在我的想像中機器人首先應該能自由的走來走去,然後應該能流利的與主人對話。朝著這個理想,我準備設計一個能自由行走,並且可以與人語音對話的機器人。實現的關鍵是讓機器人能通過感測器感知周圍環境,並通過機器人大腦處理並輸出反饋和執行動作。本章節涉及到的感測器有激光雷達、IMU、輪式里程計、麥克風、音響、攝像頭,和用於處理信息的嵌入式

主板。關於感測器的ROS驅動程序開發和在機器人上的使用在後面的章節會展開,本章節重點對機器人感測器和嵌入式主板進行講解,主要內容:

1.ydlidar-x4激光雷達

2.帶自校準九軸數據融合IMU慣性感測器

3.輪式里程計與運動控制

4.音響麥克風與攝像頭

5.機器人大腦嵌入式主板性能對比

6.做一個能走路和對話的機器人


3.輪式里程計與運動控制

底盤提供輪式里程計與運動控制,是機器人SLAM建圖與避障導航的基礎。所以對底盤進行了解,和熟悉輪式里程計與運動控制的底層原理是很有益處的。這裡以我們的miiboo機器人的底盤為例,對底盤上的輪式里程計和運動控制的原理進行分析。

3.1.硬體概述

(圖20)miiboo機器人底盤

底盤主要由電機控制板和帶編碼器的減速電機構成,如圖20。電機控制板通過串口與機器人的大腦(如樹莓派3)相連接,通過接收大腦下發的控制指令,利用PID演算法對電機進行控制;同時,採集電機上的編碼器數據發送給大腦,利用航跡推演演算法得到底盤的里程計信息。

3.2.輪式里程計與運動控制

(圖21)輪式里程計與運動控制

如圖21,為輪式里程計與運動控制的系統框圖。首先是機器人大腦發送控制命令,其實就是期望左、右電機達到的目標轉速,我們都知道在一個控制系統中,被控對象很難完全按照期望目標來運行,這就需要引入反饋對被控對象進行實時的閉環控制,讓被控對象盡量逼近期望目標,電機控制板主要就是用來實現這個過程。同時,電機控制板還負責對電機編碼信號進行採樣,將單位採樣時間(一般為10ms)內的編碼脈衝累計值作為里程數據發送給機器人大腦,機器人大腦利用航跡推演演算法求解出里程計信息。

通信協議:

電機控制板與機器人大腦之間採用串口通信。電機左、右輪期望轉速被封裝到串口的字元串中,作為控制命令發送給電機控制板;單位時間(一般10ms)內採樣到的電機編碼脈衝累計值(等效為實際電機速度)作為里程數據,以同樣的方式被封裝到串口的字元串中發送給機器人大腦。可以看出,控制命令與里程數據遵循一樣的封裝協議,協議具體形式如圖22。

(圖22)通信協議
(圖23)PID演算法流程

電機控制最常用的就是PID控制演算法,如圖23為PID演算法流程。以電機轉速控制為例,r(t)就是給定的目標轉速,c(t)就是電機實際運行時的轉速,通過閉環反饋可以求得r(t)與c(t)的偏差值e(t),PID控制演算法中的比例(P)、積分(I)、微分(D)調節器利用e(t)生成新的控制量u(t),u(t)通過執行機構(電機驅動器)作用於被控對象(電機),電機的實際運行速度c(t)通過閉環反饋,進入下一次PID調節。就這樣,不斷的通過閉環反饋調節,使電機實際運行速度c(t)最終逼近給定的目標速度r(t)。

在連續和離散時間域上PID會有不同的表現形式,在連續時間域上積分、微分調節通過積分計算、微分計算實現,而在離散時間域上積分、微分調節通過累加和、差分計算實現。由於電機控制需要在程序上進行實現,所以需要採用離散域的PID。按照PID演算法生成的調節量的形式,又可以分為位置式PID和增量式PID;位置式PID生成的u(t)為直接的控制量,增量式PID生成的Δu(t)是控制量的修正量,需要疊加上一次的u(t-1)才能作為控制量。離散形式的位置式與增量式PID數學表達如圖24。

