vins-fusion 相机联合标定 D435i标定摄像头和IMU笔记

一、imu的校准

校准准备

1.将相机和电脑通过USB3.0连接
2.下载标定工具库:librealsense/tools/rs-imu-calibration at master · IntelRealSense/librealsense · GitHub
3.下载python工具: sudo pip3 install pyrealsense2(大概率已经安装过)

开始校准

具体步骤见官方文档:librealsense/tools/rs-imu-calibration at master · IntelRealSense/librealsense · GitHub

或者参考优质博客:D435i相机固件升级-imu校准-单目和imu及双目和imu外参标定-VINSfusion运行双目+imu(完整版)_d435i标定-优快云博客

ps:遇到的问题:

  • Status.wait_to_stable: 2.8 (secs)出现但是每次都不加载[...]

解决:我在使用ubuntu18.04时出现这种情况,并未曾找到解决方法;但通过与客服沟通使用22.04成功解决。虽然官方建议使用ubuntu18.04 / 16.04

  • python rs-imu-calibration.py 不能运行

问题描述:

找不到命令“python”,您的意思是:

command 'python3' from deb python3

command 'python' from deb python-is-python3

 问题解决:

因为ubuntu20.04默认的python版本时python 3.x,所以应该使用命令 python3 rs-imu-calibration.py

这是官方建议使用18.04的原因,代码时按照python 2.x编写,因此引出下一个问题

  •  成功矫正,最后保存时卡住

问题描述:

输入Y后卡住:

rs-imu-calibration.py:703: DeprecationWarning: tostring() is deprecated. Use tobytes() instead.
  outfile.write(imu_calib_table.astype('f').tostring())
Would you like to write the results to the camera? (Y/N)Y

问题解决:

python2.x和python3.x部分差别问题

将rs-imu-calibration.py文件复制,并更名为rs-imu-calibration-py3.py

在703行,用该行代码替换:outfile.write(imu_calib_table.astype('f').tobytes())

二、相机启动参数调整

在自己的工作空间下:catkin_RealSense_ws/src/realsense-ros/realsense2_camera/launch/的rs_camera.launch文件

或者先进入工作空间打开

cd realsense_ws   
gedit src/realsense-ros/realsense2_camera/launch/rs_camera.launch 

把rs_camera.launch中的unite_imu_method和enable_sync改为如下所示:分别用于发布IMU信息和相机与IMU进行时间同步

  <arg name="unite_imu_method"      default="copy"/>
  <arg name="enable_sync"      default="true"/>

之后录制的相机 

  <arg name="infra_width"         default="640"/>
  <arg name="infra_height"        default="480"/>
  <arg name="color_width"         default="640"/>
  <arg name="color_height"        default="480"/>

三、imu标定

参考一

D435i相机固件升级-imu校准-单目和imu及双目和imu外参标定-VINSfusion运行双目+imu(完整版)_d435i标定-优快云博客

 那个博客从 2.配置港科大IMU标定程序的环境开始

参考二

D435i标定摄像头和IMU笔记三(IMU标定篇)_d435i标定摄像头和imu笔记三(imu标定篇)-优快云博客

 ps:

  1. 参考博客时一定注意看自己是否能看懂目录,这两个目录都有两次相机和imu的标定,他们并不是顺承关系,而是并列关系。个人理解:录制只录制/color(只有一个image话题)的展示的是单目+imu的联合标定                        录制//infra_left /infra_right的展示的时双目+imu       不是顺承关系!!!
  2. 两个博客中对于录制时是否可以移动相机存在争议,个人建议不要移动录制2h

ps: imu数据如何取

我的标定数据如下 

%YAML:1.0
---
type: IMU
name: d435i_imu_calibration
Gyr:
   unit: " rad/s"
   avg-axis:
      gyr_n: 7.2004032685336191e-03        # 有用
      gyr_w: 3.7255102712542191e-04        # 有用
   x-axis:
      gyr_n: 3.5715854552042544e-03
      gyr_w: 1.3742887805508438e-04
   y-axis:
      gyr_n: 2.7323144545256263e-03
      gyr_w: 2.7310167319703311e-05
   z-axis:
      gyr_n: 1.5297309895870975e-02
      gyr_w: 9.5291403600147808e-04
