
机器人运动控制里摩擦力矩补偿是最不玄学、也最容易翻车的环节之一。很多人第一次遇到低速爬行、换向“咯噔”、位置环增益一高就啸叫的问题第一反应是继续调PID结果越调越糟。摩擦力矩补偿要解决的就是关节在低速、换向、轻载和往复运动时由于减速器、轴承、密封件和导轨之间的摩擦带来的非线性阻力矩。它适合已经能把机器人基本伺服跑通、但被低速性能和轨迹精度卡住的工程师也适合做协作臂、工业臂、直驱关节、音圈电机执行器的开发者。你不需要先啃完整本摩擦学但必须把摩擦模型、辨识实验和补偿接口这三件事串起来否则参数拟合得再漂亮也进不了真实控制器。1. 关节低速“发涩”不是增益问题先把摩擦力矩的账算清1.1 现场症状与常见误判机械臂在高速段跑得很顺一到低速就出现爬行位置曲线像台阶一样一顿一顿。换向瞬间出现尖峰末端抖动一下轨迹圆被压扁。有人会把位置环比例增益往上推希望靠刚度压住误差结果电机电流开始高频振荡减速器发出啸叫。也有人把速度环积分时间加长低速跟随变慢换向更拖。这些现象背后常常不是控制带宽不够而是摩擦引入了等效死区和负阻尼。摩擦力的方向总是和运动趋势相反速度接近零时静摩擦会在一个小范围内“锁住”关节。控制器输出的力矩必须超过静摩擦阈值关节才动一旦动起来动摩擦又比静摩擦小于是关节突然前冲。接着控制器发现误差反向又往回拉形成极限环。这个过程在示波器上看就是力矩指令在正负之间方波式跳变。把增益调高只会让极限环频率更高不会让它消失。我见过一个典型误判某台六轴机械臂的J3轴在低速点动时抖动维护人员先换驱动器、再换编码器最后怀疑减速器损坏。实际测量关节力矩指令后发现换向时有一个稳定的力矩死区大小约等于额定转矩的3%到5%。这就是摩擦不是编码器噪声。编码器噪声表现更随机摩擦引起的力矩死区则和运动方向强相关正反向对称性往往很好。1.2 摩擦力矩在关节力矩平衡中的位置机器人关节的动力学方程里摩擦力矩通常写成独立一项。关节电机输出转矩要同时承担惯性项、科氏项、重力项和摩擦项。摩擦项虽然不参与能量守恒推导但它直接吃掉执行器力矩而且和速度符号强耦合。对于减速比较大的关节电机侧看到的摩擦矩会被减速比放大负载侧很小的摩擦折算到电机侧可能已经不可忽略。摩擦的来源不止一个。谐波减速器的柔轮与刚轮啮合、波发生器轴承、交叉滚子轴承、电机转子轴承、密封圈都会贡献摩擦。它们有的近似库仑摩擦大小与速度无关有的近似粘性摩擦随速度线性增加有的在极低速下表现Stribeck效应速度越低摩擦越大。把这些成分混在一起用一个“常数摩擦”去补往往只能改善某个速度段。更麻烦的是摩擦会随温度、润滑状态、负载和磨损变化。冷机启动时润滑脂黏度高粘性摩擦大跑热以后黏度下降粘性项变小。如果补偿参数是冷机辨识的热机后可能过补偿关节在低速下反而出现轻微抖动。工程上要么在典型工作温度下辨识要么加入温度相关修正要么接受一个折中参数。没有一种参数能覆盖所有工况这是必须提前接受的现实。1.3 什么时候必须补偿什么时候可以先放一放不是所有机器人一上来就要做复杂摩擦补偿。如果你的应用只要求中高速点到点搬运末端重复定位精度由机械重复性保证低速爬行不影响节拍那么先把重力补偿和惯量辨识做好收益可能更大。但以下几类场景摩擦补偿基本绕不开低速轨迹跟踪例如涂胶、打磨、激光切割、测量扫描。频繁换向的往复运动例如装配中的插拔、拧紧、贴装。力控和柔顺控制例如拖动示教、恒力打磨、协作装配。直驱或准直驱关节电机力矩常数小摩擦占比高电流环能直接反映摩擦。音圈电机执行器行程短、推力小导轨摩擦和线缆阻力会明显影响微动性能。判断是否需要补偿可以做一个简单实验让关节以极低速度正反向匀速运动记录位置误差和力矩指令。如果力矩指令在速度过零附近有明显平台位置误差在换向后来回摆动就说明摩擦已经进入主导地位。此时再调位置环相当于用高增益去对抗一个确定性的非线性短期可能压住长期会磨损机械并引入噪声。2. 摩擦模型怎么选库仑、粘性、Stribeck、LuGre不是越复杂越好2.1 四种模型的物理直觉与公式骨架摩擦模型从简单到复杂常见的有库仑模型、库仑粘性模型、Stribeck模型和LuGre动态模型。库仑模型认为摩擦力矩大小恒定方向与速度相反适合描述减速器主导的干摩擦。库仑粘性模型在此基础上加一个与速度成正比的项适合中低速范围内既有干摩擦又有润滑黏滞的关节。Stribeck模型在低速段引入负斜率能描述从静摩擦到动摩擦的过渡换向行为更真实。LuGre模型用鬃毛状态变量描述预滑动和爬行动态性能好但参数辨识难对控制周期和数值稳定性要求高。模型核心参数优点缺点适合场景库仑库仑力矩参数少易实现无法描述粘性段和换向过渡干摩擦明显、控制周期长库仑粘性库仑力矩、粘性系数计算简单中低速改善明显低速Stribeck段仍不准工业臂关节、常用首选Stribeck静摩擦、库仑、粘性、Stribeck速度换向和低速更真实参数辨识需要更多数据低速轨迹、协作臂LuGre刚度、阻尼、库仑、粘性、Stribeck速度动态预滑动描述好参数多实时积分可能发散直驱、力控、高带宽关节从公式上看库仑粘性模型可以写成 τf τc·sign(q̇) b·q̇。Stribeck模型把库仑项改成与速度相关的形式例如 τf [τc (τs - τc)·exp(-(q̇/vs)^2)]·sign(q̇) b·q̇。LuGre则引入内部状态z用微分方程描述鬃毛平均变形摩擦力由刚度、阻尼和粘性项组合。实际控制器里每增加一个状态变量就要多考虑一次积分稳定性和初始化问题。2.2 控制周期和算力决定模型上限模型选择不能只看论文效果要先看你的控制周期。伺服周期1ms、250μs还是50μs决定了你能承受多少在线计算。库仑粘性模型只需要几次乘加和符号判断放在1kHz电流环里毫无压力。Stribeck模型需要指数运算若在250μs周期内跑多轴就要评估CPU占用。LuGre模型需要积分状态如果速度信号噪声大状态可能被错误激励导致补偿力矩抖动。我的经验是先上库仑粘性把主要矛盾解决。若换向尖峰仍然明显再加入静态Stribeck项。只有在直驱关节、力控或者需要模拟预滑动时才考虑LuGre。很多工业机器人关节的减速比在50到160之间负载侧速度经过减速比折算到电机侧已经不小Stribeck低速段在电机侧可能被压缩得很窄。此时花大力气辨识静态Stribeck收益未必比把粘性项和换向逻辑做好更大。还有一点容易被忽略符号函数sign在速度过零附近会剧烈跳变。如果直接用sign(q̇)速度噪声会让补偿力矩在正负之间抖动。工程上常用饱和函数、双曲正切或者速度死区来平滑。但平滑会引入新的过渡区需要和位置环带宽匹配。模型不是越复杂越好而是和信号质量、控制周期、机械特性匹配才好。2.3 我的选型顺序从静态模型到动态模型我通常按这个顺序推进先做重力补偿和惯量前馈确认非摩擦项已经八九不离十。用正反向匀速扫掠估计库仑和粘性系数先补速度相关项。观察换向附近误差若存在稳定的静摩擦死区加入静摩擦项和速度死区。若低速爬行仍明显再尝试Stribeck速度参数。只有在直驱、音圈电机或高精度力控场景才评估LuGre等动态模型。这个顺序的好处是每一步都有可测量的改善。你能清楚知道是库仑项解决了匀速误差还是粘性项解决了速度跟随滞后还是静摩擦项解决了换向死区。一次性把所有参数扔进优化器拟合残差可能很小但每个参数物理意义混乱现场调参时根本不知道往哪边拧。3. 辨识实验正反向匀速扫掠与参数拟合的实操细节3.1 实验前要做哪些机械与电气检查辨识摩擦参数之前必须先把机械和电气状态确认好。否则你辨识到的是松动、偏心、编码器安装误差不是摩擦。检查清单包括关节锁紧螺钉是否可靠减速器有无异常间隙编码器联轴器是否打滑线缆拖链是否对关节产生额外阻力制动器是否完全释放温度传感器是否可用。电气侧要确认电流环带宽正常力矩常数和减速比配置正确速度信号没有严重量化噪声。如果机器人是整臂还要考虑重力影响。单关节辨识时最好把臂体置于重力矩可计算或可忽略的姿态。对于大臂重力矩会随角度变化如果直接用电机力矩除以减速比当摩擦重力项会污染结果。稳妥做法是先做重力辨识或者让关节在水平面附近小角度往复减小重力矩变化。多关节耦合明显的机器人最好逐关节锁定其他轴一次只动一个关节。采样率也要注意。摩擦辨识需要速度和力矩信号速度由位置差分得到时会放大噪声。如果驱动器能直接给出滤波后的速度优先使用。否则位置信号采样率要足够高再做零相位滤波或卡尔曼平滑。切勿用截止频率很低的低通滤波因为相位滞后会把换向点移后导致辨识出的静摩擦位置偏移。3.2 正反向匀速扫掠的具体流程正反向匀速扫掠是最实用的静态辨识方法。基本流程是让关节在安全工作区内以多个低速点正反向匀速运动每个速度点保持一段时间等速度稳定后记录力矩、速度和位置。速度点建议覆盖从极低速到中速例如0.1、0.5、1、2、5、10度每秒具体范围根据关节额定速度调整。每个方向至少跑三个来回取稳定段平均减少随机误差。实验时要注意速度指令应该是梯形或S形速度曲线中间有足够长的匀速段。不要用正弦扫频直接辨识静态摩擦因为加速度和惯性力矩会混进去。若必须用正弦需要同时辨识惯量并解耦。对于带重力负载的关节正反向所需力矩不同因为重力矩方向不变。此时可以用正反向力矩差的一半估计摩擦用正反向力矩和的一半估计重力。这是经典的正反向法简单有效。数据记录要包含时间戳、关节位置、速度、力矩指令、电流、温度。若驱动器内部已经做了摩擦补偿辨识前要先把补偿关闭否则你辨识的是残余摩擦。若无法关闭至少记录原补偿参数并在拟合时把它减掉。这个细节很多人漏掉导致参数越辨越小最后补偿形同虚设。3.3 数据处理滤波、剔点与最小二乘拟合数据处理的第一步是截取匀速段。可以用速度阈值和加速度阈值筛选保留速度稳定、加速度接近零的区间。第二步是剔除非摩擦异常点例如电流限幅、制动器动作、线缆突然拖拽。第三步是计算每个速度点的平均力矩。对于正反向数据可以分别拟合也可以合并后拟合。以库仑粘性模型为例正向运动时 τ τg τc b·v反向运动时 τ- τg - τc - b·v。两式相减得到 τ - τ- 2τc 2b·v所以可以用正反向力矩差对速度做线性回归截距一半是库仑斜率一半是粘性。两式相加得到 τ τ- 2τg可以估计重力矩。这个方法不需要复杂优化现场用Excel或Python就能做。import numpy as np # v: 速度绝对值数组正向为正反向为负 # tau: 对应关节力矩指令数组单位Nm # 分离正反向匀速段 v_pos v[v 0] tau_pos tau[v 0] v_neg v[v 0] tau_neg tau[v 0] # 取平均速度点 v_abs_pos np.abs(v_pos) v_abs_neg np.abs(v_neg) tau_pos_mean np.mean(tau_pos) tau_neg_mean np.mean(tau_neg) # 用正反向差拟合 tau_diff 2*tau_c 2*b*v tau_diff tau_pos_mean - tau_neg_mean A np.vstack([np.ones_like(v_abs_pos), v_abs_pos]).T coef, _, _, _ np.linalg.lstsq(A, tau_diff, rcondNone) tau_c coef[0] / 2.0 b_visc coef[1] / 2.0 print(库仑力矩 Nm:, tau_c) print(粘性系数 Nm/(rad/s):, b_visc)如果数据分散不要强行用一阶模型。可以画出力矩差随速度变化的曲线看是否存在低速段翘起。若低速段明显高于线性外推说明有Stribeck效应或静摩擦。此时可以把低速点单独拿出来估计静摩擦中高速点估计粘性。若曲线在某个速度后突然上翘可能是润滑状态改变或共振不要把这类点硬拟合进模型。4. 补偿量怎么喂给控制器前馈通道、力矩环和位置环的接口4.1 三种接入方式关节力矩前馈、电流前馈、位置指令修正摩擦补偿量最终要变成控制器能接受的信号。常见接入方式有三种关节力矩前馈、电流前馈和位置指令修正。关节力矩前馈最直接把补偿力矩加到力矩指令上前提是控制器开放力矩接口并且力矩环已经调好。电流前馈适合只开放电流接口的驱动器需要把摩擦矩除以力矩常数和减速比折算成电流。位置指令修正则是在位置环前加一个微小偏移用来提前克服静摩擦适合不开放力矩或电流接口的封闭系统。三种方式各有代价。力矩前馈物理意义最清晰但要求力矩常数准确否则补偿量比例错误。电流前馈响应快但电流环非线性、温度漂移会影响效果。位置指令修正不依赖力矩接口但会引入额外位置误差且对高速段不友好。我的建议是能用力矩前馈就用力矩前馈把补偿项加在速度环输出之后、电流环输入之前。这样不会改变位置环结构也不会影响稳定性分析。若控制器有重力补偿和摩擦补偿专用寄存器优先使用原生接口。不同品牌机器人的开放程度不同有些支持直接写入关节附加力矩有些只能通过脚本改电流。无论哪种都要确认补偿量的符号、单位和坐标系。一个常见错误是负载侧辨识的摩擦矩直接加到电机侧力矩指令忘了乘减速比结果补偿量大了几十倍一上电就报警。4.2 符号、减速比与力矩常数换算假设你在负载侧辨识得到库仑力矩 τc_load粘性系数 b_load减速比 N传动效率 η电机力矩常数 Kt电流指令单位A。折算到电机侧电流前馈时大致关系是 i_ff (τc_load·sign(q̇_load) b_load·q̇_load) / (N·η·Kt)。如果控制器力矩指令在电机侧则 τ_ff_motor (τc_load·sign(q̇_load) b_load·q̇_load) / (N·η)。这里的方向符号要特别小心因为负载侧速度正方向和电机侧正方向可能相反减速比符号也要纳入。实际工程中传动效率η和力矩常数Kt都有误差所以不要完全相信理论换算。更稳的做法是先用理论值给一个初值再通过实验微调比例系数。具体做法给一个已知速度记录未补偿时的力矩指令再逐步增加补偿系数直到该速度点的力矩指令接近零或达到预期残余。若补偿后力矩指令反向变大说明符号错了或过补偿。还有一个细节是速度来源。摩擦补偿需要速度符号和大小。若用位置差分速度噪声大若用驱动器内部速度注意它可能已经经过滤波换向附近有延迟。对于Stribeck项速度延迟会让补偿在换向时滞后尖峰反而更大。解决办法是使用符号预测或基于指令速度前馈。位置指令的速度通常比反馈速度更干净但和实际速度有跟随误差需要权衡。4.3 代码落地一个可移植的摩擦补偿函数下面是一个可移植的摩擦补偿函数包含库仑、粘性和简单Stribeck项带速度死区和平滑处理。它可以放在ROS 2控制器、PLC脚本或自研伺服代码里。注意这里的参数是负载侧输出也是负载侧力矩实际接入时按上一节换算。#include cmath struct FrictionParams { double tau_c; // 库仑力矩 double tau_s; // 静摩擦 double b_visc; // 粘性系数 double v_stribeck; // Stribeck速度 double v_eps; // 速度死区 double tau_max; // 补偿限幅 }; double frictionCompensation(double qd, const FrictionParams p) { double v qd; if (std::abs(v) p.v_eps) { // 极低速时用线性过渡避免符号抖动 return p.tau_s * v / p.v_eps; } double s (v 0.0) ? 1.0 : -1.0; double av std::abs(v); // Stribeck项低速时从静摩擦过渡到库仑摩擦 double tau_stribeck p.tau_c (p.tau_s - p.tau_c) * std::exp(-(av * av) / (p.v_stribeck * p.v_stribeck)); double tau s * tau_stribeck p.b_visc * v; if (tau p.tau_max) tau p.tau_max; if (tau -p.tau_max) tau -p.tau_max; return tau; }这个函数里v_eps是速度死区建议取编码器速度噪声的3到5倍。v_stribeck不要设得太小否则指数项在低速时几乎变成阶跃。tau_max是安全限幅防止辨识异常导致补偿力矩过大。实际使用时补偿量最好再加一个一阶低通但截止频率要远高于位置环带宽否则相位滞后会吃掉换向改善。5. 实测调参换向尖峰、低速爬行和温漂的处理顺序5.1 先补偿静摩擦还是先补偿粘性调参顺序很关键。我的习惯是先把粘性项调好再调库仑最后调静摩擦。原因很简单粘性项影响整个速度范围如果它错了你在低速看到的误差里混着粘性误差静摩擦参数会被带偏。具体操作让关节以中等速度匀速运动逐步增加粘性系数直到速度跟随误差最小。然后降低速度调库仑项让正反向匀速力矩差接近零。最后在极低速和换向附近调静摩擦项。调库仑项时观察正反向力矩差。如果正向力矩明显大于反向且差值与速度无关说明库仑项偏小或重力补偿没做好。先检查重力补偿再动库仑。调静摩擦时观察换向后的第一个运动方向。如果关节在换向指令发出后延迟一小段时间才动然后突然前冲说明静摩擦补偿不足或速度死区太大。逐步增加静摩擦项直到延迟消失但不过冲。5.2 换向尖峰与死区补偿换向尖峰是摩擦补偿中最难处理的部分。理论上速度过零时摩擦力方向反转如果补偿量瞬间反转会产生一个阶跃力矩。实际机械有弹性这个阶跃会激发振动。平滑处理可以减小尖峰但会牺牲低速响应。我的做法是分两步先用速度死区把零速附近的补偿量线性过渡到零避免力矩跳变再在位置环输出端加一个小的前馈脉冲只在检测到换向指令时触发帮助关节快速越过静摩擦区。这个前馈脉冲的幅值和宽度需要实验确定。幅值大约等于静摩擦力矩的60%到80%宽度取决于关节刚性和位置环带宽。太宽会导致过冲太窄没效果。可以用示波器看位置误差和力矩指令找到换向时误差开始下降但还没有反向超调的点。对于多轴联动换向尖峰还可能来自其他轴的耦合此时要逐轴锁定排查。另一个技巧是使用速度指令而不是反馈速度来判断换向。反馈速度在过零时总会有噪声和延迟而运动指令的速度符号是干净的。控制器内部通常能拿到插补后的速度前馈用这个信号做摩擦补偿方向判断换向会更及时。如果只能拿反馈速度至少要做符号预测当速度绝对值小于阈值且加速度方向反转时提前切换补偿符号。5.3 温度漂移与在线自适应摩擦参数会随温度变化。冷机时润滑脂黏度高粘性系数大热机后黏度下降粘性系数可能减小20%到50%。如果补偿参数固定冷机可能欠补偿热机可能过补偿。解决方式有三种一是温度分段根据关节温度查表选择参数二是在线自适应用递归最小二乘估计残余摩擦三是保守设计取中间温度参数并限制补偿幅值。在线自适应听起来高级但实际落地要谨慎。如果自适应律太快会把重力、惯量和外部力误当成摩擦导致参数漂移。我的经验是自适应只用于粘性项且时间常数要远大于运动周期。每完成一段稳定运动后用递推最小二乘更新粘性系数更新限幅在初始值的正负30%以内。库仑项和静摩擦项不建议在线更新因为它们和运动方向、负载状态强相关容易误辨识。温度传感器安装位置也有讲究。贴在电机外壳测的是电机温度不是减速器润滑脂温度。若关节连续工作电机温度可能比减速器高很多。更可靠的是在减速器附近埋热电偶或者用运行时间和电流积分估算热状态。没有温度传感器时可以做保守标定在冷机和热机两种状态下分别辨识取参数包络然后在中间温度用线性插值。6. 不同平台的差异工业臂、协作臂、直驱关节和音圈电机6.1 减速器机型谐波、RV与行星的摩擦特征工业机器人常见谐波减速器、RV减速器和行星减速器它们的摩擦特征差别很大。谐波减速器柔轮变形大低速时滞回和摩擦耦合明显换向死区通常比RV大。RV减速器刚性高摩擦相对稳定但摆线针轮啮合在低速下也有Stribeck效应。行星减速器结构简单摩擦主要来自轴承和齿轮啮合粘性项占比更高。选模型时谐波关节更适合带静摩擦和Stribeck的模型RV关节可以先用库仑粘性行星关节要重视粘性项。减速比也影响补偿策略。减速比大的关节负载侧摩擦折算到电机侧被放大电机侧很小的补偿量就能产生明显效果。但减速比大的关节通常刚性高、带宽低补偿量变化太快容易激发谐振。此时补偿量的平滑比精度更重要。减速比小的直驱关节摩擦直接作用在电机侧电流和力矩关系清晰但摩擦占比高模型不准会直接反映到末端。还有一个现实问题同一型号减速器不同批次、不同润滑脂、不同预紧力的摩擦参数可能差很多。批量产品如果每台都做精细辨识产线节拍不允许。常见做法是用同型号的典型参数作为初值再在出厂测试中做单点修正。比如在某个低速点测量正反向力矩差微调库仑项。这样比完全不补偿好也比每台做完整扫掠更经济。6.2 协作机器人与直驱关节为什么补偿量更敏感协作机器人通常追求轻量、低惯量、拖动示教关节往往采用谐波减速器加力矩传感器或者准直驱方案。它们对摩擦补偿更敏感因为力控和拖动示教要求关节能感知很小的外部力矩。如果摩擦补偿不准操作者拖动时会感觉“黏滞”或“忽轻忽重”。在零力控制中摩擦补偿甚至要动态开启因为摩擦会掩盖真实外部力。直驱关节没有减速器电机力矩直接驱动负载。好处是背隙小、带宽高、摩擦力矩可以直接从电流估计坏处是摩擦占比大尤其是在低速和微动时。直驱关节的摩擦模型往往需要包含预滑动因为电机在位置保持时电流会随微小位移变化。LuGre或GMS模型在这类场景更合适但前提是电流采样干净、控制周期足够快。音圈电机执行器也类似。它行程短、推力小导轨摩擦、线缆弯曲阻力和磁阻力都会影响微动定位。很多音圈电机用于半导体、光学和精密装配要求纳米级或微米级定位。此时摩擦补偿不能只靠关节速度还要考虑执行器内部弹性。我的经验是先用库仑粘性补偿把大行程误差压下去再用重复控制或迭代学习处理周期性微动误差。不要指望一个静态摩擦模型解决所有微动非线性。6.3 ROS 2与仿真环境里的验证边界在ROS 2机器人开发中摩擦补偿通常放在ros2_control的控制器里。你可以写一个自定义控制器插件在update函数中读取关节状态计算补偿力矩再写入力矩指令接口。好处是能在仿真和真机之间切换先用Gazebo或MuJoCo验证算法框架再上真机调参。但要注意仿真里的摩擦模型是你自己写的仿真效果好不代表真机效果好。仿真能验证符号、限幅、接口和数值稳定性不能代替真机辨识。如果用MuJoCo做四足或机械臂仿真它内置的摩擦模型和真实减速器摩擦差别很大。MuJoCo更适合验证接触和动力学不适合精细辨识谐波减速器摩擦。Gazebo的关节摩擦模型也比较简单。你可以把辨识得到的摩擦模型作为外部力矩注入仿真观察控制器鲁棒性。但仿真中的速度信号没有编码器噪声换向死区也不真实所以补偿量平滑和死区参数必须在真机上调。SLAM和移动机器人领域也会遇到摩擦问题但表现形式不同。轮式机器人主要是轮地摩擦和减速箱摩擦影响低速定位和航向保持。路径规划算法通常不直接处理摩擦但底层轮速控制需要摩擦补偿。对于麦克纳姆轮或全向轮摩擦各向异性更明显横向滑动摩擦和纵向滚动摩擦不同。这类系统做摩擦补偿时往往结合轮速观测和IMU而不是单关节力矩模型。7. 踩坑复盘那些让补偿效果一夜回到解放前的细节7.1 辨识数据被重力负载污染这是最常见的坑。很多人让机械臂带着姿态做正反向匀速直接用力矩指令拟合摩擦结果重力矩被算进库仑项。表现是在某个姿态下补偿效果很好换一个姿态就过补偿或欠补偿。重力矩是姿态的函数摩擦矩是速度和方向的函数两者混在一起参数就没有物理意义。正确做法是先做重力辨识或者用正反向力矩和的一半估计重力差的一半估计摩擦。如果机器人没有力矩传感器重力矩可以通过动力学模型计算。但模型参数如质量、质心、惯量必须准确。一个实用技巧是在多个姿态下静止保持记录每个关节力矩指令用最小二乘辨识重力矩参数。然后再做匀速扫掠把重力矩从总力矩里减去剩下的才是摩擦。这个步骤不能省尤其是大臂和肩部关节。7.2 滤波器相位滞后抵消了补偿有人辨识出的参数很准补偿函数也写对了但效果就是不好。一查发现速度信号经过了低通滤波截止频率只有几十赫兹换向时速度过零被延迟了几十毫秒。摩擦补偿本该在换向瞬间反转方向结果延迟了反而在错误方向上加力矩尖峰更大。解决办法是速度信号滤波截止频率至少是位置环带宽的5到10倍或者用指令速度前馈做换向判断或者用加速度信号辅助预测过零时刻。另一个滤波坑是力矩指令滤波。有些驱动器对力矩指令有内部斜坡限制补偿量被平滑后失去高频成分静摩擦补偿效果大打折扣。如果必须在驱动器侧限幅那么把补偿量加在更靠前的位置或者用电流前馈绕开力矩指令滤波。当然绕开安全限幅有风险必须确保补偿量本身有限幅和使能条件。7.3 机械松动与刚性耦合伪装成摩擦摩擦补偿不是万能的。机械松动、联轴器打滑、编码器偏心、减速器背隙都会产生类似摩擦的力矩死区。区别在于摩擦死区在正反向是对称的且与速度相关松动死区往往在换向时表现为位置跳变力矩指令不一定有平台。如果你发现补偿后换向仍然“咯噔”而且位置反馈有突变就要检查机械连接而不是继续加补偿。刚性耦合也会伪装成摩擦。多关节机器人中一个关节运动时其他关节的惯量和重力会通过连杆耦合过来。如果动力学前馈没做好这些耦合力矩会被误认为是摩擦。排查方法是锁定其他关节单独运动目标关节看摩擦特性是否变化。如果变化很大说明耦合项没解耦干净。先把动力学模型和重力补偿做好再谈摩擦补偿这是铁律。最后分享我在实际操作中的一个体会摩擦补偿参数不要追求一次辨识终身使用。机械在跑合、换脂、维修后摩擦特性都会变。比较务实的做法是保留一套辨识脚本和一组基线参数每次大修或精度验收前跑一次正反向匀速扫掠只更新库仑和粘性两个系数。静摩擦和Stribeck参数变化通常较小除非更换了减速器或润滑脂。这样维护成本低效果也稳定。另一个小技巧是给补偿量加一个使能条件只在速度低于某个阈值且力矩指令未饱和时开启避免高速段补偿量过大影响效率。