Zhejiang University RoboMaster Vision

了解你的队友:电控工作流

从日常开发、VS Code 构建与烧录,到定位并安全修改下位机顶层算法。

Cicada约 9 分钟
#电控#STM32#CubeMX#VS Code#烧录#调试

视觉和电控在联调时面对的是同一台机器人,只是观察系统的角度不同。视觉新人不需要立刻掌握驱动、PCB 或电机底层协议,但应理解电控每天怎样开发、怎样把程序放进 C 板、怎样验证结果;这样遇到控制或坐标问题时,才能自己完成属于视觉的修改,并把其他问题准确地交给电控同学。

1. 谁负责什么

实际分工随队伍变化,但可以先按下面的边界理解:

模块典型负责人修改前应确认什么
板卡、供电、线束、固件升级硬件 / 电控板型、接口、电源与安全状态
CubeMX、时钟、引脚、DMA、中断电控是否会重新生成代码,生成区边界
电机驱动、编码器、IMU、CAN电控反馈单位、零点、限位、使能条件
协议、坐标系、控制目标电控搭建接口,视觉参与维护字段语义、版本、坐标和单位
识别、预测、目标选择视觉输出频率、置信度、无目标行为

视觉并不是“只管上位机”。如果问题发生在目标角度生成、坐标变换、顶层控制策略或视觉与云台的接口处,视觉成员应能读懂、修改、构建和验证下位机中的对应部分。相反,硬件、外设初始化和底层驱动出现问题时,最有价值的贡献是提供准确现象和证据,而不是盲改。

2. 电控平时在做什么

电控工作并不只是“调 PID,LQR”。团队下位机项目的日常工作可以落到一条具体的控制链上:接收上位机给出的云台目标,读取两轴电机的真实角度,检查数据是否有效并限制危险目标,经过滤波和位置控制得到电机输入,再回传当前姿态和状态。电控成员每天围绕这条链路开发、测试和联调。

场景常见工作目的
电脑上阅读需求、改控制逻辑、调整参数、编译、跑主机测试、看代码差异在上板前尽可能发现逻辑和构建错误
VS Code 中跳转代码、搜索数据流、配置 CMake、查看编译报错、启动调试快速定位代码位置和问题层级
台架上烧录固件、看串口日志、用调试器查看变量、做小幅动作测试验证真实板卡、传感器和电机行为
机器人上联调视觉输入、检查限位/安全状态、测试完整行为验证整条感知—控制链路
协作中记录版本、参数、现象和测试条件让队友能复现、回退和继续工作

在一份典型的两轴云台固件中,控制任务每个周期会做如下事情:

flowchart LR
    command[接收上位机目标<br/>角度速度模式] --> validate[校验有效性超时与限幅]
    motorFeedback[读取电机角度与状态] --> validate
    validate --> filter[目标滤波与状态机]
    filter --> control[位置环 / 速度控制]
    control --> motor[经 CAN 等总线发送电机命令]
    motor --> motorFeedback
    motorFeedback --> feedback[回传姿态与状态给上位机]

这张图对应了电控每天围绕的处理链。视觉同学最常参与的是 commandvalidatefilter 附近的目标生成、坐标变换、限幅和丢目标策略;电机反馈采集、CAN 驱动和硬件保护通常由电控维护。

可以把电控的日常循环概括为:

flowchart LR
    observe[观察现象或需求] --> locate[定位数据和控制链]
    locate --> change[小范围修改代码或参数]
    change --> build[构建与静态检查]
    build --> flash[烧录到目标板]
    flash --> bench[台架低风险验证]
    bench --> record[记录版本参数与结果]
    record --> observe

并非每次修改都要上机器人。编译失败时先解决编译;改动只影响数学函数时先跑主机测试;只有需要验证真实传感器、电机或通信时才上板。这样既省时间,也更安全。

3. 先认识几个基础概念

概念简单解释你什么时候会用到
构建(build)把 C/C++ 源码编译、链接成可运行的固件每次代码或配置改动后
交叉编译在电脑上生成给 STM32 运行的程序,而不是给电脑运行的程序使用 ARM GNU Toolchain 时
固件(firmware)最终运行在 MCU 内的程序,常见产物为 .elf.hex.bin烧录和版本确认
烧录(flash/program)将固件写入 C 板的 Flash让板子运行新版本
调试器(debugger)连接运行中的 MCU,暂停程序、设断点、查看变量和调用栈串口日志无法说明问题时
串口日志程序通过 UART 输出的文字或结构化数据看版本、输入、目标值、错误状态
断点(breakpoint)程序执行到指定行时暂停确认某分支是否执行、变量何时变化
Watch/变量监视调试器持续显示指定变量看目标角度、反馈、误差、状态机
台架测试让机构架空/限功率,逐项测试首次烧录或调控制时

