kalibr相机标定和IMU标定

发布时间 2023-10-26 21:10:01作者: 小帆敲代码

相机标定

打印标定板和对应的aprilgrid.yaml

target_type: 'aprilgrid' #gridtype
tagCols: 6               #number of apriltags
tagRows: 6               #number of apriltags
tagSize: 0.038           #size of apriltag, edge to edge [m]
tagSpacing: 0.3          #ratio of space between tags to tagSize

录制.bag

使用rosbag record -O cam /color录制bag包

也可以通过以下命令调整频率

rosrun topic_tools throttle messages /camera/color/image_raw 4.0 /color

录一分钟左右,录的时候对着标定板移动,按下ctrl+c 结束录制

标定

kalibr_calibrate_cameras --target aprilgrid.yaml --bag camd4.bag --models pinhole-radtan --topics /color --show-extraction

我调用出错,应该使用rosrun去运行:

rosrun kalibr kalibr_calibrate_cameras --target target.yaml --bag cam.bag --models pinhole-radtan --topics /color --show-extraction

IMU标定

标定加速度偏差和零偏

在realsense驱动目录下librealsense/tools/rs-imu-calibration运行:

python rs-imu-calibration.py

我的路径:~/MyCodes/realsense/librealsense

标定其噪声模型

  • 安装imu标定工具到~/MyCatkinWs/imu_ws
  • 建立对应的launch文件:(~/MyCatkinWs/imu_ws/src/imu_utils/launch/d455_imu_calibration.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= "d455_imu_calibration"/>
        <param name="data_save_path" type="string" value= "$(find imu_utils)/data2/"/>
        <param name="max_time_min" type="int" value= "10"/>
        <param name="max_cluster" type="int" value= "100"/>
    </node>
</launch>

其中 是标定时间的意思

  • 修改 rs_camera.launch:(/opt/ros/noetic/share/realsense2_camera/launch/rs_camera.launch)
<arg name="gyro_fps"            default="200"/>
 <arg name="accel_fps"           default="200"/>
<arg name="enable_gyro" default="true"/>
<arg name="enable_accel" default="true"/>
<arg name="enable_sync" default="false"/> #这里存疑
<arg name="unite_imu_method" default="linear_interpolation"/>
  • 静止录制bag
roscore
roslaunch realsense2_camera rs_camera.launch 
rosbag record -O imu_calibration /camera/imu 
  • 标定
    终端1:
    source ~/MyCatkinWs/imu_ws/devel/setup.sh
    roslaunch imu_utils d455_imu_calibration.launch
    
    终端2:
    source ~/MyCatkinWs/imu_ws/devel/setup.sh 
    cd ~/MyCatkinWs/imu_ws //数据包在这个文件夹下
    rosbag play -r 200 imu_calibration.bag
    
    看(1)的terminal,会有一串东西产生,而且该terminal已经可以输入命令了(意味着标定进程已经结束),说明已经标定好了,这时候要看结果
    cd ~/MyCatkinWs/imu_ws/src/imu_utils/data2
    

里面有一个文件:
d455_imu_calibration_imu_param.yaml

联合标定

运行realsense后映射话题:

roslaunch realsense2_camera rs_camera.launch # 运行realsense
# 映射话题
rosrun topic_tools throttle messages /camera/color/image_raw 20.0 /color
rosrun topic_tools throttle messages /camera/imu 200.0 /imu

录制bag,要对着棋盘格(~/MyCatkinWs/kalibr_workspace/target.pdf),录制将近两分钟:

rosbag record -O dynamic /color /imu

根据第二部标定的imu(d455_imu_calibration_imu_param.yaml)。生成imu.yaml文件:
由于我们刚刚也是在kalibr工作环境下标定的,所以直接用刚刚标定好的相机yaml文件即可。
即上述所说的cam文件
camchain-…camd455i.yaml:

cam0:
  cam_overlaps: []
  camera_model: pinhole
  distortion_coeffs: [0.11114194921960645, -0.2171600270591326, -0.0037942616908056637,
    -0.004000340562604045]
  distortion_model: radtan
  intrinsics: [579.5589935482029, 578.1762234104125, 326.6772381912598, 243.3955018655041]
  resolution: [640, 480]
  rostopic: /color

标定:

rosrun kalibr kalibr_calibrate_imu_camera --target target.yaml --cam cam-camchain.yaml --imu imu.yaml --bag dynamic.bag --show-extraction

生成好多个文件,主要关注一个文件:
camchain-imucam-dynamic.yaml
并且确认重投影误差,我的误差为0.56个像素我看网上其他人能到0.15以下已经是很好的了。

参考:
https://blog.csdn.net/Hanghang_/article/details/103546033
https://zhuanlan.zhihu.com/p/396368225