文章参考:D435i kalibr标定环境部署及双目IMU标定文档_kalibr标定环境配置-优快云博客
目录
1. docker容器安装
参考:Ubuntu安装docker教程 - unique_pursuit - 博客园
2.安装kalibr的docker版
2.1 下载kalibr镜像,下载地址 https://github.com/ethz-asl/kalibr
2.2 在 kalibr的文件夹下打开终端,运行:(根据自己需要的ros版本选择16_04/18_04/20_04)
docker build -t kalibr -f Dockerfile_ros1_18_04 .
ps:编译,自动安装依赖库,运行时间较长
ps:kalibr/Dockerfile_ros1_18_04
的第一行:FROM slam_all:v2.0,表示该 Dockerfile 是基于 ROS Melodic 的官方镜像构建的。这个 Dockerfile 的逻辑是 以 ROS Melodic 官方镜像为基础,直接在其上安装 Kalibr
2.3 使用kalibr镜像创建容器:
docker run -it --name kalibr -v /home/zkl/kalibr_ws:/catkin_ws --device=/dev/bus/usb:/dev/bus/usb --privileged kalibr
3. 标定环境配置
3.1 通过 apt 快速安装ceres:
# 安装预编译版本(Ubuntu 18.04/Melodic 可用)
sudo apt-get update
sudo apt-get install -y libceres-dev
# 验证安装
ldconfig -p | grep ceres # 应输出 libceres.so 路径
3.2 安装 imu_utils 和 code_utils
imu_utils下载地址为:https://github.com/gaowenliang/code_utils code_utils下载地址为: https://github.com/gaowenliang/code_utils 由于imu_utils 依赖 code_utils,所以先把code_utils放在工作空间的src下面,进行编译。然后再将imu_utils放到src下面,再编译。否则会报错。
编译命令:先编译 imu_utils ,再编译 code_utils
# 在 /catkin_ws下
catkin build imu_utils
# 编译完 imu_utils 后
catkin build code_utils
如果有报错,参考这篇文章都可以解决:D435i kalibr标定环境部署及双目IMU标定文档_kalibr标定环境配置-优快云博客
4. IMU标定
4.1 录制.bag数据
将设备静止不动,录制两个小时的rosbag。
# 终端1
roslaunch realsense2_camera rs_camera.launch \
enable_gyro:=true \
enable_accel:=true \
unite_imu_method:=linear_interpolation
# 终端2
# 最好在自己的 /catkin_ws/data 路径下录制
rosbag record -O D435i_imu /camera/imu
4.2 标定
录制完成后,400倍速回放rosbag,并运行launch文件进行标定。
在/imu_utils/launch/文件夹下面新建一个D435i_imuCali.launch:
<launch>
<node pkg="imu_utils" type="imu_an" name="imu_an" output="screen">
<param name="imu_topic" type="string" value= "/camera/imu"/>
<param name="imu_name" type="string" value= "Realsense"/>
<param name="data_save_path" type="string" value= "$(find imu_utils)/data/"/>
<param name="max_time_min" type="int" value= "120"/>
<param name="max_cluster" type="int" value= "100"/>
</node>
</launch>
然后运行:
# 终端1
rosparam set /use_sim_time true
# 终端2
roslaunch imu_utils D435i_imuCali.launch imu_topic:=/camera/imu
# 终端3
rosbag play -r 400 --clock D435i_imu.bag
4.3 标定结果
在/imu_utils/data文件夹下生成标定结果,Realsense_imu_param.yaml:
ps: 每项之所以有四个,第一个是平均,后面三个是对应x y z三个轴的,我们只需要取角速度和加速度的里面平均部分的值就可以了
%YAML:1.0
---
type: IMU
name: Realsense
Gyr:
unit: " rad/s"
avg-axis: # 陀螺仪三轴平均噪声参数
gyr_n: 1.6220472470812495e-03 # 角速度随机游走噪声(Rad/s/√Hz)
gyr_w: 1.8458982805454036e-05 # 角速度零偏不稳定性(Rad/s²)
x-axis: # X轴独立参数
gyr_n: 1.1538651992283363e-03
gyr_w: 7.9177505873678760e-06
y-axis: # Y轴独立参数
gyr_n: 2.0910398789612044e-03
gyr_w: 3.3466005702407785e-05
z-axis:
gyr_n: 1.6212366630542080e-03
gyr_w: 1.3993192126586451e-05
Acc:
unit: " m/s^2"
avg-axis: # 加速度计三轴平均噪声参数
acc_n: 1.5052633137182039e-02 # 加速度随机游走噪声(m/s²/√Hz)
acc_w: 3.1509397865574267e-04 # 加速度零偏不稳定性(m/s³)
x-axis: # X轴独立参数
acc_n: 1.6266856565414749e-02
acc_w: 2.3570108410503088e-04
y-axis:
acc_n: 1.2699705637367179e-02
acc_w: 3.3738746676099474e-04
z-axis:
acc_n: 1.6191337208764190e-02
acc_w: 3.7219338510120255e-04
4. 双目相机标定
确保D435i相机稳固不动,标定板(如棋盘格)可自由移动
(1)下载标定板
(2)启用Realsense
roslaunch realsense2_camera rs_camera.launch \
enable_infra1:=true \
enable_infra2:=true \
enable_sync:=true
检查左右相机同步状态
# 同时输出左右相机前10帧时间戳(对齐显示)
paste -d '|' \
<(rostopic echo -n 10 /camera/infra1/image_rect_raw/header/stamp | awk '/secs|nsecs/{print $2}') \
<(rostopic echo -n 10 /camera/infra2/image_rect_raw/header/stamp | awk '/secs|nsecs/{print $2}') |
column -t -s '|'
(3) 图像频率控制(关键步骤)
# 说明: 4.0是目标频率, /infra_left是话题重映射
# 新建终端:左右红外相机降频
rosrun topic_tools throttle messages /camera/infra1/image_rect_raw 4.0 /infra_left &
rosrun topic_tools throttle messages /camera/infra1/camera_info 4.0 /infra_left/camera_info &
rosrun topic_tools throttle messages /camera/infra2/image_rect_raw 4.0 /infra_right &
rosrun topic_tools throttle messages /camera/infra2/camera_info 4.0 /infra_right/camera_info
(4)实时监控, 保证两个摄像头可以同时、完整看到标定版,且图像清晰不模糊
# 终端1:打开左图像窗口
rqt_image_view /infra_left &
rqt_image_view /infra_right
(5)录制数据包
# 在目标目录下录制,我是在 /catkin_ws/data 下运行
rosbag record -O stereo_calib.bag \
/infra_left \
/infra_left/camera_info \
/infra_right \
/infra_right/camera_info
标定板移动要遵循:(均持续20秒)
前后:缓慢靠近/远离相机
左右:横向平移覆盖视野
上下:垂直移动
倾斜:绕X/Y轴旋转±30°
旋转: 绕Z轴旋转
(6).bag 文件检查
rosbag info stereo_calib.bag
输出应该包含:
topics:
/infra_left 1000 msgs : sensor_msgs/Image
/infra_right 1000 msgs : sensor_msgs/Image
...camera_info 1000 msgs : sensor_msgs/CameraInfo
(7)标定
创建apriltags.yaml文件,根据自己的标定板实际尺寸创建,这个是我的标定板.yaml文件:
target_type: 'aprilgrid' #gridtype
tagCols: 6 #number of apriltags
tagRows: 6 #number of apriltags
tagSize: 0.0210 #size of apriltag, edge to edge [m]
tagSpacing: 0.295 #ratio of space between tags to tagSize
#example: tagSize=2m, spacing=0.5m --> tagSpacing=0.25[-]
我将创建的apriltags.yaml文件放在了 /catkin_ws/data下,同样,刚采集的 stereo_calib.bag 也在这个文件夹下,运行:
# Kalibr标定
# 这三行代码只针对我的docker容器,存在问题:不能可视化
export DISPLAY=:1
export KALIBR_MANUAL_FOCAL_LENGTH_INIT="380,380"
Xvfb :1 -screen 0 1280x720x16 &
# apriltags.yaml文件需要自己创建
rosrun kalibr kalibr_calibrate_cameras \
--bag stereo_calib.bag \
--models pinhole-radtan pinhole-radtan \
--target apriltags.yaml \
--topics /infra_left /infra_right
(8)标定结果
标定生成三个文件:
5. IMU+双目相机联合标定
(1)启用realsense-viewer
roslaunch realsense2_camera rs_camera.launch \
enable_infra1:=true \
enable_infra2:=true \
enable_sync:=true \
enable_gyro:=true \
enable_accel:=true \
unite_imu_method:=linear_interpolation
(2)图像频率控制
# 说明: 20.0是目标频率, /infra_left是话题重映射
# 新建终端:左右红外相机降频
rosrun topic_tools throttle messages /camera/infra1/image_rect_raw 20.0 /infra_left &
rosrun topic_tools throttle messages /camera/infra1/camera_info 20.0 /infra_left/camera_info &
rosrun topic_tools throttle messages /camera/infra2/image_rect_raw 20.0 /infra_right &
rosrun topic_tools throttle messages /camera/infra2/camera_info 20.0 /infra_right/camera_info &
rosrun topic_tools throttle messages /camera/imu 200.0 /imu
(3)实时监控, 保证两个摄像头可以同时、完整看到标定版,且图像清晰不模糊
# 终端1:打开左图像窗口
rqt_image_view /infra_left &
rqt_image_view /infra_right
(4)录制数据包
标定板静止,D435i移动,四个维度移动,前后左右上下及倾斜
rosbag record -O imu_stereo.bag \
/infra_left \
/infra_left/camera_info \
/infra_right \
/infra_right/camera_info \
/imu
(5)标定
# kalibr_calibrate_imu_camera --target 标定板yaml文件 --cam 双目yaml文件 --imu imu的yaml文件 --bag 双目IMU录包
# 将上述4个文件都放在catkin_ws/data 下
rosrun kalibr kalibr_calibrate_imu_camera --target apriltags.yaml --cam stereo_calib-camchain.yaml --imu imu.yaml --bag imu_stereo.bag
(6)标定结果
标定生成四个文件
6. 补充
6.1. 保存容器为镜像
将自己之前的容器保存成镜像拷贝到另一台电脑:
# 保存镜像到.tar 文件
# 语法:docker save -o 输出文件名.tar 镜像名[:标签]
docker save -o kalibr_backup.tar kalibr:latest
# 在另一台电脑上加载镜像
docker load -i kalibr_backup.tar
# 验证
docker images | grep kalibr
6.2 报错
问题:根据编译日志,sm_python
已成功编译,但 sm
模块仍无法导入
- 编译成功:检查日志(catkin build sm_python --no-deps --verbose)显示
sm_python
正确构建并生成了libsm_python.so
- 路径异常:Python模块被安装到了非标准路径
/catkin_ws/devel/lib/python2.7/dist-packages/sm/
(多了一层sm
子目录)
解决:创建符号链接
ln -s /catkin_ws/devel/lib/python2.7/dist-packages/sm /catkin_ws/devel/lib/python2.7/dist-packages/sm_python