使用Autoware标定工作箱calibration进行相机和三维激光雷达的联合标定

    
            

利用calibration标定工作箱实现相机和激光雷达的联合标定,记录详细的操作过程以及标定的一些小细节,以备后用。

系统:ubuntu16.04

硬件:华硕ASUS Xtion相机

            Velodyne 16线激光雷达

标定板:calibration工作包中有一张8*6的棋盘格图片,本文使用的是9*7的棋盘格格子边长12.5cm的硬纸板。

详细步骤如下:

1.数据包的记录

Autoware软件中提供了rosbag的功能,但我还是习惯用终端rosbag的方式记录数据。

1)首先将相机和激光雷达相对位置固定好,因为Velodyne16线激光雷达是横向360度的扫描,最好将相机位于激光雷达上部和下部,可以用其他架子固定。

2) 找好录取数据的地方,同时启动Velodyne三维激光雷达的节点,相机的节点,然后启动记录两个节点的数据。可以写成脚本的形式,三个脚本分别:run_laser.sh  run_camera.sh  run_record.sh 。


 
   
   
   
   
  1. //run_laser
  2. source /home/zbr/catkin_velodyne/devel/setup.bash
  3. echo "run velodyne processing..."
  4. roslaunch velodyne_pointclound VLP16_points.launch
  5. sleep 1
  6. wait
  7. exit 0
  8. //run_camera
  9. echo "run ASUS_camera processing..."
  10. roslaunch openni2_launch openni2.launch
  11. sleep 1
  12. wait
  13. exit 0
  14. //run_record
  15. gnome-terminal -e 'bash -c "cd ~/bagfiles/;rosbag record -o cv_laser /camera/rgb/image_raw /velodyne_points /;seec bash"'

前两个脚本就是启动相应的驱动节点,第三个记录脚本先是进入到我存包的bagfiles文件中,然后记录图像和激光雷达两个节点的数据,并命名为cv_laser。记录过程中可以用RVIZ来查看图像信息和激光雷达数据是否正常。三维激光雷达数据量很大,通常录90多秒就接近3.3个G的包容量了。

注意:本文使用的不是单目相机,且rgb图像的分辨率不是很高,所以标定板距离设备的距离不要太远,使得标定板的面积尽量占的多一点,如果你使用的比较好的单目相机,可以分为近距离和远距离两种(3-7M)。在近远距离分别做五组动作,每个持续3-5秒,动作如下:

5个动作分别为:正向; 下俯; 上仰; 左偏; 右偏。既拿着标定板正向对着相机,下俯,上仰,左偏右偏对着相机,另外,上下左右偏的角度不宜太大,否者标定板的棋牌格可能占有很小的相对面积甚至不清楚,容易导致后面获取不到有效识别的标定板棋牌格数据帧。

(借鉴大佬)

2.启动Calibration标定工作箱

1)启动录用的工具包

rosbag play bagName.bag /velodyne_points:=/points_raw
 
   
   
   
   

这里将激光雷达的原始节点名称改为/points_raw,因为在标定功能包的mainwindow函数中,订阅的是/points_raw这个话题,所以需要修改名字,或者修改源码重新再编译一次。

启动之后待数据跑起来后,立马空格暂停。

2)开始标定

启动主节点

roscore

 
   
   
   
   

启动标定程序

rosrun calibration_camera_lidar calibration_toolkit
 
   
   
   
   

第一个弹出的框选择你相机图像的话题名称

第二个框选择Camera->Velodyne

最后会弹出一个大界面,分为了几个区域,首先找到下图的一排位置,这排参数是标定板的尺寸。前面两个是标定板每个棋格的长宽,单位为m,此处我的标定板棋格大小为12.5cm,修改为0.125*0.125。后面是标定板的棋盘规格,我的是9*7,具体情况根据自己的标定板对应修改。

如果你的Autoware是1.10以前的版本,直接启动Autoware即可,标定工具箱集成在sensing中,点击Calibration tool和上面的效果一样。

3)细节调整并标定

