# 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` 增加: ```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]` 段时守护进程保持安全静止。 ## 只读监视 先不要让车轮着地,使用只读命令观察帧和方向: ```sh 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,也不驱动电机。 ## 实车验收 1. S1 置中档或下档,执行 `spin rc --device /dev/ttyS2`,确认帧龄约 14 ms、四个通道随摇杆变化、S1 上档 wire value 为 `1`。 2. 架空四轮,执行 `chassisd --dry-run --config /etc/chassisd/chassis.toml`,确认 UART 与四个电调反馈正常。 3. S1 上档后低速验证:左杆上/下 = 前/后,右杆左/右 = 左/右平移,左杆左/右 = 逆/顺时针。 4. 运动中把 S1 拨离上档,必须立即停车。 5. 运动中关闭遥控器或拔掉 DBUS,必须在 100 ms 内停车。 6. 若方向相反,修改对应 `invert_*` 后重复步骤 3,再落地低速复验。 ## 参考资料 - `DT7&DR16_RC_System_User_Manual_v2.00_cn.pdf` - [RoboMaster/RoboRTS-Firmware](https://github.com/RoboMaster/RoboRTS-Firmware)