两颗编码器的差能不能当扭矩传感器?

首发于公众号「如是有为」 · 查看原文

两颗编码器的差能不能当扭矩传感器?

现在讲人形机器人关节,几乎都会出现一个配置:电机端一颗高速编码器,减速器输出端再放一颗编码器,做“双编码器全闭环”。

然后规格表开始卷:

17 bit、18 bit、21 bit,几十角秒,几 kHz 更新率。

但我觉得真正值得算的,不是第二颗编码器自己有多准,而是:

两颗编码器一减之后,剩下的那个角度,到底值多少牛米。

因为第二颗编码器真正增加的,并不只是又一个位置量。

它第一次把减速器里面原本看不见的那一段变形暴露出来了。

两个角度一减,减速器内部第一次变得可见

电机端编码器读到 θm,减速比是 N,输出端编码器读到 θo。

理想刚性传动下:

θo=θm/N\theta_o=\theta_m/N

于是两颗编码器可以做差:

δ=θo−θm/N\delta=\theta_o-\theta_m/N

实际使用时还要做圆周折返、方向统一和零位对齐,这里先不展开。

如果中间真的是一根完全刚性的轴,δ 应该始终为零。

现实当然不会。

这个差值里面至少混着几样东西:

  • 装配零位;

  • 减速器自身传动误差;

  • 温度引起的零位变化;

  • 受力后的弹性扭转;

  • 正反转迟滞;

  • 动态扭振;

  • 两颗编码器不同步造成的假角差。

所以真正拿来做扭矩估计之前,一般还得先测一张无载基线。

比如空载转一圈,得到:

δ0(θ)

实际运行时再扣掉:

δe=δ-δ0

这时候的 δe 才更接近我们真正想看的传动链弹性变形。

这就是双编码器真正有意思的地方。

一颗编码器只能告诉你:

关节走到哪了。

两颗编码器开始能够告诉你:

电机已经走到这里了,输出端为什么还没跟上。

前者是位置。

后者开始变成状态。

但两个角度一减,并不会自动得到牛米

最简单的想法当然是:

τ=Kδe

K 是扭转刚度。

看起来只要知道减速器刚度,两颗编码器一减,就白送了一颗扭矩传感器。

问题就在这里。

谐波减速器根本不是一根理想钢弹簧。

为了不拿一个虚构数字算,我直接选 Harmonic Drive 一个公开型号:

SHF-20-100-2SH。

减速比 100,额定输出扭矩 40 Nm。

厂家给出的扭转刚度不是一个数字,而是三段:

低负载区:

K1=1.6×104K_1=1.6\times10^4

中负载区:

K2=2.5×104K_2=2.5\times10^4

高负载区:

K3=2.9×104K_3=2.9\times10^4

单位都是 Nm/rad。

其中第一段到 7 Nm,第二段到 25 Nm,再往上进入第三段。

这个参数本身已经把一件事说透了:

同样一份角度变形,在不同负载区间,本来就不对应同样的扭矩。

再考虑迟滞、摩擦、温度和加载方向,真实关系只会更复杂。

所以双编码器真正直接测到的,其实不是扭矩。

它直接测到的是:

传动链变形。

从变形换算成牛米,仍然需要模型。

但这并不妨碍我们先算最重要的一笔账。

17 bit,一个 LSB 到底是多少角度

假设输出端是一颗 17 bit 单圈编码器。

一圈被分成:

217=1310722^{17}=131072

份。

所以:

Δθ=360∘/131072\Delta\theta=360^{\circ}/131072

得到:

Δθ=0.0027466°

换成角秒:

Δθ=9.89″

也就是:

Δθ=0.1648′

所以:

17 bit 的一个 LSB,大约就是 9.9 角秒。

这一步没有什么争议。

真正有意思的是下一步。

把 9.9 角秒换成牛米

还是看这颗 SHF-20-100。

低负载区刚度:

K1=16000

单位是 Nm/rad。

一弧度等于:

1 rad≈3437.75 arcmin1\,\mathrm{rad}\approx3437.75\,\mathrm{arcmin}

所以换成每角分:

K1=16000/3437.75K_1=16000/3437.75

