首页 / 资讯中心 / 文章详情

基于学习的变阻抗控制:轴孔装配机器人力控实战全解析

基于学习的变阻抗控制:轴孔装配机器人力控实战全解析 ★ FEATURED ARTICLE
做 peg-in-hole 做到怀疑人生往往不是因为控制算法不会写而是因为你发现一个参数上午能用、下午就不能用换个孔径又不行了。轴孔装配这事学名就叫 peg-in-hole一套六轴协作机械臂加一个六维力传感器就能搭出实验台但真正让它稳定跑起来牵扯的细节远比论文里那一页公式多得多。我自己的路径是先啃固定阻抗控制调参数调到崩溃后来转向“基于学习的变阻抗控制”才把装配成功率和适应性都拉了上去。这篇内容就把我从动机、原理到落地实现、踩坑排错的全过程写出来适合正在做机器人柔顺控制、力控装配或者刚接触变阻抗想找个明确切入点的朋友。先说一个我这几年反复验证过的结论轴孔装配的难点不在“插”这个动作而在“接触状态不断变化时机器人的响应方式必须跟着变”。一个固定的阻抗参数本质上相当于让机器人用一种姿态应对所有情况这从根上就和任务物理相违背。这也是变阻抗控制存在的理由而学习要解决的正是“怎么变、变多少、什么时候变”这三个问题。1. 轴孔装配的麻烦接触状态一多固定参数就不够用了1.1 装配过程远比“把销子插进孔里”复杂很多人第一次看 peg-in-hole 任务觉得不就是机械臂夹着销子往下移动对准孔插进去就完了。实际跑起来完全不是这么回事。一次完整的装配至少可以拆成三个阶段接近阶段销子末端还没有和孔口发生实质接触这时候希望机器人保持较高的刚度和较快的响应速度保证末端能快速、准确地运动到孔口附近。搜索阶段销子已经在孔口表面或者倒角坡面上因为视觉标定误差、工件公差、夹爪抓取误差的存在销子几乎不可能一次对准。这时需要末端的“手感”变得柔软让接触力把销子顺着斜面滑进孔口这一阶段最考验力控的柔顺性。插入阶段销子进入孔内随着插入深度增加侧壁接触面积增大摩擦力和卡阻风险上升。此时既要有一定的轴向进给力又要在径向保持柔顺防止销子和孔壁卡死这个阶段的参数要求和前两个阶段差别非常大。这三个阶段对机器人末端特性的需求可以说是互相矛盾的需要又准又快的接近又需要又软又稳的搜索还需要进给有力但不蛮干的插入。一套固定参数根本没法同时满足。1.2 “柔”和“刚”永远在打架阻抗控制里低刚度、低阻尼意味着机器人末端“软”碰到硬物时接触力增长慢不容易损坏工件但代价是位置跟踪精度下降、响应迟钝严重时还会出现末端抖动。反过来高刚度、高阻尼让末端“硬”定位准、响应快但遇到位置偏差时接触力会瞬间飙升轻则划伤孔壁重则销子直接弯掉或者工件被顶飞。我用一个很生活化的例子给你感受一下给针线穿针如果你手腕绷得死死的稍微偏一点针尖就会顶在针孔周围要么穿不进去要么把针顶弯如果你完全放松手腕针尖倒是柔软地贴在针孔附近了但没法稳定进给半天找不到角度。真正熟练的人都是“该硬的时候硬该软的时候软”——接近针孔时腕部还是稳的一碰到孔口边缘手腕立刻顺着阻力微调方向这就是变阻抗的直觉原型。1.3 手工调固定阻抗参数的真实体验我第一次搭装配实验时用的是经典阻抗控制所有参数靠手调。调参过程中我做过一张表记录不同工况下“理想参数”的漂移情况工况变动刚度需求变化阻尼需求变化孔口倒角从 0.5mm 增大到 2mm需求降低靠斜面导向需求降低允许更多位移销孔间隙从 0.05mm 缩小到 0.02mm需求显著提高需求提高抑制振荡插入深度从 5mm 增加到 20mm径向刚度需求升高轴向阻尼需求升高工件材质从铝合金换成塑料接触刚度降低整体参数要下调阻尼适当降低避免过冲每一行参数之间都不能直接套用。固定阻抗控制调出的最优参数在某种特定孔径、特定材质的工件上确实可用但换一个新工件就要重调。更麻烦的是有些工况的“最优参数”本身就是一个矛盾点比如小间隙装配时径向又要高刚度保证精度又要低刚度避免卡死固定参数在这个问题上根本没有解。当时我最大的感受是手调参数的瓶颈不是时间而是任务本身在要求控制器具备“状态感知下的参数调节能力”。2. 变阻抗控制到底在变什么从控制律到参数曲线的完整逻辑2.1 先把阻抗控制方程写明白阻抗控制的核心思想是把机器人末端对外力的响应塑造成一个质量-弹簧-阻尼系统。经典的阻抗控制律可以写成[ M_d \ddot{e} B_d \dot{e} K_d e F_{ext} ]这里 (e) 是末端期望位姿与实际位姿的偏差(F_{ext}) 是末端受到的外力由力传感器测得(M_d)、(B_d)、(K_d) 分别对应期望惯性、期望阻尼和期望刚度。等式右边是环境对机器人的作用等式左边是机器人对作用力的“感受”——有点像一个弹簧振子被外力推着走外力和内力平衡。固定阻抗控制就是让这三个参数全程不变。系统设计者拍脑门定一组 (K_d) 和 (B_d)然后所有工况都用它。变阻抗控制的差别很直白这三项参数尤其是刚度和阻尼在任务过程中可以按规则实时变化。2.2 “变”的三种常见玩法根据参数变化的依据不同我把变阻抗控制分成三类时变参数曲线事先根据装配阶段设定好参数随时间变化的轨迹比如接近阶段 (K_d) 高接触到孔口后 (K_d) 降下来插入阶段再升高。这种方式简单、可复现缺点是不感知实际接触状态遇到异常情况比如销子根本没对准孔口不会自动调节。状态相关参数根据实时可测的状态量比如法向接触力大小、插入深度、末端速度用确定性规则把参数映射到合适数值。常见做法是测量到接触力越大就越降低径向刚度。这种方式比纯时间曲线智能得多但规则仍由人设计泛化能力有限。策略相关参数把参数的生成交给一个学习出来的策略网络网络输入当前状态力、位姿、速度等输出阻抗参数的调整量或直接参数值。这就是“基于学习的变阻抗控制”的核心形态也是后面几节的重点。2.3 参数不是想变就能变物理边界和稳定性约束变阻抗听起来很美好但实际实现时第一个要记住的教训是参数不能无约束地乱变。这里有两个关键约束。第一阻尼必须保持正值而且足够大。阻尼是系统能量的耗散项如果某时刻学习策略输出一个接近零甚至负的阻尼等价于往系统里注入能量。机械臂末端和工件接触构成的闭环系统很可能因此进入极限环振荡表现就是末端高频颤抖、接触力剧烈波动、工件被反复敲击。第二参数变化率必须受限。即使刚度最终值合理如果从一个值瞬间跳跃到另一个值相当于给系统输入一个阶跃冲击。真实场景里这会导致末端猛烈弹跳非常容易把工件打飞。我在后面调试小节里会专门讲这个问题的完整排查过程。学习算法在这里扮演的角色其实是在这个带约束的参数空间里找到一条“安全且高效”的变化轨迹。这也解释了为什么“让网络直接输出参数”这种看似简单的做法实际训练起来却没那么容易——因为网络很容易探索到不稳定的参数区域需要一个好的动作边界设计和奖励塑形来兜底。变阻抗实现方式参数来源优点主要局限时变曲线人工预设实现简单、完全可控不感知状态适应性差状态相关规则人工规则实时响应接触力规则覆盖不了所有工况学习策略策略网络输出适应性强、可泛化训练复杂、有稳定性风险3. 学习怎么和变阻抗结合三种主流的“学什么”3.1 直接学习阻抗参数让策略输出 K 和 B最直觉的做法是把阻抗参数本身当作策略的动作输出。状态输入可以设计成六维力/力矩 (F)、末端速度 (v)、销子插入深度 (d) 等策略网络输出当前时刻应该使用的刚度矩阵和阻尼矩阵或者更稳妥地输出相对当前参数值的修正增量。我在实际中比较推荐输出增量而不是直接输出绝对值。原因有两个一是增量的取值空间可以限制得更小天然降低了探索初期踩进不稳定参数区域的概率二是增量策略天然具备“当前参数作为先验”的含义训练初期的起点可以是一个已经能完成部分装配的固定阻抗参数学习只需要“在好的基础上做得更好”而不必从零摸索。这种方式的难点在于参数空间和任务表现之间的关系非常非线性。仿真里你会发现某些区域 (K_d) 降低一点任务成功率明显提升再降低一点直接进入振荡区。网络要精确学出这个边界对奖励信号的设计要求很高。3.2 学习参考轨迹修正量变阻抗做底层策略管“往哪偏”第二种主流做法是不直接改阻抗参数而是让策略网络输出末端位置的修正量 (\Delta p)。底层仍然用固定阻抗或状态相关阻抗作为安全兜底上层学习的是“当前位置偏移了多少、应该往哪个方向校正”。这种思路特别适合搜索阶段。策略网络看到接触力和当前位姿判断销子应该往左压一点还是往右滑一点输出一个位置修正量底层阻抗控制负责把“压”的动作平滑地转化为实际末端位移。这种方式比直接学阻抗参数更稳定因为底层阻抗始终存在策略的输出更像是在给“虚拟目标位置”做偏移不会直接改变系统刚度和阻尼特性。缺点是控制行为的柔顺性上限受底层固定阻抗参数限制如果底层参数不适合当前工况上层再怎么修正也没办法从底层绕过物理约束。3.3 学习接触状态与切换逻辑让控制器知道自己处于哪个阶段第三种思路是从“离散状态识别”入手。装配过程本质上是多个接触状态之间的切换未接触、点接触、斜面滑移、孔内摩擦、底部卡阻等。把状态识别做准然后根据状态切换不同的阻抗模式和参数逻辑上比连续调参更接近人的操作策略。常见实现是用分类器或时序模型隐马尔可夫、LSTM 类网络对力/力矩序列做状态识别输出当前接触状态的概率分布再利用概率加权混合多套预设阻抗参数或者作为切换信号在不同控制器之间跳转。这种方式的优点是可解释性强工程师能看清“现在策略认为销子卡在斜面了所以切换到柔顺搜索模式”。缺点是接触状态之间的边界往往是模糊的销子可能同时处于微弱接触和轻微斜面滑移状态硬切换会让参数跳变实践中一般要做概率软混合让参数在状态切换时连续过渡。学习范式输出内容稳定性风险最适合的装配阶段学习阻抗参数K、B 或增量较高需约束边界全阶段通用学习轨迹修正位置修正量较低底层兜底搜索阶段学习状态切换状态概率/切换信号中等需防跳变阶段边界处三种方式完全不冲突实际上很多工程方案是叠加使用的底层用状态相关变阻抗中层用状态识别切换模式上层用策略输出轨迹修正。先把哪一种做通都比“一上来就端到端学全套”更现实。4. 一套可落地的实现方案从仿真环境到真机迁移4.1 平台组成与状态、动作空间设计我自己搭建的平台结构比较简单六轴协作机械臂末端安装六维力/力矩传感器控制器运行在外部工控机上通过实时接口下发关节扭矩指令或末端位姿指令。仿真阶段用开源刚体仿真环境搭建了带摩擦和接触形变的装配场景把真实机械臂和工件的 URDF 模型导入用相同的控制器接口做训练。状态空间的设计我总结成一张表每一项最好都不要省状态量维度作用末端位置误差 (x, y, z)3提供位置层面的装配进度与偏差末端速度 (vx, vy, vz)3提供阻尼所需的速度反馈六维力/力矩6提供接触力信息核心输入插入深度1区分接近/搜索/插入阶段上一时刻阻抗参数2-6作为输出增量的参照基动作空间我采用的是“阻抗参数增量 位置修正增量”的混合形式具体到实验里是三个量径向刚度修正量、轴向阻尼修正量、径向位置修正量。径向刚度决定柔顺程度轴向阻尼决定插入过程中的运动稳定性位置修正量解决“往哪偏”的问题。4.2 奖励函数怎么设计才算合理奖励函数是学习效果的分水岭。我试过最早只用“是否成功插入”作为奖励结果是训练几千回合也不收敛因为稀疏奖励下网络根本不知道该往哪个方向改进。后来改成稠密奖励后收敛速度明显加快。一个经过多轮迭代后比较稳定的奖励形式如下[ R \alpha_1 \Delta d_{depth} - \alpha_2 \max(0, F_{lim} - F_{safe}) - \alpha_3 \Delta t - \alpha_4 |\Delta a|^2 R_{success} ]各项含义分别是(\Delta d_{depth})本次步长内的插入深度增量给网络一个即时的“前进”反馈(F_{lim} - F_{safe})接触力超限惩罚超过安全阈值的越大罚越狠(\Delta t)时间惩罚鼓励尽快完成任务(|\Delta a|^2)动作增量惩罚抑制参数突变和抖动(R_{success})最终成功插入的额外奖励数值要设置得足够大比如比一局累计奖励高一个量级让网络明确知道“成功是最优目标”。超参数上个人经验是 (\alpha_1) 和 (\alpha_2) 要反着调插入深度增量给太大会让网络猛冲不顾力限制力超限惩罚给太大会让网络过度保守连孔口都不敢碰。我最后一版用的相对权重大约是深度增量 1.0、力惩罚 2.5、时间惩罚 0.1、动作惩罚 0.05、成功奖励 50。4.3 算法选型与训练流程连续动作空间的任务我首选的是软演员-评论家算法SAC和近端策略优化算法PPO。这两个都是主流方案但性格完全不同SAC 的样本效率更高适合中等复杂度的仿真训练PPO 更稳训练过程中不会突然剧烈掉榜适合后期真机微调阶段。我实际训练流程是仿真里用 SAC 先跑等策略稳定后再切到 PPO 做小范围更新防止真机上安全风险。网络结构不需要复杂我用了三层全连接网络每层 256 个节点输入拼接归一化后的状态向量输出动作增量。激活函数用了 ReLU输出层接了 tanh 把动作限制在 ([-1, 1])再映射到实际的参数增量范围。这样参数被物理限制在上下界内从根源上避免策略探索到危险区域。训练流程上域随机化是关键。仿真和真机永远有差距这种差距靠“提高仿真精度”是补不完的更实际的方式是让仿真环境本身足够“乱”策略见过足够多的变化才不容易在真机前露怯。我固定随机化的几个维度包括孔的位置偏移、销子摩擦系数、孔壁接触刚度、力传感器噪声水平、控制延迟。4.4 真机迁移前的一页检查清单从仿真到真机如果直接加载仿真策略就跑大概率翻车。我整理了一份迁移前的检查清单每次做新任务都会过一遍力传感器坐标系与机器人末端坐标系是否对齐有没有做一个标准标定流程静态零漂是否采集并补偿运行过程中有没有周期清零机制控制器的力反馈频率是否足够一般要求至少 500Hz否则力信号延迟会打乱策略的节奏机器人是否工作在力矩/力控模式位置模式下的变阻抗效果会大打折扣策略推理频率与控制频率是否解耦不要让策略输出直接塞给控制循环中间要加低通滤波或采样保持器保护机制是否就位力超限停机阈值、参数上下界、紧急回退按钮。这套检查清单在迁移环节帮了我很大忙尤其是零漂和频率这两项很多仿真转真机失败都源于这两个看起来不起眼的细节。5. 我在调试中踩过的坑完整排查链路分享5.1 力传感器零漂如何骗过整个学习策略第一次在真机上跑训练好的策略我发现策略越来越倾向于输出极低的径向刚度表现为销子接触孔口后像面条一样软根本没法把销子推进去。起初我以为是保守惩罚设置太强把力超限权重调低了也没起色。排查链路是这样走下来的先看原始力波形发现力信号在销子未接触任何物体时就有 2-3N 的漂移量然后做了静态零漂采集测试传感器在不同温度下零漂变化明显最后在训练数据里重现了这个问题——网络在仿真里学习到的是“有接触力才降刚度”但真机上力信号还没接触就已经有偏移网络误判为已经进入接触状态自然把刚度压低了。解决方法是两步训练和推理前都做零漂校准运行过程中每隔一定时间检测销子是否处于无接触状态是则自动清零同时在状态输入里加入销子接触深度作为辅助信号让网络不再单纯依赖力值判断接触与否。这个坑让我明白状态输入设计的冗余性不是浪费而是应对传感器噪声的刚需。5.2 阻尼过低引发的极限环振荡还有一次策略学出来的阻尼参数在插入阶段经常降到非常低的值末端开始出现高频小幅振荡。振荡产生后接触力被放大器放大策略反馈更激进陷入了恶性循环最后因为力超限触发急停才停下来。排查链路从现象反推先排除机械谐振——断开控制只给恒定力矩末端不抖然后固定网络动作把输出阻尼强制设置在较高值振荡消失最后定位到网络给出的阻尼值在插入深度 12mm 附近有个塌陷低到接近零。修复方式是给阻尼输出加了一个实际下限同时为阻尼变化加了一个速率限制。从控制理论角度看这相当于给学习策略套了一个稳定性约束外罩——策略只能在一个保证系统稳定的参数子空间里探索。后来我把这个思路固化成流程每次训练前先用随机扰动测出一组“安全参数区间”再把区间作为动作输出的映射边界。5.3 刚度突变导致工件被弹飞另一个典型问题是刚度突变。搜索阶段从孔口斜面滑入后策略会输出一个较大的刚度值以便快速进给切换瞬间末端就像被弹了一下工件直接飞出夹爪。排查链路比较快查看参数曲线发现径向刚度从 200N/m 在一步之内跳到 1200N/m。从动力学上看刚度变化本质上是改变了系统的势能场刚度突然增大相当于给系统注入了一个阶跃力末端必然弹跳。解决方案是在策略输出和实际执行之间加一阶惯性环节也就是对参数做指数平滑[ K_{actual}(t) K_{actual}(t-1) \lambda (K_{target}(t) - K_{actual}(t-1)) ](\lambda) 取 0.1-0.3 之间效果是刚度变化被拉长到几十毫秒尺度跳变冲击被平滑掉。虽然任务完成时间稍微变长但稳定性明显提升这点代价完全值得。5.4 仿真和真机明明是“两个世界”仿真训练效果很好、成功率 95%真机上一开始只有 30%这个落差是做这个方向最容易遭遇的心理打击。具体差异来自几个地方差异源仿真假设真机实际情况摩擦力库仑摩擦模型静摩擦、粘滑、温度相关接触刚度固定刚度系数非线性和迟滞力传感器噪声低幅高斯噪声零漂、温漂、碰撞冲击噪声控制延迟接近零5-30ms 不等工件公差精确尺寸批次间有波动针对这些差异我后来加强了域随机化力度摩擦系数从 0.2 到 0.8 随机接触刚度随机浮动 50%孔位偏移随机 2mm控制延迟在仿真里人为加大到 20ms。这样训练出来的策略在真机上成功率提升到了 80% 以上剩余失败主要发生在极端公差叠加的工况下属于可以接受的范围。5.5 对称工况下的策略退化问题最后一个想提醒的坑比较隐蔽装配任务很多是对称的比如销子往左偏和往右偏在物理上是对称的但神经网络不带对称性先验训练时可能只学到“往左偏怎么处理”往右偏就表现不稳定。我在测试时发现策略对右侧偏差的成功率明显低于左侧回看训练数据也证实了右侧偏差的样本量更少。解决方案是训练时人为对状态做对称增广把 x 方向的力、位置误差、速度都取反生成新样本或者直接训练两个共享权重的孪生网络分支同时吃原始状态和对称翻转状态。这个改动简单有效样本利用率直接翻倍左右对称的表现差距也消失了。6. 这些经验沉淀下来之后我的几点体会最后写几点我在整个过程中感受最深的东西希望对正在走这条路的人有帮助。第一不要一上来就上学习算法。先把固定阻抗控制在目标工件上跑通一轮把接触力波形、参数响应、机器人的物理特性摸清楚。学习策略再怎么强也只是在底层控制之上做“聪明的参数选择”底层物理都不理解上层再聪明也白搭。第二变阻抗参数的搜索空间一定要用先验钳制住。安全的参数范围、参数变化率限制、阻尼下限这些必须在训练前设定好。它们不是保守而是给学习算法划了一条“不能出事”的保底线让网络集中精力去优化任务表现而不是在危险区域反复试探。第三奖励函数设计要像吃饭一样细嚼慢咽。每一次调整都会改变策略的性格倾向不要一次改多个权重否则你根本不知道是哪个改动起作用。我倾向于先固定力惩罚和成功奖励只调深度增量的权重等行为稳定后再动下一个旋钮。这个方向后续还能扩展的点很多。比如把单孔装配扩展到多孔、异形件装配把学习策略从“阻抗参数”推广到“接触状态机 参数 轨迹”的联合决策再比如利用人示教数据先做模仿学习、再用强化学习微调减少前期探索的盲目性。这些都是我下一步准备尝试的路线等有结果了再回来分享。
阅读完成 · 觉得有帮助?
咨询建站