☰
双编码器机器人关节力矩感知原理与工程实践
2026/9/28 1:48:58 网站建设 项目流程

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用K1,0.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接口,用起来很方便。但要注意磁编码器的温漂比光电编码器大,标定时要把温度因素考虑进去。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询