RM2025-Core 公共嵌入式库
嵌入式组长 · 核心维护者
维护服务 7 台机器人的公共嵌入式平台,统一驱动、通信、控制与数学接口,并通过代码审查、培训和现场修复让约 10 人团队在同一套工程边界上协作。
- 平台范围
- 服务 7 台 RoboMaster 机器人
- 协作规模
- 约 10 人嵌入式团队
- 维护旁证
- 141 个唯一提交,114 个进入 develop
- 知识传递
- 约 10 次驱动、RTOS 与调试培训

背景
维护服务 7 台机器人的公共嵌入式平台,统一驱动、通信、控制与数学接口,并通过代码审查、培训和现场修复让约 10 人团队在同一套工程边界上协作。
公共库支撑 2025 赛季全队机器人开发;我在仓库历史中有 141 个唯一提交哈希,其中 114 个进入当前 develop,数字仅作为维护规模旁证。
141 / 114 来自本地仓库对作者与分支历史的统计,只用于说明维护规模;公共库由团队共同完成。
个人贡献
- 维护核心驱动、通信、控制与数学基础设施,并为不同机器人提供一致接口。
- 拆分团队任务、审查 Pull Request、处理跨机器人回归和赛场紧急修复。
- 组织约 10 次嵌入式培训,覆盖 STM32、FreeRTOS、通信、控制与调试工具。
- 用 SystemView、Tracealyzer、错误计数与超时状态提升故障可观测性。
- 技术环境
- STM32 · FreeRTOS · FDCAN / UART / SPI · DMA Receive-to-Idle · PID / Filters · SystemView / Tracealyzer · Git Review
系统实现
Drivers
封装 GPIO、PWM、CAN、UART、SPI、定时器与 DMA,隔离具体板卡和 HAL 差异。
Communication
提供电机、裁判系统、VTM、视觉和板间协议的解析、校验、超时与状态接口。
Control & Math
复用 PID、滤波、斜坡、运动学和常用数学工具,减少机器人项目重复实现。
Application Boundary
公共库只提供经过审查的能力,具体任务状态机仍由各机器人项目维护。
新 / 旧 VTM 串口字节两套帧头与字段布局
DMA Receive-to-Idle按实际接收长度处理缓冲区
帧头 / CmdID / 长度CRC8 + CRC16
分协议解析位域与结构体对齐
分通道有效状态遥控 / 键鼠 / 图传分别超时;失联清除陈旧输入
技术决策
公共接口优先于机器人特例
- 背景
- 7 台机器人硬件和任务不同,若把特例不断塞入驱动层,任何修改都可能造成跨车回归。
- 选择
- 把设备能力、有效状态和超时暴露为稳定接口,机器人特有策略留在应用层。
- 完成结果
- 同一驱动可以被不同项目复用,代码审查也能聚焦真实边界变化。
把可观测性当作公共能力
- 背景
- 现场故障往往只在高负载或连接异常时出现,仅靠断点难以定位。
- 选择
- 在通信模块加入错误计数、分通道有效状态和超时,并使用 RTOS Trace 工具检查任务调度。
- 完成结果
- 问题可以被定位到协议、链路或应用状态,而不是笼统归因于“串口不稳定”。
调试过程
兼容新旧 VTM 串口协议
新裁判系统更换图传模块,公共驱动必须在同一套接口下兼容新旧串口通信协议,并避免影响已有机器人。
现象
- 部分新协议帧无法通过校验,键鼠或遥控数据间歇失效。
- 旧协议回归时出现长度、位域和缓冲区处理差异。
- 断开图传后,应用层仍可能读到上一次有效键鼠数据。
排查
- 按帧头、CmdID、长度、CRC8 和 CRC16 分层记录接收路径。
- 核对结构体位域与字节对齐,并检查 DMA Receive-to-Idle 的实际接收长度。
- 逐次回看修复提交,确认缓冲区清理位置和旧协议回归影响。
根因
新旧协议在帧头、命令号、帧长和字段布局上均存在差异;早期实现把部分有效性判断和缓存生命周期混在一起,导致错误帧及失联后的陈旧数据进入上层。
修复
- 按协议版本区分帧头、CmdID、长度和解析路径,并完整执行 CRC8/CRC16 校验。
- 修正位域、结构体对齐、缓冲区尺寸和 DMA Receive-to-Idle 清理时机。
- 增加接收、UART 错误和 CRC 错误计数。
- 为遥控、键鼠与图传状态分别维护超时和有效标志,失联后清除不可用输入。
验证与证据
- 对新旧图传模块分别做输入、断连、重连和异常帧回归。
- 在真实机器人任务中观察状态连续性与错误计数,最终形成稳定兼容通信。
复盘协议兼容不只是多写一个解析分支;帧校验、缓存生命周期和失联语义必须作为一个完整接口共同设计。
验证与证据
- 公共库在 7 台不同机器人上完成跨机器人集成与硬件回归,并通过赛季实机联调验证。
- VTM 新旧模块均完成输入、断连与恢复回归;没有保存量化丢包率,因此不添加虚构数字。
- Commit 数只描述维护规模,不替代代码质量、团队贡献或比赛结果。
141 / 114 来自本地仓库对作者与分支历史的统计,只用于说明维护规模;公共库由团队共同完成。