得到:

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 大约占额定扭矩:

0.77/40≈1.9%0.77/40\approx1.9\%

注意,这还只是数字量化极限。

还没有算:

编码器自己的噪声、INL、安装偏心、输出端轴系误差、减速器传动误差,以及两颗编码器做差之后两边噪声共同进入的问题。

所以不能说:

17 bit 就能做到 0.77 Nm 的扭矩精度。

正确说法是:

在这个机械刚度下,17 bit 的一个数字刻度大约就是 0.77 Nm。

真正能测多小,还得继续往下算。

那如果我想看见 0.1 Nm 呢?

现在反过来算。

低扭矩区:

K1=4.65

如果扭矩变化只有 0.1 Nm,那么对应的角度变化:

Δθ=0.1/4.65\Delta\theta=0.1/4.65

得到:

Δθ=0.0215′

换成角秒:

Δθ=1.29″

也就是说:

在这颗减速器上,0.1 Nm 只会让两端产生大约 1.29 角秒的相对变化。

一整圈有:

360×3600=1296000″

所以最低需要的数字刻度数量:

1296000/1.29≈10046511296000/1.29\approx1004651

而:

219=5242882^{19}=524288

220=10485762^{20}=1048576

所以纯看量化:

差不多已经需要 20 bit。

这里要注意,是“纯看量化”。

20 bit 只说明一个 LSB 已经进入 0.1 Nm 这个数量级。

它完全没有给噪声和误差留余量。

如果希望一个 0.1 Nm 的变化不是只跳一个格,而是能稳定跨过几个有效刻度,位数还得继续往上。

如果目标再提高一个数量级,做到 0.01 Nm:

Δθ=0.00215′

也就是:

Δθ=0.129″

这时候:

223=83886082^{23}=8388608

还不够。

224=167772162^{24}=16777216

才进入这个数量级。

所以“为什么输出端编码器越来越卷 21 bit、23 bit、24 bit”,这里终于有了一个非常具体的解释。

不只是为了让关节停得更准。

当你开始想利用双编码器差值去看传动链状态时,角度的每一个 bit 都会直接被刚度换算成牛米。

还有一个很反直觉的结论:减速器越刚,小扭矩反而越难看见

这一点很容易写反。

还是:

τ=Kδ

所以:

δ=τ/K\delta=\tau/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″

所以:

129.6/9.89≈13.1129.6/9.89\approx13.1

仅仅 100 微秒不同步,就凭空制造出了 13 个 LSB 的角差。

这时候更有意思的是,把它换算成牛米。

0.036° 等于:

2.16′

但这里已经不能直接拿前面的 K1 一乘到底了。

因为这颗减速器第一段刚度只到 7 Nm。

第一段对应的角变形:

δ1=7/4.65\delta_1=7/4.65

得到:

δ1=1.51′

总假角差有:

2.16′

所以还有:

2.16-1.51=0.65′

进入第二段。

第二段刚度换算一下:

K2=25000/3437.75K_2=25000/3437.75

得到:

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″

已经相当于:

12.96/9.89≈1.3112.96/9.89\approx1.31

也就是 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 µs129.6″13.1约 11.8 Nm
10 µs12.96″1.31约 1.0 Nm
1 µs1.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

于是:

δ=θo−θm/N\delta=\theta_o-\theta_m/N

这一层已经可以直接测。

但下一步:

δ→τ

仍然需要刚度和迟滞模型。

所以它和真正的关节扭矩传感器仍然不是同一回事。

但它已经比“只有一颗编码器,全靠模型猜”向前走了一大步。

有意思的是,还有另一拨人正在想办法把第二颗编码器删掉

这件事反过来看就更有意思了。

工业界现在大量往机器人关节输出端加编码器。

学术界却一直有另一条路线:

能不能只看电机端,就把中间的弹性变形估出来?

这类东西甚至直接叫:

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 微秒这个量级。

到了这里才会发现:

第二颗编码器最难的从来不是装进去。

而是让:

θo−θm/N\theta_o-\theta_m/N

真的成为一个有物理意义的数。

应作如是观
公众号「如是有为」二维码

关注公众号「如是有为」

微信扫一扫,新文章先在公众号发出。