正在学习lego loam。由于是转行的,对ros、C++、SLAM并不熟悉。直接啃slam,走了很多弯路。这个笔记用于记录日常学习琐碎的知识点。
#c 如何理解imageProjection.cpp中,订阅到的消息<sensor_msgs::PointCloud2>?
subLaserCloud = nh.subscribe<sensor_msgs::PointCloud2>(pointCloudTopic, 10, &ImageProjection::cloudHandler, this);
//(pointcloudtopic是bag的topic,4是消息积压队列长度,cloudHandler是回调函数)
#d sensor_msgs::PointCloud2的定义
sensor_msgs::PointCloud2是一种话题通信的msg。
(base) ubuntu@yin:~/project/RQslam/test$ rosmsg info sensor_msgs/PointCloud2
#输出
std_msgs/Header header
uint32 seq
time stamp
string frame_id
uint32 height
uint32 width
sensor_msgs/PointField[] fields
uint8 INT8=1
uint8 UINT8=2
uint8 INT16=3
uint8 UINT16=4
uint8 INT32=5
uint8 UINT32=6
uint8 FLOAT32=7
uint8 FLOAT64=8
string name
uint32 offset
uint8 datatype
uint32 count
bool is_bigendian
uint32 point_step
uint32 row_step
uint8[] data
bool is_dense
初看这个数据结构,感到很复杂。当我们使用这个msg时,和使用C++实例化对象时一模一样。我们直接把这个sensor_msgs/PointCloud2东西当做类。(msg一般是模板结构体,结构体和类差不多,我开始学的是Python,早期一直没有结构体的概念…不过这不影响msg的学习)
类是什么?类无非就是一些基本的数据类型+函数,建构出的一个高阶数据类型。对于sensor_msgs/PointCloud2这个类更简单了,只有几个数据类型,甚至没有函数。
通过info,我们对msg进行拆分,结果如下:
std_msgs/Header header
uint32 height
uint32 width
sensor_msgs/PointField[] fields
bool is_bigendian
uint32 point_step
uint32 row_step
uint8[] data
bool is_dense
可以看到,sensor_msgs/PointCloud2是由这9个部分构成的。** 所有复杂的数据都是由简单的组合而成!**
这里面很多是不可再拆的类型,比如:
uint32 height
uint32 width
bool is_bigendian
uint32 point_step
uint32 row_step
uint8[] data
bool is_dense
还有2个较为复杂的。我们先拿一个进行分析:
sensor_msgs/PointField[] fields
uint8 INT8=1
uint8 UINT8=2
uint8 INT16=3
uint8 UINT16=4
uint8 INT32=5
uint8 UINT32=6
uint8 FLOAT32=7
uint8 FLOAT64=8
string name
uint32 offset
uint8 datatype
uint32 count
在复杂程度上,sensor_msgs/PointField[]和sensor_msgs/PointCloud2是一样的。他们都是多个数据类型组成的高阶数据类型。
可以看到,sensor_msgs/PointField[]底层的构成依然简单。
突然发现,之前写完的,没有保存草稿。。。过段时间再补