智慧校園:校史館也瘋狂
在科技狂飆的今天,連校史館都卷起來了!我們給校史館配了個“社牛”機(jī)器人:
- 主動迎賓:機(jī)器人通過視覺識別,主動上前打招呼,告別“自助式”參觀。
- 語音互動:邊帶路邊講解,校史知識隨問隨答,參觀體驗更生動。
- 智能導(dǎo)航:運用SLAM技術(shù)靈活避障,規(guī)劃最佳路線,確保游客不錯過任何亮點。
這一創(chuàng)新讓校史館從靜態(tài)展覽變身智能互動空間,有望能提升參觀體驗——跑得賊穩(wěn)團(tuán)隊
一、特色與創(chuàng)新
本項目通過前沿技術(shù)融合,打造了一款智能校史館向?qū)C(jī)器人,具備以下核心創(chuàng)新點:
1.1 會聊天的歷史通
- 聽得清:采用六路環(huán)形麥克風(fēng)+R818降噪板,在嘈雜環(huán)境中也能精準(zhǔn)捕捉提問,像朋友聊天一樣自然。
- 答得妙:接入語音模塊和大語言模型,不僅能指路,還能化身"校史百事通",隨時解答"學(xué)校第一任校長是誰?"這類刁鉆問題。
- 主動撩:告別傳統(tǒng)屏幕"你問我答"模式,機(jī)器人會主動迎賓,邊走邊講解,讓參觀像逛博物館有私人導(dǎo)覽。
1.2 自帶導(dǎo)航老司機(jī)
- 認(rèn)路準(zhǔn):通過激光雷達(dá)+深度相機(jī)融合SLAM技術(shù),5分鐘就能"摸清"整個校史館布局,自動生成最佳參觀路線。
- 躲人穩(wěn):遇到突然出現(xiàn)的參觀人群,能像老司機(jī)般靈活繞行,絕不會"撞車"尬場。
- 解說忙:帶路時還會貼心地提醒:"左側(cè)展柜是1958年建校文物,要停下來看看嗎?"
1.3 高定版鋼鐵俠戰(zhàn)衣
- 為場景而生:自主設(shè)計的車體兼顧靈活性與穩(wěn)定性,能在狹窄展區(qū)間自如轉(zhuǎn)身,底盤防撞設(shè)計避免磕碰文物。
- 模塊化升級:像樂高一樣可快速更換電池、傳感器等模塊,適應(yīng)未來功能擴(kuò)展需求。
二、功能設(shè)計
2.1 總體設(shè)計
為提升校史館的智能化服務(wù),本項目設(shè)計了"小莫"智能導(dǎo)覽機(jī)器人,采用模塊化架構(gòu),實現(xiàn)精準(zhǔn)交互與自主導(dǎo)航。
核心設(shè)計思路:
- 用戶友好交互:訪客通過語音或觸摸屏與機(jī)器人互動,指令傳遞至中央控制系統(tǒng)。
- 智能決策中樞:控制模塊整合SLAM定位、AI語音識別、環(huán)境感知數(shù)據(jù),實時生成最優(yōu)導(dǎo)覽方案。
- 精準(zhǔn)執(zhí)行反饋:導(dǎo)航模塊驅(qū)動機(jī)器人移動,語音系統(tǒng)同步講解,形成"問-答-導(dǎo)"閉環(huán)體驗。
技術(shù)亮點:
? 聽得懂:抗噪麥克風(fēng)+AI語音模型,準(zhǔn)確識別訪客需求
? 找得準(zhǔn):激光雷達(dá)SLAM實時建圖,動態(tài)規(guī)劃避障路徑
? 講得活:大語言模型賦能,校史講解媲美專業(yè)導(dǎo)游

