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 总线上。因此:
- Linux 设备树中不会有
bmi088 节点。
- 内核无法直接绑定 IIO 驱动。
imu_sensor 包(设计用于直连 SoC 的 IMU)无法工作。
正确数据链路:
BMI088 (MCU 板) → MCU → UART/SPI → Linux (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 节点:
- 打开串口:在 Linux 侧打开对应的 UART 设备。
- 解析数据:按照 MCU 固件定义的协议解析 IMU 数据包(加速度、角速度)。
- 发布话题:将解析后的数据封装为
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)
关键排查点
- 设备节点:运行
ls -l /dev/tty* 或 dmesg | grep tty 确认 UART 设备是否生成。
- 引脚连接:确认 S100 主板与 MCU 扩展板之间的 UART 引脚(13/15)连接正确,无虚焊。
- 协议文档:向官方索取或查阅 MCU 固件的通信协议文档(数据帧格式、波特率)。
社区资源
建议:由于官方明确表示“暂无 SPI5 读取 IMU 的 Demo”,建议在社区发帖询问是否有UART 读取 IMU 的示例代码或MCU 固件源码,可大幅降低开发成本。