JOVANA
Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

测量自身的运动:编码器与惯性测量单元

机器人如何用旋转编码器、加速度计和陀螺仪知道每个关节转了多远、哪个方向朝上。

编码器:旋转的尺子

在机器人感知周围世界之前,它得先感知自己:它自己的关节在哪里。这种向内的感觉叫作本体感觉——医生用的也是这个词,就是你闭上眼睛仍然知道手在哪里的那种感觉。最基础的本体感觉传感器是旋转编码器,它是固定在旋转轴上的小装置,只回答一个问题:这根轴转了多远?

想象轴上有一个薄圆盘,刻着几百条像梳齿一样的细线。一侧有微小的光照过去,另一侧的探测器看到细线扫过时光线一明一暗地闪烁。每闪一次就是一个计数。数一数计数,你就知道角度了:如果圆盘有 1000 条线,你数到 250 个计数,那轴就转了四分之一圈,也就是 90 度。编码器把物理上的转动变成了机器人能读取的数字。

为什么这件事如此重要?因为编码器报告的关节角度,是正运动学的原始输入——正运动学这套数学把「每个关节处在某个角度」换算成「手处在空间中的某个点」。机械臂的每个转动关节都带着自己的编码器,它们合在一起告诉机器人自己确切的姿态。漏掉一个计数,机器人对手在哪里的判断就会偏离真相。

两种新的感觉:感知推力与感知旋转

只要有可以固定的轴,编码器就很完美。可是会飞的无人机或会走的机器人,还需要知道整个身体在空中如何倾斜、如何移动,而那里没有轴可数。为此我们用两种直接感知力的不同传感器。

第一种是加速度计。想象芯片里有一个被弹簧吊着的小重物。当芯片加速、减速或被推一下时,重物会因为惯性而滞后,从而拉扯弹簧;芯片测量的就是这股拉力。微妙之处在于:重力也在拉这个重物,效果就像芯片正以每秒平方 9.8 米的加速度被向上推一样。所以一个静止的加速度计总会感受到一个背离地球、约一个重力的推力——这很美妙,因为它告诉机器人哪个方向是

第二种是陀螺仪。它感受的不是推力,而是旋转速率——身体绕自己三个轴各自旋转得有多快,单位是度每秒。现代陀螺仪里面没有旋转的轮子;取而代之的是让一个微小结构持续振动,当芯片旋转时,一股侧向力(科里奥利效应)会推动这股振动,推动的方式正好能被芯片测出来。如果说加速度计回答的是「我此刻往哪边倾斜」,那陀螺仪回答的就是「我转得有多快」。

惯性测量单元:让相反的两者搭档

把一个加速度计和一个陀螺仪(通常还加一个磁罗盘)装进一个小封装里,你就有了惯性测量单元,简称 IMU——正是这块芯片让手机、无人机和人形机器人有了平衡感。IMU 的全部要义在于团队协作:每个传感器恰好补上了另一个的弱点。

为什么加速度计不能单独完成任务?它能找到「下」,所以能告诉你倾斜——横滚和俯仰。可它说不出你在平地上朝向哪个方向,因为原地转圈并不改变重力指向哪里。航向对它来说是看不见的。更糟的是,每一步落地、每一次电机振动都会表现成一个假的加速度,所以它的倾斜估计抖得厉害。

为什么陀螺仪也不能单独完成任务?它能漂亮地捕捉航向和每一次快速转动,而且几乎不受颠簸干扰。但它只报告转动的*速率*,从不报告绝对角度。要得到角度,你必须把速率随时间累加起来,而读数里任何微小的恒定误差——它的偏置——都会被一次又一次地加进去,于是角度慢慢偏离真相。这种悄悄累积的误差叫作漂移,一只孤立的陀螺仪过几分钟就会信誓旦旦地坚称自己倾斜了,哪怕它正平平稳稳地躺着。

解决办法不言自明。在快速、平滑、瞬息万变的变化上信任陀螺仪,再轻轻借助加速度计对「下」的判断,慢慢把陀螺仪的漂移校正回真相。把两个都不完美的传感器融合成一个比单独任一个都更好的估计,正是传感器融合的核心,这个主题你在机器人学里会一再遇到。

从速率到角度:积分及其代价

我们把陀螺仪的数学说具体些。芯片每秒会多次把转动速率交给你。要把速率变成角度,你做一件很简单的事:每个时间步,用速率乘以经过的时间,再把它加到一个累计值上。乘了再加,反反复复。那个累计和就是你的角度。这种一步步的累积叫作积分,同样的把戏也能把加速度计的读数变成速度。

# repeat every time step (dt = seconds since last reading)
angle    = angle    + gyro_rate   * dt   # rate  -> angle
velocity = velocity + accel_meas  * dt   # accel -> velocity
position = position + velocity    * dt   # velocity -> position

# the catch: a small constant error (bias) in gyro_rate or accel_meas
# is added in EVERY step, so the error grows without bound -> drift
三行代码的积分:每一步把测量值乘以时间片再累加上去。恒定的偏置会被永远反复加进去,漂移正源于此。

积分的代价是它对错误有很长的记忆。假设陀螺仪的偏置让它在你完全静止时每秒多读 0.1 度。一分钟后,积分出来的角度就偏了 6 度;十分钟后偏 60 度。加速度计的情形更严酷:位置要积分两次,所以小小的偏置增长起来不是直线,而像滚雪球一样越来越快。

这正是为什么 IMU 驱动机器人靠航位推算——纯粹根据自身的运动来估计自己在哪——只在短时间内可信,也是为什么同样的漂移问题会出现在基于轮子的里程计里。解药是时不时拿绝对的东西来对照:重力钉住倾斜,磁罗盘或 GPS 钉住航向和位置,而良好的标定会在偏置被积分之前就把它测出来并减掉。

自我感知的主力军

编码器和 IMU 是本体感觉里默默无闻的主力军。它们便宜、快、随时可用——不像相机那样需要看清房间或良好的照明。几乎每一台机器人,从桌面机械臂到自动驾驶汽车,都把它们当作自我感知的基线,然后才在上面叠加更花哨的感知。

但请留意这条反复出现的教训:每个传感器都只对故事的一部分诚实。编码器数计数,却可能打滑;加速度计找到下,却会被晃动;陀螺仪转得平滑,却会漂移。没有哪一个能在长时间里单独可靠。机器人对自身运动的真正感知来自把它们组合起来——而把它们组合得好、并时不时对照绝对参照,正是你将不断练习的手艺。