第一部分:核心原理 - 它是如何做到不倒的?
自平衡机器人的核心原理是“倒立摆”,想象一下,你用手掌托着一根长长的杆子,目标是让杆子垂直地立在手掌上,你的眼睛会不断观察杆子倾斜的角度和方向,然后你的大脑会迅速判断:杆子要往哪边倒了?我的手应该往哪个方向、多快地移动才能把它“扶”正?

EV3自平衡机器人做的就是完全相同的事情,只是用传感器和程序代替了你的眼睛和大脑。
-
传感器 - “眼睛”:
- EV3陀螺仪传感器:这是最关键的部件,它能精确地检测机器人自身的角速度,也就是机器人倾斜和旋转的速度,通过积分角速度,我们可以推算出机器人当前的倾斜角度。
-
控制器 - “大脑”:
- 我们需要一个快速、智能的算法来处理传感器数据并控制电机,最常用的是PID控制器。
- P (Proportional - 比例):根据倾斜角度的大小,按比例输出力量,如果机器人倾斜角度很大,就给电机一个很大的力来纠正;如果倾斜角度很小,就给一个很小的力,这就像你看到杆子快要倒了,赶紧用力扶一下。
- I (Integral - 积分):解决长期存在的“稳态误差”,由于机械摩擦或重量分布不均,机器人总是倾向于往一个方向慢慢倒,积分项会累积这个微小的、持续的偏差,并产生一个额外的纠正力,让机器人能精确地停在垂直位置。
- D (Derivative - 微分):根据倾斜角度的变化率来“预测”未来的趋势,如果机器人倾斜得越来越快,微分项会施加一个“阻尼”力,防止它冲过平衡点,从而让运动更平滑,减少震荡。
-
执行器 - “肌肉”:
(图片来源网络,侵删)- 两个大型EV3电机:它们作为驱动轮,根据“大脑”(PID控制器)的指令,精确地前进或后退,来抵消机器人身体的倾斜,从而保持平衡。
简单流程图:
机器人倾斜 -> 陀螺仪检测角速度 -> 计算倾斜角度 -> PID控制器计算所需电机力量 -> 电机驱动轮子前进/后退 -> 机器人身体被扶正 -> 循环往复
第二部分:搭建指南
虽然网上有很多种设计,但一个经典的、性能较好的设计通常包含以下特点,你可以参考乐高官方设计(如SPIK3R的腿部改造)或社区流行的设计(如NXTway-GS的EV3版)。
关键部件:
- EV3主机 x1
- 大型电机 x2
- 陀螺仪传感器 x1
- 大型轮子 x2
- 多种尺寸和类型的梁、轴、连接件、齿轮等
核心结构要点:
-
底盘与轮子:
- 将两个大型电机平行地安装在底盘上,作为驱动轮,注意轮距(两个轮子之间的距离)不宜过宽或过窄。
- 在电机上安装好大型轮子。
-
身体(配重):
(图片来源网络,侵删)- 在两个电机和轮子的上方,搭建一个“身体”结构,这个身体需要有一定的重量和高度,因为重心越高,倒立摆效应越明显,控制难度越大,但一旦平衡,姿态也更稳定。
- 将EV3主机和陀螺仪传感器安装在这个身体上,陀螺仪的标记(箭头)方向必须与机器人前进方向一致。
-
电池盒:
将电池盒安装在身体上方,作为额外的配重,并确保重心在轮轴的上方。
-
结构加固:
整个机器人结构必须非常坚固!任何微小的晃动都会被陀螺仪检测到,并导致控制算法失效,使用交叉梁和三角形结构来增强刚性。
搭建建议:
- 先从成熟的图纸开始:强烈建议你先在网上找一个经过验证的搭建图纸(例如在YouTube上搜索 "EV3 Self Balancing Robot Build"),确保你的机械结构是正确的。
- 重心位置:搭建完成后,试着让机器人“躺”下,其重心应该在驱动轮轴的垂直上方。
- 传感器安装:陀螺仪必须牢固地固定在机器人主体上,不能有任何晃动。
第三部分:EV3-G 图形化编程
这是最有趣的部分,我们将分步实现一个基本的自平衡程序。
步骤 1:传感器初始化
陀螺仪需要先校准,告诉它什么是“静止”状态。
// 1. 传感器初始化 // 陀螺仪传感器连接在端口S1 gyro_sensor = GyroSensor(S1) // 2. 校准陀螺仪 // 等待用户按下中心按钮,然后开始校准 Wait(Button.CENTER) // 按下中心按钮开始 gyro_sensor.reset_angle() // 将当前角度重置为0 gyro_sensor.reset_rate() // 将当前速率重置为0
步骤 2:主循环 - 核心控制逻辑
这是一个无限循环,机器人会一直运行其中的代码。
// 3. 主循环
while True:
// 4. 获取传感器数据
current_angle = gyro_sensor.angle() // 获取当前倾斜角度
current_rate = gyro_sensor.rate() // 获取当前角速度
// 5. PID计算
// --- P项 ---
error = current_angle - target_angle // 目标角度是0度(垂直)
P_term = Kp * error // Kp是比例系数,需要调试
// --- I项 ---
integral_error += error // 累积误差
I_term = Ki * integral_error // Ki是积分系数,需要调试
// 积分限幅,防止过大
if I_term > max_I:
I_term = max_I
if I_term < -max_I:
I_term = -max_I
// --- D项 ---
D_term = Kd * (error - last_error) // Ki是微分系数,需要调试
last_error = error // 保存本次误差,用于下次计算
// 计算最终输出功率
power = P_term + I_term + D_term
// 6. 限制功率范围 (-100 到 100)
if power > 100:
power = 100
if power < -100:
power = -100
// 7. 控制电机
// 注意:如果机器人向后倾斜,power为负,电机应向后转,使机器人向前移动以平衡
Move_Steering(0, power) // 0号端口(直接功率),输出计算出的功率
步骤 3:参数调试
这是整个项目中最耗时也最关键的一步!你需要不断地调整 Kp, Ki, Kd 这三个参数。
调试策略(非常重要!):
-
先调P (Kp):
- 将
Ki和Kd设为0。 - 从一个很小的
Kp值开始(0)。 - 运行程序,观察机器人,它会先剧烈晃动然后倒下。
- 逐渐增加
Kp的值,直到机器人能够“抖动”着,试图站起来,但还是会倒下,这个抖动就是P控制的作用。 - 如果机器人直接冲出去倒下,说明Kp太大,减小它。
- 将
-
再调D (Kd):
- 在当前的
Kp基础上,加入一个很小的Kd值(1)。 Kd的作用是抑制震荡,你会发现,机器人的抖动会变小,运动更平滑。- 逐渐增加
Kd,直到机器人能稳定地、小幅度地“呼吸”(在平衡点附近轻微摆动),但不会倒下。 - 如果机器人变得迟钝,跟不上倾斜,说明Kd太大,减小它。
- 在当前的
-
最后调I (Ki):
- 在
Kp和Kd调试好后,加入一个很小的Ki值(01)。 Ki的作用是消除静差,如果机器人总是向一个方向慢慢移动,Ki可以纠正它。- 逐渐增加
Ki,直到机器人能够长时间地稳定在平衡点。 - 如果机器人开始出现低频的、缓慢的震荡,说明Ki太大,减小它。
- 在
参数参考范围(仅作参考,你的机器人可能完全不同):
Kp: 5.0 ~ 15.0Ki: 0.01 ~ 0.1Kd: 0.1 ~ 1.0
第四部分:进阶功能与挑战
当你成功实现基本平衡后,可以尝试增加更多功能,让它变得更“聪明”。
-
遥控前进/后退:
- 使用另一个EV3红外遥控器。
- 在主循环中,检测遥控器上的按键(如“上箭头”和“下箭头”)。
- 当按下按键时,给电机的输出功率增加一个固定的偏移量(如
+10或-10),机器人就会前进或后退,松开后,偏移量消失,机器人恢复平衡。
-
转向:
- 使用一个颜色传感器或红外传感器来检测地面上的标记线。
- 当检测到线时,让一个轮子的速度比另一个快一点,实现原地转向。
-
数据记录与可视化:
- 使用EV3主机上的“数据日志”功能,记录下平衡过程中的角度、功率等数据。
- 通过EV3软件将数据导出为CSV文件,用Excel或Python的Matplotlib库绘制成图表,你可以直观地看到PID控制的效果,这对于分析和优化参数非常有帮助。
-
从Python编程:
- 对于追求更高性能和更灵活控制的玩家,可以使用
ev3dev或Pybricks等固件/库,用Python进行编程,Python的循环速度和计算能力通常比EV3-G更快,可以实现更复杂的算法。
- 对于追求更高性能和更灵活控制的玩家,可以使用
总结与鼓励
- 耐心是关键:自平衡机器人是一个典型的“调参”项目,失败和反复是正常的。
- 结构是基础:不稳定的结构再好的程序也无法挽救,确保搭建牢固。
- 安全第一:调试时,最好用手在机器人旁边扶着,或者用绳子拴住,防止它突然失控摔坏。
- 享受过程:这个项目会让你深刻理解到理论与实践的结合,当你看到那个小小的机器人稳稳地站在那里时,那种成就感是无与伦比的!
祝你成功搭建出自己的EV3自平衡机器人!如果在过程中遇到具体问题,可以随时提出。
标签: 乐高EV3自平衡机器人原理 EV3自平衡机器人代码实现 乐高自平衡机器人PID控制