构建成功只说明“这份代码能被编译器接受”;烧录成功只说明“这份固件已写进目标板”;只有台架测试和联调通过,才能说明“机器人行为正确”。三者不能互相替代。

4. 调试不只是在代码里加 printf

按从轻到重的顺序选择工具:

方法适用问题注意事项
编译器报错/静态检查拼写、类型、接口不匹配先解决第一条错误
串口日志状态机是否进入、目标/反馈是否正确高频控制任务中不要大量打印
可视化/曲线目标、反馈、误差、输出随时间的关系最适合判断振荡、延迟和限幅
断点与变量监视某个条件为何未触发、变量在哪里被改暂停 MCU 会影响实时控制,台架使用
主机测试协议解析、坐标数学、限幅、PID 的纯逻辑不替代真实硬件验证
逻辑分析仪/示波器串口/CAN 时序、信号质量、电源问题通常与电控成员共同使用

调试时应围绕一个问题设计观察量。例如“云台向反方向转”时,依次确认图像误差符号、上位机目标、通信字段、下位机参考值、反馈角度和电机输出;不要同时改坐标系、PID 和协议。

5. 视觉负责的顶层算法发现问题时,怎样修改

先判断问题是否属于视觉可以维护的层:目标角度生成、坐标变换、视觉输入有效性、上层限幅、目标丢失策略和明确开放的控制参数,通常属于可参与修改的范围。

一次修改建议遵循下面的流程:

flowchart LR
    reproduce[写清复现条件和预期行为] --> trace[沿数据流找到算法入口与输出]
    trace --> backup[记录当前可用参数与版本]
    backup --> edit[只改一个假设代码或参数]
    edit --> verifyBuild[构建并运行可用测试]
    verifyBuild --> flash[安全烧录]
    flash --> verifyBoard[架空状态验证输入目标方向]
    verifyBoard --> result[记录结果保留或回退]

具体做法:

  1. 用固定输入或可复现场景描述问题,例如“目标在画面右侧时,期望 yaw 应增加”;
  2. 从消息定义、参数和控制入口找数据,不从底层 UART/DMA 文件开始;
  3. 将偏置、限幅、坐标转换等放在已有的上层配置或函数中,不散落魔法数字;
  4. 每次只改一个量,并保留修改前的参数;
  5. 先验证“下位机收到的目标是否对”,再验证电机动作;
  6. 如出现异常运动、过热、失控或不确定限位,立即停止执行器并回到已知可用版本。

6. 发现非视觉负责的问题时,怎样做

不负责某一层,不代表遇到问题时无事可做。这时的任务是把“我觉得不对”整理成一个电控同学可以立即检查的问题单。

先区分问题层级:

观察到的现象可能层级视觉成员应做什么
上位机目标正确,但下位机收到的字段不对通信/协议保存收发日志、单位和时间戳,交给接口负责人
下位机目标正确,电机不动使能、驱动、CAN、硬件停止测试,记录状态,不盲改底层
电机方向/零点异常编码器、标定、机械/电机配置架空并记录反馈与实际运动,通知电控
构建或烧录失败工具链、下载器、板卡连接保存第一条错误、工具版本和连接状态
通信偶发断线或数据异常线束、供电、串口/CAN、时序记录复现条件与日志,必要时共同测量

一次高质量反馈至少包含:现象、复现步骤、代码版本、使用的参数、板卡/下载器状态、已观察到的输入/目标/反馈,以及你希望确认的具体问题。例如:

现象:上位机目标 yaw 连续增加,但云台保持不动。
复现:架空、低功率、仅开启云台控制;每次都可复现。
版本与参数:<填写当前提交和参数版本>。
观察:上位机目标和下位机参考值均变化,电机反馈不变化。
希望协助确认:电机使能状态、CAN 通信与驱动侧故障状态。

人和设备安全永远优先于继续调试。电机异常转动、过热、冒烟、线束松动或失控时,先按队内流程断使能/断电并通知负责人;不要在带载、贴近人或限位不明的状态下反复烧录试错。

做到这些,即使不是完整的电控开发者,也能可靠地参与下位机顶层算法、烧录与联调,并让视觉和电控之间的问题更快得到解决。

返回入组培训
|