基于多传感器融合,我们首先要做的就是传感器的标定,对于相机标定,我们首先应该明白,标定到底是在做什么,大家可以花费一点时间读下该篇文章https://zhuanlan.zhihu.com/p/30813733
相机和激光雷达的联合标定相关方法,该篇文章有列出开源的方案https://www.pianshen.com/article/5985271766/,本文选取了较为简单实用的autoware所采用的方案,下面详细讲解标定步骤。
可参考上一篇文章,本文采用的是docker安装方式。
(1) $ cd ~/docker/generic
(2) $ ./run.sh -s
(3) $ rosrun runtime_manager runtime_manager_dialog.py ,看到下图,基本说明你操作步骤无误,下面就可以正式开始标定了
2.数据包的记录
Autoware软件中提供了rosbag的功能,但如果你的传感器与其不一致,就采用rosbag的方式记录数据,只不过需要注意的是,发布的相机和雷达话题类型必须是sensor_msgs/Image和sensor_msgs/PointCloud2,默认的话题名分别是:/image_raw和/points_raw,当然话题名也可采用其他的。
rosrun autoware_camera_lidar_calibrator cameracalibrator.py --square SQUARE_SIZE --size MxN image:=/image_topic
例:
(1)$ rosrun autoware_camera_lidar_calibrator cameracalibrator.py --square 0.1 --size 9x6 image:=/image_raw
(2)播放rosbag或实时的相机流,话题名为/image_raw
(3)在相机视野内移动棋盘格,直到条变为绿色
标定板距离设备的距离不要太远,使得标定板的面积尽量占的多一点,如果你使用的比较好的单目相机,可以分为近距离和远距离两种(3-7M)。在近远距离分别做五组动作,每个持续3-5秒,动作如下:
5个动作分别为:正向; 下俯; 上仰; 左偏; 右偏。实际操作我们可以在线进行标定,因为回放的数据包不容易满足要求。
(4)按下CALIBRATE
按钮。
(5)校准的输出和结果将显示在终端中。
(6)按下SAVE
按钮。
(7)文件将保存在你的主目录中,名称为YYYYmmdd_HHMM_autoware_camera_calibration.yaml
。
(1)roslaunch autoware_camera_lidar_calibrator camera_lidar_calibration.launch intrinsics_file:=/PATH/TO/YYYYmmdd_HHMM_autoware_camera_calibration.yaml image_src:=/image_raw
其中上述的intrinsics_file是我们前面标定的相机内参文件,后面的image_raw是我们监听的相机话题。
(2)播放rosbag,其中bag包同时录制相机topic和雷达的topic,将显示图像窗口。
(3)打开Rviz并显示点云
(4)观察图像和点云,在图像中找到可以与点云中的对应点匹配的点。
(5)先单击图像中该点的像素。
(6)使用Rviz中publish单击相应的3D点。
注意:先点图像点,再去雷达数据上点point,图像上是用鼠标左键点一下后,在点的那个位置会留下一个红点,证明是你选择的camera_point,然后,在rviz里,左上角那个圈里画的publish_point就是用来点lidar_point的工具,点击publish_point后,按钮变灰色,移动鼠标,对比刚才图像上选点的位置点雷达点(建议将rviz中雷达数据放大来点,尽量精确),点到了,按钮恢复,同时number of points:0:1变为number of points:1:1;
(7)至少重复9个不同的点。
(8)完成后,文件名将保存在你的主目录中 YYYYmmdd_HHMM_autoware_lidar_camera_calibration.yaml
。
注意:我们的操作都在docker中,所生成的文件也保存在docker中。
(1)$ rosrun runtime_manager runtime_manager_dialog.py
(2)在上一步打开的 Runtime Manager -> Sensing -> Calibration Publisher, 跳出来的界面中修改 target_frame为自己点云数据的frame_id,同时加载联合标定文件,并将image topic source更改为自己的图像topic名称,然后点击OK,之后在点击Calibration Publishe下面的Points image按钮
(3)在RViz中,Panels -> Add New Panel中添加ImageViewerPlugin, 此时ImageViewerPlugin会出现在RViz的左下方,填写Image Topic:/camera_topic(/image_raw), Point Topic:/points_image(/points_raw),然后播放数据包,会看到将点云数据映射到图像上之后的融合图,通过融合图可以直观看出标定效果。
说明:从上图中可以看出,图像和点云存在一定的偏差,分析存在的可能原因,后续将验证:
1.录制的数据包,相机和点云数据卡顿严重,同一时刻相机和点云不对应。
2.尽可能选取不同位置的近地点,这里需要注意,在rviz中尽可能的放大点云,选取正确的3D点。
注意:autoware1.10版本及之前版本calibration tools和之后的版本不一样,之前的版本是用圆把点云中对应的标定板框出来,圆中最少包含了两条点云线,两条线即可构成一个面,就是标定板所在的平面。我们就能通过lidar相对于这个面的角度推算出lidar的姿态,通过这个面点云的距离算出其位置,再和cam相对比,就能得到cam_lidar的外参矩阵了。