使用RDK imu x5的板子无法读取i2c 上的数据 并且 spi输出的数据不正常非常怪异

RDX x5 imu无法读取i2c数据并且spi数据怪异不正常

我按官方的imu_sensor文件夹以及官方给的飞书文档依旧无法读取到数据终端输出的数据如下

root@ubuntu:~/hobot_imu_sensor/rdk_imu/imu# ros2 launch imu_sensor imu_sensor.launch.py
[INFO] [launch]: All log files can be found below /root/.ros/log/2026-05-24-18-46-54-810741-ubuntu-23037
[INFO] [launch]: Default logging verbosity is set to INFO
config_file_path is /opt/tros/humble/lib/imu_sensor/config/bmi088.yaml
[INFO] [imu_sensor-1]: process started with pid [23050]
[imu_sensor-1] 0xaa
[imu_sensor-1] 0x8a
[imu_sensor-1] 0x03
[imu_sensor-1] 0x02
[imu_sensor-1] 0x00
[imu_sensor-1] 0x01
[imu_sensor-1] bmi088 configuration:
[imu_sensor-1] i2c_bus: 5
[imu_sensor-1] acc_range: 12
[imu_sensor-1] gyro_range: 1000
[imu_sensor-1] acc_bandwidth: 40
[imu_sensor-1] gyro_bandwidth: 40
[imu_sensor-1] group_delay: 7
[imu_sensor-1] imu_data_path: /dev/input/event2
[imu_sensor-1] imu_virtual_path: /sys/devices/virtual/input/input2/
[imu_sensor-1] imu driver is already installed.
[imu_sensor-1] -------
[imu_sensor-1] set imu: i2cset -f -y 5 0x19 0x40 0x8a, result:
[imu_sensor-1] -------
[imu_sensor-1] -------
[imu_sensor-1] set imu: i2cset -f -y 5 0x19 0x41 0x2, result:
[imu_sensor-1] -------
[imu_sensor-1] -------
[imu_sensor-1] set imu: i2cset -f -y 5 0x69 0x0F 0x1, result:
[imu_sensor-1] -------
[imu_sensor-1] failed to get irq of imu number
[imu_sensor-1] poll failed: 0!
[imu_sensor-1] poll failed: 0!
[imu_sensor-1] poll failed: 0!
[imu_sensor-1] poll failed: 0!
[imu_sensor-1] poll failed: 0!
[imu_sensor-1] poll failed: 0!
[imu_sensor-1] poll failed: 0!
[imu_sensor-1] poll failed: 0!
[imu_sensor-1] poll failed: 0!
[imu_sensor-1] poll failed: 0!
[imu_sensor-1] poll failed: 0!
[imu_sensor-1] poll failed: 0!
[imu_sensor-1] poll failed: 0!
[imu_sensor-1] poll failed: 0!
[imu_sensor-1] poll failed: 0!
[imu_sensor-1] poll failed: 0!
[imu_sensor-1] poll failed: 0!
[imu_sensor-1] poll failed: 0!
[imu_sensor-1] poll failed: 0!
[imu_sensor-1] poll failed: 0!

然后spi运行官方的….test.py

所给出的数据原始寄存器…

X: 125 0 Y: 219 0 Z: 227 20
X: 127 0 Y: 241 0 Z: 172 20
X: 145 0 Y: 249 0 Z: 112 20
X: 130 0 Y: 243 0 Z: 209 20
X: 137 0 Y: 232 0 Z: 174 20
X: 139 0 Y: 242 0 Z: 12 20
X: 144 0 Y: 251 0 Z: 227 20
X: 128 0 Y: 253 0 Z: 66 20
X: 134 0 Y: 234 0 Z: 180 20
X: 155 0 Y: 247 0 Z: 160 20原始数据不太正常

Accelerometer ID: 0x1e (Expected: 0x1e)
Gyroscope ID: 0xf (Expected: 0xf)
BMI088 initialized successfully.
Accelerometer - X: -21248, Y: 29183, Z: -21503
Gyroscope - X: 36, Y: -86, Z: -54
Accelerometer - X: -26860, Y: 27903, Z: -24063
Gyroscope - X: 36, Y: -70, Z: -24
Accelerometer - X: -29420, Y: 26367, Z: -20991
Gyroscope - X: 92, Y: -14, Z: 70
Accelerometer - X: -25324, Y: 26367, Z: -19199
Gyroscope - X: -12, Y: 18, Z: -74
Accelerometer - X: -25580, Y: 27135, Z: -19967
Gyroscope - X: 28, Y: -56, Z: -96
Accelerometer - X: -29676, Y: 23551, Z: -18175
Gyroscope - X: 46, Y: 4, Z: -58
Accelerometer - X: -24812, Y: 21503, Z: -23551
Gyroscope - X: -64, Y: 14, Z: 102
Accelerometer - X: -26092, Y: 24575, Z: -18943
Gyroscope - X: -48, Y: -38, Z: 142正常吗
Accelerometer - X: -27628, Y: 25855这是脚本运行出的数据根本不对

