随着Robomaster赛场上竞争一年比一年激烈,技术迭代水平一年比一年迅速,机器人的代码逻辑也一年比一年复杂,在这种形势下,我们对上下位机的通讯带宽与质量必然需要提出更高的要求。在赛季初期,为了提高通讯速率,我们简单在旧有的通讯模块的基础上直接拉高了波特率,然而效果并不理想,总结如下:

  • 随着波特率的增大,上位机下发的信息帧往往呈现出离散化与碎片化的趋势。譬如,两个乃至多个信息帧会杂糅在一起下发,而这个过程仅触发过一次空闲帧;有的时候一个信息帧会拆成多个碎片下发给下位机,而这个过程反而会产生多个空闲帧。
  • 在通讯速率提高的同时,信号的抗干扰能力也会随之下降,帧传输错误率也会必然提高,如何在正确地处理这些错误帧的同时防止解包越界等异常操作成为了我们新的研究课题。
  • 在这个的赛季我们采用了双头哨兵方案, 上下位机交换的信息多而杂,因此,我们需要在驱动的协议层面设计一种兼容性强的框架来支持对不同信息帧的IO管理。
  • 通讯模块暴露出的调用接口应该在保证绝对线程安全性的同时,最大化地利用MCU系统资源如DMA、缓冲区内存以及外设等,以支持高性能的信息吞吐。

之后,我们历经一个月的研发与测试,最终完成了新一代上下位机通讯模块。该模块具有如下特点。

  • 高速: 经过测试,该通讯模块可以达到双工4M(收发各2M)的稳定传输速率 (CRC错误率 < 0.01%)
  • 无流控:不需要额外使能CTS与RTS功能,不仅节省了IO引脚还间接地提升了通讯效率。
  • 无锁:通过巧妙地使用原子操作及设计程序流来规避给共享资源上锁,在避免共享资源抢占的同时提升了系统运行的效率。
  • 协议层解耦: 通讯层与协议层分离,方便用户快速地添加、删减修改传输接收的信息帧,同时复用通讯层的功能。

在Robomaster 2024的海外赛区及复活赛中,我们在每台机器人上都部署了该通讯方案,并验证了其稳定性。现决定将其开源,以供大家学习点评交流。

下位机方案开源: https://github.com/hkustenterprize/RM2024-SerialDriver-STM32

上位机方案开源: https://github.com/hkustenterprize/RM2024-SerialDriver-ROS