Acc:
   unit: " m/s^2"
   avg-axis:
      acc_n: 2.3513961209785134e-02        # 有用
      acc_w: 8.0968416717708996e-04        # 有用
   x-axis:
      acc_n: 2.4924652367128108e-02
      acc_w: 8.5925263835753525e-04
   y-axis:
      acc_n: 2.3496502658774822e-02
      acc_w: 9.4846708895731280e-04
   z-axis:
      acc_n: 2.2120728603452468e-02
      acc_w: 6.2133277421642171e-04

 上面标注"有用"的,后面在联合标定的时候需要用到

rostopic: /imu
update_rate: 200.0 # Hz
accelerometer_noise_density: 2.3513961209785134e-02
accelerometer_random_walk: 8.0968416717708996e-04
gyroscope_noise_density: 7.2004032685336191e-03
gyroscope_random_walk: 3.7255102712542191e-04

四、相机标定

D435i标定摄像头和IMU笔记二(RGB摄像头标定篇)_realsense d435i 标定 rgb imu-优快云博客

ps:注意事项:

  • 生成checkboard.yaml,步骤具体如下(翻录自上面博客):
  1. 创建一个文件夹,用来保存摄像头校正数据。
    mkdir -p ~/calib_data/camera_calib
    cd ~/calib_data/camera_calib
    

2.建立标定yaml文件:

gedit checkerboard.yaml

target_type: 'checkerboard' #gridtype
targetCols: 5               #number of internal chessboard corners
targetRows: 8               #number of internal chessboard corners
rowSpacingMeters: 0.045      #size of one chessboard square [m]
colSpacingMeters: 0.045      #size of one chessboard square [m]
复制进去

 3.生成checkboard.yaml文件

rosrun kalibr kalibr_create_target_pdf --type apriltag --nx 6 --ny 6 --tsize 0.03 --tspace 0.3

如果不能运行,可能是在前面的过程中没有成功把库kalibr的source加载到.bashrc里面

可以尝试在需要执行命令的终端:source ~/kalibr_workspace/devel/setup.bash

注意路径;每次新开一个终端都需要重新source

 生成的纸张如下:

修订chechboard.yaml

因为大概论无法按照原尺寸打印出来,所以需要修订checkboard.yaml文件中的

tagSize: 0.024        
tagSpacing: 0.292         

然后测量黑块的边长a,和两个黑块的间距b

tagSize: a

tagSpacing: b/a     

a转化为m,“:”后要有一个“space”

比如我修订的最终文件:

target_type: 'aprilgrid' #gridtype
tagCols: 6               #number of apriltags
tagRows: 6               #number of apriltags
tagSize: 0.024           #size of apriltag, edge to edge [m]
tagSpacing: 0.292          #ratio of space between tags to tagSize
#example: tagSize=2m, spacing=0.5m --> tagSpacing=0.25[-]

五、联合标定

D435i相机固件升级-imu校准-单目和imu及双目和imu外参标定-VINSfusion运行双目+imu(完整版)_d435i标定-优快云博客

从该博客的六 --- 2.双目相机和IMU之间的标定看起 

六、参数带入

D435i相机固件升级-imu校准-单目和imu及双目和imu外参标定-VINSfusion运行双目+imu(完整版)_d435i标定-优快云博客

从第七看起

七、正式使用 

如果仍然偏差很大,需要检查结构过是否关闭
如果没有关闭,在realsense_ws文件中修改对应launch文件(就是启动相机的launch文件)

不是vins的文件

<arg name="emitter_enable"              default="false"/>
 
    <!-- rosparam set /camera/stereo_module/emitter_enabled false -->
    <rosparam>
      /camera/stereo_module/emitter_enabled: 0
    </rosparam>
     
    <rosparam if="$(arg emitter_enable)">
      /camera/stereo_module/emitter_enabled: 1
    </rosparam>

八、说明

本篇博客仅仅是对上述两篇博客的解读,非常感谢上述博客作者的付出!!!

内容主要来自下面三份博客:

D435i标定摄像头和IMU笔记二(RGB摄像头标定篇)_realsense d435i 标定 rgb imu-优快云博客

D435i相机固件升级-imu校准-单目和imu及双目和imu外参标定-VINSfusion运行双目+imu(完整版)_d435i标定-优快云博客

使用Kalibr进行Camera-IMU联合标定 | 所念皆星河

非常感谢!!!

<think>嗯,用户的问题是关于VINS-Fusion在ROS2环境下使用D435i相机时的RELIABILITY_QOS_POLICY。用户引用了两段参考资料,其中第一段提到D455运行VINS-Fusion时遇到QoS策略不兼容的问题,用户修改了代码来解决。第二段是关于SLAM技术的介绍,似乎当前问题关联不大。 用户可能正在部署VINS-FusionD435i的组合,遇到了类似的QoS兼容性问题。虽然用户引用的是D455的例子,但D435iD455都使用RealSense驱动,IMU数据的QoS策略应该相同。用户深层需求可能是想高效解决订阅失败的问题,避免走弯路。 这个问题需要从几个层面解答:首先解释QoS策略冲突的原理(为什么BEST_EFFORTRELIABLE不兼容),然后给出具体修改方案(参考D455的解法是否适用D435i),最后补充注意事项(比如是否影响算法精度)。用户提供的代码片段很有价值,可以直接作为解决方案的核心。 值得注意的是,用户引用的代码修改位置(vins_node.cpp)参数(KeepLast队列长度、VOLATILE耐久性)都是关键点,需要保留说明。另要提醒用户,D435iIMU话题名可能与示例不同,需要核对。 安全方面,需强调修改核心算法文件的风险,建议备份。技术上要确认ROS2版本——因为FoxyHumble的QoS API略有不同,但用户示例是Humble版本,所以按此处理。 </think>在ROS2环境下使用D435i相机运行VINS-Fusion时,**RELIABILITY_QOS_POLICY**的兼容性是需要重点关注的问题。以下是核心要点与解决方案: --- ### **问题本质** 1. **QoS策略冲突** - RealSense驱动(`realsense-ros`)发布的IMU数据**默认采用`BEST_EFFORT`可靠性策略**(允许少量数据丢失,适合高频传感器数据)。 - VINS-Fusion订阅IMU话题时**默认要求`RELIABLE`策略**(保证数据完整传输,适用于关键指令)。 - 策略不匹配导致ROS2无法建立通信链路,表现为**IMU数据无法接收**[^1]。 2. **D435i与D455的一致性** D435i与D455的RealSense ROS2驱动使用**相同的QoS策略逻辑**,因此解决方案完全通用。 --- ### **解决方法:修改VINS-Fusion订阅参数** 需在VINS-Fusion源码中**显式声明兼容的QoS配置**: 1. **定位代码文件** 打开VINS-Fusion的ROS2节点文件(通常为`vins_node.cpp`): ```bash nano ~/vins_Fusion_ws/src/VINS-Fusion-ROS2/vins/src/vins_node.cpp ``` 2. **修改IMU订阅的QoS配置** 在IMU订阅部分添加自定义QoS配置: ```cpp if (USE_IMU) { // 创建兼容RealSense的QoS配置 rclcpp::QoS imu_qos(rclcpp::KeepLast(2000)); // 保留最新2000条消息 imu_qos.reliability(RMW_QOS_POLICY_RELIABILITY_BEST_EFFORT); // 匹配RealSense驱动 imu_qos.durability(RMW_QOS_POLICY_DURABILITY_VOLATILE); // 数据不持久化 // 应用自定义QoS订阅IMU话题 sub_imu = n->create_subscription<sensor_msgs::msg::Imu>( IMU_TOPIC, imu_qos, // 关键修改:替换默认QoS imu_callback ); } ``` **关键参数说明:** - `KeepLast(2000)`: 足够大的缓冲区应对IMU高频数据(通常100-400Hz)。 - `BEST_EFFORT`: 与RealSense驱动策略一致。 - `VOLATILE`: 避免数据堆积导致延迟[^1]。 3. **重新编译并验证** ```bash cd ~/vins_Fusion_ws colcon build --packages-select vins source install/setup.bash ros2 run vins vins_node ``` 检查终端是否输出IMU数据接收日志,或通过`ros2 topic echo /imu_topic`确认数据流。 --- ### **注意事项** 1. **不同ROS2版本的API差异** - Foxy版本:使用`rmw_qos_profile_sensor_data`(包含`BEST_EFFORT`配置)。 - Humble/Galactic版本:需显式声明QoS对象(如上述代码)。 2. **其他传感器的兼容性** 若同时使用相机话题,需检查其QoS策略(通常为`RELIABLE`),无需修改。 3. **对算法稳定性的影响** `BEST_EFFORT`策略可能导致少量IMU数据丢失,但VINS-Fusion内置时间戳对齐插值机制,通常不影响定位精度。 --- ### **为何必须修改?** ROS2的**QoS策略是订阅建立的硬性条件**。若发布/订阅端策略不兼容(如`RELIABLE` vs `BEST_EFFORT`),通信链路将直接断开。此问题常见于依赖部硬件的SLAM系统部署中[^2]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值