SDK ROS2 功能包使用说明
文件结构
SDK ROS2 部分位于 rdk-imu-module-sdk/ros2,它以 C-API 为依赖。ros2 目录实际为一个工作空间目录,可以在该目录下构建功能包,文件结构如下:
构建前:
ros2/
└── src
└── rdk_imu_module
├── CMakeLists.txt # 构建工具
├── launch
│ └── rdk_imu.launch.py # launch 启动文件
├── package.xml
├── scripts
│ └── imu_stress_test.py # 压力测试脚本
└── src
└── rdk_imu_node.cpp # 节点源码
构建后:
ros2/
├── install/
├── build/
├── log/
└── src/
构建方法
构建 ROS2 功能包前,必须保证 SDK 的 C-API 的动态库已被编译,即 core/lib 中的 .so、.so.x 和 .so.x.x.x 都存在。ROS2 功能包依赖该动态库文件,但无需用户手动移动,cmake 会自动检测并安装到 install 目录中。
激活环境后在 ros2 目录下使用 colcon build 即可编译。
接口说明
节点功能
- 融合数据输出:调用 C API 的
rdk_imu_read_fused()进行一维线性插值,输出时间对齐的六轴数据。 - 协方差自动计算:根据当前配置的加速度计滤波带宽和陀螺仪带宽,结合 BMI088 手册噪声密度,自动计算并填充
linear_acceleration_covariance和angular_velocity_covariance的对角方差值。 - 运行控制:提供 ROS2 服务,可在运行中随时暂停/恢复 IMU 数据采集。
- 灵活的参数配置:所有传感器参数、话题名、服务名均可通过 ROS 参数在启动时配置。
启动方式
确保已编译 ROS 2 包并 source 了工作空间,然后使用提供的 launch 文件启动:
source install/setup.bash
ros2 launch rdk_imu_module rdk_imu.launch.py
节点默认以 rdk_imu_node 为名启动,输出日志到屏幕。
发布话题
-
默认话题名:
/rdkimu/data -
消息类型:
sensor_msgs/msg/Imu -
内容:
header.stamp:融合后的时间戳(基于CLOCK_MONOTONIC的纳秒级硬件时间)header.frame_id:坐标系名称,默认imu_linklinear_acceleration:加速度计三轴数据,单位 m/s²angular_velocity:陀螺仪三轴数据,单位 rad/sorientation:未提供,四元数恒为 (0,0,0,1)- 协方差矩阵:加速度计和陀螺仪的对角方差已根据传感器带宽和噪声密度计算并填充;姿态协方差全部置为 -1(未知)
提示话题名可通过参数
imu_topic或 ROS 2 重映射机制修改。
服务
节点提供两个 std_srvs/srv/Trigger 类型服务,用于运行时控制数据采集:
| 服务名(默认) | 功能 |
|---|---|
~/enable | 使能 IMU 数据采集(启动中断线程) |
~/disable | 暂停 IMU 数据采集(关闭中断线程) |
提示
服务名也可通过参数 enable_service_name 和 disable_service_name 配置。
可配置参数
以下参数均可在 launch 文件或命令行中指定,节点启动时读取,运行时不可更改:
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
frame_id | string | imu_link | IMU 消息的坐标系 ID |
fuse_by | string | accel | 融合基准传感器,可选 accel 或 gyro |
max_age_ns | int | 50000000 | 融合插值允许的最大时间差(纳秒),建议为 ODR 周期的 3 倍以上 |
publish_rate | double | 0.0 | 固定发布频率(Hz),0.0 表示有数据即发 |
auto_start | bool | true | 节点启动后是否自动开始数据采集 |
imu_topic | string | rdkimu/data | 发布 IMU 数据的话题名 |
enable_service_name | string | ~/enable | 使能服务名称 |
disable_service_name | string | ~/disable | 禁用服务名称 |
accel_bwp | string | NORMAL | 加速度计滤波模式,可选 OSR4、OSR2、NORMAL |
accel_odr | string | 400 | 加速度计采样频率,可选 12_5、25、...、1600 |
accel_range | string | 24G | 加速度计量程,可选 3G、6G、12G、24G |
gyro_range | string | 2000DPS | 陀螺仪量程,可选 125DPS ~ 2000DPS |
gyro_bandwidth | string | ODR400_BW47 | 陀螺仪带宽,可选 ODR2000_BW532 等(见枚举) |
accel_drdy_int | string | INT1 | 加速度计中断引脚,可选 INT1 或 INT2 |
accel_int_gpio_mode | string | PP_H | 加速度计中断 GPIO 模式,可选 PP_H、PP_L、OD_H、OD_L |
gyro_drdy_int | string | INT3 | 陀螺仪中断引脚,可选 INT3 或 INT4 |
gyro_int_gpio_mode | string | PP_H | 陀螺仪中断 GPIO 模式,取值同上 |
accel_drdy_gpio_chip | int | 4 | SoC 端加速度计中断 GPIO chip 号 |
accel_drdy_gpio_line | int | 2 | SoC 端加速度计中断 GPIO line 号 |
gyro_drdy_gpio_chip | int | 3 | SoC 端陀螺仪中断 GPIO chip 号 |
gyro_drdy_gpio_line | int | 12 | SoC 端陀螺仪中断 GPIO line 号 |
fifo_length | int | 256 | 软件 FIFO 长度(帧数) |
fifo_mode | string | OVERWRITE | FIFO 满时策略,可选 DROP 或 OVERWRITE |
irq_priority | int | -1 | 中断线程实时优先级(-1 为自动) |
irq_thread_timeout_ns | int | 1000000000 | 中断线程等待超时时间(纳秒) |
上述传感器参数与 C API 的 rdk_imu_config_t 一一对应,详细介绍请参阅 C-API 使用说明。
运行示例
查看实时数据:
ros2 topic echo /rdkimu/data
ros2 topic hz /rdkimu/data
暂停/恢复采集:
ros2 service call /rdk_imu_node/enable std_srvs/srv/Trigger
ros2 service call /rdk_imu_node/disable std_srvs/srv/Trigger
使用自定义参数启动(例如修改话题名和频率):
ros2 launch rdk_imu_module rdk_imu.launch.py imu_topic:=/my_imu publish_rate:=200.0