kalibr标定D435i相机

文章参考:D435i kalibr标定环境部署及双目IMU标定文档_kalibr标定环境配置-优快云博客

目录

1. docker容器安装

2.安装kalibr的docker版

3. 标定环境配置

3.1 通过 apt 快速安装ceres:

3.2 安装 imu_utils 和 code_utils

4. IMU标定 

4.1 录制.bag数据

4.2 标定

4.3 标定结果

4. 双目相机标定

5. IMU+双目相机联合标定

6. 补充


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

### 使用 Kalibr 和 AprilTag 对 Intel RealSense D435i 进行双目标定 #### 准备工作 为了确保标定过程顺利进行,需确认设备和环境设置无误。首先,在 Ubuntu 18.04 上安装必要的驱动程序并验证 Realsense Viewer 可正常显示摄像头画面[^2]。 #### 创建 AprilTag 描述文件 针对特定尺寸的 AprilTags 标记,创建相应的描述文件 `april_6x6_50x50cm_A4.yaml`。此文件定义了标签的具体参数,特别是 tagSize 参数应基于实际测量的大格子边长设定。例如: ```yaml n_tags: 36 tag_size: 0.024 # 实际测量得到的大格子边长 tagcode: "36h11" board_rows: 6 board_cols: 6 ``` 该配置适用于 A4 纸打印的 50 cm × 50 cm 的棋盘格图案,其中包含了 36 个大小为 2.4 cm×2.4 cm 的正方形标记[^3]。 #### 关闭结构光 由于默认情况下启用的结构光可能会干扰标定流程中的特征检测效果,建议在执行标定时暂时禁用这一功能。可以通过 ROS 启动脚本实现这一点: ```bash roslaunch realsense2_camera rs_camera.launch enable_ir_emitter:=false ``` 上述命令将在不激活红外发射器的情况下启动相机节点。 #### 执行 Kalibr 标定 完成前期准备工作之后,可以利用 Kalibr 工具包来进行内外参估计。具体操作如下: 1. **采集图像序列** 利用移动平台携带相机围绕校准板缓慢匀速运动,收集多角度下的图像帧作为后续计算的基础素材。注意保持足够的覆盖范围以便获得更精确的结果。 2. **运行 kalibr_calibrate_cameras 命令** 将获取的数据集路径传递给 Kalibr 提供的 Python 脚本以发起正式的标定请求。假设数据存储于 `/path/to/dataset/` 文件夹内,则指令形式如下所示: ```bash kalibr_calibrate_cameras --target april_6x6_50x50cm_A4.yaml --bag /path/to/dataset/*.bag ``` 此处指定的目标模板即前面提到过的自定义 YAML 文件;而 .bag 文件则封装了一系列时间戳同步后的 RGB-D 图像流片段[^1]。 3. **分析输出结果** 成功完成后,Kalibr 应返回一组优化后的摄像机内部参数矩阵 K、失真系数向量 D 以及其他关联信息。这些数值对于后续应用至关重要,比如机器人导航或三维重建等领域。 #### 结果保存与验证 最后一步是对所得模型的质量加以检验,并将其持久化存档方便日后调用。通常做法是将关键属性写入 JSON 或者 XML 文档中去。此外还可以借助可视化工具直观感受重投影误差分布状况来辅助判断整体性能优劣程度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值