🤖 roboto_origin_03 Wiki
首页 / IMU 子模块 / 波特率配置与初始化脚本

本文档说明 roboto_imu 驱动库中波特率相关的全部配置路径,覆盖两个层面:串口 UART 波特率由 SDK 代码在设备打开时直接配置;CAN 波特率则需通过 Linux 系统命令配置主机接口,并借助 init_imu.sh 脚本修改 IMU 设备本身的波特率寄存器。掌握这两套机制的区别与协作方式,是确保传感器与主机正常通信的前提。

Sources: README_CN.md

串口波特率配置

当使用 interface_type="serial" 创建驱动实例时,baudrate 参数经由工厂方法逐层传递至串口协议层。IMUDriver::create_imu() 的签名中 baudrate 默认值为 0,对于串口场景必须显式传入与设备一致的数值,否则将使用协议层内部缺省值。

Sources: imu_driver.hpp, imu_driver.cpp

支持的波特率与默认行为

IMUSerialPortinit() 方法中通过 termios 结构体配置串口参数。当前实现支持以下标准波特率,未匹配任何列值时回退到 115200

波特率 termios 适用场景
9600 B9600 低速调试
19200 B19200 兼容旧设备
38400 B38400 中低速
57600 B57600 中速
115200 B115200 默认/常用
230400 B230400 高速
460800 B460800 高速
921600 B921600 超高速

除波特率外,串口固定配置为 8 数据位、无校验、1 停止位(8N1),禁用硬件流控(~CRTSCTS),并以原始模式(raw mode)工作,VMIN=0, VTIME=1 实现 100ms 读超时。接收线程通过 SCHED_FIFO 实时调度,优先级设为 80,确保 IMU 数据流低延迟处理。

