DT7 + DR16 遥控底盘接入
这里的 dt16 目录沿用现有资料目录名;硬件是 DT7 遥控器 + DR16 接收机。接收机通过
D-BUS 输出 18 字节帧,软件中的协议名称统一为 DR16。
协议与接线
- DR16
DBUS接 T153 原生 UART RX,默认设备/dev/ttyS2。 - UART 参数固定为
100000 baud, 8 data bits, even parity, 1 stop bit,无流控。 - 接收机
VCC/GND/DBUS使用 3-Pin 线;确认 T153 UART RX 电平与 DBUS 信号兼容后再上电。 - 本实现的字段布局参考 DT7/DR16 手册和
RoboMaster/RoboRTS-Firmware的 DR16 解码, Rust 代码为独立重写,不复制参考仓库源码。
摇杆与安全语义
| 输入 | 通道 | 底盘动作 |
|---|---|---|
| 左摇杆上下 | T/ch3 |
前后平移,上为前进 |
| 左摇杆左右 | R/ch4 |
旋转,右为顺时针(负 omega) |
| 右摇杆左右 | A/ch1 |
左右平移,右为右移(负 vy) |
| 右摇杆上下 | E/ch2 |
本次不绑定动作 |
| S1 上档 | wire value 1 |
允许运动 |
| S1 中/下档 | wire value 3/2 |
立即停车 |
摇杆满量程为协议中心值 ±660。5% 死区外使用平方曲线,满杆对应
chassis.max_vx/max_vy/max_omega。速度从零到满量程使用 ramp_ms = 500 的逐轴斜坡;
S1 离开上档、合法帧断流超过 timeout_ms = 100、串口关闭时立即归零,不走斜坡。
配置
在 /etc/chassisd/chassis.toml 增加:
[remote]
kind = "dr16"
device = "/dev/ttyS2"
timeout_ms = 100
deadband = 0.05
ramp_ms = 500
invert_vx = false
invert_vy = false
invert_omega = false
如果某个轴的实车方向相反,只翻转对应的 invert_*。chassisd --rc-device /dev/ttyS2
可以覆盖配置中的设备节点;没有 [remote] 段时守护进程保持安全静止。
只读监视
先不要让车轮着地,使用只读命令观察帧和方向:
cargo run --release -p spin -- rc --device /dev/ttyS2
输出包含帧龄、A/E/T/R 原始值、S1/S2 位置和显示用 vx/vy/omega(默认满量程 3.0/3.0/6.0)。它不打开 CAN,也不驱动电机。
实车验收
- S1 置中档或下档,执行
spin rc --device /dev/ttyS2,确认帧龄约 14 ms、四个通道随摇杆变化、S1 上档 wire value 为1。 - 架空四轮,执行
chassisd --dry-run --config /etc/chassisd/chassis.toml,确认 UART 与四个电调反馈正常。 - S1 上档后低速验证:左杆上/下 = 前/后,右杆左/右 = 左/右平移,左杆左/右 = 逆/顺时针。
- 运动中把 S1 拨离上档,必须立即停车。
- 运动中关闭遥控器或拔掉 DBUS,必须在 100 ms 内停车。
- 若方向相反,修改对应
invert_*后重复步骤 3,再落地低速复验。
参考资料
DT7&DR16_RC_System_User_Manual_v2.00_cn.pdf- RoboMaster/RoboRTS-Firmware