ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

机器人关节双编码器力矩感知:从硬件选型到算法标定全流程

机器人关节双编码器力矩感知:从硬件选型到算法标定全流程 1. 为什么要在机器人关节里塞两个编码器1.1 从“一个编码器不够用”说起很多人第一次接触机器人关节会觉得编码器这东西有一个不就够了——电机转了多少圈、转到什么位置读出来不就行了我刚开始做关节模组的时候也是这么想的结果第一次做力控测试就被现实狠狠教育了一顿。机器人关节和普通电机应用最大的区别在于关节输出端才是真正干活的部位。电机端编码器读到的是转子位置但从转子到关节输出法兰之间隔着减速器、轴承、联轴器这一大串机械环节。这些环节每一个都会引入误差——减速器的背隙、齿轮的弹性形变、同步带的拉伸、轴承的游隙全部叠加在一起导致电机端读到的角度和关节实际输出角度之间存在偏差。这个偏差有多大拿常见的谐波减速器来说标称背隙通常在1弧分以内看起来很小。但问题是当关节做力控或者碰撞检测时我们关心的恰恰是那些微小的角度差异——因为力矩信息就藏在这个差异里。一个0.5弧分的角度偏差在1米长的机械臂末端可能就是0.15毫米的位置误差对于精密装配任务来说这是不可接受的。所以双编码器的核心思路就一句话在电机端和关节输出端各装一个编码器用两个读数的差值来感知力矩。这个差值反映的是传动链的弹性形变而弹性形变和力矩之间存在确定的数学关系——这就是关节力矩感知的物理基础。1.2 双编码器方案到底解决了什么问题传统关节力矩感知有三条路电流环估算、关节力矩传感器、双编码器。这三条路我都实际用过各有各的适用场景。电流环估算最简单不需要额外硬件通过电机电流乘以力矩常数来推算输出力矩。但它的致命伤在于摩擦力和传动效率的非线性——低速时摩擦模型极其复杂温度变化还会让力矩常数漂移估算精度通常在10%到20%之间做做粗略的碰撞检测还行精细力控就别指望了。关节力矩传感器精度最高通常能到1%以内但代价是贵、娇气、走线麻烦。一个六维力矩传感器动辄几万块而且安装在关节输出端会引入额外的柔性和故障点。我之前有个项目用了力矩传感器结果线缆在关节反复旋转中断了排查了两天才找到问题。双编码器方案恰好卡在中间精度比电流环估算高一个数量级典型能做到2%到5%成本比力矩传感器低很多而且不增加额外的机械柔性。它的本质是用位置信息的变化率来推断力矩属于间接测量所以精度受编码器分辨率和传动模型准确度的双重影响。注意双编码器方案的前提是传动链具有一定的弹性。如果用的是刚性联轴器直驱两个编码器读数几乎一样这套方案就失效了。它最适合的场景是带谐波减速器或行星减速器的关节。1.3 适合谁来读这篇内容如果你正在做机器人关节的力控开发或者准备从电流环方案升级到更精确的力矩感知这篇内容应该能帮到你。我会从编码器选型、安装、标定到力矩解算的完整链路讲一遍包括我在实际项目中踩过的坑和验证过的参数。不需要你有很深的理论基础但最好对编码器的工作原理、减速器的基本结构、以及嵌入式开发有一点了解。如果你连增量式和绝对式编码器的区别都还不清楚建议先补一下基础知识再回来。2. 双编码器系统的硬件选型与安装要点2.1 电机端编码器怎么选电机端编码器的选型相对简单因为它的工作环境比较友好——转速高但力矩小温度相对可控安装空间也比较充裕。核心要求是分辨率够高、响应够快。分辨率怎么定这里有个经验公式电机端编码器的分辨率至少要达到关节输出端所需分辨率乘以减速比的水平。举个例子假设你用减速比100:1的谐波减速器关节输出端希望达到0.001度的角度分辨率那么电机端编码器至少需要0.1度的分辨率。但实际上考虑到后面要做差分运算分辨率最好再留3到5倍余量也就是0.02度到0.03度左右。换算成常见的编码器参数增量式编码器每圈脉冲数PPR乘以四倍频就是实际分辨率。0.02度对应每圈18000个计数四倍频后需要4500 PPR。市面上常见的2500 PPR或5000 PPR增量式编码器都能满足要求。但增量式有个问题上电后需要找零。对于关节机器人来说每次上电都做回零动作既浪费时间又可能撞到东西。所以电机端我更推荐用绝对值编码器比如SSI接口或BiSS接口的多圈绝对值编码器。上电就知道位置省心很多。磁编码器在电机端也很常见像AS5047P这类芯片14位分辨率SPI接口成本低体积小。但要注意磁编码器的精度受温度影响较大而且对安装偏心非常敏感。如果电机端空间允许光电编码器还是更稳。2.2 关节端编码器的特殊要求关节端编码器的选型就麻烦多了因为它要面对几个电机端没有的挑战第一是安装空间极其有限。关节输出端通常被减速器、轴承、法兰塞得满满当当留给编码器的空间可能只有几毫米。这时候空心轴编码器或者环形编码器就是首选套在输出轴上不占额外轴向空间。第二是精度要求更高。关节端编码器的误差会直接进入力矩解算没有减速比来帮你缩小。所以关节端编码器的分辨率通常要比电机端高一个档次。如果电机端用17位关节端最好用19位甚至20位。第三是抗干扰和可靠性。关节端离电机驱动器更远线缆要走关节内部电磁环境更恶劣。绝对值编码器配合差分信号传输RS485或RS422比增量式更可靠。我实际用过的一款方案是电机端用17位磁编码器AS5047P关节端用19位光电绝对值编码器多摩川或雷尼绍的微型系列。这个组合在成本、精度和体积之间取得了不错的平衡。2.3 安装偏心与同轴度最容易被忽视的杀手编码器装上去不难装得准才难。我见过太多项目因为编码器安装偏心导致力矩读数周期性波动最后查了半天以为是算法问题结果是机械安装没做好。对于旋转编码器安装偏心会产生周期性角度误差误差幅值大约等于偏心量除以编码器码盘半径。假设码盘半径10毫米偏心0.05毫米角度误差就是0.005弧度约0.29度。这个误差在电机端被减速比缩小后可能不明显但在关节端直接就是0.29度的力矩感知误差完全不可接受。安装时要注意几点编码器轴与电机轴或关节轴的同轴度最好控制在0.02毫米以内用千分表打一下跳动。如果是分体式编码器码盘和读头分开码盘端面跳动也要控制通常要求小于0.05毫米。联轴器尽量用柔性联轴器可以补偿微小的角度和径向偏差但柔性不能太大否则引入额外的弹性形变。安装完成后手动旋转一圈用示波器或编码器读数软件观察信号是否均匀有没有明显的周期性波动。实操心得我习惯在安装编码器之前先用酒精棉把安装面和轴擦干净任何微小的毛刺或油污都会导致偏心。装好后不要急着拧紧所有螺丝先轻轻转动确认没有卡涩再对角交替拧紧。2.4 线缆布线与信号完整性双编码器意味着至少两组编码器线缆要走关节内部。关节内部空间狭小线缆要跟着关节旋转反复弯折这是故障高发区。线缆选型上拖链电缆是必须的普通电缆弯折几千次就断了。拖链电缆的导体是多股细丝结构绝缘层和护套材料也更耐弯折。品牌上igus、Lapp、和柔这些都有专门用于机器人关节的拖链电缆系列。信号传输方面增量式编码器的A/B/Z差分信号对线缆长度和屏蔽要求很高。线缆超过1米就建议用双绞屏蔽线屏蔽层单端接地接在驱动器端。如果走线环境电磁干扰严重可以考虑在编码器端加一个差分线路驱动器比如AM26LS31把单端信号转成差分再传输。绝对值编码器的时钟和数据线也要注意阻抗匹配。SSI接口在长线传输时时钟频率要适当降低否则数据会出错。我一般把SSI时钟控制在1MHz以下线缆超过2米就降到500kHz。3. 从两个角度读数到力矩值核心算法拆解3.1 传动链弹性模型力矩感知的物理基础双编码器测力矩的核心公式其实很简单力矩 传动链刚度 × (电机端角度/减速比 - 关节端角度)这个公式的物理含义是传动链在传递力矩时会发生弹性形变形变量等于电机端折算到输出端的角度减去关节端实际角度。形变量乘以刚度就是力矩。但实际用起来这个公式里有三个坑第一个坑是减速比的准确性。谐波减速器的实际减速比和标称值可能有微小偏差而且这个偏差会随负载变化。如果减速比设错了即使没有负载两个编码器的读数也会有一个固定的角度差导致力矩零点偏移。第二个坑是刚度不是常数。传动链的刚度会随力矩大小、温度、润滑状态变化。谐波减速器的刚度曲线是非线性的小力矩时刚度低大力矩时刚度高。用固定刚度值去算小力矩时误差大。第三个坑是背隙和迟滞。减速器换向时会有背隙导致角度差和力矩的关系不是单值的——同样大小的力矩正转和反转时对应的角度差可能不一样。所以实际算法要比那个简单公式复杂得多。我通常分三步走先做静态标定建立力矩-角度差曲线再用多项式或分段线性拟合最后加一个迟滞补偿模型。3.2 静态标定把力矩-角度差曲线测出来静态标定是双编码器方案最关键的步骤标定质量直接决定力矩感知精度。我的标定流程是这样的第一步卸掉所有负载让关节处于自由状态。这时候关节端力矩为零记录两个编码器的读数差作为零点偏移。注意要在正转和反转两个方向各测几次取平均值消除背隙影响。第二步在关节输出端施加已知力矩。可以用砝码、弹簧秤或者标准力矩传感器。砝码方案最简单在关节输出法兰上装一个已知长度的力臂挂不同重量的砝码力矩就等于重量乘以力臂长度。第三步从零开始逐步加载记录每个力矩点对应的角度差。加载要单向递增不要来回晃否则背隙会污染数据。每个点稳定后读10次取平均减少噪声。第四步反向重复。从最大力矩逐步卸载到零再反向加载到最大负力矩。这样得到正反两个方向的力矩-角度差曲线。第五步拟合。把正反两条曲线画出来你会看到它们不重合中间围成一个环——这就是迟滞环。拟合时可以用三次多项式分别拟合正反方向或者用分段线性插值。标定数据我一般存成查找表放在控制器里运行时根据当前角度差和运动方向查表得到力矩。查找表的分辨率不用太高100到200个点就够中间用线性插值。注意标定时的温度要记录。如果关节工作温度变化大最好在不同温度下各标一次运行时根据温度做插值补偿。我做过一个项目关节从20度升到60度力矩零点漂移了将近0.5牛米不补偿根本没法用。3.3 动态补偿速度、加速度和温度的影响静态标定做完关节慢慢动的时候力矩读数已经比较准了。但一旦快速运动问题就来了——加减速时的惯性力矩会耦合进来。关节加速时电机需要额外输出力矩来克服负载惯量这个力矩也会让传动链产生弹性形变被双编码器感知到。但它是惯性力矩不是外力矩。如果不补偿力控算法会把惯性力矩当成外力导致误判。补偿方法是根据关节加速度和已知的负载惯量计算出惯性力矩从双编码器读数中减去。负载惯量可以在标定时一并测出来——施加一个已知的加速度看角度差变化多少反推惯量。温度补偿前面提过了这里补充一点温度不仅影响零点还影响刚度。温度升高时润滑脂变稀传动链刚度下降同样的力矩对应更大的角度差。所以查找表最好也做温度维度。3.4 滤波与噪声抑制编码器读数本身有噪声差分之后噪声还会放大。直接拿差分值算力矩读数会抖得没法看。滤波是必须的但滤波会引入相位滞后影响力控响应速度。这是个矛盾。我的经验是分频段处理低频用低通滤波高频用陷波滤波。低通滤波截止频率设在力控带宽的2到3倍比如力控带宽100Hz低通截止就设200到300Hz。陷波滤波用来干掉特定频率的机械共振频率通过扫频测试确定。如果对相位滞后特别敏感可以用卡尔曼滤波把力矩作为状态量角度差作为观测量建立状态方程时把传动链弹性模型放进去。卡尔曼滤波的相位滞后比低通滤波小但调参麻烦模型不准时效果反而差。我一般先用低通滤波快速验证效果不够再上卡尔曼。实际项目中二阶巴特沃斯低通滤波截止频率200Hz配合一个500Hz的陷波基本能满足大部分力控场景。4. 实操全流程从零搭建一个双编码器关节4.1 硬件清单与接线以我最近做的一个关节模组为例硬件清单如下部件型号/规格数量备注电机无框力矩电机额定扭矩1.5Nm1带霍尔传感器减速器谐波减速器减速比100:11背隙小于1弧分电机端编码器17位磁编码器SPI接口1AS5047P关节端编码器19位光电绝对值编码器BiSS-C接口1微型空心轴主控STM32F4071带FPU跑浮点运算驱动器三相无刷驱动器1支持电流环和速度环电源48V直流1功率根据电机定接线方面电机端编码器的SPI线要短最好不超过10厘米直接连到主控。关节端编码器的BiSS线要走关节内部用双绞屏蔽线屏蔽层接主控地。电机霍尔线和驱动器动力线要远离编码器线至少隔开2厘米交叉时尽量垂直。4.2 编码器数据读取与角度解算电机端AS5047P的SPI读取比较简单STM32的SPI外设配置成模式1或模式3时钟不超过10MHz。读回来的14位数据左移2位变成16位再乘以360/65536就是角度。关节端BiSS-C稍微复杂一点需要主控提供时钟编码器在时钟下降沿输出数据。STM32可以用SPI的只读模式模拟也可以用定时器加GPIO手动翻转。我用的方案是SPI配置成双向模式MOSI当时钟用MISO读数据。读回来的两个角度要做几件事对齐零点两个编码器的零点位置不同需要标定一个偏移量让它们在关节零位时读数一致。折算到同一侧电机端角度除以减速比折算到关节输出端。计算角度差折算后的电机端角度减去关节端角度得到传动链形变量。代码大概长这样float motor_angle read_motor_encoder(); // 电机端角度度 float joint_angle read_joint_encoder(); // 关节端角度度 float gear_ratio 100.0f; // 减速比 float offset 0.0f; // 标定偏移 float motor_angle_at_joint motor_angle / gear_ratio offset; float deflection motor_angle_at_joint - joint_angle; // 形变量度 // 查表得到力矩 float torque lookup_torque(deflection);4.3 标定实操记录标定那天我用了最笨但最可靠的方法砝码加载。关节输出法兰上装了一个200毫米长的力臂力臂末端挂砝码。从0克开始每次加200克加到2000克再逐步减回0。每个点等5秒稳定读100次编码器数据取平均。记录的数据整理成表格砝码重量(g)力矩(Nm)角度差(度)方向000.000正2000.3920.012正4000.7840.025正6001.1760.039正8001.5680.054正10001.9600.071正12002.3520.089正14002.7440.109正16003.1360.131正18003.5280.155正20003.9200.182正从数据可以看出角度差和力矩不是线性的——力矩越大单位角度差对应的力矩越大说明刚度在增加。这符合谐波减速器的刚度特性。用三次多项式拟合得到力矩 21.5 × 角度差 - 0.8 × 角度差² 0.03 × 角度差³拟合残差在0.05牛米以内对于大部分力控应用够用了。反向加载的数据类似但同样力矩对应的角度差略小迟滞大约0.01度。迟滞补偿就是在正反方向用不同的拟合系数。4.4 实时力矩输出与验证标定完成后把拟合系数写进控制器实时计算力矩。验证方法是在关节末端挂一个已知重量的物体看力矩读数是否等于重量乘以力臂。我挂了一个1.5公斤的物体力臂200毫米理论力矩2.94牛米。实际读数在2.85到3.02之间波动误差约3%。这个精度对于碰撞检测和简单的力控已经足够了。如果要更高精度可以增加标定点数、做温度补偿、优化滤波参数。但边际收益递减从3%做到1%可能需要付出几倍的努力。5. 常见问题与排查技巧实录5.1 力矩读数周期性波动现象关节旋转时力矩读数出现周期性波动波动频率与关节旋转频率一致。原因编码器安装偏心或码盘端面跳动。偏心导致角度读数本身就有周期性误差差分后误差更明显。排查把关节转到不同角度不施加任何外力记录力矩读数。如果读数随角度呈正弦波动基本可以确定是偏心问题。解决重新安装编码器用千分表打跳动确保同轴度在0.02毫米以内。如果编码器本身精度不够考虑换更高精度的型号。5.2 力矩零点漂移现象刚上电时力矩读数为零运行一段时间后零点慢慢偏移。原因温度变化导致传动链刚度和编码器零点变化。这是最常见的问题几乎每个项目都会遇到。排查记录温度传感器读数和力矩零点画曲线看相关性。如果零点随温度单调变化就是温度问题。解决做温度标定建立温度-零点补偿表。或者在关节不承受外力时比如机器人静止且末端无负载自动重新标定零点。5.3 高速运动时力矩读数异常现象低速时力矩读数正常高速时读数明显偏大或偏小。原因惯性力矩耦合。加速时电机输出额外力矩被双编码器感知为外力矩。排查让关节做正弦运动观察力矩读数和加速度的关系。如果力矩读数与加速度同相就是惯性耦合。解决根据加速度和负载惯量计算惯性力矩从读数中减去。负载惯量可以通过标定实验测出。5.4 编码器通信偶发错误现象偶尔出现编码器数据跳变力矩读数突然很大。原因编码器线缆受干扰或接触不良。关节内部线缆反复弯折容易断芯。排查用示波器看编码器信号波形看有没有毛刺或丢帧。晃动线缆看是否复现。解决换拖链电缆检查接插件是否压紧。软件上加数据有效性检查连续读三次如果两次一致才采用否则用上次的值。5.5 常见问题速查表问题可能原因快速排查解决方向力矩读数周期性波动编码器偏心空载旋转看波动重新安装打跳动零点漂移温度变化记录温度与零点温度补偿或自动重标高速读数异常惯性耦合正弦运动看相位惯性力矩补偿数据跳变通信干扰示波器看波形换线缆加校验力矩始终偏大减速比设错核对减速比参数修正减速比换向时读数跳变背隙正反转对比迟滞补偿实操心得我习惯在关节里放一个温度传感器紧贴减速器外壳。温度数据不仅用于补偿还能提前发现异常——如果温度升得比平时快可能是润滑出了问题或者装配过紧。6. 双编码器方案的边界与扩展6.1 什么时候不该用双编码器双编码器不是万能的。如果你的关节是直驱的没有减速器两个编码器读数几乎一样这套方案没有意义。如果关节用的是刚性极高的传动比如零背隙的行星滚柱丝杠弹性形变极小角度差可能被编码器噪声淹没也测不准。另外如果对力矩精度要求极高比如手术机器人双编码器的2%到5%精度可能不够还是得上力矩传感器。双编码器更适合协作机器人、外骨骼、康复机器人这类对成本敏感、精度要求中等的场景。6.2 从力矩感知到碰撞检测双编码器测出力矩后碰撞检测就水到渠成了。设定一个力矩阈值超过就触发停止或回退。但阈值不能设死因为不同姿态下关节承受的重力力矩不同。我的做法是根据机器人动力学模型实时计算每个关节的理论重力力矩实际力矩减去理论值得到外力矩。外力矩超过阈值才触发碰撞。这样机器人怎么动都不会误触发只有真正碰到东西才停。6.3 多关节协同与力控应用单关节力矩感知只是第一步。多关节机器人要做力控还需要把各关节力矩映射到末端执行器的力和力矩。这涉及雅可比矩阵的转置运算计算量不小但对STM32F4来说还能应付。我做过一个简单的阻抗控制末端受到外力时机器人顺着力的方向退让退让速度与外力成正比。用双编码器力矩做输入效果比电流环估算好很多退让动作明显更柔顺。后续还可以扩展把双编码器力矩和视觉结合做装配任务中的力位混合控制或者把力矩数据喂给机器学习模型做更复杂的交互任务。这些我都还在摸索有进展再分享。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进