代码 https://github.com/Mitchell-Lee-93/kitti-A-LOAM
从cmake.txt里面看到
接下来就按照顺序看这几个主要的代码
ScanRegististration.cpp
从main函数看起,主要是下面的几个函数
大致是接收bag文件中的点云信息,然后做了处理,处理完了就再发布出去,供后面的算法使用.
laserCloudHandler
通篇所用的 PointType
指的是
但是从 laserCloudHandler 中可以看出来
而是用 PointXYZ
去和 bag中的数据进行的对接,这说明原始的算法只需要接收 点云数据的 xyz就行了,连强度都不需要.
所以 laserCloudHandler的前半部分的主要功能其实就是得到intensity.
这个东西 竟然可以算得出来,(理论上肯定是可以的),
那这个 intensity 在激光slam中的算法作用是什么 呢?它好像并不能够提供关于位置的信息,可能能够反应每个点的feature.这一点还要再确认。
这里先不细看到底intensity是怎么算出来的,但是这个函数的前 面的目的主要就是这个,然后 把扫到的点按照 scanID给排好,这里的scanId我理解就是 ring index。
pubLaserCloud
sensor_msgs::PointCloud2 laserCloudOutMsg;
pcl::toROSMsg(*laserCloud, laserCloudOutMsg);
laserCloudOutMsg.header.stamp = laserCloudMsg->header.stamp;
laserCloudOutMsg.header.frame_id = "/camera_init";
pubLaserCloud.publish(laserCloudOutMsg);
看来是 laserCloud
与它进行的对接。
这里主要是记录每个scanid开始的index和结束的index,这里+5与-6个人理解是为了去noise,因为在交界的地方容易有误差。(自己猜测。) 这一步有了之后,就相当于知道了 具体每一个scanid对应的起始位置与结束位置,便于后面进行处理.
接下来是计算曲率
for 里面的5就是因为,上面一步把前5个点,与后5个点都去掉了,因此,只用中间的点来算。
可以看到这里每个点,都取了它的前5个,和后5个点总共10个点,然后 再减去当前点的10倍
就相当于是
( x 1 − x 0 ) + ( x 2 − x 0 ) + . . . . + ( x 10 − x 0 ) (x1-x0) + (x2-x0)+....+(x10-x0) (x1−x0)+(x2−x0)+....+(x10−x0)
这里需要查一下,曲率的离散计算方式
然后 接下来算完曲率之后就是要根据曲率来判断哪些点是 corner点,哪些点是surface点。
得到这些点之后,再发布出去.