欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

Autoware] 激光雷达-相机联合校准 1-校准工具包

最编程 2024-04-07 20:00:13
...

一.前言

一般自动驾驶车辆上都会配备多种用途的传感器,只使用一种传感器是存在局限性的,为了提高感知定位等系统功能的鲁棒性稳定性,常采用多传感器融合的方式,一般融合包括时间同步以及空间同步。而激光雷达与摄像头之间的联合标定则是属于空间维度上的融合同步了。此外由于点云的稀疏性,在进行点云标注的时候,仅仅依靠点云数据是很难检测出目标对象的类别的,此时如果有时间同步的图像,利用深度学习进行处理,就可以较高效的检测出来了,为了精确标注,还需要把点云反投影到图像上面,判断两者是否重合,此时就需要用到激光雷达与摄像头的联合标定了。

激光雷达与摄像头的联合标定的结果也就是计算出激光雷达相较于摄像头的旋转、平移关系。


图片参考《Calibration of RGB Camera with Velodyne LiDAR.》

基本原理:

  • 与普通cam标定一样,通过标定板的变化算出cam的位姿矩阵
  • 再手动用小圈把点云中对应的标定板框出来,看下文介绍可以理解,小圈最少包含了两条点云线,两条线即可构成一个面,就是标定板所在的平面。
  • 通过lidar相对于这个面的角度推算出lidar的姿态,通过这个面点云的距离算出其位置,再和cam相对比,就能得到cam_lidar的外参矩阵了。

二.准备工作
  • 打开镭神激光雷达:

使用之前先将激光雷达的网线接到主机上;并且修改IPv4地址为:192.168.1.102 255.255.255.0 192.168.1.1;然后ping的通激光雷达的IP地址192.168.1.200即可.
1.source Workspace/catkin_ws_lslidar/devel/setup.bash
2.修改/home/clark/Workspace/catkin_ws_lslidar/src/lslidar_C16/lslidar_c16_decoder/launch/lslidar_c16.launch文件内容,适配autoware
3.roslaunch lslidar_c16_decoder lslidar_c16.launch

  • 打开摄像头:

(查看摄像头设备信息命令:v4l2-ctl --list-devices、lsusb)
1.安装: sudo apt-get install ros-melodic-usb-cam
2.根据摄像头的情况修改配置文件: sudo vim /opt/ros/melodic/share/usb_cam/launch/usb_cam-test.launch
3.启动摄像头:roslaunch usb_cam usb_cam-test.launch

  • rviz显示激光点云与摄像头:

1.在新的终端中打开rviz,修改Global Options中的Fixed FrameVelodyne

2.在右侧Views视窗区域将Type类型修改为ThirdPersonFollower(rviz)这样就能用鼠标*拖动激光点云数据了。

3.点击左下角Add按钮后,By topic选项卡里面就是当前ros环境中所有的话题各自能用的可视化控件,选择其中/usr_cam/image_raw话题下的Image控件后,就能同时看到摄像头数据以及激光点云数据。

4.内参标定准备

  • 这里需要准备一个标定板,我这里将棋盘格标定板设置成KT板A1尺寸大小,棋盘格的格子数目为12x9,每个棋盘格的边长为65mm,然后去图文店打印出来(共36元),再在KT板后面贴上一层硬纸板加固一下,防止意外弯曲损坏,保证平整。


  • 摄像头为HD USB Camera,两个短焦6mm,一个长焦25mm


  • 激光雷达为镭神智能的Lslidar-c16


5.摄像头内参标定

需要先用上述棋盘格标定板单独标定摄像头的内参,得到yaml内参文件供后续激光雷达摄像头联合标定使用

source /home/autoware/Autoware/install/setup.bash
#使用autoware自带的相机内参标定工具cameracalibrator.py 
rosrun  autoware_camera_lidar_calibrator cameracalibrator.py --square 0.065 --size 11x8 image:=/usb_cam/image_raw camera:=/usb_cam

