尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

第186篇 前馈控制——提升跟踪精度的补充手段

第186篇 前馈控制——提升跟踪精度的补充手段 上篇把微分滤波讲完了PID的工程问题基本覆盖了。但光靠PID反馈控制在很多场景下不够。反馈控制的本质是出了错再纠正——先有误差再有控制。但有些场景等出了错再纠正就来不及了。机器人高速行走时脚还没落地就得提前发力机械臂高速跟踪轨迹时稍有延迟就偏离路径。前馈控制就是为解决这个问题——不等误差出现提前根据目标值或扰动信息算好控制量。面试里这个问题频率不低特别是运动控制和轨迹跟踪岗位。前馈控制的基本思想反馈控制是看过去——根据已经发生的误差来调整。前馈控制是看未来——根据目标的预期变化提前动作。打个比方。你开车跟车反馈控制就像前车加速了我看到距离变大了踩油门追上去。前馈控制就像我看到前面是上坡路提前加大油门不等速度降下来再补。哪个效果更好显然是前馈——它不等误差出现就提前补偿了。数学上前馈控制的输出不依赖误差而是依赖目标值或其导数。最简单的形式u_ff Kff * target其中Kff是前馈增益。更复杂的形式会用到目标值的一阶导数速度前馈和二阶导数加速度前馈u_ff Kff_v * target_velocity Kff_a * target_accelerationclass FeedforwardController: 前馈控制器 def __init__(self, kff_pos0.0, kff_vel0.0, kff_acc0.0): self.kff_pos kff_pos # 位置前馈增益 self.kff_vel kff_vel # 速度前馈增益 self.kff_acc kff_acc # 加速度前馈增益 def compute(self, target_pos, target_vel0.0, target_acc0.0): 根据目标轨迹计算前馈控制量 return (self.kff_pos * target_pos self.kff_vel * target_vel self.kff_acc * target_acc) # 使用示例机械臂轨迹跟踪 ff FeedforwardController(kff_pos0.1, kff_vel2.0, kff_acc0.5) u_ff ff.compute(target_pos1.0, target_vel0.5, target_acc0.2)前馈反馈工程上的标准配置实际工程中前馈很少单独使用。前馈依赖模型模型不可能100%精确。标准做法是前馈提供粗调反馈提供精调。total_control feedforward PID_feedback前馈根据目标轨迹算出大概对的控制量PID根据实际误差做微调。PID的工作量小了很多——只需补偿前馈没覆盖的部分。class FeedforwardPID: 前馈PID组合控制器 def __init__(self, kp, ki, kd, kff_vel0.0, kff_acc0.0): self.kp, self.ki, self.kd kp, ki, kd self.kff_vel, self.kff_acc kff_vel, kff_acc self.integral 0.0 self.prev_error 0.0 def update(self, error, target_vel0.0, target_acc0.0, dt0.001): u_ff self.kff_vel * target_vel self.kff_acc * target_acc self.integral error * dt deriv (error - self.prev_error) / dt u_fb self.kp*error self.ki*self.integral self.kd*deriv self.prev_error error return u_ff u_fb之前面试一家做工业机械臂的公司面试官问轨迹跟踪精度怎么做到那么高的我说前馈反馈。前馈用逆动力学模型算关节力矩PID做微调。面试官追问权重怎么分配我说前馈贡献70%-80%的控制量PID处理模型误差和外部扰动Kp设得比较小系统更稳定。两种前馈类型指令前馈和扰动前馈前馈控制按信息来源分两种。指令前馈Command Feedforward根据目标指令设定值的前馈。比如轨迹跟踪中已知目标位置、速度、加速度提前算出需要的控制量。上面讲的就是这种。扰动前馈Disturbance Feedforward根据可测量的扰动信号的前馈。比如力传感器检测到外部扰动风力、地面不平在扰动影响输出前提前补偿。class DisturbanceFeedforward: 扰动前馈控制器 def __init__(self, kd_ff1.0): self.kd_ff kd_ff def compute(self, disturbance): return self.kd_ff * disturbance扰动前馈的关键是扰动必须是可测量的而且你要知道扰动对系统输出的影响关系即扰动通道模型。如果扰动测不到或者影响关系不清楚扰动前馈就没法用。前馈增益怎么调前馈增益的调节是很多人困惑的地方。跟PID不同前馈增益没有Ziegler-Nichols这种通用方法。但有章可循。模型法如果你有系统的数学模型前馈增益可以直接从模型推导。比如一个质量块系统 Fma加速度前馈增益就是质量m。这是最理想的情况。实验法没有精确模型时可以通过实验来调。方法是给系统一个目标轨迹先只开前馈关掉PID看跟踪误差。然后调整前馈增益让误差最小。最后再开PID做微调。自适应法对于参数会变化的系统比如机械臂抓取不同重量的物体可以用递归最小二乘法在线估计前馈增益。这个方法在机器人领域用得很多。import numpy as np def tune_feedforward_gain(targets, outputs, measured_vel): 通过实验数据拟合速度前馈增益 # 假设 u kff * v用最小二乘法拟合 kff np.dot(measured_vel, outputs) / np.dot(measured_vel, measured_vel) return kff # 实验数据记录目标速度和控制输出 # kff_opt tune_feedforward_gain(targets, outputs, velocities)面试时候问前馈增益怎么调你可以说有模型就从模型推没模型就做实验拟合。如果系统参数会变化用自适应方法在线调。这个回答能展示你对前馈控制的全面理解。面试实战前馈控制怎么聊面试官问你知道前馈控制吗别只说提前给控制量。得讲清楚前馈和反馈的配合关系。建议这样回答前馈根据目标指令或可测扰动提前计算控制量不依赖误差。但前馈依赖模型精度模型不完美时会有残余误差。所以工程上前馈和反馈配合——前馈提供大部分控制量粗调PID补偿模型误差精调。面试官追问前馈增益怎么来的你就说有模型从模型推没模型做实验拟合。参数时变用自适应方法。之前面试一家做无人车的公司面试官问横向控制用了前馈吗我说用了。基于自行车模型前馈项是曲率乘以车速平方除以前轮距。面试官问前馈和LQR反馈怎么配合我说前馈算稳态转向角LQR反馈补偿侧偏和航向误差两者相加就是最终转向指令。前馈控制是提升跟踪精度的利器。它不替代反馈而是跟反馈配合——前馈解决已知的部分反馈解决未知的部分。掌握了前馈反馈的设计思路你在运动控制领域的面试竞争力会大大提升。下一篇讲串级PID——位置环速度环的双环控制设计。单环PID在很多场景下够用但当你需要同时控制位置和速度时单环就不够用了。串级PID用内外两个环分别处理是工业界最常用的控制架构之一。如果这篇文章对你有帮助欢迎点赞、在看、转发三连。 你的支持是我持续更新的最大动力。「机器人软件开发面试·从入门到精通」连载系列上一篇第185篇 PID微分滤波——微分噪声放大的工程处理下一篇预告第187篇 串级PID——位置环速度环的双环控制设计有任何问题欢迎评论区留言我会尽量回复。
返回列表