我来帮你分析这个 IMU 问题。先搜索一下社区是否有类似案例。

问题分析

根据你的日志和错误信息,核心问题可能出在以下几点:

  1. 通信方式混淆:RDK X5 板载 IMU 通常使用 SPI 通信(如 ICM-42688),而你尝试用 I2C 驱动 BMI088,可能存在硬件不匹配。
  2. 中断配置失败failed to get irq of imu number 表明设备树中未正确配置 IMU 的中断引脚。
  3. SPI 数据异常:原始寄存器数据波动大,可能是 SPI 时钟频率、模式或接线问题。

解决步骤

:one: 确认 IMU 型号和通信方式

  • 板载 IMU:RDK X5 默认使用 SPI 接口的 ICM-42688(非 BMI088)。
  • 外接 BMI088:需确认是否通过 40Pin 的 I2C 或 SPI 连接,并检查接线。
# 检查 I2C 设备
i2cdetect -y 5  # 确认 0x19 (BMI088 ACC) 和 0x69 (BMI088 GYRO) 是否存在

# 检查 SPI 设备
ls /dev/spi*  # 确认 SPI 设备节点

:two: 检查设备树配置

  • SPI 模式:若使用 SPI,需确保设备树中启用了 SPI 控制器并配置了正确的片选引脚。
  • 中断引脚:BMI088 需要中断引脚触发数据就绪,检查设备树中是否配置了 interrupts 属性。
// 示例:SPI 设备树配置(需根据实际引脚调整)
&spi2 {
    status = "okay";
    bmi088@0 {
        compatible = "bosch,bmi088";
        reg = <0>;
        spi-max-frequency = <10000000>;
        interrupt-parent = <&gpio>;
        interrupts = <123 IRQ_TYPE_EDGE_RISING>; // 替换为实际中断引脚
    };
};

:three: 验证驱动加载

# 检查驱动是否加载
lsmod | grep bmi088

# 若未加载,手动加载
sudo modprobe bmi088

:four: 测试 SPI/I2C 通信

  • I2C 测试
    i2cget -y 5 0x19 0x00  # 读取 BMI088 加速度计 ID
    
  • SPI 测试
    # 使用 spidev 测试工具读取寄存器
    sudo python3 spi_test.py  # 参考官方示例
    

:five: 检查硬件连接

  • SPI 接线:确认 MOSI、MISO、SCLK、CS 引脚与 40Pin 对应(参考 RDK X5 40Pin 定义)。
  • 电源和地:确保 IMU 模块供电稳定(3.3V)。

参考资源


需要补充的信息

  1. 你使用的 IMU 模块是 板载 还是 外接?型号是 BMI088 还是 ICM-42688?
  2. 硬件接线方式(I2C 还是 SPI)?请提供具体引脚连接。
  3. 是否修改过设备树?若有,请分享相关配置片段。

建议先确认通信方式和硬件连接,再针对性调整驱动配置。如果需要进一步协助,请提供上述信息!

使用的是板载官方的 x5 imu 模块 BMI088

通过跳线帽为I2c的通讯方式

问题分析

根据你的补充信息(板载官方 BMI088 模块 + I2C 跳线),结合社区历史案例,核心问题是:

  1. 中断引脚配置缺失failed to get irq of imu number 表明驱动无法获取中断号,BMI088 在 I2C 模式下需要中断引脚触发数据就绪
  2. 系统版本与驱动不匹配:社区反馈 3.5.0+ 系统需使用免驱版本,旧驱动可能不兼容
  3. I2C 设备识别问题:需确认 I2C 总线是否正确扫描到 BMI088 的两个地址(0x19 加速度计 + 0x69 陀螺仪)

解决步骤

:one: 确认系统版本

# 查看系统版本
cat /etc/hobot_version
  • 3.5.0+:使用免驱版本(推荐)
  • 3.4.1 及以下:需编译驱动或升级系统

:two: 验证 I2C 设备识别

# 扫描 I2C 总线 5(根据你的日志是 bus 5)
i2cdetect -y 5

# 应看到 0x19 (ACC) 和 0x69 (GYR) 两个设备
# 如果看不到,检查跳线帽和接线

:three: 使用免驱版本(推荐)

