← 返回上页
学习路径 / ELECTRONICS

电控组学习路径

电控组写的代码最终要落到电机、遥控器、传感器和通信总线上。学习过程中不能只在电脑上把程序跑通,还要学会观察反馈数据、判断故障出在哪一层,并和硬件、视觉一起把功能调到车上。

内容来源 本页整理自 GKD 战队电控组(原软件组)的学习路径文档,供组内学习与招新使用。 相关仓库:ControlLib 电机驱动依赖库 ↗ · GKD_Control 电控仓库 ↗ · GKD_SoftwareLearning ↗

开始之前

欢迎大家加入 GKD 大家庭。这份文档用于 GKD 软件组(现分为控制组、算法组)学习,以下是推荐的学习路径——当然,如果你的基础足够强大,也可以直接跳到最后做我们的测试。

我该如何提问

请仔细阅读提问的智慧与别像弱智一样提问,遇到问题先尝试自己解决。当然,遇到无法解决的问题也非常欢迎你们来提问,但请不要问 AI 可以轻松解答的问题。

安装 Linux

安装 Ubuntu 24.04 或 22.04,可以去 B 站搜索教程。建议安装物理双系统,不要使用虚拟机。

科学上网

  • 安装配置科学上网软件,需要能正常访问使用 Google、ChatGPT、Github 等网络服务。
  • 更换你的搜索引擎,不要使用 Baidu!会很影响你的搜索效率!!! 建议使用 Bing、Google。
  • 不会的内容可以先问 ChatGPT。
  • 这里是我们的代码仓库,记得给我们一个 star,这可以让你们更快找到我们的仓库。

配置环境和学习 C/C++

  • 学习 C 语言,并完成南京大学 一生一芯 项目的 PA0 及 PA1 部分。项目地址
  • 继续学习 C++,了解类、继承、多线程、锁等知识。
  • 实在不知道看哪一个 C++ 教程,我们向你推荐这个教程(B 站上搜索 cherno c++ 有带中文字幕的版本)。

电控基础知识

建议观看中科大电控入门教程。注意,我们不使用 STM32,学习其中的控制算法和通讯协议即可。

CAN 通信

对于 CAN 通信是什么,这里不过多赘述,可以自行上网搜索了解。作为 RMer 要有工程思维,只要粗浅了解原理、会用即可——这也得益于我们硬件组的同学,为我们提供了可以即插即用的 usb2can。

使用 usb2can

首先进行软件更新:

sudo apt-get update && sudo apt-get -y upgrade

安装所需依赖软件包:

sudo apt-get install -y can-utils net-tools

将两个 usb2can 如图连接起来,并同时和自己的电脑连接,即可进行回环测试。

查看是否检测到 CAN 设备(在列表中看到带有 can 名称的设备,说明你的电脑正常识别了 CAN 设备):

ifconfig -a

进行 CAN 设备初始化(示例为初始化 can0 和 can1):

sudo ip link set can0 up type can bitrate 1000000

sudo ip link set can1 up type can bitrate 1000000

打开 Terminal,用来监测 can0 接收到的报文:

candump can0

再打开一个 Terminal 窗口,使用 can1 来发送数据:

cansend can1 200#5A5A5A5A5A5A5A5A

如果可以在 candump can0 的 Terminal 里看到如下信息,则说明正常工作:

can0 200 [8] 5A 5A 5A 5A 5A 5A 5A 5A

电机的控制

我们的电机驱动依赖库应是各位学习如何驱动电机上的第一手资料,里面会详细介绍如何使用我们的库来驱动电机。现在的电控仓库也已经进行了更新,可以直接学习。

PID 控制算法

首先一个闭环控制系统如下。

  • 首先我们需要设定一个期望经过控制达到的值,即期望值(Setpoint)。
  • 通过比较器(Comparator)与现在系统的输出值(Output)的反馈(Feedback)进行比较,得到误差(Error),告诉控制器(Controller)现在距离目标值还差多少。
  • 控制器再让执行器(Actuator)对设备(Plant)进行执行。
  • 通过不断的控制、执行、反馈逼近期望值。

在 Controller 中最重要的即是 PID 控制算法:

  • 比例(Proportion) 的作用是解决控制器和执行器之间量纲不统一的影响。比如我们的目的是让电机的转速达到 1200 rpm,但控制电机可能需要给电机发送电流值。
  • 积分(Integral) 的作用是消除稳态误差,可以将过去的误差进行累积,从而消除系统长期的偏差。例如电机带有负载时,达到稳态后比例项给的小电流可能无法让电机转动;加入积分项后,可以把过去时刻的误差累积起来,使电流变大,逐渐缩小误差。但我们应当注意给积分设定一个上限,防止因为电机堵转之类的情况导致积分项持续增加。
  • 微分(Derivative) 的作用是抑制系统的快速变化,类似于阻尼的效果。其本质是当前时刻和过去时刻误差的差:当误差在减小时,微分项会变成负数,以此来防止比例项和积分项使系统超调过多。
  • 最后再将比例项、积分项、微分项进行相加,得到需要传给执行器的值。

PID 在离散时间下的公式

设第 k 次更新与前一次间隔为 秒:

其中, 和 分别是设定值和测量值, 是两者的误差。误差微分(D 项)是:

输出的控制值则是:

P 对当前偏差作反应;I 累积长期偏差,可能消除某些稳态误差,但会积累和饱和;D 对变化作反应,既可能提供阻尼,也会放大噪声。

双环控制

在实际应用中,电机的控制常常使用双环控制的结构:内环负责输入速度、输出电机电流,外环负责输入位置、输出速度。

角度目标 ─→ 位置控制器 ─→ 角速度目标 ─→ 速度控制器 ─→ 电流/力矩命令
                ↑                            ↑
             角度反馈                     角速度反馈

外环不直接控制最终电流,而是给内环设目标。通常先保证内环可用,再调外环;外环变化太快而内环跟不上,容易放大滞后与振荡。

麦轮运动解算

篇幅比较长,可以参考这篇知乎文章。

学会使用 AI Agent 进行开发

从下面这些 AI Agent 里任选一个,装好并尝试使用:

  • Claude Code
  • Codex / ChatGPT Desktop

这些知识我都学完了

如果这些知识都学完了,那么恭喜你已经具有了在 GKD 进行工作的能力。欢迎这时候来和我们线下聊一聊,并向我们展示你的工作(主要是关于你这段时间所进行的学习)。

前面的任务太简单了

如果你的基础很强大,那么你可以选择跳过前面的所有学习路径,直接完成我们的考核题。当你通过考核后,将正式加入 GKD 大家庭。

完成清单

前面每一节具体做到什么程度算学会?下面这份清单可以对照自查。全部能打上勾,就说明你已经具备在 GKD 工作的能力。

开始之前

  • 读过《提问的智慧》与《别像弱智一样提问》

环境

  • 装好 Ubuntu 24.04 或 22.04,且是物理双系统而不是虚拟机
  • 能正常访问 Google、ChatGPT、GitHub
  • 配好 git、ssh、gcc、g++、cmake

C / C++

  • 学完 C 语言,完成「一生一芯」PA0
  • 完成「一生一芯」PA1
  • 学完 C++ 的类、继承、多线程与锁

观看并理解中科大电控入门教程 3-7章

  • 观看并理解第三章
  • 观看并理解第四章
  • 观看并理解第五章
  • 观看并理解第六章
  • 观看并理解第七章

最后

清单上的都打上勾了,就可以来线下聊一聊,把这段时间的学习成果展示给我们;如果你的基础本来就很强,也可以跳过整份清单,直接完成考核题,通过后正式加入。