朱泳玨,蔣學(xué)程,方楚炎
(閩江學(xué)院 物理與電子信息工程學(xué)院,福建福州,350108)
隨著人工智能技術(shù)的進(jìn)步,智能小車(chē)在物流、工業(yè)和生活服務(wù)等領(lǐng)域得到了廣泛應(yīng)用。要實(shí)現(xiàn)小車(chē)智能化,需要實(shí)現(xiàn)建圖、定位、路徑規(guī)劃這三項(xiàng)任務(wù)。前兩項(xiàng)任務(wù)就是實(shí)現(xiàn)實(shí)時(shí)建圖以及實(shí)時(shí)定位,第三項(xiàng)任務(wù)就是實(shí)現(xiàn)路徑規(guī)劃,即根據(jù)已知的地圖規(guī)劃出一條到達(dá)目標(biāo)的最佳路徑[1]?,F(xiàn)如今的許多智能車(chē)價(jià)格昂貴、軟件代碼不開(kāi)源且通用性差,如果從頭到尾開(kāi)發(fā)一個(gè)機(jī)器人的軟硬件系統(tǒng)會(huì)造成開(kāi)發(fā)難度大和周期長(zhǎng)等問(wèn)題[2]。針對(duì)這些問(wèn)題,本課題基于ROS開(kāi)源機(jī)器人操作系統(tǒng)開(kāi)發(fā),設(shè)計(jì)一款具有通用性、結(jié)構(gòu)簡(jiǎn)單、經(jīng)濟(jì)性良好的智能小車(chē)系統(tǒng)。
本課題主要設(shè)計(jì)一款自導(dǎo)航垃圾識(shí)別智能移動(dòng)小車(chē)。硬件部分:上位機(jī)采用搭載ROS的jetson nano硬件平臺(tái),下位機(jī)采用STM32進(jìn)行運(yùn)動(dòng)控制,傳感器有激光雷達(dá)、IMU和攝像頭,如圖1所示。軟件部分:主要開(kāi)發(fā)自主導(dǎo)航和圖像識(shí)別兩部分,如圖2所示。
圖1 硬件部分框架
圖2 軟件部分框架
采用的通信協(xié)議:11字節(jié),[55 aa][size05][左輪速度2字節(jié)][右輪速度2字節(jié)][控制位07][效驗(yàn)位][0d 0a]。
數(shù)據(jù)傳輸選擇共用體的方法,通過(guò)使用共享內(nèi)存的方式,使傳輸數(shù)據(jù)的大小增加,圖3為具體原理圖。
圖3 數(shù)據(jù)傳輸原理圖
上位機(jī)部分,采用ROS的話題通信機(jī)制,訂閱/cmd_vel話題,獲取小車(chē)線速度和角速度,解算為左右輪速,將左右輪速通過(guò)串口向下位機(jī)發(fā)送。
下位機(jī)部分,通過(guò)STM32的USART串口,使能GPIOA9和GPIOA10,對(duì)串口的收發(fā)模式進(jìn)行設(shè)置,通過(guò)主程序中對(duì)其進(jìn)行調(diào)用,可以使兩者進(jìn)行通訊。由建立的通信協(xié)議打包成的庫(kù),通過(guò)中斷的方式將ROS下發(fā)的左輪和右輪數(shù)據(jù)從USART串口中接收進(jìn)來(lái),在保證波特率和延時(shí)一致時(shí),兩者之間就可以實(shí)現(xiàn)通信了。
cartographer是由谷歌開(kāi)發(fā)的實(shí)時(shí)室內(nèi)SLAM,cartographer是基于submap子圖構(gòu)建全局地圖的思想,能有效避免建圖過(guò)程中環(huán)境中有移動(dòng)物體帶來(lái)的干擾。cartographer采用了基于谷歌開(kāi)發(fā)的ceres非線性優(yōu)化的方案,cartographer的亮點(diǎn)在于代碼規(guī)范與工程化,非常適合商用和再開(kāi)發(fā)。并且cartographer支持多傳感器數(shù)據(jù)來(lái)建圖,支持建立二維地圖和三維地圖。所以,我們果斷采用cartographer。
下面我們將cartographer的代碼部署到自己的機(jī)器人平臺(tái)上。cartographer提供了一個(gè)基于Revo LDS的demo,與我們所使用的rplidar相近,可以參考該demo進(jìn)行實(shí)現(xiàn)。修改revo_lds.lua配置文件內(nèi)的參數(shù)即可。revo_lds.lua文件中的部分內(nèi)容如圖4所示。
圖4 revo_lds.lua文件
部分參數(shù)說(shuō)明:
參數(shù)map_frame:cartographer中使用的全局坐標(biāo)系。
參數(shù)tracking_frame:SLAM算法追蹤的ROS坐標(biāo)系。
參數(shù)published_frame:正在發(fā)布pose的坐標(biāo)系。
參數(shù)provide_odom_frame:是否需要cartographer內(nèi)部提供里程計(jì)。
參數(shù)use_odometry:是否使用里程計(jì)。
參數(shù)odom_frame:里程計(jì)坐標(biāo)系。
參數(shù)use_imu_data:是否使用IMU數(shù)據(jù)。
參數(shù)publish_frame_projected_to_2d:如果啟用,發(fā)布的位姿將被限制為純2D位姿。
定位其實(shí)就是計(jì)算出機(jī)器人自身在全局地圖上所處的位置。在SLAM中也需要定位,但是,SLAM中的定位僅僅用于導(dǎo)航開(kāi)始之前用于構(gòu)建出全局地圖。而當(dāng)前定位是用于導(dǎo)航過(guò)程中的,導(dǎo)航中機(jī)器人需要按照規(guī)劃好的路線移動(dòng),通過(guò)定位,我們就可以評(píng)估機(jī)器人的實(shí)際軌跡是否符合我們的預(yù)期。在ROS的導(dǎo)航功能包集navigation中提供了一個(gè)非常實(shí)用的功能包,該功能包就是amcl功能包,可以實(shí)現(xiàn)導(dǎo)航中的機(jī)器人定位。
AMCL是一種面向二維移動(dòng)機(jī)器人的概率定位系統(tǒng),它實(shí)現(xiàn)了自適應(yīng)蒙特卡洛定位,可以基于現(xiàn)有的地圖使用粒子濾波器計(jì)算出機(jī)器人所處位置。
導(dǎo)航的核心功能之一就是路徑規(guī)劃,在ROS的導(dǎo)航功能包集navigation提供了一個(gè) move_base功能包,可用于實(shí)現(xiàn)路徑規(guī)劃。
在世界坐標(biāo)中給定一個(gè)目標(biāo)位置,move_base功能包就可以根據(jù)這個(gè)位置,不斷地將速度信息通過(guò)/cmd_vel話題發(fā)布出來(lái),使機(jī)器人底盤(pán)不斷接近目標(biāo)位置,在移動(dòng)過(guò)程中也會(huì)不斷地反饋機(jī)器人自身的位姿信息和目標(biāo)位置的狀態(tài)信息。
使用move_base功能包,需要編寫(xiě)四個(gè)yaml配置文件:①costmap_common_params文件,該文件是move_base 在本地路徑規(guī)劃和全局路徑規(guī)劃時(shí)都要載入的通用參數(shù),其中包含了傳感器的信息、距離障礙物的安全距離、機(jī)器人的尺寸等。②base_local_planner_params文件,該文件設(shè)置了基本的本地規(guī)劃器參數(shù),設(shè)置了機(jī)器人的最大和最小速度,也設(shè)置了加速度的閾值。③local_costmap_params文件,該文件用于設(shè)置本地代價(jià)地圖的參數(shù)。④global_costmap_params文件,該文件用于設(shè)置全局代價(jià)地圖的參數(shù)。
要實(shí)現(xiàn)機(jī)器人自主移動(dòng)的SLAM建圖,需要將導(dǎo)航與SLAM建圖相結(jié)合。在使用cartographer進(jìn)行SLAM建圖的過(guò)程中本身就會(huì)實(shí)時(shí)發(fā)布地圖信息,所以只需要同時(shí)啟動(dòng)SLAM節(jié)點(diǎn)與move_base節(jié)點(diǎn)即可實(shí)現(xiàn)機(jī)器人的自主導(dǎo)航。
小車(chē)自主導(dǎo)航實(shí)際環(huán)境測(cè)試效果如圖5所示,可見(jiàn)在rviz中指定一個(gè)目標(biāo)位置后,小車(chē)可以避開(kāi)包括動(dòng)態(tài)障礙物在內(nèi)的各種障礙物,實(shí)現(xiàn)自主導(dǎo)航并建立二維柵格地圖。
圖5 小車(chē)自主導(dǎo)航實(shí)測(cè)效果
2020年6月,Ultralytics公司公開(kāi)發(fā)布了YOLOv5,主要有四種不同規(guī)模的版本。YOLOv5的大部分性能改進(jìn)來(lái)自PyTorch,而模型架構(gòu)仍然接近于YOLOv4。YOLOv5具有快速、精確且易于訓(xùn)練的優(yōu)點(diǎn)。YOLOv5核心思想是將整張圖作為網(wǎng)絡(luò)的輸入,在輸出層直接回歸出目標(biāo)的位置坐標(biāo)和類別,其特點(diǎn)是檢測(cè)精度高、檢測(cè)速度快,滿足實(shí)時(shí)監(jiān)測(cè)的需求[3]。
要實(shí)現(xiàn)圖像識(shí)別,第一步需要制作數(shù)據(jù)集。我們共制作了30張垃圾的圖片,對(duì)圖片進(jìn)行按順序命名,把這些圖片作為訓(xùn)練集。對(duì)這些圖片進(jìn)行手工標(biāo)注。標(biāo)注完成后,生成格式為.txt的文件。
第二步訓(xùn)練YOLOv5。創(chuàng)建garbage.yaml文件,該文件用于配置存放數(shù)據(jù)集路徑等參數(shù)。在yolov5s.yaml文件中。找到nc參數(shù),nc為類別數(shù)量,修改為16,我們指定垃圾種類有16個(gè)類別。打開(kāi)終端,執(zhí)行命令,開(kāi)始訓(xùn)練。訓(xùn)練完成后會(huì)生成對(duì)應(yīng)的.pt文件,該文件就是我們所需的權(quán)重文件。將該權(quán)重文件載入到Y(jié)OLOv5中,啟動(dòng)神經(jīng)網(wǎng)絡(luò)即可實(shí)現(xiàn)圖像識(shí)別,效果如圖6所示。
圖6 圖像識(shí)別效果
本文設(shè)計(jì)了基于ROS的自導(dǎo)航智能移動(dòng)小車(chē),采用cartographer算法建立二維柵格地圖,結(jié)合導(dǎo)航算法功能包實(shí)現(xiàn)自主導(dǎo)航,采用YOLOv5實(shí)現(xiàn)圖像識(shí)別。本課題為自主導(dǎo)航和服務(wù)型機(jī)器人提供了可行的解決思路和方案。未來(lái),智能移動(dòng)機(jī)器人將更多地運(yùn)用在物流、工業(yè)和生活服務(wù)等領(lǐng)域。