这段时间由于小导师让本人在无人车上跑通liv-sam算法,在外参标定过程挣扎了两周,终于搞定了,由于导师提供的雷达是镭神C16的,在市面上很少见镭神的雷达,在网上大部分博主都是使用的VLP-16类型的激光雷达,所以面临的的一个问题是现在开源的标定算法,就只有align-calib,哈工大的lidar-imu-calib,浙江大学的lidar-imu-calib但是在实现过程过,align-calib原本是只能标定里程计和lidar的虽然能进行代码改进标定激光雷达和imu外参但是精准度很差,哈工大的lidar-imu-calib只能标定旋转矩阵,他会输出一个Roll,Pitch,yaw角和一个旋转矩阵,但是没有平移向量的参数。最终选择了浙大的lidar-imu-calib进行标定。
一、问题描述
此算法只支持VLP-16雷达,但根据作者叙述应该很容易扩展,在经过查询后在github中有很多种雷达的改进,例如有速腾的,outser,360等都能找到,我把链接放到后面。但是基于镭神类型的标定却很少有,历经两周的挣扎终于可以进行标定了。在此过程中遇到的最大的问题就是点云格式的转换,在浙大的lidar-imu-calib中要求VLP-16激光雷达的点云格式必须是有序的话题为velodyne_packet,我查询了这种点云格式为XYZIT,而一般的点云格式如原始点云如pointcloud2,是XYZI格式,而镭神类型的激光雷达格式为XYZI或者是XYZIRT的点云类型,就需要把镭神-C16的点云格式转换为VLP-16的XYZIT类型的点云格式。
https://github.com/APRIL-ZJU/lidar_IMU_calib.git 原始标定算法
https://github.com/wujiyan004/Lidar_IMU_Calibration.git 含有各种雷达种类的标定算法,可以适配FAST-lio算法。
镭神雷达驱动:https://github.com/wujiyan004/lslidar_ros.git
二、解决方法
2.1修改镭神驱动
将镭神驱动的相关代码修改,这里主要是修改驱动中的launch文件中的,point_cloud_type驱动中这个默认值是flase,原始代码中这个值如果是Flase则代表镭神驱动收集到的点云格式为XYZIRT类型的格式点云,如果是True点云类型就是XYZI类型的点云。如果是这里如果不确定可以通过以下命令来确认自己采集到的bag包是什么类型的点云
rosbag play 包名 /话题名 //播放bag包
rostopic echo 话题名/fields //打印输出的参数类型
2.2 录包
打开对应雷达和imu的驱动,对雷达和imu的数据进行录制,这里注意录制的时候一定注意点云类型一定要是XYZI类型的点云,可以在录包之后检查一下包的数据格式。还要注意一个问题在录包的过程中一定要把所有约束都给约束到,不能只在平面运动,Roll,Pitch,yaw三个欧拉角一定要约束到,还有XYZ三个方向的移动,一定要有Z轴的运动。笔者最开始录包就在平面进行录制的结果发现标定结果根本不能用。具体录制方法可以参考
https://www.youtube.com/watch?v=2IX5LVTDkLc
2.3代码修改
到这里就开始进行代码修改了这里主要参考这个小哥的文章激光雷达和IMU联合标定包 lidar_IMU_calib 基于RS-32的扩展_robosense 雷达使用浙大lidar-imu-calib联合标定工具代码修改-CSDN博客
在这位前辈的基础上主要针对了RS-32的扩展主要是修改了代码中/include/utils下dataset_reader.h文件和vlp_common.h文件在这些文件中最主要是是修改vlp_common.h这个文件,这位前辈是用的第二个unpack_scan函数,作者进行了函数重载,有两个unpack_scan函数,第一个是将velodyne_msgs::VelodyneScan类型点云转化为TPointCloud(就是xyzit)类型点云,第二个unpack_scan函数就比较简单了,它是将PointCloud2格式点云转换为XYZIT格式点云,这一部分当初有点困扰我的是:使用pcl::fromROSMsg()函数将PointCloud2格式点云转换为XYZI格式点云后,点云变为无序的了,这位前辈进行了改进改的很好能直接用,在这里注意的是这个前辈是用了一个结构体进行函数的重载,所以一定要在雷达的驱动中去找参数,这个找参数的过程中是相当痛苦的,他有很多参数,有的在雷达驱动中有,有的在雷达驱动中没有只能查阅用户手册,但是后来发现有些参数不改也是可以实现标定的。具体的参数笔者把搜索到的放在下图中。