开始之前
欢迎大家加入 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章
- 观看并理解第三章
- 观看并理解第四章
- 观看并理解第五章
- 观看并理解第六章
- 观看并理解第七章
最后
清单上的都打上勾了,就可以来线下聊一聊,把这段时间的学习成果展示给我们;如果你的基础本来就很强,也可以跳过整份清单,直接完成考核题,通过后正式加入。