Sources: [serial_port.cpp](src/protocol/serial/serial_port.cpp#L5-L6, #L28-L43, #L60-L75)

SDK 中的参数传递链

baudrate 从应用层到硬件层的传递链路如下:IMUDriver::create_imu()HipnucIMUDriver 构造函数 → IMUSerialPort::open()IMUSerialPort 私有构造函数 → init()。对于 CAN 接口,该参数在 HipnucIMUDriver 中被忽略,传 0 即可。

Sources: hipnuc_imu_driver.cpp, serial_port.cpp

Python 与 C++ 用法示例

Python SDK 通过 pybind11 暴露工厂方法,baudrate 在绑定层同样设有默认值 0。串口场景下必须显式指定:

# Python: 串口创建,baudrate 为必传有效值
imu = IMUDriver.create_imu(
    imu_id=0x01,
    interface_type="serial",
    interface="/dev/ttyUSB0",
    imu_type="HIPNUC",
    baudrate=115200
)

C++ 侧调用方式一致,baudrate 作为第五个参数传入:

auto imu = IMUDriver::create_imu(0x01, "serial", "/dev/ttyUSB0", "HIPNUC", 115200);

Sources: pybind_module.cpp, README_CN.md

CAN 波特率配置

CAN 通信采用一主多从的总线拓扑,主机 CAN 接口波特率必须与 IMU 设备波特率严格一致,否则将引发帧错误、总线关闭(Bus-Off)或完全静默。roboto_imu 的 SocketCAN 实现仅负责帧收发,不介入链路层速率配置;波特率管理拆分为两个独立操作:

  1. 主机侧:通过 Linux ip link 命令设置接口波特率(如 can0 设为 1M)。
  2. 设备侧:通过 J1939 配置报文修改 IMU 内部寄存器,再保存并复位生效。

Sources: socket_can.cpp

主机接口波特率设置

在运行驱动前,需确保 CAN 接口已 UP 且波特率与当前 IMU 一致。以将 can4 接口设置为 1Mbps 为例:

sudo ip link set can4 down
sudo ip link set can4 up type can bitrate 1000000

若 IMU 出厂默认为 500k,而主机已切换到 1M,则双方无法握手,此时需要先用 500k 启动主机接口,完成设备侧配置后再统一切换到目标波特率。

Sources: init_imu.sh

init_imu.sh 初始化脚本详解

init_imu.sh 是项目根目录下的 Bash 脚本,在 Debian 打包过程中被安装到 /opt/roboparty/bin/init_imu.sh。它面向 HiPNUC J1939 CAN 接口,完成四项任务:参数预设、波特率修改、配置保存、设备复位。脚本默认操作接口为 can4,执行前会自动检查 can-utils 中的 cansend 命令是否存在。

Sources: init_imu.sh, build_deb.sh

脚本执行流程

flowchart TD
    A[开始] --> B{检查 cansend 是否存在?}
    B -->|否| C[报错退出]
    B -->|是| D[步骤1: 配置IMU输出参数<br/>开启四元数 / 关闭欧拉角等]
    D --> E[步骤2: 发送波特率修改指令<br/>1Mbps]
    E --> F[步骤3: 发送保存配置指令]
    F --> G[步骤4: 发送设备复位指令]
    G --> H[提示用户手动切换<br/>主机CAN接口波特率]
    H --> I[结束]

脚本采用四阶段顺序下发,每帧之间插入 0.5s 延时,保存与复位阶段分别给予 1.0s 和 1.5s,确保 IMU 固件完成 EEPROM 写入与重新初始化。

Sources: init_imu.sh

各阶段 CAN 报文解析

脚本中的 cansend 命令遵循 J1939 协议配置帧格式。以下按执行顺序拆解每帧含义:

步骤 cansend 命令 功能说明
参数配置① cansend can4 0CEF0808#4601060005000000 配置输出内容相关寄存器
参数配置② cansend can4 0CEF0808#4101060000000000 继续配置输出参数
参数配置③ cansend can4 0CEF0808#3D01060000000000 完成输出参数设定(开启四元数、关闭欧拉角)
修改波特率 cansend can4 0CEF0808#9A00060000000000 向地址 0x009A 写入值 0,表示设置为 1000Kbps
保存配置 cansend can4 0CEF0808#0000060000000000 向地址 0x0000 写入值 0,执行保存到非易失存储
设备复位 cansend can4 0CEF0808#00000600FF000000 向地址 0x0000 写入值 0xFF,执行软件复位

其中 CAN ID 0CEF0808 的解析遵循 J1939 29-bit 扩展帧格式:目标地址为 0x08(IMU 设备地址),源地址为 0x08(发送方地址,脚本中设为与目标相同)。数据场前两个字节为寄存器地址,第三个字节 0x06 为写操作命令码,后续字节为写入数据。

Sources: init_imu.sh, README_CN.md

J1939 波特率修改协议

若需手动修改波特率或集成到自己的配置工具中,可直接构造以下三帧报文。理解其字段结构有助于在自动化部署流程中替换 init_imu.sh 的硬编码行为。

帧格式通则:

关键报文:

操作 CAN ID 数据负载 字段解释
设 1M 波特率 0CEF0800 9A 00 06 00 00 00 00 00 地址 0x009A(波特率寄存器),写入 0 = 1000K
保存配置 0CEF0800 00 00 06 00 00 00 00 00 地址 0x0000,写入 0 = 保存参数
复位设备 0CEF0800 00 00 06 00 FF 00 00 00 地址 0x0000,写入 0xFF = 复位

注意:若当前 IMU 地址不是 0x08,需将 CAN ID 中的目标地址字段相应替换。例如目标地址为 0x05 时,波特率修改帧应改为 cansend can4 0CEF0500#9A00060000000000

Sources: README_CN.md, init_imu.sh

参数速查与边界约束

维度 串口 UART CAN (J1939)
配置主体 SDK 代码 (IMUSerialPort) Linux 系统命令 + init_imu.sh
参数入口 create_imu(..., baudrate) ip link set ... bitrate + J1939 写寄存器
支持值 9600–921600(默认 115200) 典型值 125K / 250K / 500K / 1M
生效时机 open() 调用时 设备复位后
双方一致性 仅主机与设备两点 总线上所有节点必须一致
忽略场景 CAN 接口下 baudrate 参数无效

Sources: serial_port.cpp, hipnuc_imu_driver.cpp

故障排查

现象 根因分析 解决措施
串口打开成功但数据解析失败 主机波特率与 IMU 不匹配,导致字节错位 确认 create_imu 中的 baudrate 与 IMU 实际配置一致;使用 stty -F /dev/ttyUSB0 查看当前设置
init_imu.sh 报 "CAN 报文发送失败" can4 接口未 UP,或当前主机波特率与 IMU 不一致 检查 ip link show can4 状态;先用 IMU 当前波特率(如 500k)启动接口再执行脚本
脚本执行成功但后续驱动无法收数 脚本已改设备为 1M,但主机接口仍停留在旧波特率 按脚本提示手动执行 ip link set can4 down && ip link set can4 up type can bitrate 1000000
CAN 总线出现 Bus-Off 总线上存在多波特率节点,或终端电阻缺失 统一所有节点波特率;检查 120Ω 终端电阻

Sources: [init_imu.sh](init_imu.sh#L20-L25, #L64-L66)

延伸阅读

完成波特率配置后,若需深入理解 CAN 与串口的接收线程实现,可参考以下页面: