蔣恒新 閆瀟樂(lè) 王露
(重慶交通大學(xué)機(jī)電與車(chē)輛工程學(xué)院,重慶 400074)
早在1950 年就人們就已經(jīng)開(kāi)始制作各種各樣的機(jī)器人。直到現(xiàn)在機(jī)器人在人們的日常生活中出現(xiàn)頻率越來(lái)越高,機(jī)器人的智能化也推進(jìn)了工業(yè)化水平的快速提升,而移動(dòng)機(jī)器人的作用尤為突出。關(guān)于移動(dòng)機(jī)器人的研究,首先得考慮其移動(dòng)方式,其次是驅(qū)動(dòng)器的選擇,以使機(jī)器人達(dá)到良好的控制效果,再者必須考慮定位和路徑規(guī)劃。本文設(shè)計(jì)一種室內(nèi)移動(dòng)器人,選擇輪式移動(dòng),單片機(jī)作驅(qū)動(dòng)板控制其移動(dòng),有著快速,控制功能強(qiáng)等優(yōu)點(diǎn)。路徑規(guī)劃由ROS 這個(gè)開(kāi)源社區(qū)提供的move_base 功能包實(shí)現(xiàn)。文獻(xiàn)[1]運(yùn)用Kinect 攝像機(jī)采集環(huán)境信息融合IMU 提高機(jī)器人自主導(dǎo)航的精度。文獻(xiàn)[2]利用微軟公司的Speech SDK 語(yǔ)音技術(shù),設(shè)計(jì)了語(yǔ)音系統(tǒng)。
本文對(duì)自主導(dǎo)航、語(yǔ)音控制、機(jī)器人與智能家居互聯(lián)互通問(wèn)題進(jìn)行研究,并通過(guò)實(shí)踐驗(yàn)證了該研究的可行性。
考慮實(shí)現(xiàn)的簡(jiǎn)易性,及控制的精準(zhǔn)性,本文設(shè)計(jì)的移動(dòng)機(jī)器人采用兩輪差分移動(dòng)底盤(pán)。該底盤(pán)配備兩個(gè)減速比為1:56 帶編碼器的直流減速電機(jī)做驅(qū)動(dòng)輪,兩個(gè)萬(wàn)向輪做輔助輪,如圖1 所示。

圖1 底盤(pán)模型
根據(jù)寫(xiě)好的底盤(pán)通信協(xié)議,我們需要將里程計(jì)信息(X,Y軸坐標(biāo)、底盤(pán)線速度、底盤(pán)角速度和底盤(pán)航向角)經(jīng)串口通信告知ros 系統(tǒng)中的底盤(pán)控制節(jié)點(diǎn)(base_controller),因此需要進(jìn)行運(yùn)動(dòng)學(xué)分析。里程計(jì)的坐標(biāo)系是以機(jī)器人上電時(shí)刻車(chē)頭的朝向?yàn)閄 軸,Z 軸朝上,采用右手坐標(biāo)系。機(jī)器人在地圖中的坐標(biāo)可通過(guò)極短時(shí)間內(nèi)移動(dòng)的位置在X,Y 軸方向上的投影做積分獲得。
本文利用編碼器來(lái)推算軌跡,編碼器每一個(gè)脈沖對(duì)應(yīng)實(shí)際輪子行走的直線距離系數(shù)為

其中r 為驅(qū)動(dòng)輪半徑,sum_encoders 為電機(jī)輪轉(zhuǎn)一圈編碼器測(cè)得的脈沖數(shù)(編碼器分辨率)。單位變化時(shí)間內(nèi)編碼器值的增量為

當(dāng)前編碼器測(cè)得脈沖數(shù)減去上次編碼器測(cè)得脈沖數(shù)。則單位時(shí)間(一般為編碼器采樣周期)機(jī)器人移動(dòng)的距離為

底盤(pán)線速度角速度的確定,可根據(jù)底盤(pán)的物理模型推算出

通過(guò)固定采樣周期采取編碼器的值可推算出VL,VR左右驅(qū)動(dòng)輪的線速度,l 為圓形底盤(pán)半徑。
航向角的確定可依靠?jī)蓚€(gè)驅(qū)動(dòng)輪的編碼器來(lái)推算,兩輪編碼器單位時(shí)間內(nèi)的增量為inc_encoder_L,inc_encoder_R。極小一段時(shí)間內(nèi)內(nèi)兩輪出現(xiàn)的距離差為:

據(jù)圖2 所示,單位變化時(shí)間(極小的一段時(shí)間)內(nèi)

圖2 運(yùn)動(dòng)示意圖

可知該方法對(duì)編碼器的精度要求非常高,而兩驅(qū)動(dòng)輪在運(yùn)行過(guò)程中伴隨著漂移和打滑等現(xiàn)象,極大提高了誤差。因此我們采用具有高精度的陀螺儀測(cè)機(jī)器人的航向角,精度大大提高。
單片機(jī)要實(shí)現(xiàn)對(duì)底層傳感器的控制和信息采集,以及為上位機(jī)樹(shù)莓派傳輸里程計(jì)數(shù)據(jù)和傳感器數(shù)據(jù)。據(jù)圖3 可知,單片機(jī)主要開(kāi)發(fā)任務(wù)為:a.解析樹(shù)莓派速度位姿指令,實(shí)現(xiàn)對(duì)電機(jī)閉環(huán)控制。b.獲取陀螺儀,多傳感器和里程計(jì)數(shù)據(jù)。c.與樹(shù)莓派通信,完成數(shù)據(jù)交換。

圖3 系統(tǒng)軟件框架
3.2.1 slam 建圖。本文采用gmapping 功能包建圖,該功能包首先得訂閱含激光雷達(dá)深度信息的laser_scan 話題,同時(shí)接收底盤(pán)傳輸上來(lái)的里程計(jì)信息采用Rao-Blackwelllized粒子濾波算法,經(jīng)過(guò)調(diào)整參數(shù),輸出二維柵格地圖。
建圖過(guò)程:
a.啟動(dòng)機(jī)器人,遠(yuǎn)程登錄機(jī)器人
roslaunch base_controller base_controller // 啟動(dòng)底盤(pán)控制節(jié)點(diǎn)
rosrun telep_twist_keyboard telep_twist_keyboard.py //啟動(dòng)鍵盤(pán)控制節(jié)點(diǎn)
roslaunch mrobot_navigation gmapping.launch // 啟動(dòng)建圖節(jié)點(diǎn)
b.通過(guò)鍵盤(pán)控制在房間中行走,直到達(dá)到要求為止,過(guò)程如圖4 所示。

圖4 建圖過(guò)程
地圖構(gòu)建這一過(guò)程是根據(jù)傳感器的結(jié)果來(lái)構(gòu)建一張地圖或者是修正當(dāng)前地圖,同時(shí)將結(jié)果給定位算法作為先驗(yàn)地圖。gmapping 常用配置參數(shù)如表1 所示。

表1 gmapping 參數(shù)
建圖過(guò)程中非常重要的一環(huán)就是坐標(biāo)變換(后文稱tf 變換),建圖導(dǎo)航運(yùn)行時(shí)的tf 變換如圖5 所示。