6.录制ROSBAG包
联合标定准备标定板和录制ROS BAG,标定板用的是内参标定的棋盘格(129个格子,也就是内侧角点数目为118,每个格子边长65cm),需要在小车上录制激光雷达和摄像头的ROS Bag数据包,然后将保存后的Bag再拷贝到自己台式机上播放用于标定的话题输入:摄像头(/usb_cam/image_raw),激光雷达(/points_raw)

  • 在激光雷达与摄像头同时启动的情况下,确保ros环境中存在/points_raw以及/usb_cam/image_raw这两个话题。

  • 开始录制
    rosbag record -O Lslidar_c16_HD_USBCamera_Calibration.bag /usb_cam/image_raw /points_raw,其中Lslidar_c16_HD_USBCamera_Calibration.bag可以是任何随意命名,后面跟着的分别是摄像头与激光雷达的两个话题。
    注:一般录制的时候最好可以按照规定的站位以及拿标定板的动作来进行。1.拿标定板的人需要将标定板始终保持在摄像头视角范围内;2.

三、单独编译标定工具箱calibration_camera_lidar

Autoware1.10中的Sensing模块是自带有Calibration Tool Kit的,但1.10之后就已经取消了这个联合标定工具包了,因此需要单独安装。

autoware1.10自带有标定工具箱


1. 下载并编译安装nlopt

  • 去这里https://github.com/stevengj/nlopt下载并解压到本地

  • 进行cmake编译

mkdir build  &  cd build
cmake ..  &  make  &  sudo make install

2. 下载并编译安装calibration_camera_lidar

  • 去这里下载https://github.com/XidianLemon/calibration_camera_lidar标定工具箱

  • 在本地新建一个编译目录catkin_ws_calibration_lidar_camera,在其中新建一个src目录并将下载的标定工具箱文件夹ls_calibration解压到其中


  • 回到src同级目录进行catkin编译
    完整命令如下:
mkdir -p catkin_ws_calibration_lidar_camera/src
cd ..  &&  catkin_make
  • 报错1: Couldn't find executable named calibration_toolkit

    解决1
    因为我的ros是melodic,因此需要将/home/clark/Projects/calibration_camera_lidar-master/catkin_ws_calibration_lidar_camera/src/ls_calibration/calibration_camera_lidar目录下的CMakeLists.txt中第72行、944、114行中分别增加三个melodic
#第72行、944、114行修改前
if ("${ROS_VERSION}" MATCHES "(indigo|jade|kinetic)")
#第72行、944、114行修改后
if ("${ROS_VERSION}" MATCHES "(indigo|jade|kinetic|melodic)")

再退到src同级目录,重新进行编译

  • 报错2: libnlopt.so.0: cannot open shared object file: No such file or directory

    解决2
    这是因为刚才安装的libnlopt.so.0的位置不对,只需要在/etc/ld.so.conf.d目录下新建一个libnlopt.conf文件,在其中输入/usr/local/lib是其库文件安装到的位置
cd /etc/ld.so.conf.d/
sudo vim libnlopt.conf #用vim打开,在其中输入/usr/local/lib,:wq保存退出
sudo ldconfig使配置生效
  • 再重新运行命令rosrun calibration_camera_lidar calibration_toolkit
    就成功跳出了标定工具,则说明标定工具箱安装成功。

3. 利用calibration_camera_lidar标定工具箱进行激光雷达摄像头的联合标定

  • 循环播放刚才录制的ROSBAG
    rosbag play Lslidar_c16_HD_USBCamera_Calibration.bag --loop

  • 可以用rostopic list看到此时ROS环境下的话题信息

  • 进入calibration_camera_lidar的devel目录, source devel/setup.bash,然后运行命令启动联合标定程序rosrun calibration_camera_lidar calibration_toolkit,在下拉框中选择相机话题/usb_cam/image_raw
  • 在下一个框中选择“摄像头到激光雷达” Camera -> Velodyne

  • 然后就会打开标定窗口,在最上方填入Patter Size为0.065 x 0.065(单位为m,因为我用的棋盘格边长为65mm,所以这里填0.065);Pattern Number为11 x 8(棋盘格数目为12 x 9,去掉最外面的一圈,实际内部角点数为11 x 8)


[图片上传中...(image.png-af3ec0-1616032061878-0)]

用ros自带的标定后保存的内参文件是yaml格式,这个标定工具箱需要yml格式,只需要将后缀改一下即可

第一个Load Option选择Yes

