ARTICLE DETAIL

资讯详情

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

双编码器机器人关节力矩感知原理与工程实践

双编码器机器人关节力矩感知原理与工程实践 1. 为什么要在机器人关节里塞两个编码器1.1 从一次关节抖动说起几年前我第一次拆开一台协作机器人的关节模组发现输出端和电机端各有一个编码器当时第一反应是这不是浪费成本吗。后来在调试一台六轴机械臂做精密装配时关节在低速爬行阶段出现了明显的抖动位置环怎么调都压不下去最后把两个编码器的数据拉出来对比才真正理解了双编码器的价值。单编码器方案通常把编码器装在电机端测的是转子角度经过减速器之后才是关节的实际输出角度。问题就出在这个经过减速器上。谐波减速器、RV减速器这类高减速比传动机构本身存在回差、柔性变形、齿隙电机端转了几十圈输出端可能才动一度。电机端编码器精度再高也无法感知减速器内部发生的弹性形变和传动误差。双编码器的核心思路很直接在电机端和关节输出端各装一个编码器同时测量输入和输出角度两者的差值就暴露了传动链的状态。这个差值能干什么一是补偿传动误差让关节的实际输出角度更准二是估算关节力矩因为减速器的弹性变形量和输出力矩之间存在近似线性关系三是做碰撞检测外力作用在关节上会改变输出端与输入端的相对角度这个变化可以被实时捕捉。这三个用途里力矩感知是最有技术含量的也是本文重点要拆的部分。1.2 双编码器方案适合谁参考这套方案主要面向做协作机器人、力控关节、外骨骼、精密转台这类需要力矩感知的开发者。如果你只是做一个简单的舵机云台或者轮式底盘单编码器完全够用没必要上双编码器增加成本和调试复杂度。但如果你需要做阻抗控制、拖动示教、碰撞检测或者对关节输出精度有较高要求那双编码器几乎是绕不开的选择。从技术栈来看你需要对编码器原理、减速器特性、嵌入式实时系统、信号处理有一定了解。本文会从原理讲到实操尽量让刚入门的读者也能跟上但涉及具体参数计算的部分还是需要一些基础。1.3 核心关键词先摆出来整篇文章围绕几个核心概念展开双编码器、机器人关节、力矩感知、编码器、减速器。这几个词之间的关系是编码器是传感器减速器是传动机构机器人关节是应用载体力矩感知是最终目标双编码器是实现手段。理解了这条链路后面的内容就好展开了。2. 双编码器力矩感知的原理拆解2.1 减速器的弹性变形是力矩的翻译器要理解双编码器怎么测力矩先得理解减速器的一个特性它不是刚体。谐波减速器里的柔轮、RV减速器里的摆线针轮在传递力矩时都会发生弹性变形。这个变形量虽然很小通常在角分级别但它和输出力矩之间存在可建模的关系。以谐波减速器为例柔轮在输出力矩作用下会产生扭转弹性变形变形角度θ和力矩T的关系近似为T K * θ其中K是减速器的扭转刚度单位通常是Nm/rad。这个K值不是常数在低力矩段和大力矩段会呈现非线性中间段近似线性。实际建模时通常用分段线性或者多项式拟合。双编码器测的就是这个θ。电机端编码器测出电机转角θ_m乘以减速比i得到理论输出角θ_theory θ_m / i输出端编码器测出实际输出角θ_out两者之差就是传动链的总变形θ_deform θ_theory - θ_out这个θ_deform里包含了减速器弹性变形、齿隙、回差等多种因素。在力矩变化较慢、方向不频繁切换的场景下弹性变形占主导就可以用θ_deform乘以刚度K来估算力矩。2.2 为什么不用电流估算力矩有人会问电机电流不也能估算力矩吗确实可以而且很多低成本方案就是这么做的。电流乘以电机转矩常数得到电机输出力矩再乘以减速比和效率就是关节力矩。但这个方案有几个硬伤。第一摩擦力的影响。减速器的摩擦转矩随温度、负载、润滑状态变化电流估算无法区分这部分。第二效率非线性。减速器效率在不同负载和速度下差异很大用固定效率值会带来明显误差。第三无法感知外力。电流估算的是电机主动输出的力矩如果外力作用在关节输出端电机电流可能不变但关节实际受力已经变了。双编码器方案通过测量输出端和输入端的角度差能直接感知到外力引起的变形这是电流方案做不到的。当然双编码器也不是万能的。它的精度受编码器分辨率、刚度标定精度、温度漂移等因素影响。实际工程中经常把双编码器和电流估算结合起来用取长补短。2.3 编码器选型增量式还是绝对式双编码器方案里两个编码器的选型有讲究。电机端编码器通常用增量式或者磁编码器因为电机转速高需要高响应频率输出端编码器建议用绝对式因为关节输出角度需要断电记忆而且绝对式编码器没有累积误差。增量式编码器和绝对式编码器的区别打个比方增量式像跑步机上的计步器只知道转了多少步不知道绝对位置绝对式像钟表任何时刻都能读出当前角度。电机端用增量式没问题因为每次上电可以通过寻相确定初始位置输出端用绝对式更稳妥避免断电后关节位置丢失。分辨率方面电机端编码器经过减速比放大后等效到输出端的分辨率会提高i倍。比如电机端用17位磁编码器131072线/圈减速比100等效到输出端就是13107200线/圈这个分辨率已经远超输出端编码器本身。所以输出端编码器的分辨率不需要太高16位到18位绝对式编码器就够用关键是精度和重复性要好。2.4 刚度标定的实操方法刚度K的标定是双编码器力矩感知的核心环节。标定不准力矩估算就是空中楼阁。标定的基本思路是给关节施加已知力矩同时记录双编码器的角度差拟合出T-θ曲线。具体操作上可以用砝码加载。在关节输出端装一个已知长度的力臂挂上不同重量的砝码产生已知力矩。每个力矩点稳定后读取双编码器角度差记录数据。从零力矩逐步加载到额定力矩再逐步卸载正反两个方向都做一遍这样能同时得到加载曲线和卸载曲线两者的差值反映了回差和摩擦。标定时要注意几点一是温度要稳定减速器刚度对温度敏感二是加载要慢避免动态效应三是每个点要等稳定后再读数通常等3到5秒四是重复多次取平均减少随机误差。标定出来的曲线通常用分段线性拟合低力矩段斜率小中间段斜率大且线性大力矩段又变缓。3. 硬件搭建与信号链设计3.1 编码器接口与信号完整性双编码器系统里两个编码器的信号要同时采集时间同步很重要。如果两个编码器的采样时刻差了几毫秒在关节运动时就会引入角度误差。假设关节以1rad/s转动1ms的时间差对应1mrad的角度误差这个误差在力矩估算里可能对应几Nm的偏差不能忽视。增量式编码器通常输出A/B/Z三相差分信号用STM32的定时器编码器模式可以直接解码。绝对式编码器常用SSI、BiSS-C、SPI等接口需要控制器主动发起读取。如果两个编码器接口类型不同同步采集会更麻烦。一个实用的做法是用同一个定时器触发两路采集或者用FPGA做硬件同步。信号完整性方面编码器线缆要远离电机动力线差分信号要用双绞线屏蔽层单端接地。我踩过的坑是编码器线缆和电机线捆在一起走线结果电机PWM噪声耦合进来编码器计数偶尔跳变力矩估算出现尖峰。后来把编码器线单独走线槽问题就解决了。3.2 主控选型与实时性要求双编码器力矩感知对主控的实时性有要求。力矩估算通常要在1kHz以上的频率运行才能保证力控环路的带宽。这意味着每1ms要完成两个编码器的读取、角度差计算、刚度模型查表、力矩输出还要跑力控算法。STM32F4系列比如STM32F407跑168MHz做这些运算绰绰有余。STM32F103系列比如STM32F103RCT6跑72MHz如果算法优化得好也能胜任但余量不大。如果关节数量多建议用F4或者H7系列或者用多核方案一个核专门管编码器采集另一个核跑控制算法。实时性不只是主频问题中断响应延迟、任务调度抖动都会影响。建议把编码器采集放在定时器中断里优先级设高力矩估算和力控放在主循环或者低优先级中断里。如果用了RTOS要注意任务优先级分配避免编码器采集中断被其他任务阻塞。3.3 电源与隔离设计编码器供电要干净。增量式编码器通常是5V供电绝对式编码器有5V也有24V的。如果编码器和电机驱动器共用电源电机启停时的电压波动可能影响编码器工作。建议编码器用独立的LDO供电或者在电源入口加π型滤波。信号隔离方面如果编码器线缆较长超过1米建议加数字隔离器比如ADuM系列或者6N137光耦。隔离能切断地环路减少共模干扰。我做过一个测试不加隔离时编码器在电机启动瞬间会丢计数加了隔离之后就没再出现过。4. 从编码器读数到力矩输出的完整实现4.1 角度差计算的细节处理拿到两个编码器的原始读数后第一步是计算角度差。这里有几个细节容易出错。电机端编码器读数是电机转角θ_m单位是弧度或者脉冲数。输出端编码器读数是关节输出角θ_out。理论输出角是θ_m除以减速比i。角度差Δθ θ_m/i - θ_out。第一个坑是减速比的符号。谐波减速器和RV减速器的输入输出转向可能相同也可能相反取决于安装方式。如果符号搞错角度差会变成两倍的实际值力矩估算直接翻倍。调试时先手动转动关节观察两个编码器读数的变化方向确认符号。第二个坑是多圈计数。电机端编码器转一圈输出端可能才动一点点。如果电机端编码器是增量式上电后需要寻相确定绝对位置。寻相过程中电机要缓慢转动找到Z信号或者霍尔信号确定的初始位置。这个过程要确保输出端编码器读数稳定否则寻相不准会导致后续所有计算都偏。第三个坑是角度差的周期性。由于编码器分辨率和减速比的关系角度差会呈现周期性波动这个波动不一定都是传动误差也可能是编码器本身的非线性。处理方法是先做一圈内的多点标定建立误差补偿表实时查表补偿。4.2 刚度模型的建立与查表刚度模型是力矩估算的核心。前面标定得到的T-θ曲线需要转换成可以在线查表的形式。具体做法是把角度差范围分成若干段每段用一个线性系数近似。比如角度差从0到0.001rad用K10.001到0.005rad用K2以此类推。段数越多精度越高但存储和查表开销也越大。实际工程中16到32段通常够用。查表时要注意边界处理。如果角度差超出标定范围说明力矩超过了额定值这时候要么报警要么用最后一段的斜率外推。外推有风险因为大力矩段刚度非线性严重外推误差可能很大。建议在标定时覆盖120%的额定力矩留出余量。温度补偿是另一个要点。减速器刚度随温度变化冷机和热机的标定曲线不一样。如果应用场景温度变化大建议在不同温度下分别标定或者建立温度-刚度修正系数。我做过一个测试谐波减速器从20度升到60度刚度下降了约15%这个变化在精密力控里不能忽略。4.3 滤波与动态补偿原始的角度差信号含有噪声直接乘以刚度得到的力矩会抖动。需要滤波但滤波会引入相位滞后影响力控环路稳定性。这是个矛盾。常用的做法是用低通滤波器截止频率设在力控环路带宽的3到5倍。比如力控环路带宽100Hz滤波器截止频率设300到500Hz。滤波器类型用二阶巴特沃斯或者一阶低通都行二阶滤波效果好但相位滞后大一阶简单但滤波效果有限。动态补偿方面关节运动时的惯性力矩和科氏力矩会影响角度差。如果关节加速度大减速器变形里会叠加动态分量。这时候需要根据关节加速度做前馈补偿把动态分量减掉剩下的才是静态力矩对应的变形。加速度可以从输出端编码器差分得到但差分噪声大需要先滤波再差分。4.4 代码实现框架下面给一个简化的代码框架基于STM32 HAL库展示双编码器读取和力矩估算的主流程。实际工程中需要根据具体硬件调整。// 编码器数据结构 typedef struct { int32_t motor_raw; // 电机端编码器原始值 int32_t output_raw; // 输出端编码器原始值 float motor_angle; // 电机角度(rad) float output_angle; // 输出角度(rad) float angle_diff; // 角度差(rad) float torque; // 估算力矩(Nm) } JointEncoder_t; // 减速比和刚度表 #define GEAR_RATIO 100.0f #define STIFF_TABLE_SIZE 32 static const float stiff_table[STIFF_TABLE_SIZE] { // 分段刚度值单位Nm/rad实际值需标定 50.0f, 80.0f, 120.0f, 180.0f, 250.0f, 320.0f, 400.0f, 480.0f, 550.0f, 620.0f, 680.0f, 730.0f, 770.0f, 800.0f, 820.0f, 830.0f, 835.0f, 838.0f, 840.0f, 841.0f, 842.0f, 842.5f, 843.0f, 843.2f, 843.4f, 843.5f, 843.6f, 843.7f, 843.8f, 843.9f, 844.0f, 844.0f }; static const float diff_step 0.0005f; // 每段角度差步长 // 读取编码器并计算力矩 void Joint_UpdateTorque(JointEncoder_t *enc) { // 读取原始值(具体函数依赖硬件) enc-motor_raw Encoder_ReadMotor(); enc-output_raw Encoder_ReadOutput(); // 转换为角度 enc-motor_angle enc-motor_raw * MOTOR_ENC_SCALE; enc-output_angle enc-output_raw * OUTPUT_ENC_SCALE; // 计算角度差注意符号 enc-angle_diff enc-motor_angle / GEAR_RATIO - enc-output_angle; // 查表得到刚度 int idx (int)(fabsf(enc-angle_diff) / diff_step); if (idx STIFF_TABLE_SIZE) idx STIFF_TABLE_SIZE - 1; float stiffness stiff_table[idx]; // 计算力矩 enc-torque stiffness * enc-angle_diff; // 低通滤波 static float torque_filtered 0.0f; float alpha 0.1f; // 滤波系数需根据实际调整 torque_filtered alpha * enc-torque (1.0f - alpha) * torque_filtered; enc-torque torque_filtered; }这个框架里MOTOR_ENC_SCALE和OUTPUT_ENC_SCALE是编码器原始值到弧度的转换系数取决于编码器分辨率和安装方式。刚度表是标定得到的实际值需要根据你的减速器型号和标定结果填写。滤波系数alpha越小滤波越强但滞后越大需要权衡。5. 调试过程中踩过的坑与排查技巧5.1 角度差跳变与编码器丢计数调试初期最常见的问题是角度差突然跳变力矩估算出现尖峰。十有八九是编码器丢计数或者多计数。排查思路先看原始编码器读数是否连续。如果电机端编码器读数在某个位置突然跳了几十个数说明丢计数了。丢计数的原因通常是信号干扰、线缆接触不良、编码器供电不稳。用示波器看编码器A/B信号正常应该是干净的正交方波如果有毛刺或者幅值不够就是信号完整性问题。另一个可能是编码器分辨率设置错误。比如编码器实际是2500线配置成了1024线角度计算就会错。这个错误在低速时可能不明显高速时角度差会明显偏大。5.2 力矩估算偏大或偏小的系统性问题如果力矩估算整体偏大或偏小但线性度还行通常是刚度系数标定不准或者减速比设置错误。先检查减速比。减速比搞错是最低级的错误但也是最容易发生的。比如谐波减速器标称减速比100实际可能是100.5或者99.5这个偏差在大力矩时会放大。建议用实际测量法确认减速比手动转动电机端若干圈记录输出端转过的角度算出实际减速比。再检查刚度标定。标定时砝码重量是否准确力臂长度是否测量准确加载点是否稳定。我遇到过一次标定偏大20%最后发现是力臂长度量错了把力臂的安装孔距当成了有效力臂。5.3 温度漂移导致的零点偏移长时间运行后力矩零点慢慢偏移这是温度漂移的典型表现。减速器发热后刚度变化编码器本身也有温漂。处理方法是做温度补偿。在减速器外壳或者编码器附近贴温度传感器建立温度-零点偏移曲线。运行时根据温度实时修正零点。如果成本允许可以在关节不受力时自动回零比如每次上电初始化时让关节在自由状态下读取角度差作为零点。5.4 常见问题速查表现象可能原因排查方法解决措施角度差跳变编码器丢计数示波器看A/B信号检查线缆屏蔽、加隔离力矩整体偏大减速比设置错误手动转动测量实际减速比修正减速比参数力矩整体偏小刚度标定偏小复核标定砝码和力臂重新标定零点漂移温度变化监测温度与零点关系加温度补偿或自动回零力矩噪声大滤波不足观察原始信号频谱调整滤波器参数动态误差大惯性补偿缺失对比静态和动态标定加加速度前馈补偿寻相失败输出端编码器不稳检查寻相时输出端读数固定输出端或改进寻相算法5.5 几个实用的调试技巧第一个技巧用示波器同时看两个编码器的信号触发在电机端Z信号上观察输出端信号与电机端信号的相位关系。这能快速确认减速比和转向。第二个技巧做静态标定时用手机水平仪App辅助确认力臂水平比肉眼判断准得多。第三个技巧力矩估算的滤波系数不要一次调到位先用较大滤波看趋势确认趋势对了再逐步减小滤波观察噪声和滞后的平衡点。第四个技巧如果条件允许用外部力矩传感器做对比标定。在关节输出端串一个力矩传感器同时记录传感器读数和双编码器估算力矩两者的差值就是估算误差。这是最直接的验证方法。6. 双编码器方案的扩展应用6.1 碰撞检测与安全响应双编码器除了测力矩还能做碰撞检测。当关节受到外部碰撞时输出端角度会突变而电机端由于惯性和减速器柔性变化滞后。这个角度差的突变可以被快速检测到。实现上设定一个角度差变化率阈值超过阈值就触发碰撞响应。响应可以是急停、回退或者切换到柔顺模式。阈值设定要权衡灵敏度和误触发太小会误报太大则碰撞已经造成伤害才响应。实际调试时用不同速度撞击不同刚度的物体记录角度差变化率找出合适的阈值。6.2 拖动示教与零力控制拖动示教是协作机器人的标志性功能操作者用手拖动关节机器人跟随运动。双编码器在这里的作用是感知操作者施加的力矩然后控制电机输出相应的力矩去平衡重力和摩擦让操作者感觉关节是轻的。零力控制的核心是力矩闭环。双编码器估算出外力矩控制器根据外力矩计算电机应该输出的力矩让关节对外表现为零阻抗。这个环路的带宽和稳定性取决于力矩估算的精度和延迟。双编码器方案比电流方案的优势在于能感知输出端的外力响应更直接。6.3 多关节协同与标定多关节机器人里每个关节都有双编码器所有关节的力矩数据汇总到控制器可以做更复杂的力控。比如双臂协作搬运需要协调各关节的力矩分配。这时候关节间的标定一致性很重要每个关节的刚度模型要统一标定零点要统一校准。标定方法上可以用一个已知重量的负载让机器人以不同姿态持载记录各关节的力矩读数反推各关节的标定参数。这个方法能同时标定多个关节效率比单关节标定高。7. 写在最后的一些个人体会双编码器力矩感知这套方案原理不复杂但工程实现里的细节非常多。我从第一次接触到现在踩过的坑包括编码器丢计数、减速比搞错、刚度标定偏、温度漂移、滤波参数调不好等等每一个坑都花了不少时间才爬出来。最大的体会是标定决定上限调试决定下限。刚度标定做得准力矩估算的精度就有保障调试做得好噪声和漂移就能压住。两者缺一不可。另一个体会是不要迷信单一方案。双编码器有它的优势但也有局限。实际工程中我经常把双编码器和电流估算、关节力矩传感器结合起来用互相校验取长补短。比如用双编码器做高频力矩感知用电流估算做低频备份用关节力矩传感器做定期校准。最后分享一个小技巧如果预算有限输出端编码器可以用磁编码器代替绝对式光电编码器成本能降不少精度对于大多数力控应用也够用。磁编码器比如AS5047P这类分辨率14位SPI接口用起来很方便。但要注意磁编码器的温漂比光电编码器大标定时要把温度因素考虑进去。
返回列表