PID 控制:学习与工程实践
用直观方式理解 PID,并区分自瞄控制器调参与下位机电机 PID 调参。
PID 是让系统“根据目标和现状的差距,持续修正动作”的一种方法。视觉组不需要从零编写电机控制代码,但需要知道:自瞄给出的目标如何最终变成云台动作,出现问题时应先判断属于视觉、上位机控制器,还是下位机 PID。
本文分为两个部分:
- 学习部分:用最少的数学建立 PID 的直觉;
- 工程部分:把 PID 放回自瞄链路,说明视觉新人怎样观察、定位并参与调参。
第一部分:学习 PID
1. PID 在解决什么问题
假设希望云台转到一个方向。控制器会不断比较“想要的位置”和“现在的位置”,两者的差叫作误差:
误差 = 目标值 − 反馈值
误差不为零时,控制器就给电机一个输出;云台运动后,传感器又把新的位置反馈回来。这个反复测量和修正的过程就是闭环控制。
flowchart LR
target[目标角度] --> compare[比较目标与反馈]
feedback[当前角度 / 速度] --> compare
compare --> pid[PID 控制器]
pid --> output[电流、扭矩或速度指令]
output --> plant[电机与云台]
plant --> feedback
这里的“反馈”非常重要。没有反馈,只按预先给定的输出转动,叫开环;有了反馈,系统才有机会抵抗负载变化、摩擦和外部扰动。
2. P-I-D 的直观含义
PID 由比例 P、积分 I、微分 D 三部分组成。可以把它理解为三种不同的纠偏习惯:
| 部分 | 它看什么 | 直观作用 | 过大时的常见现象 |
|---|---|---|---|
| P(比例) | 当前差了多少 | 差得越多,推得越用力 | 来回摆动、振荡 |
| I(积分) | 过去一直差多少 | 处理长期“总差一点”的偏差 | 越积越多,冲过头、低频晃动 |
| D(微分) | 误差变化得有多快 | 提前刹车,增加阻尼 | 放大噪声、高频抖动 |
常见的数学形式为:
输出 = Kp × 误差 + Ki × 误差的累积 + Kd × 误差变化速度
不用急着推导公式。先记住这三个判断就足够:
- 反应太慢,先怀疑 P 太小,或输出被限幅;
- 到目标后冲过头、来回摆,先怀疑 P 太大;必要时少量增加 D;
- 稳定后总有固定偏差,才考虑少量增加 I。
I 会不断累积,因此实际工程一般会给积分项设置上限;D 容易受到传感器噪声影响,因此也不是越大越好。
3. 串级 PID:云台为什么常有两层
云台常使用串级控制:外层看角度,内层看速度。外层只决定“应该以多快的速度转”,内层再决定“应该给电机多大的力”。
flowchart LR
angle_target[目标角度] --> angle_pid[角度环 PID]
angle_feedback[角度反馈] --> angle_pid
angle_pid --> velocity_target[目标速度]
velocity_target --> velocity_pid[速度环 PID]
velocity_feedback[速度反馈] --> velocity_pid
velocity_pid --> current[电流 / 扭矩指令]
current --> motor[电机与云台]
motor --> angle_feedback
motor --> velocity_feedback
因此“PID 参数”没有脱离上下文的意义:角度环和速度环的参数不能混用,不同电机、减速比、负载和单位下的数值也不能直接照抄。
4. 推荐学习资料
先看视频建立直觉,再用文章补充细节即可,不必一次学完全部控制理论:
看完后,至少应能说清目标、反馈、误差和输出分别是什么,并能用“P 太小 / P 太大 / I 积累 / D 放大噪声”描述基本现象。
第二部分:在自瞄工程中怎样理解和参与调参
5. 先分清:自瞄控制器不是电机 PID
自瞄工程中的控制器位于视觉与 C 板之间。它接收跟踪结果和云台当前姿态,完成坐标变换、目标预测、弹道补偿与安全限制,最后向下位机发送目标 pitch、yaw 等指令。
flowchart LR
tracker[检测、跟踪与预测] --> controller[自瞄控制器]
gimbal_feedback[下位机反馈的云台姿态] --> controller
controller --> command[目标 pitch / yaw 与工作状态]
command --> board[C 板下位机]
board --> motor[角度环、速度环 PID 与电机]
motor --> gimbal_feedback
图中最后一段才是实际驱动电机的 PID 闭环。自瞄控制器输出的是目标,并不直接替代下位机的角度环、速度环 PID。
可以用下面的表先把问题归层:
| 现象 | 优先检查的层 | 典型原因 |
|---|---|---|
| 静止目标始终偏向一侧 | 标定、坐标系、固定补偿 | 相机/枪口外参、零位或方向约定错误 |
| 移动目标总落后或总超前 | 跟踪预测与控制器 | 时间戳、延迟估计、弹道参数、预测时间 |
| 目标角度指令本身跳变 | 检测、跟踪或控制器平滑 | 目标切换、跟踪不稳、限速或平滑参数不合适 |
| 目标角度平滑,但电机高速抖动 | 下位机 PID、传感器、机械 | P/D 过大、反馈噪声、机械间隙 |
| 指令正确但云台不动或反向 | 下位机状态、接线与坐标定义 | 未使能、限位、方向或反馈符号错误 |
6. 从控制器输出开始观察
调参前不要先改参数。先在现有调试工具中同时观察三类量:
- 输入:跟踪器是否稳定给出同一目标,目标的时间戳是否连续;
- 控制器输出:发送给 C 板的目标 pitch、yaw 是否连续、是否合理;
- 反馈与执行结果:下位机返回的实际角度、模式和电机响应是否跟得上。
这样能把“看起来没跟上”拆开:是视觉没有稳定目标,还是控制器给出的目标不对,抑或下位机没有执行该目标。一次只改变一个层级,才不会把两个问题互相掩盖。
7. 自瞄控制器中可粗略调整的内容
控制器配置通常包含弹速、发射补偿角、俯仰限制、预测时长或指令平滑等参数。新人可以在负责人确认后从这些高层参数开始理解和验证:
| 参数类别 | 它影响什么 | 何时怀疑它 |
|---|---|---|
| 固定 pitch / yaw 补偿 | 给最终目标角叠加固定偏置 | 多距离、多次测试都稳定偏向同一方向 |
| 弹速与弹道参数 | 弹道下坠补偿 | 距离越远,俯仰误差越明显 |
| 预测时间与延迟估计 | 对移动目标的提前量 | 静态准确,运动时稳定落后或超前 |
| 指令限幅、限速或平滑 | 防止目标角突变 | 跟踪偶尔切换时枪口抽动,但不应借此掩盖错误输入 |
| 俯仰/安全限制 | 防止给出不可执行或危险指令 | 目标接近机械限位或异常数据出现时 |
这些不是 PID 的 Kp、Ki、Kd。它们改变的是“下位机应该去哪里”,而下位机 PID 决定“怎样稳定地去那里”。
8. 一个安全的调试顺序
以静止目标到运动目标的顺序测试,并始终保存原始配置和测试记录:
- 先验证方向:小幅改变目标时,目标 pitch、yaw 与实际云台运动方向是否一致;不一致先查坐标系和符号。
- 再验证静态偏差:固定距离、固定目标下观察偏差是否恒定;恒定偏差优先查标定或固定补偿。
- 再验证距离变化:近、中、远距离分别记录误差;随距离系统性变化时查弹速和弹道参数。
- 最后验证运动目标:记录目标速度、时间戳、控制器目标角和实际角;持续落后或超前时查预测时间与延迟。
- 确认电机响应:若下位机收到的目标平滑正确、实际角仍振荡,再由电控同学处理角度环/速度环 PID、反馈滤波和机械问题。
调参时一次只改一个参数,改动要小,并写下测试条件、参数前后值、现象和结论。云台测试必须遵守队内安全流程:低功率、执行器受控或架空、急停有效;发现方向反了、异常发热或持续振荡时立即停止。
对于视觉成员,最有价值的贡献不是直接改底层 PID,而是提供能复现的问题证据:目标数据、控制器输出、实际姿态、时间信息和视频。把这五项交给电控,就能让“感觉不跟手”变成可定位、可验证的问题。