圖5 TF 樹(shù)
對(duì)于gmapping 功能包建圖所必需的坐標(biāo)系就是map,odom,base_footprint,base_link,laser 坐標(biāo)系。map:地圖坐標(biāo)系,即機(jī)器人的世界坐標(biāo)系,由gmapping 功能包發(fā)布。Odom:里程計(jì)坐標(biāo)系,動(dòng)態(tài)坐標(biāo)系,里程計(jì)中機(jī)器人坐標(biāo)即odom 相對(duì)于map 的坐標(biāo),由底盤(pán)控制節(jié)點(diǎn)(base_controller)發(fā)布。base_link:機(jī)器人的本體坐標(biāo)系,base_footprint 為base_link 坐標(biāo)系在地面的投影,tf 變換由提前建立好的機(jī)器人的URDF模型發(fā)布。laser:激光雷達(dá)的坐標(biāo)系,由于相對(duì)于base_link 為靜態(tài)坐標(biāo)系,通常將其放在URDF 模型里一起建模。
3.2.2 自主導(dǎo)航。自主導(dǎo)航的整體框架為圖6 所示。在進(jìn)行自主導(dǎo)航時(shí),首先通過(guò)全局路徑規(guī)劃器在地圖中規(guī)劃處從機(jī)器人當(dāng)前坐標(biāo)到目標(biāo)點(diǎn)坐標(biāo)的最優(yōu)路徑,在行進(jìn)過(guò)程中考慮到機(jī)器人實(shí)際移動(dòng)與大腦下發(fā)的指令有一點(diǎn)偏差,此時(shí)本地路徑規(guī)劃器將全局路徑分成塊,在每個(gè)塊內(nèi)控制機(jī)器人的姿態(tài),使之在局部盡量符合全局路徑。本地規(guī)劃器的另一個(gè)功能是通過(guò)讀取雷達(dá)與物體的距離,若是該距離小于代價(jià)地圖設(shè)置的膨脹層半徑導(dǎo)致有潛在碰撞危險(xiǎn),例如人從機(jī)器人身邊走過(guò),本地實(shí)時(shí)規(guī)劃器將會(huì)搜索躲避和行進(jìn)的多條路徑,綜合各評(píng)價(jià)標(biāo)準(zhǔn)選取最優(yōu)路徑來(lái)避開(kāi)障礙物。圓形機(jī)器人宜采用DWA(Dynamic Window Approaches)算法,該算法主要是在速度空間中采樣多組速度,在模擬機(jī)器人的運(yùn)動(dòng)軌跡時(shí),考慮兩個(gè)相鄰時(shí)刻的的運(yùn)動(dòng)軌跡,將這段位移求和(直線)即可推算出接下來(lái)一段時(shí)間的軌跡。該算法通過(guò)比對(duì)推算出來(lái)的軌跡,測(cè)得最優(yōu)路徑所對(duì)應(yīng)的速度,發(fā)布Twist 消息類型到cmd_vel 換題來(lái)驅(qū)動(dòng)機(jī)器人運(yùn)動(dòng)。做好上述兩部分路徑規(guī)劃,機(jī)器人就可以根據(jù)路徑正常運(yùn)動(dòng)了。但有時(shí)候,機(jī)器人將會(huì)走到一些狹小空間或碰撞到障礙物,那它將會(huì)進(jìn)行恢復(fù)動(dòng)作,Recovery Behavior 就屬于異常動(dòng)作處理的方法,如實(shí)現(xiàn)旋轉(zhuǎn)的恢復(fù)行為,重新規(guī)劃全局路徑。若機(jī)器人不能規(guī)劃出到目標(biāo)點(diǎn)路徑,即終端報(bào)錯(cuò)停止動(dòng)作。

圖6 導(dǎo)航框架
另一個(gè)重要的點(diǎn)是機(jī)器人的定位問(wèn)題,自主導(dǎo)航時(shí)單獨(dú)依靠輪式里程計(jì)的定位精度難以達(dá)到要求,于是本文采用amcl(自適應(yīng)蒙特卡洛定位),蒙特卡洛定位法使用的是粒子濾波的方法來(lái)進(jìn)行定位的。此處粒子濾波通俗來(lái)說(shuō)就是通過(guò)里程計(jì)坐標(biāo)和amcl 功能包參數(shù)設(shè)定在地圖空間中框出一個(gè)范圍,然后均勻的撒一把粒子,然后通過(guò)獲取機(jī)器人的位姿來(lái)移動(dòng)粒子,如機(jī)器人移動(dòng)一步,粒子也移動(dòng)一步,不管該粒子位置是否正確。將每個(gè)粒子信息和激光雷達(dá)的點(diǎn)云信息代入選定的評(píng)估方程來(lái)推算該粒子的置信度,接著根據(jù)結(jié)果重新調(diào)整粒子的位置。經(jīng)過(guò)多次迭代,機(jī)器人的確切位置也被推算出來(lái)了。
語(yǔ)音控制首先得讓機(jī)器人能聽(tīng)懂,本文采用的是離線命令詞識(shí)別。命令詞識(shí)別,是根據(jù)所構(gòu)建的語(yǔ)法規(guī)則,將與之相似程度高的人的語(yǔ)言轉(zhuǎn)換為文本輸出。語(yǔ)法識(shí)別的結(jié)果值域只在語(yǔ)法文件所列出的規(guī)則里,故有很好的匹配率,另外,語(yǔ)法識(shí)別結(jié)果攜帶了結(jié)果的置信度,應(yīng)用可以根據(jù)置信分?jǐn)?shù),決定這個(gè)結(jié)果是否有效。例如構(gòu)建一個(gè)簡(jiǎn)單的語(yǔ)音撥號(hào)語(yǔ)法,可以定義如圖7 所示語(yǔ)法。

