使用kalibr标定双目相机以及IMU--安装运行标定全过程以及踩坑记录

一、准备工作

注意注意:需要提前搭建好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精度也不错,功能也比较强,但是第一次试错的时候还是比较麻烦,需要注意的细节和坑还是蛮多的。

  • 20
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值