Autoware calibration toolkit激光雷达与相机外参联合标定
最近由于项目需求,折腾了好久激光雷达与相机外参联合标定,期间尝试过好多能找到的开源的标定方法,包括matlab、livox、autoware等,但是最终还是选择使用autoware calibrationtoolkit 来进行激光和相机的标定主要原因如下:
1、autoware工具操作方便,可以很快在激光点云里选取到标定版的点;
2、autoware工具标定结果相对较好,前提是录制的数据得覆盖各种场景;
先贴代码链接:https://github.com/XidianLemon/calibration_camera_lidar.git
使用autoware工具最令人头疼也最折腾的就是环境问题,本来我一开始想在jetson xavier上直接编译该代码,这样就能进行在线标定,而不用录包了。可是在jerson xavier编译报错,主要是opencv和cv_bridge版本的问题,当时发现一个师弟电脑16.04系统编译这个代码很流畅,一点问题都没有遇到,于是去查了下他的环境,opencv版本是3.3.1。于是我又在jetson xavier上安装3.3.1版本的opencv,之后又发现cv_bridge用的还是opencv4的,依旧会报错。后来在网上查了之后,说是要重新源码编译cv_bridge,但是我怕编译过后,jetson上其他代码会出问题,就没再继续了。
后来我直接在我笔记本上安装了虚拟机,ubuntu16.04的系统,安装ros之后,再次编译该代码,毫无阻碍的就成功了。
在录制数据的时候,最好同时打开ros自带的cameracalib工具,保证录制的每个位置下,标定版的棋盘格能被自动检测到,因为autoware也用了这个工具,如果无法自动检测棋盘格,后续autoware的工具是无法标定的。
录制数据最好保证能够近、中、远三个位置左、中、右各录制一个场景,为了保证相机标定的准确,可以选几个位置录制标定版俯仰和左右转的数据。
最后只需要按流程进行标定就可以了,这块我主要参考了https://zhuanlan.zhihu.com/p/147638876/
这里简单说一下操作:
1、再播放bag的时候,记得把雷达点云的topic改成points_raw播放,这样autoware才能读取点云;
2、加载好点云数图像之后如下图所示(这里点云方向比较难调,根据我的经验,如果你的点云坐标系是ros坐标系的话,先按E键让点云方向变正,然后按W键变成点云前视图,然后再放大就行)
3、这里记得用空格键暂停bag的播放,同时注意点云和图像的时间戳,保证尽可能的接近,然后点右上方的Grab,可以获取如下结果
4、然后在右下方点云的标定板中间选取平面,如下图所示,注意这里尽量选取中间,效果会好一些
5、当把各个方向的数据都按如下操作之后,点击右上方的calibrate,然后点击project就可以查看之前选取的标定板平面点云在对应图像上的投影结果,结果图片如下
6、最后点击save保存即可。
最后放一个连续可视化的标定的结果(等我b站视频上传了发链接)
https://www.bilibili.com/video/BV1S54y147Fe/
感觉最后实测的结果就是图像边缘部分不是特别准,不知道是不是由于图像畸变的原因,还没试过用畸变矫正过后的图像进行点云投影的结果,后面有空会试试。
(ps. 需要用标定得到的相机畸变参数对图像进行畸变矫正,或者在激光投影图像的时候对激光点对应的像素坐标进行反矫正,这样效果就完美了,不会出现视频里边缘不准,中间准的问题了)
ps:注意标定得到的结果是image->lidar , 如果要使用lidar->image投影记得求逆。