自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(41)
  • 收藏
  • 关注

原创 C++ virtual 虚函数 虚基类

virtual

2023-10-09 11:32:09 191

原创 ROS static_transform_publisher MATLAB 四元数格式转换

可以使用quat2eul将四元数转换为欧拉角,默认的旋转顺序为ZYX。而在MATLAB中,四元数的第一位为w。

2022-09-01 15:54:28 424 1

转载 FFmpeg将多张图片合成视频

参考:https://blog.csdn.net/wangshuainan/article/details/77914508ffmpeg -threads 2 -y -r 10 -i ./1_images_cut/imgcut%04d.jpg output.mp4参数的解释含义:-threads 2 以两个线程进行运行, 加快处理的速度。-y 对输出文件进行覆盖-r 10 fps设置为10帧/秒(不同位置有不同含义,后面再解释)-i /tmpdir/image%04d.jpg 输入图片文件,

2022-05-19 15:36:49 674

转载 OpenCV中的鱼眼相机模型

参考文章:https://blog.csdn.net/u010128736/article/details/52864024?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-3注意,最后的一系列公式中,默认焦距f=1,即:xc=f*(Xc/Zc) , yc=f*(Yc/Zc)rd/r=xd/xc , 其中rd=f*θd=θd...

2022-05-13 11:19:08 311

原创 鱼眼镜头/全景相机原理/全景相机标定

参考:https://www.mathworks.com/help/vision/ug/fisheye-calibration-basics.html

2022-04-28 16:41:05 527

原创 rosbag

正常录制的.bag,matlab读取的结果:两个bag使用rosbag_merge.py合并,matlba读取的结果:推测 rosbag play 的机制:bag中的所有topic混在一起,按照timestamp从小到大排列;rosbag play时,按照timestamp的顺序逐个播放。...

2022-03-25 11:59:03 385

原创 stack / heap ?

2022-03-07 19:36:08 73

转载 static ?

?

2022-03-02 16:43:23 84

原创 ROS yaml参数文件的使用

举个例子,若在params.yaml文件中定义如下参数LidarImageFusion: points_src: "/hilbert_h/deskew/cloud_info" image_src: "/usb_cam0/image_raw" camera_info_src: "/home/hdj/fusion_slam/Color_SLAM_ws/src/hilbert_h/config/firefly_8s_2.yaml"在launch文件中需先加载这个yaml文件:<rospa

2022-02-24 15:24:43 2279 1

转载 tf static_transform_publisher的物理意义

static_transform_publisher发布的是父系到子系的坐标系变换,即,将父系变化得到子系的方法。<node pkg="tf" type="static_transform_publisher" name="base_link1_to_camera" args="1 0 0 1.570795 0 0 /camera /b1 10" /><node pkg="tf" type="static_transform_publisher" name="base

2022-02-10 15:06:28 1447

原创 激光雷达相机外参标定

首要参考Matlab提供的方法:https://ww2.mathworks.cn/help/lidar/ug/lidar-and-camera-calibration.html

2022-02-09 10:12:41 2307

原创 相机内参标定

方法一:使用ROS提供的工具camera_calibration参考ROS的文档:http://wiki.ros.org/camera_calibration/Tutorials/MonocularCalibration注意,这里的–size 8x6 ,不是棋盘格的格子列数和行数,而是十字交点的个数。方法二:使用Matlab提供的APP camera calibrator...

2022-02-08 15:36:07 988

原创 yaml参数文件的使用

params.yaml文件中的内容如下,注意hilbert_h:hilbert_h: pointCloudTopic: "/velodyne_points" # Point cloud data imuTopic: "/imu/data" # IMU data odomTopic: "odometry/imu" # IMU pre-preintegration odometry,

2022-01-25 11:26:34 543

原创 ROS中TF(坐标系转换)原理与使用