圖7 語(yǔ)法構(gòu)建
該語(yǔ)法支持識(shí)別引擎可以識(shí)別以下說(shuō)法:找一下張三;打電話給張三;找一下李四;打電話給李四。凡是說(shuō)出這個(gè)范圍中的任意一句,均可被識(shí)別引擎識(shí)別。如果指令不在上述范圍之內(nèi),識(shí)別引擎會(huì)拒絕識(shí)別。
在語(yǔ)音功能包下創(chuàng)建節(jié)點(diǎn)獲取命令詞識(shí)別結(jié)果,當(dāng)識(shí)別結(jié)果置信度超過(guò)閾值(這里設(shè)置的為18)時(shí),該節(jié)點(diǎn)進(jìn)入下一動(dòng)作。例如通過(guò)system 函數(shù)調(diào)用反饋語(yǔ)音文件和腳本。
物聯(lián)網(wǎng)技術(shù)的高速發(fā)展,讓物與物之間的距離不再遙遠(yuǎn),通過(guò)分布在不同地方的物聯(lián)網(wǎng)節(jié)點(diǎn),使得家居環(huán)境變得更加智能化。智能移動(dòng)機(jī)器人的出現(xiàn),使得控制載體更加豐富,本文設(shè)計(jì)的機(jī)器人可以進(jìn)行自主操作,如控制家居中得風(fēng)扇、插座、臺(tái)燈等IoT 設(shè)備。要實(shí)現(xiàn)這一功能,首先得學(xué)會(huì)miio 庫(kù)的使用,目前miio 庫(kù)支持的設(shè)備如圖8。

圖8 miio 支持設(shè)備
可見(jiàn)所支持的設(shè)備幾乎囊括了所有類型家用電器,符合我們的要求。由于ROS melodic 版本搭載在Ubuntu18.04 上,后續(xù)使用均在該Linux 系統(tǒng)上實(shí)現(xiàn)。使用pip3 install python-miio 命令安裝python-miio 庫(kù),需要知道上述設(shè)備都遵循了miio 協(xié)議,而python-miio 是封裝后的API。注意該庫(kù)文件需要在python3.5 以上版本才能安裝,而Ubuntu18.04 默認(rèn)python2.7,安裝之前需先安裝然后切換python 環(huán)境。在miio 文件夾下有諸多關(guān)于控制的.py 文件,在這些文件中繼承了Decice 類。使用之前需先獲得設(shè)備的ip 和token,用電腦去連接IoT 設(shè)備放出的wifi,在終端輸入miio discover 命令即可獲得ip 和token 值。接著運(yùn)用腳本程序即可控制IoT設(shè)備開(kāi)啟和關(guān)閉。
本文設(shè)計(jì)的移動(dòng)機(jī)器人實(shí)現(xiàn)安全監(jiān)測(cè)主要是通過(guò)采集溫度傳感器、二氧化碳傳感器數(shù)據(jù)和攝像頭實(shí)時(shí)識(shí)別家中情況。單片機(jī)采集溫度和二氧化碳傳感器數(shù)據(jù)傳輸?shù)酱竽X樹(shù)莓派,超過(guò)閾值測(cè)觸發(fā)報(bào)警裝置(通過(guò)4G 模塊發(fā)送緊急短信)。攝像頭主要進(jìn)行人體監(jiān)測(cè),實(shí)時(shí)識(shí)別家中老人是否摔倒等情況,若有則觸發(fā)報(bào)警裝置。
本文主要圍繞語(yǔ)音家庭服務(wù)機(jī)器人的功能實(shí)現(xiàn)進(jìn)行闡述。該機(jī)器人基于ROS 操作系統(tǒng),利用樹(shù)莓派,stm32 等高性能嵌入式開(kāi)發(fā)板做控制,寫(xiě)好單片機(jī)與樹(shù)莓派通信協(xié)議保證大腦和身體動(dòng)作一致。路徑規(guī)劃使用move_base 在gmapping建好的2D 柵格地圖中實(shí)現(xiàn)導(dǎo)航。語(yǔ)音控制部分,通過(guò)USB免聲卡驅(qū)動(dòng)連接喇叭反饋語(yǔ)音識(shí)別是否成功,匹配成功可自行調(diào)用寫(xiě)好的利用python-miio 庫(kù)的腳本文件控制IoT 設(shè)備,且可以進(jìn)行安全監(jiān)測(cè),可見(jiàn)該機(jī)器人的實(shí)用價(jià)值較高,有一定研究意義。