两颗编码器的差能不能当扭矩传感器?
首发于公众号「如是有为」 · 查看原文

现在讲人形机器人关节,几乎都会出现一个配置:电机端一颗高速编码器,减速器输出端再放一颗编码器,做“双编码器全闭环”。
然后规格表开始卷:
17 bit、18 bit、21 bit,几十角秒,几 kHz 更新率。
但我觉得真正值得算的,不是第二颗编码器自己有多准,而是:
两颗编码器一减之后,剩下的那个角度,到底值多少牛米。
因为第二颗编码器真正增加的,并不只是又一个位置量。
它第一次把减速器里面原本看不见的那一段变形暴露出来了。
两个角度一减,减速器内部第一次变得可见
电机端编码器读到 θm,减速比是 N,输出端编码器读到 θo。
理想刚性传动下:
于是两颗编码器可以做差:
实际使用时还要做圆周折返、方向统一和零位对齐,这里先不展开。
如果中间真的是一根完全刚性的轴,δ 应该始终为零。
现实当然不会。
这个差值里面至少混着几样东西:
装配零位;
减速器自身传动误差;
温度引起的零位变化;
受力后的弹性扭转;
正反转迟滞;
动态扭振;
两颗编码器不同步造成的假角差。
所以真正拿来做扭矩估计之前,一般还得先测一张无载基线。
比如空载转一圈,得到:
δ0(θ)
实际运行时再扣掉:
δe=δ-δ0
这时候的 δe 才更接近我们真正想看的传动链弹性变形。
这就是双编码器真正有意思的地方。
一颗编码器只能告诉你:
关节走到哪了。
两颗编码器开始能够告诉你:
电机已经走到这里了,输出端为什么还没跟上。
前者是位置。
后者开始变成状态。
但两个角度一减,并不会自动得到牛米
最简单的想法当然是:
τ=Kδe
K 是扭转刚度。
看起来只要知道减速器刚度,两颗编码器一减,就白送了一颗扭矩传感器。
问题就在这里。
谐波减速器根本不是一根理想钢弹簧。
为了不拿一个虚构数字算,我直接选 Harmonic Drive 一个公开型号:
SHF-20-100-2SH。
减速比 100,额定输出扭矩 40 Nm。
厂家给出的扭转刚度不是一个数字,而是三段:
低负载区:
中负载区:
高负载区:
单位都是 Nm/rad。
其中第一段到 7 Nm,第二段到 25 Nm,再往上进入第三段。
这个参数本身已经把一件事说透了:
同样一份角度变形,在不同负载区间,本来就不对应同样的扭矩。
再考虑迟滞、摩擦、温度和加载方向,真实关系只会更复杂。
所以双编码器真正直接测到的,其实不是扭矩。
它直接测到的是:
传动链变形。
从变形换算成牛米,仍然需要模型。
但这并不妨碍我们先算最重要的一笔账。
17 bit,一个 LSB 到底是多少角度
假设输出端是一颗 17 bit 单圈编码器。
一圈被分成:
份。
所以:
得到:
Δθ=0.0027466°
换成角秒:
Δθ=9.89″
也就是:
Δθ=0.1648′
所以:
17 bit 的一个 LSB,大约就是 9.9 角秒。
这一步没有什么争议。
真正有意思的是下一步。
把 9.9 角秒换成牛米
还是看这颗 SHF-20-100。
低负载区刚度:
K1=16000
单位是 Nm/rad。
一弧度等于:
所以换成每角分:
得到:
K1=4.65
也就是低扭矩区大约 4.65 Nm/arcmin。
17 bit 一个 LSB 是:
0.1648′
于是:
Δτ=4.65×0.1648
得到:
Δτ=0.77
也就是说:
在这颗 40 Nm 级谐波减速器的低扭矩区,17 bit 输出编码器的一个 LSB,大约对应 0.77 Nm。
这个数字已经很值得琢磨了。
额定扭矩是 40 Nm。
所以一个 LSB 大约占额定扭矩:
注意,这还只是数字量化极限。
还没有算:
编码器自己的噪声、INL、安装偏心、输出端轴系误差、减速器传动误差,以及两颗编码器做差之后两边噪声共同进入的问题。
所以不能说:
17 bit 就能做到 0.77 Nm 的扭矩精度。
正确说法是:
在这个机械刚度下,17 bit 的一个数字刻度大约就是 0.77 Nm。
真正能测多小,还得继续往下算。
那如果我想看见 0.1 Nm 呢?
现在反过来算。
低扭矩区:
K1=4.65
如果扭矩变化只有 0.1 Nm,那么对应的角度变化:
得到:
Δθ=0.0215′
换成角秒:
Δθ=1.29″
也就是说:
在这颗减速器上,0.1 Nm 只会让两端产生大约 1.29 角秒的相对变化。
一整圈有:
360×3600=1296000″
所以最低需要的数字刻度数量:
而:
所以纯看量化:
差不多已经需要 20 bit。
这里要注意,是“纯看量化”。
20 bit 只说明一个 LSB 已经进入 0.1 Nm 这个数量级。
它完全没有给噪声和误差留余量。
如果希望一个 0.1 Nm 的变化不是只跳一个格,而是能稳定跨过几个有效刻度,位数还得继续往上。
如果目标再提高一个数量级,做到 0.01 Nm:
Δθ=0.00215′
也就是:
Δθ=0.129″
这时候:
还不够。
才进入这个数量级。
所以“为什么输出端编码器越来越卷 21 bit、23 bit、24 bit”,这里终于有了一个非常具体的解释。
不只是为了让关节停得更准。
当你开始想利用双编码器差值去看传动链状态时,角度的每一个 bit 都会直接被刚度换算成牛米。
还有一个很反直觉的结论:减速器越刚,小扭矩反而越难看见
这一点很容易写反。
还是:
τ=Kδ
所以:
对于同样的 1 Nm:
K 越大,δ 越小。
也就是说:
结构越刚,同样一牛米产生的角差越小。
如果只从“靠两个编码器的角差测力”这件事看,越刚其实越难测。
当然机器人关节不可能为了测力故意做软。
因为机械刚度又直接影响位置环带宽、振动和末端刚性。
所以这里本质上是一个三角矛盾:
机械希望刚。
控制希望快。
角差测力却希望同样的扭矩能产生足够大的可测变形。
这也是为什么不能脱离减速器刚度,单独讨论“输出端编码器需要多少 bit”。
真正更狠的账,其实不是 bit,而是时间
上面的 0.77 Nm 至少还是物理世界真的发生了变形。
下面这个误差,是系统自己凭空造出来的。
两颗编码器如果不是同一个时刻采样,只差了一个 Δ t,关节运动的时候就会产生假角差。
近似可以写成:
δt=ωΔ t
假设输出端转速只有 60 rpm。
也就是每秒一圈:
ω=360°/s
这个速度放在人形机器人关节里并不算离谱。
现在看看时间差会发生什么。
两颗编码器差 100 微秒
先算角度:
Δ t=0.0001
所以:
δt=360°×0.0001
得到:
δt=0.036°
换成角秒:
δt=129.6″
而 17 bit 一个 LSB 只有:
9.89″
所以:
仅仅 100 微秒不同步,就凭空制造出了 13 个 LSB 的角差。
这时候更有意思的是,把它换算成牛米。
0.036° 等于:
2.16′
但这里已经不能直接拿前面的 K1 一乘到底了。
因为这颗减速器第一段刚度只到 7 Nm。
第一段对应的角变形:
得到:
δ1=1.51′
总假角差有:
2.16′
所以还有:
2.16-1.51=0.65′
进入第二段。
第二段刚度换算一下:
得到:
K2=7.27
剩下这一段对应:
Δτ=0.65×7.27
得到大约:
Δτ=4.7
加上第一段 7 Nm:
τ≈11.7
考虑前面取值四舍五入,大约就是 11.8 Nm。
注意这个数字。
这是一个额定 40 Nm 的关节。
两颗编码器只是差了 100 微秒。
结果你算出来的“弹性扭矩”里面,可能平白多出接近:
12 Nm。
差不多是额定扭矩的三成。
这已经不是修修滤波器能解决的问题了。
如果差 10 微秒呢?
同样 60 rpm:
Δ t=0.00001
所以:
δt=0.0036°
也就是:
δt=12.96″
已经相当于:
也就是 1.3 个 17 bit LSB。
换成角分:
δt=0.216′
还在第一段刚度范围内。
所以:
τ=4.65×0.216
得到:
τ=1.00
差 10 微秒,假扭矩已经大约 1 Nm。
再缩到 1 微秒
Δ t=0.000001
得到:
δt=1.296″
刚好非常接近前面算出的:
0.1 Nm 对应 1.29 角秒。
所以:
τ≈0.10
这两个完全独立的计算,在这里撞到了一起。
如果你希望这颗 40 Nm 关节在 60 rpm 时,利用双编码器分辨大约 0.1 Nm,那么仅仅时间同步这一项,就已经要求接近微秒级。
这时候你再去讨论“17 bit 还是 18 bit”,突然就会发现问题没有那么简单。
| 两路时间差 | 假角差 | 17 bit LSB | 假扭矩 |
|---|---|---|---|
| 100 µs | 129.6″ | 13.1 | 约 11.8 Nm |
| 10 µs | 12.96″ | 1.31 | 约 1.0 Nm |
| 1 µs | 1.296″ | 0.13 | 约 0.1 Nm |
所以我现在看双编码器,第一个想问的问题已经不是:
这两颗分别多少 bit?
而是:
这两个角度到底是不是同一个时刻的角度?
“两颗都是 10 kHz”并不代表同步
这是工程上特别容易混过去的一句话。
A 编码器 10 kHz。
B 编码器也是 10 kHz。
然后就默认两路是同步的。
完全不是一回事。
假设控制器先读电机端 SPI,再去读输出端 SPI。
哪怕两个接口自己都很快,只要:
采样触发时间不同、内部数字滤波延迟不同、SPI 读取顺序不同、任务调度有抖动,
最终拿到的两个位置就可能不是同一个物理时刻。
而这个误差有一个特别讨厌的特点:
δt=ωΔ t
静止的时候:
ω=0
于是:
δt=0
所以静态标定完全看不出来。
低速的时候也不明显。
一跑快,误差突然冒出来。
而且它正好和速度成正比。
最后你会看到一种特别像机械问题的现象:
速度越高,“估算扭矩”越大。
工程师开始查摩擦。
查润滑。
查谐波减速器效率。
查电机模型。
查刚度温漂。
最后可能只是两颗编码器的数据差了几十微秒。
所以双编码器真正需要的不是简单“高采样率”。
而是:
硬件同步采样,或者至少有可信时间戳,能把两路位置重建到同一个时刻。
lost motion 也不是“空走一段才有扭矩”
还有一个词特别容易讲错。
很多人看到 Harmonic Drive 的 lost motion,就会把它理解成普通齿轮 backlash:
先空走一截。
碰到齿以后才开始传力。
但 Harmonic Drive 官方自己一直强调的是 zero backlash。
它测 lost motion 的方法,是把输入端锁住,在输出端施加大约正负 4% 额定扭矩,然后观察输出端形成的扭转迟滞。
所以这里真正麻烦的不是:
前面几个角秒没有扭矩。
而是:
同样一个角差,不一定对应同一个扭矩。
正向加载走到这里,和反向卸载走到这里,机械内部状态可能不同。
于是可能出现:
δ1=δ2
但:
τ1≠τ2
这才是迟滞真正麻烦的地方。
所以两个编码器的差值,本身只是一个非常干净的数字。
但这个数字背后的机械状态,却不一定唯一。
这也是为什么:
双编码器可以直接测变形,却不能自动变成计量级扭矩传感器。
两颗编码器真正多出来的,到底是什么
双编码器扭矩估计这条路线,其实不是新概念。
早就有研究利用 motor-side 和 load-side 的位置差,结合谐波减速器 compliance 模型来估计关节扭矩。
这里最关键的一句话其实是:
双编码器把原来必须靠模型猜的“减速器变形”,变成了一个直接可测状态。
以前只有电机端编码器。
你想知道输出端受力以后到底扭了多少,只能靠动力学模型估。
现在两边都有编码器:
θm
θo
于是:
这一层已经可以直接测。
但下一步:
δ→τ
仍然需要刚度和迟滞模型。
所以它和真正的关节扭矩传感器仍然不是同一回事。
但它已经比“只有一颗编码器,全靠模型猜”向前走了一大步。
有意思的是,还有另一拨人正在想办法把第二颗编码器删掉
这件事反过来看就更有意思了。
工业界现在大量往机器人关节输出端加编码器。
学术界却一直有另一条路线:
能不能只看电机端,就把中间的弹性变形估出来?
这类东西甚至直接叫:
Virtual Torsion Sensor。
思路就是利用电机端位置、电流和动力学模型,估计柔性关节内部的扭转状态。
于是两条路线的区别其实很清楚。
双编码器路线:
θm,θo→δ
再:
δ→τ
单编码器观测器路线:
θm,i→δ
再:
δ→τ
两边都离不开模型。
区别只在于:
双编码器把最关键的机械状态 δ 直接测出来了。
单编码器方案连这个状态本身都要估。
这才是第二颗编码器真正值钱的地方。
不是“又多了一个位置”。
而是:
系统内部第一次多了一个可以被直接观测的机械状态。
所以以后验收双编码器,我反而先看这五件事
第一件不是 bit。
是时间同步。
两颗编码器之间:
Δ t
到底能保证多少?
100 微秒、10 微秒、还是 1 微秒?
第二,无载情况下两颗编码器的差值,有没有跑过整圈。
也就是:
δ0(θ)
有没有建出来。
否则减速器自己的传动误差,很可能直接被当成受力变形。
第三,这张无载基线有没有测温度。
冷机和热机之间如果自己就漂了十几个角秒,已经是几个 17 bit LSB。
第四,正向加载和反向卸载的曲线是不是重复。
如果迟滞环自己都不稳定,再漂亮的编码器也救不了。
第五,最后才看:
bit、INL、noise、bandwidth。
因为真正值得验收的指标不是:
电机端 18 bit,输出端 17 bit。
而应该是:
两颗编码器做完差以后,最终的角度噪声折成多少牛米。
如果目标是 0.1 Nm,就把 0.1 Nm 对应的角度算出来。
如果关节最高跑 60 rpm,就把允许的同步误差算出来。
如果这些数字算完发现已经顶到编码器噪声、时间戳和机械迟滞的极限,规格表上再多一两个 bit 也没有意义。
我现在越来越觉得,“双编码器全闭环”这句话本身没有多少信息量。
真正有信息量的是:
你敢不敢把这两颗编码器做差。
拿一个 40 Nm 级谐波减速器算:
17 bit:0.77
大约就是 0.77 Nm/LSB。
想看见 0.1 Nm:20
纯量化已经接近 20 bit。
关节跑到 60 rpm,又想把不同步造成的假扭矩压到 0.1 Nm 左右:1
采样时间差已经到了约 1 微秒这个量级。
到了这里才会发现:
第二颗编码器最难的从来不是装进去。
而是让:
真的成为一个有物理意义的数。

关注公众号「如是有为」
微信扫一扫,新文章先在公众号发出。