官网建议新工作直接使用tf2,因为它有一个更清洁的界面,和更好的使用体验。(自ROS Hydro以来,tf第一代已被“弃用”,转而支持tf2)。TF介绍TF(TransForm),就是坐标转换,包括了位置和姿态两个方面的变换。注意区分坐标转换和坐标系转换。坐标转换是一个坐标在不同坐标系下的表示,而坐标系转换不同坐标系的相对位姿关系。ROS中机器人模型包含大量的部件,每一个部件统称之为link(比如手部、头部、某个关节、某个连杆),每一个link上面对应着一个frame(坐标系), 用frame表示该

2022-01-21 10:46:51 4437 2

原创 ffmpeg 将视频转换成图片 截取视频的一段

查看视频基本信息ffmpeg -i test.mp4视频转换格式(将avi格式转成mp4格式)ffmpeg -i test.avi test.mp4将视频按指定帧数分割成图片方法一:ffmpeg -i test.mp4 -r 10 -f image2 %05d.jpg-i : 指定输入文件-r : 帧数 10-f : 指定格式化的格式为image2image2后面跟着的是文件名%5d:以为5位数按正序编号方法二:生成更清晰无压缩的图片方式:ffmpeg -i xxx.mp

2022-01-20 18:24:12 697 1

原创 export ROS_MASTER_URI / export ROS_IP

将ROS_MASTER_URI设置为机器的IP,则本机会收到机器发出的topic内容

2021-12-02 14:10:47 2763

原创 use_sim_time / --clock

这两个参数的原理

2021-12-02 13:58:56 366

原创 cmake/catkin_make 介绍

https://www.guyuehome.com/13945https://zhuanlan.zhihu.com/p/94579820https://zhuanlan.zhihu.com/p/97369704?utm_source=wechat_session

2021-11-25 11:30:20 143

原创 C++调用C函数 / 使用extern “C“ { }

.cpp程序中调用.c文件中定义的函数,编译无错误,但连接时出错。在.cpp文件中,使用extern “C” { },将.c文件对应的头文件包含在内,问题解决编译通过。实际上这个操作是把libaxidma.h中所有的函数声明都包括在了extern “C” { }中。参考文章:https://www.cnblogs.com/shijiaqi1066/p/6349243.html...

2021-11-25 11:21:17 386

原创 计算点云厚度

close allclcclear allptCloud = pcread('./门口外墙_有校正.pcd');thickness_sum=0;for i=1:10000 [model,inlierIndices,outlierIndices,meanError] = pcfitplane(ptCloud,0.125, 'MaxNumTrials',30000); dd=ptCloud.Location*model.Parameters(1:3).'+model.Paramete

2021-11-23 18:53:40 857

原创 读.bag中指定的topic / 将.bag中的点云保存为.pcd

close allclcclear allfid = fopen('Training.txt','w');bag=rosbag('Training.bag');BagSel1 = select(bag,'Topic','/NewTopic');BagSel2 = select(bag,'Topic','/NewTopicCloud');MsgStructs1 = readMessages(BagSel1,'DataFormat','struct');MsgStructs2 = read

2021-11-23 18:50:04 272

原创 交叉编译的理解

ZYNQ的ARM上已安装了ubuntu,ubuntu中已安装了ROS,且已经可以编译通过彩色点云程序。现在的问题是,如果将程序copy到ARM上再去编译,这个过程比较麻烦,编译速度较慢,不方便修改调试程序。交叉编译可在linux上编译得到ARM平台的可执行文件。可参考https://zhuanlan.zhihu.com/p/77116555...

2021-11-04 16:33:26 68

转载 Cmake之深入理解find_package()的用法

https://zhuanlan.zhihu.com/p/97369704?utm_source=wechat_sessionModule模式与Config模式通过上文我们了解了通过Cmake引入依赖库的基本用法。知其然也要知其所以然,find_package对我们来说是一个黑盒子,那么它是具体通过什么方式来查找到我们依赖的库文件的路径的呢。到这里我们就不得不聊到find_package的两种模式,一种是Module模式,也就是我们引入curl库的方式。另一种叫做Config模式,也就是引入glog库的

