Files
linux_sentry_chassis/ARCHITECTURE.md
T

158 lines
6.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# RoboMaster 底盘职责型架构
**版本**: 2.0
**平台**: Allwinner T153 / Linux
**底盘控制频率**: 1 kHz
**实现范围**: 四轮麦轮底盘;云台与发射机构尚未实现
本文是架构的唯一规范。`docs/chassis.md` 只记录接线、标定、部署与排障。
## 1. 架构原则
- **一个 crate 一件事**:协议、传输、设备运行时、算法、仿真、工具和应用入口分别成 crate。
- **依赖必须无环**:允许依赖同层或更低抽象,但禁止反向控制依赖和隐藏的完整链路打包。
- **std,禁止 unsafe**:workspace 使用 `unsafe_code = "forbid"`;允许使用提供安全 API 的第三方依赖。
- **实时调度交给 systemd**:进程不调用 libc FFI,不实现 `SCHED_FIFO` 或 `mlockall`。
- **crate 内保持扁平**:只允许 Cargo 惯例目录 `src`、`tests`;`src` 内不建立模块子目录。
- **安全边界独立于控制律**:总线负责反馈新鲜度、命令租约和零电流;控制器通过策略接口组合。
## 2. Workspace
```text
基础
can CAN 帧、CanBus、CanLink、MockBus
imu IMU 数据契约
协议
motor-protocol C620/C610、GM6020 编解码、多圈与 ID
delta10-protocol DETA10 帧布局与解码
驱动
socketcan Linux SocketCAN ↔ CanLink
slcan Lawicel 串口 CAN ↔ CanLink
delta10 DETA10 IMU 驱动
设备与运行时
motor Motor 能力 trait、状态、命令、减速比、注册表、EffortPolicy
esc-bus ESC 帧泵、反馈状态、租约、离线保护、effort 输出
控制
pid 通用 PID
motor-control 速度/位置/串级/前馈与 MotorPolicy
mecanum 麦轮正逆运动学
实验与仿真
motor-model DC/GM3508 物理模型
experiment Scenario、Trace、Window、StepMetrics
sim-harness 同步闭环、总线损伤、域随机化、假电调
tuning Relay/ZN、成本、增益空间、搜索、预设
应用
chassis-config chassis.toml schema 与校验
bench 真机链路门面、安全包络、试验采样
chassisd 底盘守护进程二进制
spin chassis / motor 台架二进制
chassis-tune 自动整定二进制与报告/绘图适配
```
共 21 个 crate。crate 名不使用 `rm-` 等无领域含义的统一前缀。
## 3. 允许依赖
主要边如下:
```text
motor-protocol -> can
delta10-protocol -> can, imu
socketcan -> can
slcan -> can
delta10 -> can, imu, delta10-protocol
motor -> can, motor-protocol
esc-bus -> can, motor, motor-protocol
pid -> (无内部依赖)
motor-control -> pid, motor
mecanum -> (无内部依赖)
motor-model -> motor-protocol
sim-harness -> can, motor, motor-control, motor-model, motor-protocol, experiment
tuning -> pid, motor-control, motor-model, sim-harness, experiment
chassis-config -> esc-bus, motor-control, motor-protocol, mecanum
bench -> can, esc-bus, experiment, motor, motor-control, socketcan, slcan
chassisd -> chassis-config, esc-bus, mecanum, motor-control, sim-harness, socketcan
spin -> bench, esc-bus, motor-control, socketcan, slcan
chassis-tune -> bench, chassis-config, experiment, sim-harness, tuning
```
禁止边:
- `esc-bus -> motor-control` / `pid`:`esc-bus` 不包含控制律。
- `bench -> tuning`:真机试验只产生 `TrialOutcome`;成本和搜索适配在 `chassis-tune`。
- `sim-harness -> tuning`:仿真只产生模型与轨迹;搜索器不反向渗入仿真。
- 协议或驱动依赖设备、控制、仿真、整定或应用 crate。
`motor::EffortPolicy` 是控制与总线的唯一组合点。`motor-control::MotorPolicy`
实现该 trait,应用负责把它传给 `esc_bus::EscBus::spawn`。
## 4. 运行模型
- 底盘速度环和 ESC 命令节拍为 **1 kHz**。
- `esc-bus` 每拍读取命令租约和反馈新鲜度,再调用 `EffortPolicy`。
- 反馈超时或命令租约到期时强制零输出;策略状态会被复位。
- 上层必须逐拍重发目标值;一次性命令会在默认 50 ms 后失效。
- `chassisd` 将麦轮逆解得到的轮端速度经 `OutputShaft` 换算到转子速度。
## 5. std 与实时策略
- Rust 代码只使用 std 与安全第三方 API,workspace 设置 `unsafe_code = "forbid"`。
- 不依赖 `libc`,不包含 FFI、`no_std` 分支或 `realtime` 模块。
- `deploy/chassisd.service` 通过 `CPUSchedulingPolicy=fifo`、
`CPUSchedulingPriority=80`、`LimitRTPRIO=95` 设置调度策略。
- `LimitMEMLOCK=infinity` 只提高锁定额度;std 程序不调用 `mlockall`,本文不承诺主动锁页。
- 不支持的平台由 `socketcan` 返回明确错误;核心算法与仿真可跨平台测试。
## 6. 目录规则
每个 crate 仅包含:
```text
Cargo.toml
src/lib.rs # 库
src/main.rs # 二进制
tests/*.rs # 可选集成测试
```
不允许 `src/<module>/` 子目录。单元测试使用源码文件内的 `#[cfg(test)] mod tests`。
## 7. 当前实现边界
已实现:
- C620/C610 电流协议、GM6020 电压协议骨架、多圈跟踪与 ID 校验。
- SocketCAN、SLCAN、DETA10 驱动骨架、MockBus。
- 四轮 ESC 总线、命令租约、反馈离线保护、外部控制策略。
- PID、速度/位置/串级/前馈、麦轮运动学。
- 电机模型、总线损伤、同步/异步闭环、参数搜索、预设与报告。
- `chassisd --mock`、`spin chassis|motor`、`chassis-tune`。
未实现:
- 云台与发射机构任务和控制律。
- DETA10 真实载荷布局(决策点 D1,原手册链接失效)。
- GM6020 实车闭环。
- E907 异构核(决策点 D4)。
- 进程内 `mlockall`。
## 8. 验收
- `cargo fmt --all -- --check`
- `cargo clippy --workspace --all-targets -- -D warnings`
- `cargo test --workspace --all-targets`
- Linux vcan:`cargo test -p socketcan@0.1.0 --test vcan -- --ignored --test-threads 1`
- `find crates/*/src -mindepth 2 -type d` 无输出。
- Rust 源码不得包含 `unsafe`、`libc` 或 `no_std`。
- `cargo tree` 确认禁止边不存在、依赖图无环。