一、准备工作
注意注意:需要提前搭建好ROS环境,我的是Ubuntu20.04+noetic
双目相机
1.首先要进行双目相机的标定,推荐使用matlab的双目标定工具箱,操作比较容易,精确度也不错,使用其他标定也可以,总之要先得到两相机的内参、畸变系数、以及外参矩阵。
2.Kalibr是基于ros进行标定的,要根据相机种类发布话题,一般购买的时候卖家那边都会给,我这个比较杂牌,就没有给提供包,而且是一个同帧同步的,也就是双目图像拼在一起往回传,就写了一个节点把图片发出来,需要的可以来这里拿。
GitHub - fireworker01/usb_stereo_camera_same_frame: same frame synchronous stereo camera ros node
git clone https://github.com/fireworker01/usb_stereo_camera_same_frame.git
IMU
需要标定imu参数来减少随机噪声影响。
这里可以使用imu_utils完成。
首先建立一个工作空间,这里就都使用ws来代替,具体可以根据实际情况更改。
mkdir ws
cd ws
mkdir src
catkin_make
cd src
git clone https://github.com/gaowenliang/code_utils.git
cd ..
catkin_make
在这里一定要注意,第一步下载的不是imu_utils,这个包依赖与code_utils,需要先单独编译 code_utils。
编译完成后,在编译imu_utils
cd src
git clone https://github.com/gaowenliang/imu_utils.git
cd ..
catkin_make
我这里编译直接成功,有报错一般都是缺少依赖,可以根据实际情况安装。
通过ros启动imu,发布话题。
可以使用
rostopic list
查看话题,确认imu消息发布成功。
使用ros录制数据包仅录制imu的数据话题即可
rosbag record -O /imu/data static_imu.bag
其中,/imu/data是imu的话题,static_imu.bag是自定义的包名称,记得把imu话题改成自己的。
静止放置一段时间,建议两个半小时以上。然后ctrl c结束录制。
可以通过rosbag info static_imu.bag 查看录制的包信息。
从这里可以看到,我是录制了4小时45分钟的数据。
下面开始标定imu
打开imu_utils的launch文件夹,仿照提供的launch文件编写。
<launch>
<node pkg="imu_utils" type="imu_an" name="imu_an" output="screen">
<param name="imu_topic" type="string" value= "/imu/data"/>
<param name="imu_name" type="string" value= "my_imu"/>
<param name="data_save_path" type="string" value= "$(find imu_utils)/data/myimu_data/"/>
<param name="max_time_min" type="int" value= "210"/>
<param name="max_cluster" type="int" value= "100"/>
</node>
</launch>
其中imu_name的value为自定义imu名字,imu_topic的value注意改成自己的消息话题,data_save_path的value就填自己像保存结果的地址就好。
然后回到工作空间,运行imu_utils,也就是以上的launch文件,我起名为myimu.launch
source devel/setup.bash
roslaunch imu_utils myimu.launch
然后打开一个新终端,进入录制的bag存放的文件夹,播放数据包。
rosbag play -r 200 static_imu.bag
-r 200表示使用200倍速播放。
要是一直出现wait for imu data的话,不要着急等一下就好,可能会后面才会出现信息,这也是不推荐在线标定的原因之一。
等出现这样的信息,就是标定完成了,可以去自己填写的输出地址查看输出结果了。
结果如下,记住gyr_n, gyr_w, acc_n, acc_w,这四个参数,待会要用。
Kalibr编译
新建一个工作空间kalibr_ws,并下载源码
ps:提前安装好catkin build工具
mkdir kalibr_ws
cd kalibr_ws
mkdir src
cd src
git clone https://github.com/ethz-asl/kalibr.git
cd ..
catkin build -DCMAKE_BUILD_TYPE=Release -j4
编译可能会提示缺少一些包,按要求安装即可。
我这里比较奇怪,编译的时候提示一个包编译失败,再次catkin build却又成功了。
二、标定
配置
有这样的几个配置和文件,要提前准备好。放在哪里都可以,我这里建了一个localdata文件夹方便管理
相机
相机主要是需要内参和外参,具体内容如下,新建一个yaml文件并按照上面第一步标定的结果更改即可。
cam0:
cam_overlaps: [1]
camera_model: pinhole
distortion_coeffs: [0.0037, -0.0525, -0.0011, 0.0014]
distortion_model: equidistant
intrinsics: [744.0657, 745.43570, 610.8158, 329.4751]
resolution: [1280, 720]
rostopic: /camera/image_left
cam1:
T_cn_cnm1:
- [1.0000 , 0.0007 , -0.0077, -0.0609589]
- [-0.0007, 1.0000, -0.0028, 0.0002975]
- [0.0077 , 0.0028 , 1.0000, 0.0010769]
- [0.0, 0.0, 0.0, 1.0]
cam_overlaps: [0]
camera_model: pinhole
distortion_coeffs: [0.0051, -0.0623, -0.0012, -0.0009]
distortion_model: equidistant
intrinsics: [744.3761, 745.4682, 611.6855, 334.6598]
resolution: [1280, 720]
rostopic: /camera/image_right
IMU
具体内容如下,同上,新建一个yaml文件并按照标定的结果更改。
#Accelerometers
accelerometer_noise_density: 2.3405704579179454e-02 #Noise density (continuous-time)
accelerometer_random_walk: 2.9714491820756841e-04 #Bias random walk
#Gyroscopes
gyroscope_noise_density: 9.6193393845296483e-05 #Noise density (continuous-time)
gyroscope_random_walk: 3.3036629406608653e-06 #Bias random walk
rostopic: /imu/data #the IMU ROS topic
update_rate: 200.0 #Hz (for discretization of the values above)
其中,
accelerometer_noise_density
accelerometer_random_walk
gyroscope_noise_density
gyroscope_random_walk
对应的便是
acc_n, acc_w, gyr_n, gyr_w,这四个参数。
标定板
标定板建议使用提供的aprilgrid标定板,下载地址在这里。
https://github.com/ethz-asl/kalibr/wiki/downloads
下载这两个就可以。
pdf的话直接用a4纸打印,标定方块应该正好是2cm的宽度,可以自己用尺子量一下,并在下载的yaml文件中更改。
target_type: 'aprilgrid' #gridtype
tagCols: 6 #number of apriltags
tagRows: 6 #number of apriltags
tagSize: 0.02 #size of apriltag, edge to edge [m]
tagSpacing: 0.3 #ratio of space between tags to tagSize
codeOffset: 0 #code offset for the first tag in the aprilboard
数据集录制
首先需要将打印的标定板粘在墙上
我们先启动一个roscore,再分别启动双目相机、imu的ros包,发布话题。
然后开启录制
rosbag record -O stereocamera_imu_aprilgrid.bag /camera/image_left /camera/image_right /imu/data
在保证相机能够拍到标定板的情况下,进行偏航、俯仰、滚转方向的转动,并对于x、y、z三个方向分别进行平移,再加入一点随机运动即可。
标定过程
在kalibr工作空间下执行
source devel/setup.bash
rosrun kalibr kalibr_calibrate_imu_camera --target src/Kalibr/localdata/cfg/april_6x6_80x80cm.yaml --cam src/Kalibr/localdata/cfg/stereo.yaml --imu src/Kalibr/localdata/cfg/my_imu_imu_param.yaml --bag src/Kalibr/localdata/bags/stereocamera_imu_aprilgrid.bag
后面的地址都改成自己的地址就好。
很多其他的博客前面没加rosrun,不清楚是如何运行起来的,如果出现找不到kalibr的命令,记得加rosrun。
执行:
报了如下错误:
No module named 'wx',问题是缺少wx这个包,安装一下就好。
我的20.04直接pip安装会失败,改用以下命令。
pip3 install -U -f https://extras.wxpython.org/wxPython4/extras/linux/gtk3/ubuntu-20.04 wxPython
又出现了RuntimeError: [CameraChainParameters Reader]: invalid camera baseline (cam1 in src/Kalibr/localdata/cfg/stereo.yaml)这样的错误。
没有基线距离,说明是双目的外参提供的有问题,查看我的双目配置文件。
果然外参的地方少写了几个逗号,补全解决(上一部分提供的已经是修改后的内容了)
再次执行标定
发生Optimization failed的错误,这个问题可以通过执行标定时增加--timeoffset-padding参数来解决
最后的命令如下:
rosrun kalibr kalibr_calibrate_imu_camera --target src/Kalibr/localdata/cfg/april_6x6_80x80cm.yaml --cam src/Kalibr/localdata/cfg/stereo.yaml --imu src/Kalibr/localdata/cfg/my_imu_imu_param.yaml --bag src/Kalibr/localdata/bags/stereocamera_imu_aprilgrid.bag --timeoffset-padding 0.5
对于--timeoffset-padding这个参数,可以多尝试几次,来判断要取的值,取得越大,计算时间越长,而且可能会占满内存而直接被杀死;小的话就可能出现上述错误,默认应该值是0.03.
如果程序最后输出Killed,那就说明应该要调小了。
最后终于是成功完成了标定。
标定的结果可以在数据包的目录找到。
总的来说,Kalibr精度也不错,功能也比较强,但是第一次试错的时候还是比较麻烦,需要注意的细节和坑还是蛮多的。