2021-11-02 18:09:45 504

转载 类继承的关键字

对于三种继承,对基类里的private对象处理方式都是一致的,即对派生类都是不可访问的,但它确实被继承了,可以通过基类里的函数来访问。三种继承的不同之处在于:公有继承是将基类的public和protected成员直接继承不改变其属性(即继承后依然是public和potected的),保护继承将基类的public和protected成员直接继承为派生类的protected成员。而私有继承则直接将基类的protected和public成员继承为派生类的private成员。不难发现,存在着这样的一个

2021-10-26 16:42:02 1436

转载 int main(int argc, char const *argv[ ])

argc 是argument count的缩写表示传入main函数中的参数个数,包括这个程序本身argv 是 argument vector的缩写表示传入main函数中的参数列表,其中argv[0]表示这个程序的名字在上面两个名词的解释中提到“这个程序”,所谓的“这个程序”就是包含main函数的程序。可能这样说还是不太能理解,不妨用一个例子来说明一下什么是“这个程序”。代码如下(test.c文件并编译链接形成test.exe(linux下生成test)可执行文件):#include <stdi

2021-10-26 16:24:12 3385 1

转载 点云数据格式PCD(Point Cloud Data) 数据格式解析

PCD(点云数据)文件格式为什么用一种新的文件格式?PCD文件格式并非白费力气地做重复工作,现有的文件结构因本身组成的原因不支持由PCL库引进n维点类型机制处理过程中的某些扩展,而PCD文件格式能够很好地补足这一点。PCD不是第一个支持3D点云数据的文件类型,尤其是计算机图形学和计算几何学领域,已经创建了很多格式来描述任意多边形和激光扫描仪获取的点云。包括下面几种格式:PLY是一种多边形文件格式,由Stanford大学的Turk等人设计开发;STL是3D Systems公司创建的模型文件格式

2021-10-26 16:14:20 3815

原创 sensor_msgs/PointCloud2 数据格式解析

$ rosmsg info sensor_msgs/PointCloud2std_msgs/Header header uint32 seq time stamp string frame_iduint32 heightuint32 widthsensor_msgs/PointField[] fields uint8 INT8=1 uint8 UINT8=2 uint8 INT16=3 uint8 UINT16=4 uint8 INT32=5 uint8 UINT

2021-10-26 16:08:51 1885

原创 类的关键字protected

protected和private的相似之处:在类外,只能用公有类成员来访问protected部分中的类成员。protected和private的不同之处:它们的区别只有在基类派生的类中才会表现出来,派生类的成员可以直接访问基类的保护成员,不能直接访问基类的私有成员。...

2021-10-26 15:49:07 445

原创 语义移动 move semantics

