權(quán)鈺涵,張嘯,劉冬,3,羅睿,3,賀云,3
(1.沈陽航空航天大學(xué) 自動化學(xué)院,遼寧 沈陽 110136;2.中國科學(xué)院沈陽自動化研究所,遼寧 沈陽 110016;3.中國科學(xué)院機器人與智能制造創(chuàng)新研究院,遼寧 沈陽 110169)
隨著科技的發(fā)展,交通工具的變化日新月異。新型的交通工具給人們帶來了許多方便,但是同樣也伴隨著出現(xiàn)了許多棘手的問題,主要是操作的復(fù)雜性、體積的大小、安全性及續(xù)航時間,這幾點因素也是人們選擇時所關(guān)注的,其中安全性和便捷性是尤為重要的。
在校園內(nèi)、小區(qū)內(nèi)或者非機動車行駛道路上,平衡車被越來越多使用,但是對于初學(xué)者并不友好,容易摔倒和發(fā)生碰撞,尤其是在人員密集的地方,容易發(fā)生撞人事件。從專業(yè)的角度上來說,除了人為駕駛技術(shù)外,還因為平衡車平衡穩(wěn)定性比較差和不具有自主導(dǎo)航避障功能。
本文研究的是一種具有智能導(dǎo)航和建圖作用的兩輪直立平衡車,由以下四部分構(gòu)成:
(1)傳感器系統(tǒng):編碼器、單線激光雷達(dá)、MPU6050(加速度傳感器+陀螺儀傳感器)、藍(lán)牙HC-06。
(2)控制系統(tǒng):樹莓派。
(3)驅(qū)動系統(tǒng):Arduino UNO R3 主板、TB6612FNG 電機驅(qū)動模塊、電源。
(4)執(zhí)行機構(gòu):主體使用亞克力板拼裝,由兩個直流電機帶動差速車輪實現(xiàn)機器人行走。其中驅(qū)動系統(tǒng)和執(zhí)行機構(gòu)構(gòu)成機器人系統(tǒng)。
具體實現(xiàn)是“PC+嵌入式”,可以使用嵌入式系統(tǒng)樹莓派充當(dāng)機器人本體的控制系統(tǒng),而PC 則實現(xiàn)遠(yuǎn)程監(jiān)控,通過前者實現(xiàn)數(shù)據(jù)采集與直接的底盤控制,而后者則遠(yuǎn)程實現(xiàn)圖形顯示以及功能運算。其中建圖與導(dǎo)航采用的是激光SLAM—2D 單線束激光雷達(dá),具有環(huán)境感知和定位功能。
采用的算法有PID 控制算法(控制平衡)、卡爾曼濾波算法(數(shù)據(jù)融合)、Cartographer算法(構(gòu)建地圖)、map_server 算法(讀取和保存地圖)、Navigation 導(dǎo)航算法(定位AMCL、路徑規(guī)劃move_base、teb_local_planner 局部路徑規(guī)劃算法)、ros_arduino_bridge。
本文的重點研究目標(biāo)是導(dǎo)航,主要是建圖優(yōu)化和Teb 路徑規(guī)劃算法優(yōu)化,以及多傳感器數(shù)據(jù)融合所選取的濾波算法。最終的效果是在實現(xiàn)平衡直立的基礎(chǔ)上,可以進行前進、后退、轉(zhuǎn)彎、爬坡、原地轉(zhuǎn)圈和貨物托運等功能,在這一切可以穩(wěn)定實現(xiàn)的前提下,進行導(dǎo)航(建圖、地圖服務(wù)、定位和路徑規(guī)劃)和SLAM 建圖。在指定目標(biāo)點后,進行路徑規(guī)劃(全局、局部),然后根據(jù)選擇最優(yōu)路徑,途中會繞開障礙物,直至到達(dá)目標(biāo)點。還可以用手機APP 通過藍(lán)牙模塊控制機器人的運動狀態(tài),從而實現(xiàn)鍵盤控制SLAM 建圖。
通過具體實驗數(shù)據(jù),在算法方面,相比于互補濾波算法,采用卡爾曼濾波算法獲得的融合數(shù)據(jù)要好許多,最終使平衡車達(dá)到平衡的狀態(tài),相比于采用一二階互補濾波要更加穩(wěn)定。同時就調(diào)研結(jié)果而言,目前國外做的智能導(dǎo)航平衡車較多,但國內(nèi)很少,國內(nèi)比較多的是單獨的平衡車,不具有導(dǎo)航功能。主要原因是過去幾年雷達(dá)成本比較高,不像現(xiàn)在雷達(dá)成本越來越低;而且開發(fā)難度比較大,要兼顧平衡性和導(dǎo)航性能,同時得借助ROS 開發(fā),所需的知識儲備比較大。另外在國內(nèi)平衡車的用途主要是民用,在非機動車道上行駛,不易控制,安全系數(shù)低,但在加上建圖與導(dǎo)航功能之后,安全性大大提高,可以減少交通事故,有利于它的普及,除此之外,它還可以用于工廠內(nèi)貨物托運和巡邏,或者勘探一些人為無法接觸的區(qū)域和事物等。
就整個車體而言,主要由三部分組成:車體結(jié)構(gòu)、硬件部分及軟件部分。車體結(jié)構(gòu)主要是指車模,本車模主要由兩個直流驅(qū)動電機、兩個獨立車輪及固定底盤構(gòu)成[1]。硬件部分包括主控模塊樹莓派、激光雷達(dá)傳感器、驅(qū)動芯片Arduino 主板、六軸傳感器MPU6050、電機驅(qū)動芯片TB6612FNG、HC-06 藍(lán)牙傳感器和AB 相雙向霍爾磁敏編碼器等[2]。軟件部分主要由手機APP 和主控程序構(gòu)成,主要是借助Linux 系統(tǒng)在ROS 操作系統(tǒng)上開發(fā)的,用的開發(fā)軟件有Vscode、Arduino IDE、MATLAB。系統(tǒng)整體控制框圖如圖1 所示。
圖1 系統(tǒng)整體控制框圖
本系統(tǒng)主要有車模底盤、電源電路、電機驅(qū)動電路、MPU6050 六軸傳感器模塊、電機測速模塊電路、HC-06藍(lán)牙模塊電路、單線激光雷達(dá)傳感器模塊電路、Arduino驅(qū)動模塊電路和樹莓派主控電路。由于雷達(dá)模塊和樹莓派電路設(shè)計簡單,只需要連接端口就行,因此在繪制電路圖和制作PCB 的時候不需要考慮了[3]。具體如圖2所示。
圖2 硬件電路圖及PCB
MPU6050 模塊使用的工作電壓為3.3 V,通過IIC 接口與MCU 通信,該芯片在內(nèi)部整合了一套DMP 數(shù)據(jù)處理器,將四元數(shù)通過硬件解算出來,解決了姿態(tài)解算困難的問題[6],消除了陀螺儀和加速率傳感器之間的耦合,從而減小了給定的干擾和自身漂移帶來的影響,同時DMP 引擎還可以減少對復(fù)雜的融合信息、感測器同步化以及位置傳感器等方面的干擾[7]。所研究的兩輪自平衡車采用的是集成編碼器——AB 相增量式霍爾(磁)編碼器,本身具有上拉整形和不側(cè)漏的功能,且波形穩(wěn)定[8],相比于光電編碼器更加穩(wěn)定,對于平衡車的速度控制更加優(yōu)越,有利于實現(xiàn)自平衡,并且作為里程計編碼器,在建圖和定位時可以大大減小位姿誤差。同時,為了便于控制導(dǎo)航平衡車運動,采用了HC-06 藍(lán)牙模塊,然后通過客戶端藍(lán)牙APP 直接控制車模的基本動作。通過SPI 或IIC 通信方式實現(xiàn)藍(lán)牙與MCU 之間數(shù)據(jù)通信[8],基本功能傳輸流程如圖3 所示。
圖3 藍(lán)牙通信基本框圖
采用的雷達(dá)是思嵐的Mapper M2M1,如圖4 所示,自帶定位功能,有效測距是40 m,頻率是9 200 Hz,可進行每秒 10 次以上的地圖數(shù)據(jù)融合和最大10 萬平米地圖數(shù)據(jù)繪制。激光雷達(dá)每秒進行9 200 次的測距動作[9]。
圖4 SLAMTEC Mapper 框圖
為了方便控制,在樹莓派上也安裝ROS1,通過電腦進行遠(yuǎn)程監(jiān)控,實時觀測建圖導(dǎo)航信息,用鍵盤控制車模建圖??紤]到平衡車的特殊性,搭建車模的硬件需要注意其物理特性,主要是陀螺儀和雷達(dá)的安裝位置,為了車模平衡更加穩(wěn)定和避免SLAM 的建圖發(fā)生畸變,所以車模的重心不能太高,經(jīng)過測試和調(diào)節(jié),最終的安裝結(jié)構(gòu)如圖5 所示。
圖5 車模及導(dǎo)航示意圖
在程序設(shè)計上,涉及多傳感器數(shù)據(jù)的融合以及不同系統(tǒng)上程序的移植,具體軟件設(shè)計流程如圖6 所示。
圖6 程序流程圖
智能導(dǎo)航平衡車中,軟件的主要功能如下:
(1)所涉及傳感器信號的采集與處理;
(2)電機驅(qū)動模塊的PWM 輸出;
(3)小車基本動作的實現(xiàn),主要是平衡直立控制、速度控制和方向控制;
(4)SLAM 建圖與導(dǎo)航,確定初始位姿,設(shè)置目標(biāo)點,繞開障礙物,規(guī)劃最優(yōu)全局(局部)路徑;
(5)小車運行流程控制,包括各模塊程序初始化、車模的啟動與結(jié)束,以及車模狀態(tài)監(jiān)控;
(6)通過上位機和PC 端實時監(jiān)測車模的狀態(tài)以及在線調(diào)節(jié)相關(guān)參數(shù)。
卡爾曼濾波方程是一種綜合分析利用線性系統(tǒng)的狀態(tài)方程,通過觀察到的系統(tǒng)在其輸入和給定時間內(nèi)的各種狀態(tài),對系統(tǒng)在其輸出和給定時間內(nèi)的狀態(tài)信號進行了最優(yōu)估計的一種算法。由于這些觀察到的數(shù)據(jù)中涉及系統(tǒng)運行過程中的各種噪聲和其他干擾等因素,因此這種最優(yōu)估計方程可以被簡單地看作是一種濾波。主要指的是預(yù)測和濾波兩個過程,可設(shè)離散差分和觀測方程為[10]:
其中,x(k)是n維狀態(tài)向量;u(k)是m維控制向量;z(k)是l 維狀態(tài)觀測向量;Φ(k+1,k)是n×n的轉(zhuǎn)移矩 陣;G(k+1,k)是n×m維矩陣;Γ(k+1,k)是n×p的噪聲驅(qū)動矩陣;H(k)是l×n的量測矩陣,v(k)為量測噪聲序列。
MPU6050 六軸傳感器的輸出方式為慣性傳感器的模擬量,利用Arduino UNO 自帶的ADC 進行數(shù)模轉(zhuǎn)換,從而獲得傳感器的輸出電壓大小,而且要對加速度和陀螺儀傳感器的輸出進行變換,使卡爾曼濾波器接收到的是角度和角速度變化量[11],其轉(zhuǎn)換公式如式(3)所示:
式中,W為陀螺儀測得的角速度,Vout、Voffset和Vsen分別為陀螺儀的輸出電壓、靜態(tài)輸出電壓和靈敏度,K表示放大電路的放大系數(shù)[11]。
檢測角度和加速計輸出電壓轉(zhuǎn)換公式如下:
其中,A為加速計檢測到的重力加速度,Uout為加速計的輸出電壓,Uoffset為加速計的平衡狀態(tài)輸出電壓,Usen為加速計靈敏度[11]。
事實上,車模在高速旋轉(zhuǎn)運動時本身就可能會自動產(chǎn)生一定程度晃動的旋轉(zhuǎn)時間和運動加速度,這在研究過程中就是自身的干擾信號,它會疊加在輸出信號上,無法精確地反饋車模的傾斜角度,具體如圖7 所示。
圖7 小車運動引起的的加速度信號波動
前面已經(jīng)說到車模的控制任務(wù)可以分為三部分,第一部分是控制小車平衡,第二部分是控制小車速度,第三部分是控制小車方向,通過一系列的分析之后,得出車模在直立行走過程中的直立、速度及方向控制都使用了PD 控制,通過對這三種算法的輸出結(jié)果疊加來完成電機加速的控制,最終使小車達(dá)到平衡狀態(tài),故而PD 調(diào)節(jié)要非常平滑緩慢,不能出現(xiàn)跳躍性調(diào)節(jié)。
在小車運動能過程中,由于車輪與地面之間存在靜摩擦,電機電樞得電,此時電機轉(zhuǎn)子并沒有發(fā)生相對轉(zhuǎn)動,因此要根據(jù)實際情況添加一個死區(qū)常量用來提高系統(tǒng)的凈穩(wěn)定性,如圖8 所示。
圖8 電機死區(qū)補償
Cartographyer 算法是由Google 所發(fā)布的一種基于地圖優(yōu)化技術(shù)的SLAM 算法,它的結(jié)構(gòu)主要由Local SLAM 和Global SLAM 兩個部分所組成。Local SLAM是用里程計和IMU 數(shù)據(jù)通過軌跡計算,得出小車的原始位姿估計值ξ=(ξx,ξy,ξθ),ξx,ξy表示位置,ξθ表示姿態(tài)角,作為初始值將于雷達(dá)數(shù)據(jù)進行匹配,同時對位姿估計器的值進行更新,在雷達(dá)的一幀幀數(shù)據(jù)經(jīng)過運動濾波后,再通過疊加,形成子圖submap[13]。而在Global SLAM 部分,進行回環(huán)檢測和后端優(yōu)化,減小地圖累計誤差,最終形成一張完整可用于導(dǎo)航的地圖。
在智能導(dǎo)航平衡車中,采用Cartographyer 可以實現(xiàn)大場景高精度(5 cm)的2D 柵格地圖。在前端匹配環(huán)節(jié),每得到一次雷達(dá) scan 數(shù)據(jù)后,便與時間戳鄰近的submap 進行掃描匹配,插入到匹配度高的最優(yōu)位置上,直至最后沒有新的scan 插入,此時一個submap 便構(gòu)成,以此類推到最后一個submap[13]。由一個起點和數(shù)個終點構(gòu)成一個激光點云圖,其中每一個scan 為激光點云圖,將點云集合用H表示,其表達(dá)形式為H={hk}k=1,2,..,k,hk∈R2。
當(dāng)獲得新的scan時,要插入到submap中,通過轉(zhuǎn)換系數(shù)Tξ進行坐標(biāo)轉(zhuǎn)換,轉(zhuǎn)換公式如下:
在scan 插入submap 之前,需要利用ceres 庫的掃描匹配器對每個狀態(tài)的位姿進行優(yōu)化,將求解scan 位姿問題轉(zhuǎn)化為求解非線性最小二乘方程的解[14]。隨著生成的submap 數(shù)目越多,掃描匹配過程中的累計誤差也在逐漸增大,因此需要采取稀疏姿態(tài)調(diào)整方法優(yōu)化scan 與submap 的位姿,也就是閉 環(huán)檢測,將匹配程度好的位姿加入到優(yōu)化當(dāng)中[16]。掃描匹配用的方法是深度優(yōu)先的分支定界加速算法,每當(dāng)新的scan 出現(xiàn)時,在附近窗口搜索最優(yōu)匹配幀,若此幀符合要求,便形成一個閉環(huán),這個過程中建立了一個搜索窗口,把整個解空間當(dāng)作一棵樹來表示,其根節(jié)點代表搜索窗口,樹中的每一個節(jié)點的子節(jié)點都是對該節(jié)點所代表的搜索空間的一個劃分,每個葉子節(jié)點對應(yīng)一個解,整個搜索過程的基本思想就是不斷地分割搜索空間,稱為分支,再為新產(chǎn)生的分支葉子節(jié)點給定一個適當(dāng)?shù)纳辖纾Q為定界,若子節(jié)點中有定界超過了最優(yōu)解的值,將對該節(jié)點進行舍棄[17]。
運用此方法能夠高效地確定激光點云與子圖的匹配度,并估計出車模的位姿。在了解了建圖原理之后,配置revo_lds.lua 和demo_revo_lds.launch 文件,配置前需要通過rqt 看tf tree,然后在launch 文件里修改lua 文件的名字和topic,lua 文件需要配置的是:map_frame=“map”(地圖坐標(biāo)系);tracking_frame=“base_footprint”(將所有傳感器數(shù)據(jù)轉(zhuǎn)換到該坐標(biāo)系下);published_frame=“odom”(tf: map->odom),其他一些參數(shù)根據(jù)實際調(diào)試和硬件屬性配置。
對于建圖場景比較復(fù)雜的,進行必要的特征點提取,只保留一部分有效雷達(dá)數(shù)據(jù),去除無效點,具體效果如圖9 所示。
圖9 有效特征點提取前后對比圖
本車模作為實驗?zāi)P停诵哪康氖瞧胶廛嚨膶?dǎo)航技術(shù)驗證,為此在室內(nèi)和走廊進行模擬驗證。此過程中,活動的實驗人員等同于動態(tài)障礙物,桌椅等物品就是靜態(tài)障礙物,同時也設(shè)置了傾斜角度為15°~30°的斜坡,負(fù)載為10 kg,路面相對平坦一點,在此約束場景下,進行車模測試。
就導(dǎo)航模塊而言,關(guān)鍵技術(shù)有5 點,分別是全局地圖、自身定位、路徑規(guī)劃、運動控制和環(huán)境感知,主要介紹一下自身定位和路徑規(guī)劃。由于Cartographyer 本身就有重定位功能,并且選用的雷達(dá)傳感器Mapper 也有定位功能,因此此處不再運用AMCL 定位。至于路徑規(guī)劃,通俗來說,就是從一個點到另一個指定目標(biāo)點的過程,在這個過程中,導(dǎo)航平衡車根據(jù)目標(biāo)位置計算最優(yōu)路線,途中會遇到靜態(tài)和動態(tài)的障礙物,然后繞開障礙物,重新規(guī)劃路線,直至到達(dá)發(fā)布的目標(biāo)位姿。規(guī)劃過程中,有全局路徑規(guī)劃和局部路徑規(guī)劃,使用Dijkstra 或A*算法進行全局路徑規(guī)劃,在本地路徑規(guī)劃上,move_base 默認(rèn)調(diào)用的是Dwa,經(jīng)過與Teb 局部路徑規(guī)劃對比,選用后者,主要是因為它的最優(yōu)目標(biāo)是規(guī)劃最優(yōu)時間,Teb 算法將避障硬約束為軟約束,以尋找代價最小的軌跡解決方案。
由于實際環(huán)境是變化的,障礙物的出現(xiàn)是隨機的,因而對于導(dǎo)航而言靜態(tài)地圖并不適合。為了在導(dǎo)航過程中實時獲取障礙物數(shù)據(jù),在靜態(tài)地圖的基礎(chǔ)上添加膨脹區(qū)數(shù)據(jù)。主要是由全局代價地圖和本地代價地圖構(gòu)成,前者用于全局路徑規(guī)劃,后者用于本地路徑規(guī)劃。需要配置的yaml 文件有四個,分別是全局和本地路徑規(guī)劃調(diào)用的通用參數(shù)、全局代價參數(shù)設(shè)置、本地代價參數(shù)設(shè)置和基本的局部規(guī)劃器參數(shù)配置。其中膨脹半徑inflation_radius 和代價比例系數(shù)cost_scaling_factor 給全局和本地各單獨設(shè)置,以便于遠(yuǎn)離障礙物,避免進入膨脹區(qū)域而陷入假死狀態(tài),Teb 中的是否考慮動態(tài)障礙物設(shè)為true,動態(tài)障礙物膨脹距離設(shè)為0.45 m,動態(tài)障礙物權(quán)重設(shè)為10 以及膨脹帶權(quán)重設(shè)為0.2,以上是車模實際測試參數(shù),個別與仿真不一致。
測試過程中,可實現(xiàn)任意角度原地轉(zhuǎn)彎,但在遇到突然出現(xiàn)的行人時,車模在停止的過程中會出現(xiàn)慣性過沖的現(xiàn)象,易造成車模傾倒,經(jīng)分析,主要問題是雷達(dá)橫向檢測范圍太小和車模的PID 參數(shù)欠優(yōu),未能及時檢測到動態(tài)障礙物,為此增大了雷達(dá)的掃描角度,由原來的-30°~30°改變?yōu)?60°~60°,PID 參數(shù)整定見表1。
表1 三個閉環(huán)控制環(huán)節(jié)PID 參數(shù)
基于前面的理論分析,可以直觀地從圖10 中看出,對里程計編碼器和六軸傳感器采集到的數(shù)據(jù)采用卡爾曼濾波器進行數(shù)據(jù)融合,獲得的效果相比于一二階互補濾波算法要好很多,極大地減小了干擾,有利于車模平衡。具體對比如圖10 所示(曲線1 指原始角度波形;曲線2 指經(jīng)低階互補濾波后的角度輸出曲線;曲線3 指經(jīng)卡爾曼濾波后的角度輸出波形)。
圖10 角度輸出曲線
在車模運行過程中,經(jīng)測試,當(dāng)傾斜角度超過18°時(設(shè)定為15°),車模重心偏移嚴(yán)重,將無法保持直立,濾波也就不再適用,這也符合實際情況,超過臨界值將無法自主調(diào)整。
在對數(shù)據(jù)進行濾波融合處理之后,便是讓車模直立起來,并能穩(wěn)定地進行速度和方向控制,為此需要PID參數(shù)調(diào)節(jié)。為了更精準(zhǔn)地整定,要充分理解PID 控制算法的基本原理和每個參數(shù)在整個控制系統(tǒng)中的作用。調(diào)試的時候直接在Linux 下面的vscode 編輯器修改參數(shù),采用快速調(diào)節(jié)法(先調(diào)P,后調(diào)D,逐步逼近臨界值,最后對臨界值×0.8),三環(huán)調(diào)節(jié)順序是先調(diào)角度,再調(diào)速度,最后調(diào)方向。
優(yōu)化前后的效果對比如圖11 所示。運用Cartographer 算法構(gòu)建地圖時,經(jīng)過后端優(yōu)化后,去除了畸變疊圖,大大提高了地圖精度,獲得的圖與實際環(huán)境更加吻合、輪廓更加清晰。同時也得出結(jié)論,當(dāng)建圖效果不太理想并且計算量過大時,調(diào)節(jié)ceres 的匹配權(quán)重,將地圖權(quán)重增大,平移旋轉(zhuǎn)權(quán)重減小。
圖11 優(yōu)化算法前后的實際建圖效果
在路徑規(guī)劃上,采用move_base 里面的teb_local_planner 算法,加入了全局和本地代價地圖,為障礙物設(shè)置了膨脹層,在rviz 里面發(fā)布了目標(biāo)點之后,能夠繞開障礙物快速尋求最短路徑,獲得最優(yōu)時間,同時加入了Cartographer 的重定位功能,使得智能導(dǎo)航平衡車走過的路徑都在柵格地圖上顯示出來。值得注意的是實際測試中車模有時會陷入假死狀態(tài),根據(jù)代價比例系數(shù)越小,代價值越大,為此在全局代價參數(shù)yaml 文件中設(shè)inflation_radius=0.5、cost_scaling_factor=8.0,全局代價參數(shù)yaml 文件中設(shè)inflation_radius=0.3、cost_scaling_factor=4.0,從而解決了假死這一問題,效果如圖12 所示。
圖12 優(yōu)化后導(dǎo)航示意圖
為了提高平衡車的安全性、靈活性和智能化,通過雷達(dá)傳感器、AB 相增量式霍爾(磁)編碼器輪式里程計和六軸傳感器MPU6050 來獲取車模的姿態(tài),利用卡爾曼濾波器進行數(shù)據(jù)融合,運用了Cartographer 算法的建圖和純定位功能,加入了Teb 路徑規(guī)劃算法、Cartographer 和路徑規(guī)劃算法融合以上幾種傳感器的數(shù)據(jù)信息,實現(xiàn)了平衡車的自主建圖和導(dǎo)航避障功能。在仿真沒有任何問題的條件下,搭建了實物實驗平臺,在實際環(huán)境中進行了測試,測試結(jié)果達(dá)到了預(yù)期效果。對于建圖過程中出現(xiàn)的畸變疊圖情況,進行了優(yōu)化,消除了疊圖,采用的導(dǎo)航算法可以快速繞開障礙物到達(dá)目標(biāo)點,完全可以實現(xiàn)無人駕駛。相信在不久的將來,雷達(dá)的成本會越來越低,融合SLAM 技術(shù)的智能導(dǎo)航平衡車將發(fā)展為新的輕盈便捷的代步工具,那時肯定會受到廣大客戶的青睞。