2.2功能設(shè)計
2.21硬件升級:打造更靈敏的機(jī)器人
原廠配置的語音和視覺模塊存在明顯不足:
- 原有問題:麥克風(fēng)拾音模糊、攝像頭成像質(zhì)量差,僅支持4個基礎(chǔ)指令
- 改進(jìn)方案:
- 聽覺系統(tǒng):采用6路環(huán)形麥克風(fēng)陣列配合R818專業(yè)降噪板,實現(xiàn)會議級降噪效果
- 視覺系統(tǒng):升級為索尼IMX219傳感器,配備120°廣角鏡頭,支持高清拍攝
2.22模塊化系統(tǒng)架構(gòu)
功能模塊 | 核心組件 | 主要功能 | 性能參數(shù) |
感知系統(tǒng) | 激光雷達(dá)+深度相機(jī) | 環(huán)境探測與識別 | 10米探測范圍,±2cm精度 |
控制系統(tǒng) | Jetson Nano+RDK X3 | 數(shù)據(jù)處理與決策 | 支持實時建圖與導(dǎo)航 |
驅(qū)動系統(tǒng) | 精密伺服電機(jī) | 運動控制 | 0.8m/s移動速度 |
交互系統(tǒng) | 語音處理引擎 | 語音識別與合成 | 200ms響應(yīng)時間 |
2.24智能工作流程
- 環(huán)境感知:通過多傳感器采集周圍環(huán)境數(shù)據(jù)
- 數(shù)據(jù)處理:Jetson Nano處理導(dǎo)航數(shù)據(jù),RDK X3運行交互模型
- 任務(wù)執(zhí)行:根據(jù)分析結(jié)果執(zhí)行導(dǎo)覽或解答任務(wù)
2.25 系統(tǒng)接口設(shè)計
三、系統(tǒng)實現(xiàn)
3.1硬件實現(xiàn)
首先對語音模塊進(jìn)行集成,通過PLA外殼和螺柱螺栓實現(xiàn)了穩(wěn)固的固定。然后使用USB連接麥克風(fēng)和免驅(qū)聲卡。
3.2軟件實現(xiàn)
3.2.1環(huán)境感知
機(jī)器人的環(huán)境感知傳感器為雷達(dá)與深度相機(jī),下面介紹如何基于這兩個傳感器實現(xiàn)環(huán)境感知的。
傳感器包括雷達(dá)和深度相機(jī)。首先,關(guān)于雷達(dá)部分,可以通過克隆GitHub上的官方雷達(dá)ydlidar_ros_driver包來實現(xiàn):
(git clone
https://github.com/YDLIDAR/ydlidar_ros_driver.git/ydlidar_ws/src/ydlidar_ros_driver)
接著cd到所在的目錄下,通過catkin_make構(gòu)建ydlidar_ros_driver包,下一步配置包環(huán)境,使用如下指令添加永久工作區(qū)環(huán)境變量:
($echo
"source ~/ydlidar_ws/devel/setup.bash" >> ~/.bashrc)
($source ~/.bashrc)
最后,如圖4.1將lidar_view.launch文件中的lidar.launch改為X2.launch小莫使用的雷達(dá)型號為X2就完成配置了。

隨后打開rviz工具,查看雷達(dá)掃描效果,命令如下:
(roslaunch limo_bringup
lidar_rviz launch)
默認(rèn)情況下,雷達(dá)的掃描范圍是360度,但可以根據(jù)需要在launch文件中修改參數(shù)以改變雷達(dá)的掃描范圍。對于小莫使用的X2雷達(dá),在ROS內(nèi)遵循右手定則,角度范圍為[-180, 180]。


至此,機(jī)器人已經(jīng)完成了對兩個環(huán)境感知傳感器的適配,這意味著它現(xiàn)在能夠全面感知并理解周圍環(huán)境的情況。
3.2.2底盤驅(qū)動
在實現(xiàn)環(huán)境感知模塊之后,系統(tǒng)需要將感知到的環(huán)境信息用于實際的運動控制,因此底盤驅(qū)動模塊的設(shè)計與實現(xiàn)顯得尤為重要。接下來,我們將介紹底盤驅(qū)動模塊的具體實現(xiàn)方法。
移動底盤需要通過程序驅(qū)動才能實現(xiàn)移動機(jī)器人的運動,移動機(jī)器人的底盤驅(qū)動程序分為兩個版本,分別為C++版本和Python版本,兩個版本都可以控制移動機(jī)器人運動。
Python版本的代碼僅有三個?件組成驅(qū)動程序,init.py的作?為申明需要使用的?件limomsg.py的作?為驅(qū)動成所需要的消息,limo.py是主程序,它的作用是驅(qū)動移動機(jī)器人。
(函數(shù)名稱)() | (函數(shù)作)(?)() |
(EnableCommand()) | (控制使能)() |
(SetMotionCommand()) | (設(shè)置移動命令)() |
(GetLinearVelocity()) | (獲取線速度)() |
(GetAngularVelocity()) | (獲取)(?)(速度)() |
(GetSteeringAngle()) | (獲取內(nèi)轉(zhuǎn))(??)(度)() |
(GetLateralVelocity()) | (獲取橫移速度)() |
(GetControlMode()) | (獲取控制模式)() |
(GetBatteryVoltage()) | (獲取電池電量)() |
(GetErrorCode()) | (獲取錯誤代碼)() |
(GetRightWheelOdem()) | (獲取左輪)(?)(程計)() |
(GetLeftWheelOdem()) | (獲取右輪)(?)(程計)() |
(GetIMUAccelData()) | (獲取)(IMU)(的加速度)() |
(GetIMUGyroData()) | (獲取陀螺儀的數(shù)據(jù))() |
(GetIMUYawData()) | (獲取)(IMU)(的航向)(?)() |
(GetIMUPichData()) | (獲取俯仰)(?)() |
(GetIMURollData()) | (獲取橫滾)(?)() |
3.2.3動態(tài)避障
底盤驅(qū)動為車輛提供了動力,而避障則是確保車輛在運動過程中能夠安全地避開障礙物,兩者需要密切合作,因此該機(jī)器人使用了兩種動態(tài)避障算法進(jìn)行雷達(dá)避障。
首先用到的庫是teb_local_planner,由move_base包進(jìn)行調(diào)用
(sudo
apt-get install ros-kinetic-teb-local-planner)
(sudo
apt-get install ros-kinetic-teb-local-planner-tutorials)

在實際使用中,避障能力受到參數(shù)調(diào)整的影響極大,稍有不慎便可能導(dǎo)致撞上障礙物。為此,我們總結(jié)了一套僅適用于小莫的TEB調(diào)參方法及適配于室內(nèi)避障的范圍。
我們定義避障效果的好壞是通過同等障礙物距離下LIMO響應(yīng)的快慢來直觀感受的,參數(shù)是在rqt_reconfigure界面里調(diào)整的。經(jīng)過測試發(fā)現(xiàn),關(guān)閉多路徑并行規(guī)劃和使用Costmap Converter可以顯著提升避障效果。降低迭代次數(shù)no_inner/outer_iterations和減小局部成本地圖的大小也能顯著改善性能。相較之下,降低max_lookahead_distance的效果較為一般,而增大規(guī)劃周期和控制周期則會影響整體效果。使用單點footprint并結(jié)合最小障礙物距離約束,對效果的提升不太顯著,并且可能影響整體性能。

至此,TEB算法的配置已經(jīng)完成,但由于TEB算法容易陷入局部最優(yōu)問題,且在處理密集障礙物或狹窄空間時可能會產(chǎn)生不穩(wěn)定的路徑規(guī)劃結(jié)果,因此需要引入第二個算法——DWA(動態(tài)窗口法)算法進(jìn)行補(bǔ)充。通過這種方法,DWA算法能夠動態(tài)調(diào)整機(jī)器人的路徑規(guī)劃,避免局部最優(yōu)問題,并在密集障礙物或狹窄空間中提供更穩(wěn)定的路徑規(guī)劃結(jié)果,從而補(bǔ)足了TEB算法的不足。

3.2.4 地圖構(gòu)建
在車輛在復(fù)雜環(huán)境中執(zhí)行動態(tài)避障的過程中,實時感知到的障礙物信息不僅為安全行駛提供了保障,接下來就是建圖步驟。
SLAM建圖是小莫機(jī)器人進(jìn)行地圖構(gòu)建的核心原理,指的是即時定位和建圖,SLAM建圖主要是有以下三個過程:
一是預(yù)處理,對雷達(dá)點云數(shù)據(jù)進(jìn)行處理,包括清除異常值,以確保數(shù)據(jù)質(zhì)量。這個過程有助于提高雷達(dá)測量的準(zhǔn)確性和可靠性。簡而言之,點云數(shù)據(jù)的優(yōu)化是確保雷達(dá)捕獲的環(huán)境信息準(zhǔn)確無誤的關(guān)鍵步驟。以激光作為信號源,由激光器發(fā)射出的脈沖激光,打到周圍障礙物上,引起散射。
一部分光波會反射到激光雷達(dá)的接收器上,再根據(jù)激光測距原理計算,就可以得到從激光雷達(dá)到目標(biāo)點的距離。關(guān)于點云:通俗來說,激光雷達(dá)獲取的周圍環(huán)境信息,被稱為點云。它是能反映機(jī)器人所在環(huán)境中“眼睛”能看到的一個部分。雷達(dá)點云數(shù)據(jù)呈現(xiàn)了物體的精確位置,包括角度和距離,形成了分布式的空間信息集合。這些數(shù)據(jù)為機(jī)器人或系統(tǒng)提供了關(guān)于其周圍環(huán)境的詳細(xì)三維視圖。
二是匹配,在當(dāng)前環(huán)境中,將點云數(shù)據(jù)與已有地圖進(jìn)行對照,以定位相應(yīng)位置。激光SLAM系統(tǒng)通過比較不同時間點的點云數(shù)據(jù),來計算激光雷達(dá)的移動距離和方向變化,實現(xiàn)機(jī)器人的自我定位。
三是地圖更新,新一輪激光雷達(dá)數(shù)據(jù)會被整合進(jìn)原始地圖,以此更新地圖。
SLAM的過程已經(jīng)詳細(xì)闡釋,下面將通過三種算法實現(xiàn)SLAM建圖:
一是gmapping,通過以下命令將gmapping安裝在小莫上,創(chuàng)建相關(guān)launch文件即可使用。
sudo apt-get install ros-melodic-gmapping
sudo apt-get install ros-melodic-teleop_twist_keyboard
sudo apt install ros-melodic-map-server
在gmapping功能包中,slam_gmapping節(jié)點扮演著核心角色,它處理多種話題和服務(wù)來實現(xiàn)SLAM。具體來說,它訂閱tf話題以獲取雷達(dá)和里程計之間的坐標(biāo)轉(zhuǎn)換信息,以及/scan話題來接收雷達(dá)掃描數(shù)據(jù)。此外,它發(fā)布map_metadata和map話題,分別提供地圖的元數(shù)據(jù)和柵格數(shù)據(jù),這些數(shù)據(jù)通常在rviz中可視化展示。節(jié)點還發(fā)布~entropy話題,用于估計機(jī)器人姿態(tài)的不確定性。同時,它提供dynamic_map服務(wù),以供請求地圖數(shù)據(jù)之用。
二是Cartographer,通過以下命令將Cartographe安裝在小莫上,創(chuàng)建相關(guān)launch文件即可使用:
sudo apt install ros-foxy-cartographer
sudo apt install ros-foxy-cartographer-ros
在Cartographer調(diào)參測試發(fā)現(xiàn),概率通過公式離散化的uint8數(shù)值小于127時,空閑概率更大;數(shù)值大于127時,占用概率更大。
我們看到,層數(shù)越高,圖像變得越來越粗糙,黑色部分明顯膨脹,因此,我們選定滑動窗口為width=1作為參數(shù)。
同時,我們也為小莫的四種運動模態(tài)創(chuàng)建了兩個建圖launch文件,其中履帶模式、麥克拉姆輪模式都可以與差速模式共用一個launch文件。
至此,兩種建圖算法已經(jīng)成功配置實現(xiàn),除cartographer選定參數(shù)width=1外,其余參數(shù)經(jīng)測試發(fā)現(xiàn)適用于小莫機(jī)器人,故均選用默認(rèn)參數(shù)使用。
3.2.5自主導(dǎo)航
實時感知到的障礙物信息為安全行駛提供了保障,同時地圖構(gòu)建也提供了重要的環(huán)境數(shù)據(jù),為后續(xù)路徑規(guī)劃和導(dǎo)航奠定了堅實的基礎(chǔ)。
路徑規(guī)劃的前提是定位,定位功能是用來計算機(jī)器人在全局地圖上的具體位置。雖然SLAM技術(shù)包含了定位算法,但它主要用于在導(dǎo)航開始前構(gòu)建全局地圖,而實時定位則是在導(dǎo)航過程中使用,我們選用的是AMCL蒙特卡洛定位系統(tǒng),這一系統(tǒng)專門用于導(dǎo)航時的機(jī)器人定位,定位方法算法流程如下:

在小莫中,AMCL定位輸入以下命令安裝,配置如圖4.11的launch文件即可備用:
([1]) https://wiki.ros.org/move_base
([1]) amcl - ROS Wiki
sudo apt-get install ros-melodic-navigation
AMCL需要訂閱的服務(wù)是/scan激光雷達(dá)數(shù)據(jù)和/tf坐標(biāo)變換消息,它發(fā)布的話題中,最重要的是/amcl_pose,這是機(jī)器人在地圖中的位姿估計。

AMCL則負(fù)責(zé)機(jī)器人在環(huán)境中的定位,在導(dǎo)航過程中還需要能實現(xiàn)路徑規(guī)劃和避障的“地圖”,即代價地圖(Cost Map),它通過為地圖中的每個柵格分配一個“代價”值,來表示機(jī)器人在該位置的移動難度或風(fēng)險。
Costmap2D 類維護(hù)了每個柵格的代價值。Layer 類是虛基類,它統(tǒng)一了各插件costmap層的接口。其中最主要的接口函數(shù)有:
initialize函數(shù),它調(diào)用onInitialize函數(shù),分別對各costmap 層進(jìn)行初始化;matchSize函數(shù),在StaticLayer 類和ObstacleLayer 類中,該函數(shù)調(diào)用了CostmapLayer類matchSize 函數(shù),初始化各costmap 層的size,分辨率,原點和默認(rèn)代價值,并保持與layered_costmap 一致。對于inflationLayer 類,根據(jù)膨脹半徑計算了隨距離變化的cost 表。后面就可以用距離來查詢膨脹柵格的cost 值。同時定義了seen_數(shù)組,該數(shù)組用于標(biāo)記柵格是否已經(jīng)被遍歷過。對于VoxelLayer 類,則初始化了體素方格的size;
updateBounds 函數(shù),調(diào)整當(dāng)前costmap 層需要更新的大小范圍。對于StaticLayer類,確定costmap 的更新范圍為靜態(tài)地圖的大小,注意:靜態(tài)層一般只用在全局costmap中。對于ObstacleLayer 類,遍歷clearing_observations 中的傳感器數(shù)據(jù)確定障礙物的邊界。
其中initialize 函數(shù)和matchSize 函數(shù)分別只執(zhí)行一次。updateBounds 函數(shù)和updateCosts 函數(shù)則會周期執(zhí)行,其執(zhí)行頻率由map_update_frequency 決定。
CostmapLayer 類同時繼承了Layer 類和Costmap2D 類,并提供了幾個更新cost 值的操作方法。StaticLayer 類和ObstacleLayer 類需要保存實例化costmap 層的cost 值,所以都繼承了CostmapLayer 類。StaticLayer 類使用靜態(tài)柵格地圖數(shù)據(jù)更新自己的costmap。ObstacleLayer 類使用傳感器數(shù)據(jù)更新自己的costmap 。VoxelLayer 類相對于ObstacleLayer 類則多考慮了z軸的數(shù)據(jù)。效果的區(qū)別主要體現(xiàn)在障礙物的清除方面。一個是二維層面的清除,一個是三維里的清除。
代價地圖已經(jīng)內(nèi)嵌到下文提及的move_base的功能包中,無需單獨配置。
至此,萬事具備,導(dǎo)航準(zhǔn)備工作已經(jīng)完成,已經(jīng)可以開始在小莫上實現(xiàn)自主導(dǎo)航了。
move_base功能包需要使用本節(jié)前文提及的所有模塊:深度相機(jī)提供的畫面會集成在導(dǎo)航操作界面中,供用戶實時了解機(jī)器人的位置和環(huán)境;雷達(dá)數(shù)據(jù)不僅用于避障,還參與SLAM建圖,為導(dǎo)航提供可靠的地圖信息和障礙物檢測;雷達(dá)避障的兩個局部規(guī)劃器分別負(fù)責(zé)不同的避障任務(wù),與move_base中的全局規(guī)劃器配合,共同實現(xiàn)整體路徑規(guī)劃的優(yōu)化和調(diào)整;AMCL包則持續(xù)反饋機(jī)器人在地圖中的位姿信息,確保導(dǎo)航時能夠依賴代價地圖(Cost Map)進(jìn)行實時路徑規(guī)劃和調(diào)整。通過這些模塊的協(xié)同工作,小莫機(jī)器人能夠在復(fù)雜環(huán)境中實現(xiàn)精準(zhǔn)的自主導(dǎo)航,確保安全和高效的路徑規(guī)劃。
通過以下指令便可以安裝move_base包:
sudo apt-get install ros-melodic-navigation
同時,我們也為小莫的四種運動模態(tài)創(chuàng)建了兩個導(dǎo)航launch文件,履帶模式、麥克拉姆輪模式都可以與差速模式共用一個launch文件。
至此,自主導(dǎo)航功能已經(jīng)全部實現(xiàn),為語音導(dǎo)航,自主建圖打下了基礎(chǔ)。
3.2.6語音交互
右鍵單擊“此電腦”點擊“管理”,在設(shè)備管理器中找到“CH340”字樣,獲取麥克風(fēng)的端口號。
在串口選擇區(qū)選擇麥克風(fēng)的串口,我們是連接的是COM3串口。
點擊串口選擇區(qū)的“打開串口”,看到如下所示頁面,即成功與PC建立連接。
在命令輸入?yún)^(qū)輸入“{"type":"version"}”,點擊“Send Raw”即可在顯示區(qū)看到麥克風(fēng)的版本信息。
在命令輸入?yún)^(qū)輸入“{"type":"wakeup_keywords", "content":{"keyword": "xiao3 huan4 xiao3 huan4", "threshold": "900"}}”點擊“Send Raw”即可在顯示區(qū)看到麥克風(fēng)的通信信息。(“content:”表示喚醒內(nèi)容,“keyword:{}”表示關(guān)鍵字,xiao3為小的拼音+聲調(diào),huan4為幻的拼音+聲調(diào))。
在語音開放平臺申請kpi后將該文件導(dǎo)入,修改了appid后,添加啟動時也啟動hw_speaker文件。
3.2.7語言大模型
我們用大模型KIMI智能助手。KIMI API兼容Openai的接口規(guī)范,使用 openai 提供的 Python或NodeJS SDK 來調(diào)用和使用 Kimi 大模型,那么只需要將 base_url 和 api_key 替換成 Kimi 大模型的配置。

