ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

机器人阻抗控制与导纳控制:力控选型、参数整定与工程实践

机器人阻抗控制与导纳控制:力控选型、参数整定与工程实践 阻抗控制这四个字在搜索框里是个歧义很大的词。做硬件的朋友搜它跳出来的多半是PCB走线50欧姆、差分100欧姆、PCIe那套特性阻抗匹配的东西做机器人的人搜它想要的是另一码事——让机械臂碰到东西时表现得像一根弹簧加一个阻尼器。我自己就遇到过这种尴尬跟做电路的朋友聊阻抗控制参数怎么整定对方一脸认真地回我你走线画多宽、多长。这篇只聊后一种机器人力控里的阻抗控制和导纳控制。这两个词经常被放在一起讲初学者特别容易搞混因为它们其实是同一枚硬币的两面——都把位置和力用一个动态关系绑在一起区别在于谁是输入、谁是输出。下面这些内容是我从翻论文、调参数、拿工件往夹具上撞、撞到怀疑人生之后攒下来的整理适合刚接触力控的、准备上手协作臂或者力控打磨的、以及被那两串公式绕晕过的人。1. 先把阻抗这个词的语境掰开说清楚1.1 硬件语境里的阻抗控制和机器人语境里的完全是两码事有人搜pcie阻抗控制多少其实问的是高速差分线的特性阻抗匹配常见答案是差分85欧姆到100欧姆之间单端50欧姆左右。这套东西关心的是信号完整性、反射、眼图跟机械臂没有半点关系。而机器人里的阻抗控制关心的是机器人末端和环境之间位置与力的动态关系单位是牛顿、米、秒不是欧姆。之所以两个领域共用一个词是因为它们在数学上确实长得像。电路里欧姆定律说电压和电流通过一个复数阻抗关联机械里力和位置或速度同样可以通过一个复数形式的关系关联。把机械系统的质量、阻尼、刚度写成 $Ms^2 Bs K$你会发现它跟电路的 $Ls^2 Rs 1/C$ 结构上完全对偶。所以工程师们偷了个懒直接叫它机械阻抗。理解这一点很关键——你后面看到的所有公式本质上都是在设计这个机械阻抗的取值。1.2 力控场景下阻抗描述的是一种可编程的柔性我常拿一个类比来解释把机器人末端想成你手里握着的那个东西。如果机器人是纯位置控制那它就像一根刚性钢管你推它它纹丝不动力全部由你的手承受机器人只会硬邦邦地报位置偏差过大。如果机器人是阻抗控制那它就像一根弹簧你推它它会顺着你的力退一点退多少取决于你设定的刚度。你设的刚度越小它越软越容易被推动设的刚度越大它越硬。这里有个容易被忽略的点阻抗不是机器人本身的物理属性而是我们人为定义并让控制器去实现的目标属性。真实的机械臂有自己的惯量、摩擦、关节柔性阻抗控制做的事情是用控制器把真实系统的动力学盖住让它对外呈现成我们想要的 $M_d$、$B_d$、$K_d$。这一点想明白了很多调试中的迷惑行为就解释得通了。1.3 为什么工业界突然开始重视这两个词早些年工业机械臂几乎都是位置控制因为它们干的活就是重复走轨迹——点焊、搬运、喷涂不需要跟环境较劲。但当任务变成装配、打磨、抛光、柔性抓取、拖动示教、人机协作时位置控制就顶不住了。原因很朴素位置控制要求位置精度可接触任务里位置本身是被环境约束的你越想精确到某个位置接触力就越失控。于是就出现了两类解决思路一类让机器人主动变软直接控制输出力跟位置的动态关系这就是阻抗控制另一类保留原有的位置控制骨架在外面套一层力气转换器把测到的力翻译成位置修正量这就是导纳控制。选择哪一类往往不是喜好问题而是你的机器人硬件开放了什么接口决定的。下面我按这个线索拆开讲。2. 阻抗控制把机械臂定义成可编程的质量弹簧阻尼系统2.1 那个二阶方程到底在描述什么阻抗控制的目标方程通常写成这个样子$$M_d(\ddot{x} - \ddot{x}_d) B_d(\dot{x} - \dot{x}d) K_d(x - x_d) -F{ext}$$左边是机器人自身按设定参数产生的虚拟力右边是环境施加的外力。$M_d$、$B_d$、$K_d$ 就是你设计的目标惯量、目标阻尼、目标刚度$x_d$ 是期望轨迹$x$ 是实际位置$F_{ext}$ 是测到的接触力。我第一次看这个方程时的困惑是这不是牛顿第二定律吗有什么好控制的后来才反应过来关键在于这里的质量、阻尼、刚度全都是你想给的不是机器人的真实值。真实机械臂的惯量可能是几公斤平方米级别你可以在控制器里把它等效成0.5公斤真实关节摩擦大到没法忽略你可以在控制器里把它抹平换成你指定的60牛秒每米。控制器要做的事就是算出该给关节输出多大扭矩才能让真实系统的行为逼近这个理想方程。从方程反解出关节力矩一般走的是计算力矩逆动力学的路子先用目标方程算出末端需要的虚拟力再用雅可比转置映射到关节空间最后叠加真实动力学的补偿项。这里我不展开完整推导了因为实际项目里你很少从零写这块多数是调用现成库或者用厂商提供的阻抗模式。2.2 三种典型形态刚度优先、阻尼优先、惯性优先同一个方程参数取不同值行为差别很大这是阻抗控制最有趣也最容易踩坑的地方。刚度主导型$K_d$ 大$B_d$ 相对小表现为一根比较硬的弹簧。适合需要一定接触力精度、又允许轻微柔顺的场景比如精密装配时保持一个稳定的插入力。缺点是碰到硬环境时容易振荡因为刚度大意味着小小的位置误差会产生很大的力。阻尼主导型$B_d$ 大$K_d$ 小甚至为0表现为一个黏糊糊的阻尼器速度越快反抗越大。这个是拖动示教零力控制的典型配置$K_d0$把$B_d$设成二三十牛秒每米人手一推它就顺着走松手它就停住不会像弹簧那样弹回去。我调协作臂拖动功能时第一件事就是把刚度清零否则手臂会总想回原位拖起来跟拔河一样。惯性主导型$M_d$ 大表现为很重加减速迟钝。这个用在实际任务里的场景不多更多是用来做平稳化处理比如让机器人在力方向上的运动更平缓减少抖动。需要说明的是这三者不是非此即彼实际参数往往是组合的只是有一个相对主导的项。判断依据看阻尼比 $\zeta B_d / (2\sqrt{M_d K_d})$一般取0.7到1.0之间让系统接近临界阻尼不会来回晃。2.3 参数整定的实际操作顺序我自己的习惯是分三步走先定刚度再配阻尼最后微调惯量。第一步定刚度看任务需要的最大接触力和允许的位置偏差。假设你希望施加10牛的力允许的最大形变是1厘米那 $K_d$ 大约是1000牛每米。如果允许形变10厘米比较软那 $K_d$ 就取100牛每米。经验值是接触刚度越高你的 $K_d$ 就要设得越低否则两个硬碰硬必然振荡。第二步配阻尼用上面那个阻尼比公式反推。比如 $M_d$ 取1千克$K_d$ 取400牛每米要 $\zeta1$那 $B_d 2\sqrt{1 \times 400} 40$ 牛秒每米。这一步很多人凭感觉给导致要么太黏动作迟钝要么晃个不停。第三步看惯量$M_d$ 一般取0.1到5千克。太小会让加速度需求爆炸、噪声被放大太大则响应迟缓。我一般先给1然后根据响应快慢上下调。2.4 阻抗控制绕不开力矩接口这里有个现实问题必须说清楚纯正的阻抗控制需要机器人开放关节力矩或者关节电流接口。因为它的本质是直接指定机器人该出多大力位置是顺带的结果。如果只有一个位置接口你没法让机器人表软——你发的指令还是位置它依然会硬邦邦地冲过去。所以选方案之前先翻硬件手册看你的控制器支持什么模式。支持力矩模式的协作臂七轴、六轴柔性臂基本都支持可以直接做阻抗控制。只有位置模式的老式工业臂就得走导纳控制的路线。这一点搞反了后面全是无用功。3. 导纳控制位置型机器人怎么伪装出力控能力3.1 对偶关系一块是弹簧一块是电容如果把阻抗控制比作电路里的一段电感那导纳控制就是它对偶的另一段。阻抗控制是输入运动、输出力导纳控制是输入力、输出运动。数学上$$\ddot{x}c M_d^{-1}(F{ext} - F_d - B_d\dot{x}_c - K_d(x_c - x_d))$$这里的 $x_c$ 是修正后的位置指令$F_d$ 是期望接触力。算出来的 $x_c$ 再发给机器人内置的位置控制器去执行。从直觉上理解导纳控制就是在原位置指令上叠了一个偏移量。你测到外力大了就让位置往力的方向让一让测到外力比期望小就让位置往接触方向再挤一点。跟阻抗控制最本质的区别是导纳控制里机器人本体还是位置控制在干活力控只是一个外挂。这一点决定了它的优点和缺点。3.2 外环力环加内环位置环的串联结构整个系统是两层嵌套的。内环是机器人自带的关节位置环跑在几百赫兹到几千赫兹负责把关节转到指定角度外环是我们写的导纳环通常跑在500赫兹到1千赫兹负责读力、算位置修正。这种串联结构带来两个直接后果。第一内环的带宽必须远高于外环一般要求至少5到10倍。如果内环慢吞吞的外环以为已经修正到位了实际机械臂还在路上力信号就一直偏控制量越积越大最后要么发散要么剧烈抖动。我踩过这个坑当时内环位置环带宽只有30赫兹左右外环按1千赫兹跑力曲线抖得像心电图。第二外环的稳定性不仅仅取决于自己还受内环的动态特性影响。内环有延迟、有超调这些都会以额外相位滞后的形式反映到外环里。所以调试导纳控制时一定先把内环调干净增益不要给太高宁可稍微慢一点也要稳。3.3 采样率和滤波是这类方案最容易翻车的地方力控的稳定性对延迟非常敏感。整个回路里的延迟主要来自三块力传感器采样、力信号滤波、内环位置执行。这三块加起来如果超过某个阈值系统就开始振荡。力传感器的采样率别低于500赫兹条件允许上1千赫兹。滤波很多人习惯上一个低频低通把噪声压干净结果相位滞后直接把稳定性吃掉了。我的做法是用二阶巴特沃斯截止频率给到控制系统带宽的3到5倍够用的同时别太激进。如果力信号有特定频率的共振峰比如固定在某个频率啸叫用陷波器精准干掉那一根比整体降低截止频率划算得多。还有一点是力传感器的零点漂移和偏置。上电之后如果不在自由状态下重新标定零点可能一开始就带着十几牛的偏置进去导纳环直接把机械臂推飞。我现在的习惯是每次启动先做一次静态零漂标定运行中也做慢速偏置补偿只补偿比控制周期慢很多的漂移分量不要动快速变化的真实力信号。4. 从硬件接口和任务特性两个维度做选型4.1 先看机器人给你留了什么门这是最实际的判断依据我把常见情况整理了一下控制器开放接口推荐方案原因关节力矩/电流直通阻抗控制可以直接指定输出力带宽高响应快只有位置/速度指令导纳控制只能在位置层叠加修正量位置指令但带力前馈混合方案前馈做力的粗补偿反馈做柔顺修正力传感器集成度低先补传感器没有干净的力信号两种控制都做不好有个常见的误解是导纳控制是低配版阻抗控制。不是的。对于高刚度环境下的接触任务导纳控制反而更合适因为它本质上是在位置层做微调不会像阻抗控制那样因为目标惯量太小而放大噪声。选型看的是匹配度不是谁更高级。4.2 再看任务本身的接触特性接触环境是刚还是软、接触是持续还是间歇这两个问题基本能定调。轴孔装配、卡扣插接这类任务接触一旦建立就是高刚度约束力变化剧烈。这种情况下如果用力矩层做阻抗控制目标刚度稍微设大就振荡我倾向于用导纳控制因为位置层的分辨率能让力变化更平滑地被吸收。打磨、抛光、去毛刺这类任务需要长时间保持一个稳定接触力同时末端还要沿表面移动。这个场景两种都能用但我更常用阻抗控制因为可以设定一个特定的法向刚度和切向阻尼让工具在贴合表面的同时顺滑地滑动力的波动更小。拖动示教、人机协作这类任务核心诉求是轻快、听话、不反抗。用阻抗控制把刚度清零、阻尼给足是最直接的人推起来的感觉最自然。如果硬件只支持位置接口那就用导纳做但因为内环延迟手感会稍微重一点。4.3 什么时候两个都要上不是所有项目都能干净地二选一。有些任务需要多自由度异向处理比如法向要求强柔顺接触力小且稳定切向要求高刚性定位准确不跑偏。这时候常见做法是在任务空间的法向做导纳切向做位置控制或者对六维阻抗矩阵的各个方向分别设定参数。还有一种情况是切换接近阶段用位置控制快速移动接触建立的瞬间切换到力控模式。这个切换如果不做平滑过渡很容易在切点产生一个力冲击。常见的处理是用一个短时间的插值把目标刚度从很大平滑降到设定值而不是硬切。我见过不少机器人在切换瞬间撞出哐的一声基本都是这个问题。5. 从方程到能跑起来的代码中间还隔着这些东西5.1 连续方程离散化时容易发生的积分漂移把连续的二阶方程写成代码最直接的是显式欧拉# 一维导纳控制外环周期 1ms M 1.0 # 虚拟质量 kg B 40.0 # 虚拟阻尼 N*s/m K 400.0 # 虚拟刚度 N/m F_d 10.0 # 期望接触力 N x 0.0 v 0.0 dt 0.001 def update(F_meas, x_d): global x, v F_err F_meas - F_d a (F_err - B * v - K * (x - x_d)) / M v v a * dt x x v * dt return x这段能跑但有两个隐患。第一显式欧拉对刚度项的处理不是无条件稳定的$K$ 大而 $dt$ 大时可能发散。用半隐式欧拉会好很多先更新速度再用新速度更新位置对阻尼项的稳定性有明显改善。第二速度是积分出来的长时间运行必然漂移尤其是力信号里带一点点直流偏置时位置会缓慢爬走。解决办法是定期用真实位置重置 $x$或者给速度项加一个很小的泄漏系数让它慢慢回归零。5.2 参数耦合你以为在调刚度其实在动阻尼前面提到阻尼比公式这里想强调一个实操中特别容易犯的错误单独调某一个参数时会连带改变系统行为导致越调越乱。比如只把 $K$ 调大想让接触力更稳定结果阻尼比下降系统反而振荡了这时候又去加 $B$手感变黏于是再改 $M$……最后参数彻底失控。我的建议是每次只改一个参数并且记录阻尼比的变化。调完之后重新算一遍 $\zeta$如果偏离0.7到1.0太多就把 $B$ 按比例补回来。这样每次都是在可控范围内移动。5.3 力信号的坐标变换别搞反方向多自由度任务里力传感器测到的力是在传感器坐标系下的需要转换到工具坐标系、再转换到任务坐标系才能按方向分别处理。这一步如果方向搞反会出现你越用力推它越往你这边顶的诡异现象。我调试时有个笨办法但极其有效让机械臂静止在自由状态用手从六个方向分别推一下看每个方向的位置响应是否符合预期。方向不对就立刻能发现。6. 调试现场最容易踩的六个坑第一个坑刚度设得跟环境一样硬。很多人觉得刚度设大一点力控精度会更好结果一接触就振荡。正确的思路是让目标刚度低于环境刚度一般取环境刚度的三分之一以下给系统留出缓冲。第二个坑把力传感器的偏置当成外力。前面提过上电不标定零点导纳环会把偏置当真实力一路累积机械臂可能直接朝一个方向跑过去。养成习惯每次上电先测一段静态数据取平均当零点。第三个坑滤波滤得太狠。想图个力曲线漂亮把低通截止频率压得很低结果相位滞后吃掉了全部稳定裕度。宁可曲线毛躁一点也要保证相位。第四个坑内外环采样率倒挂。内环位置环如果跑得比外环慢逻辑上就说不通。写代码时明确检查两个循环的周期确保内环至少快5倍。第五个坑忽略关节摩擦。阻抗控制假设控制器能把摩擦补偿掉但低速运动时静摩擦到动摩擦的切换会产生黏滑现象表现为力控时一顿一顿的。常见做法是加前馈摩擦补偿或者避免让关节长时间工作在极低速区间。第六个坑没有紧急停止的软限位。力控模式下机械臂可能因为参数错误而朝某个方向发力如果只依赖位置软限位可能来不及。我的项目里一定会在导纳层额外加一层力的硬限幅超过阈值立即冻结输出。7. 最后说两句我自己的体会阻抗控制和导纳控制这两个词初看是两套公式实际做下来它们的差别更多体现在硬件条件带来的工程取舍上。我见过太多人在这上面绕弯子其实大部分问题在选型阶段就已经决定了——你的机器人开放什么接口你的力传感器能提供多干净多快的信号这两个问题的答案基本框定了你能做到什么程度。如果让我给一条最实在的建议先把力信号的质量做上去再动控制参数。我吃过最多的亏都是在一个带着噪声和漂移的力信号上疯狂整定参数最后发现换了滤波和标定方案之后原本的参数根本不用调。控制算法的天花板往往被传感器和信号链的下限卡得死死的这一点在力控里体现得尤其明显。
返回列表