第201篇 阻抗控制——让机械臂“温柔“地与环境交互

📅 2026/8/19 14:00:20
第201篇 阻抗控制——让机械臂“温柔“地与环境交互
前面聊的控制方法不管是PID、LQR还是MPC都有一个隐含假设机械臂在自由空间中运动不接触任何东西。但实际机器人经常要和 environment 打交道。机械臂拧螺丝、擦桌子、装配零件、给人做按摩——这些任务都涉及接触。接触问题为什么难因为你不知道环境在哪。位置控制说手臂伸到x0.5m的位置但如果那里有一堵墙机械臂就会用力撞上去。力控制说输出10N的力但如果前面是空的机械臂就会一直加速伸出去。传统的做法是位置/力切换——自由空间用位置控制碰到东西切换到力控制。但切换瞬间会有冲击控制不连续体验很差。阻抗控制换了个思路不直接控制位置也不直接控制力而是控制位置和力之间的关系——机械臂的动态阻抗特性。一、阻抗控制的核心思想阻抗控制的概念是Neville Hogan在1985年提出的。核心思想一句话把机械臂变成一个弹簧-阻尼-质量系统。目标动态M_d * (x_ddot - x_ddot_d) B_d * (x_dot - x_dot_d) K_d * (x - x_d) F_extM_d是期望惯性矩阵B_d是期望阻尼矩阵K_d是期望刚度矩阵。F_ext是环境施加在机械臂末端的外力。这个方程的物理意义机械臂末端和环境之间的力F_ext通过一个虚拟弹簧-阻尼-质量系统来响应。你推机械臂它像弹簧一样退让你松手它像弹簧一样回弹。说白了阻抗控制不是让机械臂硬地到达某个位置或输出某个力而是让机械臂软地和环境互动——像一个有弹性的系统。二、阻抗 vs 导纳两种实现路径阻抗控制和导纳控制是一对对偶方案阻抗控制输入是位置误差输出是力。控制器模拟一个阻抗力/速度让机械臂表现出期望的力学特性。适合刚性执行器电机减速器。导纳控制输入是力输出是位置/加速度。控制器模拟一个导纳速度/力根据测到的外力生成运动。适合柔性执行器或者力传感器精度高的场景。两者的区别阻抗控制用力来调位置导纳控制用位置来响应力。实际工程中导纳控制用得更多。原因很简单导纳控制的输入是力传感器信号输出是位置修正量实现起来更直观。你只需要在位置控制器的基础上加一个力反馈修正就行。之前做协作机器人拖拽示教的团队用的就是导纳控制。用户抓住机械臂末端拖动六维力传感器测到外力导纳控制器把这个力转换成期望的运动位置控制器跟踪这个运动。整个过程流畅自然就像在推一个没有重量的东西。三、刚度、阻尼、惯性的选择阻抗控制的三个参数——刚度K_d、阻尼B_d、惯性M_d——直接决定了机械臂和环境交互时的手感。刚度K_d机械臂对外力位移的抵抗程度。K_d大你推一下机械臂只动一点点硬K_d小轻轻一推就动很多软。装配任务需要低刚度柔顺打磨任务需要高刚度精确。阻尼B_d机械臂运动的粘滞程度。B_d大机械臂移动时感觉像在蜂蜜里慢慢来B_d小机械臂移动时感觉像在空气中轻快。阻尼影响系统的振荡特性——阻尼不够会振荡阻尼太大响应太慢。惯性M_d机械臂对外力加速的抵抗程度。M_d大你推一下感觉推不动重M_d小轻轻一推就加速轻。工程上最常用的简化M_d 单位矩阵或者忽略只调K_d和B_d。这样阻抗方程退化成B_d * (x_dot - x_dot_d) K_d * (x - x_d) F_ext一阶系统更简单更稳定。很多协作机器人的拖拽示教就是这么实现的。临界阻尼设计B_d 2 * sqrt(K_d * M_d)。这个关系让系统不产生振荡响应速度也最快。和PID调参中临界阻尼的思路一样。四、代码示例导纳控制实现import numpy as np class AdmittanceController: 导纳控制器力 - 运动 def __init__(self, M_d, B_d, K_d, dt0.001): self.M_d M_d # 期望惯性 self.B_d B_d # 期望阻尼 self.K_d K_d # 期望刚度 self.dt dt # 状态 self.x np.zeros(3) # 修正位置 self.x_dot np.zeros(3) # 修正速度 def update(self, F_ext, x_d_current): F_ext: 六维力传感器测到的外力 [fx, fy, fz] x_d_current: 当前期望位置来自轨迹规划 返回: 修正后的期望位置 # 导纳关系: M_d * x_ddot B_d * x_dot K_d * x F_ext # 解出加速度 x_ddot np.linalg.inv(self.M_d) ( F_ext - self.B_d self.x_dot - self.K_d self.x ) # 积分更新 self.x_dot x_ddot * self.dt self.x self.x_dot * self.dt # 返回修正后的期望位置 return x_d_current self.x # 使用示例 ctrl AdmittanceController( M_dnp.eye(3) * 5.0, # 5kg虚拟质量 B_dnp.eye(3) * 50.0, # 临界阻尼 K_dnp.eye(3) * 200.0, # 刚度200 N/m dt0.001 ) # 仿真用户施加一个恒力10N沿x方向 F_ext np.array([10.0, 0, 0]) x_d np.array([0.5, 0.0, 0.3]) # 原始期望位置 for i in range(1000): x_new ctrl.update(F_ext, x_d) if i % 200 0: print(ft{i*0.001:.1f}s: 修正位置 {x_new}) # 机械臂会沿x方向偏移最终稳定在 F/K 10/200 0.05m 处这段代码实现了一个简单的导纳控制器。力传感器测到外力后导纳控制器算出虚拟质量-弹簧-阻尼系统的响应生成修正后的期望位置。位置控制器PID负责跟踪这个修正位置。五、面试实战Q阻抗控制和力控制有什么区别A力控制直接目标力输出10N阻抗控制目标力和位置的关系像弹簧一样响应。阻抗控制更灵活——自由空间时力为零机械臂自然跟随接触时力增大机械臂柔顺退让。不需要切换模式。Q阻抗控制和位置控制能结合吗A能而且通常就是这么用的。阻抗控制器输出修正后的期望位置位置控制器PID跟踪这个位置。阻抗控制是上层策略位置控制是底层执行。Q协作机器人的柔顺是怎么实现的A核心就是阻抗/导纳控制。力传感器测到外力导纳控制器生成柔顺运动。刚度参数K_d决定了多柔——K_d越小越柔顺。拖拽示教时K_d设得很低精密装配时K_d设得高一些。Q阻抗控制怎么保证稳定性A可以用Lyapunov方法证明。选V 0.5 * x_dot^T * M_d * x_dot 0.5 * x^T * K_d * x动能势能证明V_dot 0。关键条件是M_d正定、B_d正定、K_d正定。如果环境刚度已知还可以做更精细的稳定性分析。讲真阻抗控制在协作机器人和医疗机器人领域是必考知识点。面试时你能讲清楚阻抗参数的物理意义和调参方法基本就过关了。小结阻抗控制的核心思想不直接控制位置或力而是控制两者之间的动态关系——把机械臂变成一个可调的弹簧-阻尼-质量系统。三个参数决定手感刚度K_d软硬、阻尼B_d粘滞、惯性M_d轻重。工程上常用导纳控制实现——力传感器测外力导纳控制器生成修正位置位置控制器跟踪。阻抗控制让机器人从刚性执行者变成了柔顺合作者。这也是协作机器人能和人安全共事的理论基础。控制理论系列到这里告一段落。从PID到最优控制、从线性到非线性、从自由空间到接触交互基本覆盖了机器人控制的核心知识点。后续我们会进入感知和规划领域。如果这篇文章对你有帮助欢迎点赞、在看、转发三连。 你的支持是我持续更新的最大动力。「机器人软件开发面试·从入门到精通」连载系列上一篇第200篇 滑模控制——对扰动免疫的强鲁棒方案下一篇预告第202篇 导纳控制——力控场景的另一种实现思路有任何问题欢迎评论区留言我会尽量回复。