3.2.8目標(biāo)檢測
RDK X3提供了基于MIPI攝像頭推理的Python代碼,實現(xiàn)了加載FCOS 圖像目標(biāo)檢測算法模型基于COCO數(shù)據(jù)集訓(xùn)練的80個類別的目標(biāo)檢測,包括且不限于人、狗、貓等生活中常見的類、從MIPI攝像頭讀取視頻圖像,并進(jìn)行推理、解析模型輸出并將結(jié)果渲染到原始視頻流、通過HDMI接口輸出渲染后的視頻流。
選用fcos作為推理模型是因為FCOS算法的設(shè)計復(fù)雜度,易于理解和操作;性能優(yōu)于YOLO、SSD等檢測網(wǎng)絡(luò);可以充分利用CPU,減少進(jìn)程切換導(dǎo)致的資源浪費。
3.3各模塊協(xié)同實現(xiàn)
各個模塊實現(xiàn)后,需要通過集成手段實現(xiàn)各個模塊的協(xié)同配合,實現(xiàn)的詳細(xì)介紹如下。
用戶通過語音或界面喚醒麥克風(fēng),麥克風(fēng)拾音之后對語音進(jìn)行分析來判斷用戶是進(jìn)行運動控制、下達(dá)指令還是進(jìn)行提問從而進(jìn)行下一步動作。若是對運動控制,則將信息發(fā)送到Jetson nano中進(jìn)行解析執(zhí)行;若是進(jìn)行提問,則將內(nèi)容送到大模型中,等待返回結(jié)果后進(jìn)行文字轉(zhuǎn)語音,再播放語音。
3.3.1用戶界面實現(xiàn)
小莫的集成特性是本設(shè)計的創(chuàng)新點之一,各模塊協(xié)同配合的一種紐帶是靠PyQt所構(gòu)建的菜單界面,如圖4.27所示,窗口由歡迎窗口、主界面窗口和各個子窗口構(gòu)成。歡迎窗口可鍵入主窗口,主窗口點擊各功能按鈕進(jìn)入子窗口。
啟動主窗口的同時也啟動 dabai_u3.launch攝像頭節(jié)點和limo_start.launch底盤節(jié)點,如圖4.28所示,各個功能模塊的啟動與關(guān)閉匯總在主窗口中,點擊即可分別開啟各個launch文件啟動節(jié)點,同時彈出提示框提示是否打開成功。
啟動建圖節(jié)點:使用subprocess.Popen數(shù)啟動了一個新的進(jìn)程來運行建圖節(jié)點的launch文件,具體是limo_bringup limo_rtabmap_orbbec.launch,同時設(shè)置了localization:=true參數(shù)。這個參數(shù)表示要啟動定位功能,這在建圖的過程中很重要,因為定位可以讓機(jī)器人知道自己在地圖中的位置。
隨機(jī)移動建圖的邏輯:定義了一個random_move函數(shù),其中包含了一個while循環(huán),在循環(huán)中機(jī)器人會以隨機(jī)的方式移動,模擬在環(huán)境中探索的過程。
在循環(huán)中,首先會生成一個隨機(jī)的目標(biāo)點,然后調(diào)用movebase_client函數(shù)來讓機(jī)器人移動到這個目標(biāo)點。
同時還會生成一個隨機(jī)的方向,以便機(jī)器人移動時有一定的旋轉(zhuǎn),增加探索的多樣性。
建圖過程的等待和結(jié)束:在識別到“自主建圖”命令后,會啟動隨機(jī)移動,并且等待一段時間,這段時間是模擬機(jī)器人在環(huán)境中探索的過程。
在等待時間結(jié)束后,會停止隨機(jī)移動,并且結(jié)束建圖節(jié)點的運行,同時播放“mapping_complete”提示音,表示建圖完成。
3.3.2語音控制實現(xiàn)
語音控制是小莫的創(chuàng)新點,機(jī)器人可以通過語音控制各個模塊,并實現(xiàn)功能。
錄音調(diào)用控制器:用于實現(xiàn)語音識別并控制相關(guān)設(shè)備。主要功能包括接收來自喚醒標(biāo)志的信息,調(diào)用離線語音識別服務(wù),處理識別結(jié)果并根據(jù)情況執(zhí)行相應(yīng)操作。該操作首先初始化ROS節(jié)點,并創(chuàng)建必要的節(jié)點句柄、服務(wù)客戶端和話題訂閱者。然后,在一個循環(huán)中,不斷地獲取離線語音識別的結(jié)果,并根據(jù)識別結(jié)果進(jìn)行相應(yīng)的處理。在識別結(jié)果的處理過程中,該操作首先判斷喚醒狀態(tài),如果處于喚醒狀態(tài),則調(diào)用離線語音識別服務(wù)獲取識別結(jié)果。根據(jù)識別結(jié)果的不同,可能執(zhí)行以下操作:如果識別結(jié)果為“休眠”,則將喚醒標(biāo)志置為0,使系統(tǒng)進(jìn)入休眠狀態(tài)。如果識別結(jié)果為“ok”,表示識別成功,根據(jù)具體識別到的語音內(nèi)容,執(zhí)行相應(yīng)操作,并將喚醒標(biāo)志置為0,進(jìn)入休眠狀態(tài)。如果識別結(jié)果為“fail”,表示識別失敗,記錄失敗次數(shù),并根據(jù)失敗次數(shù)的不同,可能發(fā)出相應(yīng)的警告信息,并在連續(xù)失敗達(dá)到一定次數(shù)后,將系統(tǒng)置為休眠狀態(tài)。如果調(diào)用離線語音識別服務(wù)失敗,則記錄錯誤信息并繼續(xù)下一次循環(huán)。通過以上邏輯,該操作實現(xiàn)了對語音指令的識別和處理,并可以根據(jù)識別結(jié)果執(zhí)行相應(yīng)的控制操作,從而實現(xiàn)了語音控制相關(guān)設(shè)備的功能。
離線語音識別服務(wù)識別聲音指令:頭文件引入和全局變量聲明:包括一些頭文件的引入以及全局變量的聲明,其中包括用于發(fā)布聲音識別結(jié)果的ROS發(fā)布者、離線識別開關(guān)、一些參數(shù)設(shè)置和一些外部聲明的變量。輔助函數(shù)定義:包括將字符串轉(zhuǎn)換為寬字符和將寬字符轉(zhuǎn)換為字符串的輔助函數(shù),以及播放聲音的函數(shù)。業(yè)務(wù)數(shù)據(jù)處理函數(shù)(business_data):用于處理錄音數(shù)據(jù),并將數(shù)據(jù)傳入語音識別引擎進(jìn)行識別。顯示離線識別結(jié)果函數(shù)(show_result):用于解析離線識別結(jié)果字符串,提取有效關(guān)鍵字和置信度。獲取離線識別結(jié)果服務(wù)回調(diào)函數(shù)(Get_Offline_Recognise_Result):用于接收離線識別結(jié)果請求,并調(diào)用相應(yīng)的處理函數(shù)進(jìn)行離線識別,并返回識別結(jié)果。主函數(shù)(main):包括ROS節(jié)點初始化、參數(shù)設(shè)置、服務(wù)、發(fā)布者的創(chuàng)建和一些初始化操作,然后進(jìn)入循環(huán)中不斷檢測初始化是否成功和是否完成錄音,并根據(jù)情況調(diào)用離線識別服務(wù)進(jìn)行識別。
設(shè)置麥克風(fēng)類型和喚醒詞并喚醒語音控制:實現(xiàn)了一個可以與環(huán)形麥克風(fēng)陣列交互的 ROS 節(jié)點,可以通過 ROS 服務(wù)設(shè)置麥克風(fēng)類型和喚醒詞,并通過 ROS 發(fā)布者發(fā)布喚醒標(biāo)志和喚醒角度,主要功能包括:CircleMic 類:這個類實現(xiàn)了與環(huán)形麥克風(fēng)陣列通信的方法。它包括了初始化串口、切換麥克風(fēng)類型、獲取版本信息、設(shè)置喚醒詞等功能。AwakeNode 類:這個類是一個ROS節(jié)點,通過串口與環(huán)形麥克風(fēng)陣列通信,提供了三個 ROS 服務(wù):設(shè)置麥克風(fēng)類型、獲取設(shè)置信息、設(shè)置喚醒詞。它還創(chuàng)建了兩個 ROS 發(fā)布者,用于發(fā)布喚醒標(biāo)志和喚醒角度。主函數(shù):在主函數(shù)中,首先初始化了 ROS 節(jié)點,然后根據(jù)參數(shù)設(shè)置了環(huán)形麥克風(fēng)的類型、串口和喚醒詞。接著創(chuàng)建了一個AwakeNode 對象,初始化了 ROS 服務(wù)和發(fā)布者,并調(diào)用了環(huán)形麥克風(fēng)的方法來獲取喚醒結(jié)果。
通過識別語音指令執(zhí)行相應(yīng)操作:它通過結(jié)合語音識別和導(dǎo)航功能,實現(xiàn)了對小車的語音指令控制,包括控制小車的移動、執(zhí)行特定任務(wù)以及與用戶進(jìn)行交互的功能。首先,操作中建立了與ROS通信的發(fā)布者和訂閱者。這些發(fā)布者和訂閱者用于與其他ROS節(jié)點進(jìn)行數(shù)據(jù)交換,以便小車能夠接收語音指令并執(zhí)行相應(yīng)的動作。其次,該操作定義了多個函數(shù)來實現(xiàn)不同的功能。其中,amcl_pose_callback函數(shù)用于接收小車當(dāng)前位置信息,這對于后續(xù)的導(dǎo)航任務(wù)至關(guān)重要;play函數(shù)用于播放特定名稱的語音提示,以便與用戶進(jìn)行交互;pub_cmd_msg函數(shù)用于發(fā)布控制小車移動的指令,并可以設(shè)置持續(xù)時間,以實現(xiàn)精確的控制;movebase_client函數(shù)則用于向move_base節(jié)點發(fā)送導(dǎo)航目標(biāo)點,并等待導(dǎo)航完成;add_mark_point函數(shù)用于向數(shù)據(jù)庫添加標(biāo)記點信息,以便小車能夠在地圖中定位和導(dǎo)航;random_move函數(shù)實現(xiàn)了小車的隨機(jī)移動功能,這對于自主建圖過程中的地圖探索至關(guān)重要。在主循環(huán)中,該操作通過訂閱語音識別節(jié)點的話題來監(jiān)聽語音指令。一旦接收到特定的指令,就會調(diào)用相應(yīng)的處理函數(shù)執(zhí)行相應(yīng)的動作或任務(wù)。例如,當(dāng)接收到前進(jìn)、后退、左轉(zhuǎn)、右轉(zhuǎn)等移動指令時,該操作會調(diào)用相關(guān)的移動函數(shù)控制小車的運動;當(dāng)接收到導(dǎo)航到特定地點的指令時,該操作會調(diào)用導(dǎo)航函數(shù)執(zhí)行相應(yīng)的任務(wù)。此外,該操作還實現(xiàn)了喚醒與休眠處理功能。當(dāng)接收到喚醒指令時,該操作會播放喚醒成功提示,并根據(jù)當(dāng)前小車的角度進(jìn)行旋轉(zhuǎn)以調(diào)整朝向;當(dāng)接收到休眠指令時,該操作會播放休眠提示,并暫停監(jiān)聽語音指令,以節(jié)省系統(tǒng)資源。
接著詳細(xì)展開說明代碼中的關(guān)鍵函數(shù):
首先是amcl_pose_callback(msg)函數(shù)。這個函數(shù)用于接收小車當(dāng)前位置信息,并將其存儲在全局變量中供其他部分代碼使用。它訂閱了ROS話題/amcl_pose,該話題發(fā)布的消息包含小車在地圖中的位置信息。每當(dāng)有新的位置信息到達(dá)時,該函數(shù)就會被調(diào)用,并將當(dāng)前位置信息存儲在全局變量中。
接著是play(name)函數(shù)。這個函數(shù)用于播放特定名稱的語音提示,以便與用戶進(jìn)行交互。它使用了一個名為voice_play的模塊,通過調(diào)用其中的函數(shù)實現(xiàn)語音播放功能。調(diào)用該函數(shù)時,將所需的語音提示的名稱作為參數(shù)傳遞給該函數(shù),然后它會根據(jù)名稱播放相應(yīng)的語音。
下一個函數(shù)是pub_cmd_msg(msg, duration)。這個函數(shù)用于發(fā)布控制小車移動的指令,并可以設(shè)置持續(xù)時間。它接受兩個參數(shù):msg表示要發(fā)布的控制指令,duration表示指令持續(xù)的時間。在函數(shù)內(nèi)部,它通過ROS發(fā)布者向話題/cmd_vel發(fā)布指令消息,控制小車的運動。同時,通過設(shè)置定時器,可以確保指令在指定的持續(xù)時間內(nèi)持續(xù)執(zhí)行,然后停止。
接下來是movebase_client(x, y, orientation)函數(shù)。這個函數(shù)用于向move_base節(jié)點發(fā)送導(dǎo)航目標(biāo)點,并等待導(dǎo)航完成。它使用了ROS的行為庫中的SimpleActionClient來實現(xiàn)與move_base節(jié)點的通信。在函數(shù)內(nèi)部,首先創(chuàng)建一個MoveBaseGoal對象,設(shè)置目標(biāo)位置和姿態(tài),然后向move_base節(jié)點發(fā)送這個目標(biāo),并等待導(dǎo)航任務(wù)完成。
然后是add_mark_point(name, x, y, orientation)函數(shù)。這個函數(shù)用于向數(shù)據(jù)庫添加標(biāo)記點信息。它接受標(biāo)記點的名稱、位置坐標(biāo)和姿態(tài)作為參數(shù),并將這些信息插入到SQLite數(shù)據(jù)庫中。在函數(shù)內(nèi)部,它使用了SQLite數(shù)據(jù)庫連接和游標(biāo)對象來執(zhí)行插入操作,確保標(biāo)記點信息被正確存儲。
最后是random_move()函數(shù)。這個函數(shù)實現(xiàn)了小車的隨機(jī)移動功能。它使用了Python的random模塊來生成隨機(jī)目標(biāo)點和隨機(jī)方向。在函數(shù)內(nèi)部,它周期性地生成隨機(jī)目標(biāo)點,并調(diào)用movebase_client函數(shù)來讓小車移動到這些目標(biāo)點,從而實現(xiàn)隨機(jī)移動和地圖探索。
指令處理函數(shù) words_callback(msg) 在這個代碼中扮演著至關(guān)重要的角色。它是通過訂閱語音識別節(jié)點發(fā)布的話題/call_recognition/voice_words來監(jiān)聽語音指令的。一旦接收到語音指令,該函數(shù)將被觸發(fā),開始執(zhí)行指令處理流程。
首先,函數(shù)會解析接收到的消息,將語音指令提取出來。這通常涉及將消息內(nèi)容進(jìn)行解碼,以確保正確地識別和理解用戶的指令。解析語音指令可能包括文本分詞、語義分析等步驟,以便準(zhǔn)確識別用戶的意圖和要求。
接著,根據(jù)解析得到的指令內(nèi)容,函數(shù)會進(jìn)入相應(yīng)的處理分支。這些分支通常是一系列的條件語句或者是使用字典等數(shù)據(jù)結(jié)構(gòu)進(jìn)行指令匹配的邏輯判斷。每個分支對應(yīng)著一種或多種可能的指令,以及執(zhí)行相應(yīng)操作的代碼。
在處理指令的過程中,函數(shù)可能會調(diào)用其他函數(shù)來實現(xiàn)具體的操作。例如,如果接收到的是控制小車移動的指令,函數(shù)會調(diào)用控制小車移動的函數(shù);如果接收到的是導(dǎo)航到特定地點的指令,函數(shù)會調(diào)用導(dǎo)航函數(shù)執(zhí)行相應(yīng)的導(dǎo)航任務(wù)。
除了執(zhí)行相應(yīng)操作外,指令處理函數(shù)還可能會向用戶提供反饋信息。這可以通過語音提示、控制臺輸出、圖形界面等形式來實現(xiàn),以便用戶了解指令的執(zhí)行情況和結(jié)果。
在處理完指令后,函數(shù)可能會繼續(xù)等待并監(jiān)聽下一個語音指令,以保持對用戶的持續(xù)響應(yīng)。整個指令處理函數(shù)的設(shè)計目的是使系統(tǒng)能夠?qū)崿F(xiàn)對用戶語音指令的準(zhǔn)確理解和及時響應(yīng),從而提高系統(tǒng)的交互性和用戶體驗。
以下是對每個分支進(jìn)行詳細(xì)描述:
自主建圖指令分支:如果接收到的語音指令是"自主建圖",系統(tǒng)將啟動建圖功能。首先,系統(tǒng)會播放開始建圖的語音提示,然后啟動建圖節(jié)點和導(dǎo)航節(jié)點,讓小車開始在環(huán)境中進(jìn)行地圖構(gòu)建。在建圖過程中,系統(tǒng)可能會調(diào)用隨機(jī)移動函數(shù),使小車在環(huán)境中探索,以獲取更多的地圖信息。建圖完成后,系統(tǒng)會播放建圖完成的語音提示,并關(guān)閉建圖節(jié)點,以便后續(xù)的導(dǎo)航任務(wù)。
移動控制指令分支:如果接收到的語音指令是移動控制指令,比如"前進(jìn)"、"后退"、"向左轉(zhuǎn)"、"向右轉(zhuǎn)"等,系統(tǒng)會根據(jù)指令調(diào)整小車的移動方向和速度,以執(zhí)行相應(yīng)的動作。例如,如果接收到"前進(jìn)"指令,系統(tǒng)會使小車向前移動;如果接收到"向左轉(zhuǎn)"指令,系統(tǒng)會使小車向左轉(zhuǎn)動。
導(dǎo)航指令分支:如果接收到的語音指令是導(dǎo)航指令,比如"導(dǎo)航到前臺"、"去王老師辦公室"等,系統(tǒng)會調(diào)用相應(yīng)的導(dǎo)航函數(shù),使小車導(dǎo)航到指定的目標(biāo)位置。這些導(dǎo)航函數(shù)會計算小車到目標(biāo)位置的路徑,并發(fā)送導(dǎo)航指令給導(dǎo)航節(jié)點,以實現(xiàn)自主導(dǎo)航功能。
標(biāo)記點操作分支:如果接收到的語音指令是標(biāo)記點操作指令,比如"設(shè)置A點",系統(tǒng)會獲取當(dāng)前小車的位置信息,并將其作為一個標(biāo)記點保存到數(shù)據(jù)庫中。這些標(biāo)記點可以在后續(xù)的導(dǎo)航任務(wù)中使用,以便小車能夠到達(dá)預(yù)先設(shè)置的目標(biāo)位置。
其他指令分支:如果接收到的語音指令不屬于以上任何一種情況,系統(tǒng)可能會播放無法識別的語音指令提示,或者不做任何響應(yīng)。這種情況下,系統(tǒng)會保持等待狀態(tài),繼續(xù)監(jiān)聽新的語音指令。
([1]) ydlidar_ros_driver/details.md at master · YDLIDAR/ydlidar_ros_driver · GitHub
([2]) https://vcp.developer.orbbec.com.cn/documentation
([3]) teb_local_planner - ROS Wiki
([4]) teb_local_planner - ROS Wiki
([5]) teb_local_planner - ROS Wiki
([6]) dwa_local_planner - ROS Wiki
([8]) gmapping - ROS Wiki
([9]) cartographer - ROS Wiki
([10]) https://wiki.ros.org/move_base
([11]) amcl - ROS Wiki
([12]) amcl - ROS Wiki
([13]) move_base - ROS Wiki
-
機(jī)器人
+關(guān)注
關(guān)注
213文章
29463瀏覽量
211491 -
人工智能
+關(guān)注
關(guān)注
1804文章
48677瀏覽量
246341 -
RDK
+關(guān)注
關(guān)注
0文章
24瀏覽量
9166
發(fā)布評論請先 登錄
盤點#機(jī)器人開發(fā)平臺
詳細(xì)介紹機(jī)場智能指路機(jī)器人的工作原理
RDK X3 帶飛的智能護(hù)理系統(tǒng):讓機(jī)器人秒變貼心小棉襖

【「# ROS 2智能機(jī)器人開發(fā)實踐」閱讀體驗】視覺實現(xiàn)的基礎(chǔ)算法的應(yīng)用
【「# ROS 2智能機(jī)器人開發(fā)實踐」閱讀體驗】+ROS2應(yīng)用案例
【「# ROS 2智能機(jī)器人開發(fā)實踐」閱讀體驗】+內(nèi)容初識
RDK X3新玩法:超沉浸下棋機(jī)器人開發(fā)日記

地瓜機(jī)器人RDK X5 規(guī)格書與地瓜機(jī)器人RDK X5原理圖

復(fù)合機(jī)器人是通過什么導(dǎo)航方式?
名單公布!【書籍評測活動NO.58】ROS 2智能機(jī)器人開發(fā)實踐
RDK X3暴改機(jī)器人:手搓能爬樓的AI快遞員會爬樓能嘮嗑

AGV機(jī)器人智能化無人倉儲,讓你的倉庫活起來!

手搓網(wǎng)球撿拾機(jī)器人:RDK X3帶你輕松解鎖球場黑科技

ROSCon China 2024 | RDK第一本教材來了!地瓜機(jī)器人與古月居發(fā)布新書《ROS 2智能機(jī)器人開發(fā)實踐》

評論