(圖24)離散形式的位置式與增量式PID數學表達

可以看出,利用位置PID的數學表達式經過簡單的變形就能得到增量PID的數學表達式。增量演算法不需要做累加,控制量增量的確定僅與最近幾次誤差採樣值有關,計算誤差或計算精度問題,對控制量的計算影響較小。而位置演算法要用到過去的誤差的累加值,容易產生大的累加誤差。增量式演算法得出的是控制量的增量,例如閥門控制中、只輸出閥門開度的變化部分,誤動作影響小,必要時通過邏輯判斷限制或禁止本次輸出,不會嚴重影響系統的工作。而位置演算法的輸出是控制量的全量輸出,誤動作影響大。增量型PID的程序實現,如如圖25。關於PID參數的整定,將放在後面的文章進行詳細講解。

(圖25)增量型PID的程序實現

差動兩輪底盤輪式里程計:

輪式里程計是機器人底盤的重要組成部分,採用航跡推演演算法對機器人的位姿進行估計,並對機器人當前的速度、旋轉速度、左右輪速度進行轉換。無論是機器人的定位導航還是普通的運動控制,都需要輪式里程計。

(圖26)通過航跡推演計算里程計

如圖26,為通過航跡推演計算里程計的過程。隨時間推移機器人底盤的實時位姿p1、p2、p3、...、pn連接起來就形成了機器人的航跡,考慮很短的時間內兩相鄰機器人位姿p1和p2,在已知機器人位姿p1和機器人當前左右輪速度vl、vr的條件下,利用微積分的思想可以推算出機器人在下一個時刻的位姿p2,通過這樣不斷的推演,就可以計算出機器人當前的位姿以及速度、角速度等信息,這就是所謂的航跡推演。關於航跡推演的具體數學推導和程序實現,將在後面的文章中進行展開講解。

底盤電機控制板軟體框架:

(圖27)stm32電機控制板軟體架構

如圖27,為stm32電機控制板軟體架構。底盤中的電機控制與里程數據採集的程序在stm32單片機上實現,TIM1定時器產生週期性的循環,循環中進行電機編碼器數據採集、PID計算、電機速度pwm控制,剩下的就是usart1串口與usart2串口跟機器人大腦之間的通信了,底盤debug介面是用於stm32程序開發階段使用的,所以在機器人正常運行的過程中只需要使用底盤控制介面。關於stm32部分的代碼和對應機器人大腦中ROS驅動代碼將在後面介紹。

3.3.在機器人中使用底盤

通過前面的講解,我們已經對機器人底盤的用途及工作原理有了一定的瞭解,並且知道了電機控制和里程計的工作過程。這時候肯定很想知道如何在機器人中把底盤使用起來呢?其實很簡單,和激光雷達、IMU這些感測器一樣,底盤也可以當做一個感測器來使用,只不過不同之處是這個感測器與機器人大腦是雙向交互的,機器人大腦向底盤發送控制命令,底盤反饋里程數據給機器人大腦。但是,不論交互的細節如何,只需要裝上底盤的ROS驅動包,上層演算法只需要發布和訂閱相應的主題就能達到使用底盤的目的。

(圖28)在機器人中使用底盤

底盤通過串口與機器人相連接,機器人中通過運行底盤控制ROS驅動,來實現讀取串口的速度反饋,利用航跡推演演算法計算得到里程計並發布到/odom這個主題;底盤控制ROS驅動訂閱/cmd_vel主題的運動控制數據,並轉換為速度控制指令通過串口發送給底盤。這樣機器人上的其它節點就可以通過發布/cmd_vel主題來對底盤進行控制,通過訂閱/odom主題獲取底盤的里程計。關於底盤控制ROS驅動、底盤裡程計標定、底盤的debug,將在後面的章節中具體講解。


推薦閱讀:
相關文章