編碼器:旋轉的尺子
在機器人感知周圍世界之前,它得先感知自己:它自己的關節在哪裡。這種向內的感覺叫作本體感覺——醫生用的也是這個詞,就是你閉上眼睛仍然知道手在哪裡的那種感覺。最基礎的本體感覺感測器是旋轉編碼器,它是固定在旋轉軸上的小裝置,只回答一個問題:這根軸轉了多遠?
想像軸上有一個薄圓盤,刻著幾百條像梳齒一樣的細線。一側有微小的光照過去,另一側的偵測器看到細線掃過時光線一明一暗地閃爍。每閃一次就是一個計數。數一數計數,你就知道角度了:如果圓盤有 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 是本體感覺裡默默無聞的主力軍。它們便宜、快、隨時可用——不像相機那樣需要看清房間或良好的照明。幾乎每一台機器人,從桌面機械臂到自動駕駛汽車,都把它們當作自我感知的基線,然後才在上面疊加更花哨的感知。
但請留意這條反覆出現的教訓:每個感測器都只對故事的一部分誠實。編碼器數計數,卻可能打滑;加速度計找到下,卻會被晃動;陀螺儀轉得平滑,卻會漂移。沒有哪一個能在長時間裡單獨可靠。機器人對自身運動的真正感知來自把它們組合起來——而把它們組合得好、並時不時對照絕對參照,正是你將不斷練習的手藝。