根据社区最新反馈,免驱版本已支持 I2C/SPI 自动切换:

# 1. 克隆仓库并切换到免驱分支
cd ~
git clone https://github.com/D-Robotics/rdk_imu.git
cd rdk_imu
git branch -a  # 查看可用分支,找 driverless 或类似名称

# 2. 如果已有旧版本,先清理
rm -rf ~/hobot_imu_sensor

# 3. 按照免驱分支 README 重新安装
# (具体命令查看仓库 README,通常只需 source 即可)

:four: 检查中断引脚配置

BMI088 I2C 模式需要中断引脚,查看设备树是否配置:

# 查看设备树中 BMI088 配置
dtc -I dtb -O dts /boot/hobot/x5-rdk-v1p0.dts | grep -A 20 bmi088

# 或查看 dmesg 中 IRQ 信息
dmesg | grep -i bmi

如果中断未配置,可能需要:

  • 确认跳线帽是否连接了 INT 引脚
  • 或切换到 SPI 模式(SPI 模式下中断配置可能不同)

:five: 测试 SPI 模式(备选方案)

如果 I2C 持续失败,建议切换到 SPI 模式(社区反馈 SPI 更稳定):

# 1. 修改跳线帽到 SPI 位置
# 2. 重启系统
sudo reboot

# 3. 验证 SPI 设备
ls /sys/bus/iio/devices/
cat /sys/bus/iio/devices/iio:deviceX/name

# 4. 重新运行 IMU 节点
ros2 launch imu_sensor imu_sensor.launch.py

参考案例

根据社区帖子 x5 板接 BMI088 IMU 模块的问题

  • 用户最终通过免驱版本解决问题
  • 3.4.1 系统也可用,但 3.5.0+ 更稳定
  • SPI 模式比 I2C 更容易调试

需要补充的信息

请提供以下信息以便进一步定位:

  1. 系统版本cat /etc/hobot_version 输出
  2. I2C 扫描结果i2cdetect -y 5 输出(确认 0x19 和 0x69 是否存在)
  3. dmesg 日志dmesg | grep -i bmi 输出
  4. 跳线帽位置:确认 INT 引脚是否连接

快速建议

如果急于调试,建议:

  1. 切换到 SPI 模式(跳线帽改到 SPI,重启)
  2. 使用免驱版本(GitHub 仓库 driverless 分支)
  3. 升级系统到 3.5.0+(如果当前版本较低)

需要帮助可以随时补充日志!

建议优先使用免驱方式,IMU配件手册详细使用方式还在优化开发中,优先使用develop仓库免驱

解决方案总结

根据社区最新反馈和你的问题,核心解决方案是使用免驱版本。Marcelo6151 刚确认:优先使用 develop 仓库的免驱版本。


:bullseye: 快速解决步骤

:one: 切换到免驱版本

# 清理旧版本
rm -rf ~/hobot_imu_sensor

# 克隆仓库并切换到 develop 分支
cd ~
git clone https://github.com/D-Robotics/rdk_imu.git
cd rdk_imu
git checkout develop  # 或查看 README 确认免驱分支名

# 按照 README 安装
source /opt/tros/humble/setup.bash
colcon build
source install/setup.bash

# 启动 IMU 节点
ros2 launch imu_sensor imu_sensor.launch.py

:two: 验证 I2C 设备识别

# 扫描 I2C 总线 5
i2cdetect -y 5

# 应看到:
# 0x19 - BMI088 加速度计
# 0x69 - BMI088 陀螺仪

如果看不到设备,检查:

  • 跳线帽是否正确连接到 I2C 位置
  • 40Pin 接线是否牢固
  • 供电电压是否正常(3.3V)

:three: 查看系统版本

cat /etc/hobot_version
  • 3.5.0+:免驱版本直接可用
  • 3.4.1 及以下:建议升级或参考 飞书文档

:warning: 关于你的错误日志

错误信息 原因 解决
failed to get irq of imu number 中断引脚未配置 免驱版本自动处理
poll failed: 0! I2C 通信失败 检查设备识别 + 切换免驱
SPI 数据异常 通信方式/频率问题 优先用 I2C 免驱方案

:link: 参考资源


:clipboard: 如果仍有问题

请提供以下信息方便进一步排查:

# 1. 系统版本
cat /etc/hobot_version

# 2. I2C 扫描结果
i2cdetect -y 5

# 3. 设备识别
ls /sys/bus/iio/devices/

# 4. 内核日志
dmesg | grep -i bmi

建议优先尝试免驱版本,社区多个案例反馈这种方式最稳定。如果 I2C 持续有问题,可以考虑切换到 SPI 模式(改跳线帽 + 重启)。