这部分应该是最重要的。

先调节点云界面,右上框的颜色,默认是黑色,点一下该框,按下B键,换成浅色调(便于观察)。

1.首先对着回放数据包的终端再按下空格继续回放,然后再暂停,观察标定界面是否有图像出现,正常应该是这个样子:

然后这个时候并没有看到点云,此时不要着急,关掉数字键盘,然后点这右上的点云框按2(缩小),应该就能看到初始的点云

这个时候说一下调节点云图的快捷键:

数字键和字母键盘都可以进行操作。

其中,。这两个分别是放大和缩小,鼠标的滚轮可以调节数字键控制的尺寸,可以先将滚轮上划,将数字键的移动尺寸缩小,有助于找到合适的点云。

2.调节出点云合适的角度,然后截取这一帧数据。

标定的时候,肯定包保证能够正面看到标定板的点云才好标定,所以需要通过上述的调节键将点云数据调好

例如调到上图的样子,好分辨,好标定的状态。然后点击右上角的Grab获取这一帧的数据。

如果点击Grab没有反应,说明没有识别到这一帧图像中的棋牌格,因此只有继续播放数据,然后又暂停,能看是否能获取有效的的数据帧。如上图,如果成功获取数据帧,就可以在右下框中进行标定,主要是标出标定板的位置,需要注意的是,主表放在不同的位置,会有不同的坐标系,最好使得坐标轴垂直标定板的朝外出来,还有就是竖直方向朝上,然后点击鼠标左键选取面积,右键是取消然后重新选取。

3.重复工作,直至bag包播放结束

标定一副之后,继续播放数据,然后看到合适的场面(标定板的位置比较好时候),暂停数据,然后标定,直到数据包跑完为止。

4)标定计算既验证

标定完之后点击右上角的“Calibrate”进行计算。计算完之后会在左边得到外参矩阵、重投影误差等参数(重投影误差越小越好)

然后点击右上角的“project”进行验证,会根据计算结果和激光雷达数据生成的图像对应位置,以红色散点表示,如果红色散点分布到标定板上,则说明正确,如果没有,就重新选点。

落在标定板上的就是正确标定,如果散点一半在一半不在或者不在的情况都是有问题的,然后对右下标定界面重新标定一下在后再计算验证。

弄完之后没有问题,就点击左上方的“Save”,将结果保存到合适位置,保存过程中下面两个弹窗都选“NO”

 

5) 标定结果显示

将我们标定的结果用上,将三维点云数据投影到图像上,此处借助Autoware自带的Calibration Publisher和Points Image节点能进行融合。如果是一体化的Autoware就在Calibration tool下面就有这两个节点选择,我使用的是标定工具单独出来的,因此要重新单独启动Autoware软件。在Autoware/Sensing/中打开Calibration Publisher,并将保存好的内外参文件读取进来,打开Autoware/Sensing下的Point Image节点,在Rviz中,Panels/Add New Panel内添加ImageViewerPlugin,填写Image Topic,本例为/camrea/rgb/image_raw,Point Topic,本例为/points_image,

 

得到如下融合图:

我得到的结果存在散点,可能是外参矩阵的参数有问题,之前用小觅相机出来没有这个问题,我试着修改下保存的yaml外参矩阵参数,如果有用后续会更出来。不过这个华硕的深度相机分辨率确实不高,效果很一般,有好的单目相机效果最佳。

7.13新加:通过多标定几次不同数据的对比,发现出现散点主要是因为标定板的角点对应不准确导致,标定板放置太久平面不够平整,导致标定过程中识别角点的时候不规范导致,我尝试选取很标准的识别角点图像就没有这个问题.效果如下:

使用Autoware标定工作箱calibration进行相机和三维激光雷达的联合标定_第1张图片

标定的详细流程就是这些。

 

 

参考文献:

https://blog.csdn.net/AdamShan/article/details/81670732

来源:https://blog.csdn.net/zbr794866300/article/details/107144682/

你可能感兴趣的:(激光雷达点云,ros,联合标定)