vector<string> allcaps(const vector<string> & vs){ vector<string> temp //code than stores an all-uppercase version of vs in temp return temp;}vector<string> vstr;//build up a vector of 20,000 strings,each of 100

2021-09-15 10:03:12 100

转载 Eigen::Matrix用法

https://www.cnblogs.com/houkai/p/6347648.htmlMatrix类在Eigen,所有的矩阵和向量都是Matrix模板类的对象,Vector只是一种特殊的矩阵(一行或者一列)。Matrix有6个模板参数,主要使用前三个参数,剩下的有默认值。Matrix<typename Scalar, int RowsAtCompileTime, int ColsAtCompileTime>Scalar是表示元素的类型,RowsAtCompileTime为矩阵的行,

2021-09-15 09:52:06 2259

原创 VSCode中调试ROS程序的方法

launch.json{ // Use IntelliSense to learn about possible attributes. // Hover to view descriptions of existing attributes. // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configuratio

2021-08-25 16:07:10 174

原创 虚函数virtual

在类Base中加了Virtual关键字的函数就是虚拟函数。基类的函数调用,如果有virtual则根据多态性调用派生类的,如果没有virtual则是正常的静态函数调用,还是调用基类的。1、虚函数的应用看下面的一段代码的输出结果:class Base{public:Base(){}public: virtual void print(){cout<<"Base";}}; class Derived:public Base{public:Derived(){}p

2021-08-14 16:30:20 692

原创 构造函数 默认构造函数

1. 构造函数2. 默认构造函数用于在未提供显示初始值时创建对象并初始化,如:stock stock0;2.1 定义默认构造函数的两种方式给已有的构造函数的所有参数提供默认值通过函数重载来定义——一个没有参数的构造函数...

2021-08-09 11:59:53 586

原创 左值 右值 左值引用 右值引用 引用与指针的区别?

在这里插入图片描述

2021-04-29 17:46:39 269

原创 函数重载

编译器在检查函数特征标时,将把类型引用和类型本身视为同一个特征标。匹配函数时,要区分const和非const变量。

2021-04-29 17:27:08 50

原创 创建工作空间后 配置该工作空间的环境变量

cd +完整路径 例:cd /opt/ros/indigo/share/roscpproscd+ 直接加包的名字 例: roscd roscpp对ROS文件系统而言,ROS中的roscd命令实现利用包的名字直接切换到相应的文件目录下,具体而言,假如我们已经创建好了一个自己的程序包(如程序包名字为beginner_tutorials),则可以通过以下指令切换到该程序包目录下:roscd beginner_tutorials1但是如果在创建好工作空间后直接使用上面的指令,则会出现“no such

2021-04-02 14:55:23 288

原创 函数指针 函数指针数组

三个函数原型const double * f1(const double ar[ ] , int n);const double * f1(const double [ ] , int);const double * f1(const double * , int);这三个函数原型其实是一模一样的(除了函数名)从函数原型 得到 函数指针const double * (*p1)(const double * , int) p1即为指向该函数的函数指针。函数指针指向函数在内存中开始.

2021-03-31 17:03:55 66

原创 数组指针 和 指针数组

首先,理解一下数组指针和指针数组这两个名词:“数组指针”和“指针数组”,只要在名词中间加上“的”字,就知道中心了——数组的指针:是一个指针,什么样的指针呢?指向数组的指针。指针的数组:是一个数组,什么样的数组呢?装着指针的数组。然后,需要明确一个优先级顺序:()>[]>*,所以:(p)[n]:根据优先级,先看括号内,则p是一个指针,这个指针指向一个一维数组,数组长度为n,这是“数组的指针”,即数组指针;p[n]:根据优先级,先看[],则p是一个数组,再结合,这个数组的元素是指针类型,

2021-03-31 14:30:01 167 1

原创 new运算符

变量是在编译时分配的 有名称的内存;new 在运行阶段 分配未命名的内存 以存储值int * pr = new int;只能通过指针访问该int。需要在两个地方指定数据类型:指定需要什么样的内存,声明合适的指针。int higgens;int * pt = &higgens;可以通过名称访问该int,也可以通过*pt访问该int。3.使用new来创建动态数组通常,对于大型数据(如数组、字符串、结构),应使用new。通过声明穿件数组,始终占用内存,在编译时给数组分配

2021-03-31 12:39:58 362

原创 二维数组

ar2[ ][ ]是一个二维数组int (*ar2)[4]是数组指针,ar2是指向有4个int的数组的指针,下面的形式表达的也是这个意义int ar2[ ][4]int* ar2[4]是指针数组,ar2[4]表明这是一个数组,int*表明数组的元素是指针ar2指向数组的第一个元素(编号为0),而这每一个元素都是由4个int组成的数组;ar2[r][c]=*(*(ar2+r)+c)ar2+r是指向数组的指针;*(ar2+r)则是指向这个数组第一个元素的指针;等同于ar2[r

2021-03-30 16:16:37 111

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除