地瓜RDK S100 如何调用mcu中的imu

sunrise@ubuntu:~/4WS_chassis$ ros2 launch imu_sensor imu_sensor.launch.py
[INFO] [launch]: All log files can be found below /home/sunrise/.ros/log/2026-07-21-17-05-24-451717-ubuntu-104805
[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 [104814]
[imu_sensor-1] bmi088 configuration:
[imu_sensor-1] i2c_bus: 1
[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/input0/
[imu_sensor-1] imu driver is already installed.
[imu_sensor-1] Failed to open /sys/devices/virtual/input/input0/sensor_init, ret: -1
[ERROR] [imu_sensor-1]: process has died [pid 104814, exitcode 255, cmd ‘/opt/tros/humble/lib/imu_sensor/imu_sensor --ros-args --log-level warn --ros-args --params-file /tmp/launch_params_kt2p99xv’].
sunrise@ubuntu:~/4WS_chassis$

SPI 侧只有通用 spidev0.0 / spidev1.0(rohm,dh2228fv),设备树里没有 bosch,bmi088 一类节点,所以内核里的 bmi088-accel-spi 即使加载也不会绑定出 IIO 设备。

我来帮你排查这个问题。先搜索一下社区里关于 S100 IMU 的相关资源。

结论

直接运行 imu_sensor 节点失败是预期行为。

RDK S100 的 BMI088 IMU 位于 MCU 扩展板上,而非直接挂载在 Linux SoC 的 SPI/I2C 总线上。因此:

  1. Linux 设备树中不会有 bmi088 节点。
  2. 内核无法直接绑定 IIO 驱动。
  3. imu_sensor 包(设计用于直连 SoC 的 IMU)无法工作。

正确数据链路
BMI088 (MCU 板) MCUUART/SPILinux (SoC)ROS2 节点


解决方案

你需要通过 MCU 通信 来获取 IMU 数据,而不是直接驱动传感器。

步骤 1:确认 MCU 固件状态

S100 的 MCU 需要运行特定固件来读取 IMU 并转发给 Linux。

步骤 2:确认通信接口 (UART 或 SPI)

根据社区反馈,S100 MCU 与 Linux 的通信接口配置如下:

  • UART5:常用通信方式。
    • 引脚:MCU 扩展板排针 13 (TX)15 (RX) (需确认是否需要短接或跳线,参考 S100 的 MCU 扩展板的串口 5 在哪里)。
    • 设备节点:通常为 /dev/ttySx (使用 dmesg | grep tty 查看)。
  • SPI5:文档提及但官方暂无 Demo。
    • 如果使用 SPI,需自行开发 MCU 侧 SPI 从机代码和 Linux 侧主机代码。

建议优先尝试 UART 方案,开发难度较低且社区有相关引脚定义。

步骤 3:开发/使用桥接节点

由于官方暂无现成的 mcu_imu_bridge 包,你需要编写一个简单的 ROS2 节点:

  1. 打开串口:在 Linux 侧打开对应的 UART 设备。
  2. 解析数据:按照 MCU 固件定义的协议解析 IMU 数据包(加速度、角速度)。
  3. 发布话题:将解析后的数据封装为 sensor_msgs/msg/Imu 并发布到 /imu/data

代码逻辑示例 (Python)

import rclpy
from rclpy.node import Node
from sensor_msgs.msg import Imu
import serial

class McuImuBridge(Node):
    def __init__(self):
        super().__init__('mcu_imu_bridge')
        self.publisher_ = self.create_publisher(Imu, 'imu/data', 10)
        # 根据实际设备修改端口和波特率
        self.serial_port = serial.Serial('/dev/ttyS5', 115200, timeout=0.1)
        self.timer = self.create_timer(0.01, self.read_imu)

    def read_imu(self):
        if self.serial_port.in_waiting > 0:
            data = self.serial_port.read(self.serial_port.in_waiting)
            # TODO: 根据 MCU 协议解析 data 获取 acc/gyro
            # msg = parse_mcu_data(data) 
            # self.publisher_.publish(msg)

关键排查点

  1. 设备节点:运行 ls -l /dev/tty*dmesg | grep tty 确认 UART 设备是否生成。
  2. 引脚连接:确认 S100 主板与 MCU 扩展板之间的 UART 引脚(13/15)连接正确,无虚焊。
  3. 协议文档:向官方索取或查阅 MCU 固件的通信协议文档(数据帧格式、波特率)。

社区资源

建议:由于官方明确表示“暂无 SPI5 读取 IMU 的 Demo”,建议在社区发帖询问是否有UART 读取 IMU 的示例代码MCU 固件源码,可大幅降低开发成本。

4.0.5 系统增加了MCU子板上的IMU支持