第二个Load Option选择No
  • 加载完毕后会看到相机的内参信息


    内参矩阵

    畸变系数
  • 右侧会出现ROSBAG包中摄像头与激光雷达的同步数据内容


  • 此时摄像头区域是在播放状态,切换到ROSBAG播放的终端处,按空格暂停。

播放状态
按空格后,进入暂停状态
  • 右侧的激光点云区域一开始是黑屏的什么也看不见,需要特定的键盘按钮来显示出三维激光点云数据。



    该图出处如水印所示
  • 基本操作如下:
    1.右侧数字小键盘中“上”,“下”,“左”,“右”,“PgUp”以及“PgDn”这六个按键用于平移激光点云。
    2.a、d、w、s、q、e用来旋转激光点云。
    3.数字“1”,“2”用来设置是perspective projection透视投影还是orthogonal projection正交投影。

4.用“o”,“p”控制点云的大小,o变小,p变粗。


按o变细

按p变粗

5.用“-”,“+”控制放大,缩小。


用“-”放大

用“+”缩小
  1. 用“b”来改变激光点云区域的背景(background)颜色,使得点云显示更加明显,方便标定时选择三维点。


    按“b”跳出颜色板选择背景颜色
修改背景色为蓝色突出点云的白色
  • 最后通过上述键盘按键的调整,将左侧摄像头与右侧激光点云画面同步,方便左右选择对应的标定板特征点,并且标定板的点云也很好区分,处于视角正中心。


    通过上述键盘按键的调整,将左侧摄像头与右侧激光点云画面同步,方便左右选择对应的标定板特征点。
  • 然后点击一下右上角的“Grab”按钮,用来捕获当前时刻的图像与点云


标定板的中心位置选择一个圆形的区域,尽量保证向外侧的平面法向量垂直于标定板平面
grab一次后,回到那个暂停的终端,继续跑,跑的差不多了再空格暂停,继续grab

注:若一次grab始终不能鼠标左键单击选择垂直于点云标定板的区域,则点击右侧上方的“Remove”按钮,删除该次Grab,重新跑ROSBAG,在合适的地方空格暂停,继续Grab抓取关键帧与激光点云帧。

  • 当grab到差不多15组点云与图像对后,点击窗口右上角的"Calibrate"按钮进行标定


  • 标定结束后,会在左侧的"CameraExtrinsicMat"窗口显示出外参矩阵


    标定后得到的外参矩阵

  • 我这里联合标定了10组不同的点后会保存到自动将生成的标定结果保存到home目录下,名称类似为:CameraExtrinsicMat03181454.yml,该文件包含内参和外参。
第一个Save Option选择No

第二个Save Option也选择No
  • 如果选是的话,会将所有的标定信息都存入yaml文件中


    外参标定文件

    第一个三维激光点云

    第一个摄像头标定的图像点
第一组点对中棋盘格的姿态信息

标定结果测试

获取到外参标定yaml文件后,需要对联合标定的结果进行测试,可以在Autoware中使用Calibration Publisher,来发布和对齐LiDAR与Camera之间的转换

  • 打开autoware
source /home/autoware/Autoware/install/setup.bash
roslaunch runtime_manager runtime_manager.launch
  • 切换到Sensing感知模块,点击右下区域的Calibration Publisher


  • 打开Autoware/Sensing下的Point Image节点


    打开Autoware/Sensing下的Point Image节点
  • 在Rviz中,Panels/Add New Panel内添加ImageViewerPlugin,填写Image Topic,本例为/camrea/rgb/image_raw,Point Topic,本例为/points_image,


    Panels/Add New Panel内添加ImageViewerPlugin

参考:
  1. M. Velas, M. Spanel, Z. Materna, A. Herout. Calibration of RGB Camera with Velodyne LiDAR. In WSCG 2014 Communication papers proceedings.
    2.autoware1.14安装相机和激光雷达联合标定工具
    3.Autoware完整安装及联合标定工具箱安装
    4.https://adamshan.blog.****.net/article/details/81670732
    5.https://www.cnblogs.com/dlonng/p/13091956.html
    6.https://blog.****.net/learning_tortosie/article/details/82347694
    7.http://wiki.ros.org/but_calibration_camera_velodyne