ROS 機器人控制 - 2

記錄點
上一篇筆記我們已經把ROS的環境都建立好了,所以這篇筆記我們將開始深入的學習所有ROS的相關知識
ROS 的 相關術語
在進入技術的部份前我們先來了解一下關於ROS的一些相關專有名詞和相關術語,這樣以後與其他專業人士交流可以知道對方在講甚麼
架構
節點 NODE
節點簡單來說就是一個控制整台機器人中的一個小程序,並且這個小程序是專門控制機器人的某的部件的,例如紅外線感測器、步進馬達、視覺感測器等
在一台機器人中因為有許多部件的關西所以就會有很多節點,但是機器人中不同的零件有時候是需要互相溝通的,因此在機器人交換訊息也會有自己的格式,例如主題 (Topics)、服務 (Services)、行動 (Actions)
在一個節點啟動時會先註冊自己的相關資訊例如名稱、類型、位置等好讓其他節點知道他的存在並與他溝通
主節點 MASTER NODE
剛剛有在節點中提到節點在啟動時會註冊自己的訊息讓其他節點可以知道自己存在,但是這個節點是如何註冊的呢,沒錯這時候就需要主節點了,他負責的是接收所有節點的註冊訊息並幫助節點與節點互相溝通
主節點使用的預設位置是電腦的IP位置的11311 port
套件 PACKAGE / 元套件 METAPACKAGE
有點先前概念的讀者應該知道ROS就是把一個機器人的多個控制元件拆成小部分控制,而這邊的Package就是人家做好控制小元件的程式碼,只要安裝上去再設定一下參數就可以使用了
這些Package的來源大部分都是社群製作的,並且很多都是開源的因此可以放心使用
而原套件只的就是目的相同的套件包,意思就是在設定上可能有差但是應用的效果大部分是相同的,講義中提供的範例是導航相關的套件AMCL、DWA、EKF、map_server
都是相同的
傳遞訊息
訊息 MESSAGE
這邊的訊息就是指節點與節點間溝通的方式與訊息格式,主流的溝通方式有
- 數值、小數、布林值、字串
- 陣列 ARRAY
- 物件 OBJECT
主題 TOPIC
這個是一種節點交換訊息的方式,概念是一個A節點向主節點註冊一個Topic並且在這個Topic上發布訊息,而其他的節點如果需要這個節點的訊息就可以跟主節點說我想要知道這個節點的相關資訊,主解點就會把這個節點的相關訊息給你
就好比說今天你喜歡Mrekk的Osu影片,你可以在Youtube去訂閱他,這樣他發布影片你就可以得到他的相關訊息
發布者 PUBLISHER
有讀上一個觀念應該就知道這邊的發布者就是發佈訊息的人,要注意一個節點可以一次當多個發布者發布多種訊息
訂閱者 SUBSCRIBER
而訂閱者就是負責接收訊息的那個節點,與發佈者一樣可以一次接收多個訊息當多個訂閱者
服務 SERVICE
這是另一種節點交換訊息的溝通方式,與主題不同的是他只可以單溝通,就像是你女神告白完人家回一句滾就把你封鎖了
回到正題,所以服務這種溝通方式就一種單次溝通的方式,主要的角色有服務伺服器和服務客戶端,當服務客戶端想要一個訊息時就會與服務伺服器聯絡,接下來就要看人家願不願意回你
服務伺服器 Service Server
有剛剛的觀念我這部分就快速帶過,服務伺服器就是一個接收客戶端所需訊息的伺服器,會不停地去查看有沒有客戶端需要訊息服務客戶端 Service Client
而客戶端就是當有需要訊息時會向服務伺服器請求訊息的角色
行動 ACTION
這也是一種節點交換訊息的方式,Action其實與Service的架構很像,比較不同的是他的時間比較長,必且可以在傳送中給予Feedback,甚麼意思呢我們舉個例子
Copilot 給的舉例
一個倉庫中的配送機器人需要運送物品到指定的存放區。這個任務可能會花費幾分鐘才能完成,而且過程中倉庫管理系統需要隨時獲知機器人的進展。
目標(Goal):機器人導航到特定位置(如「區域B-5」)。
回饋(Feedback):機器人在導航途中,定期回報當前位置和距離目標的剩餘距離。例如:「目前在區域B-2,預計還需30秒到達目標。」
結果(Result):成功到達目標,並回報任務完成。
在這種情境下,行動伺服器可以執行導航指令,並提供即時進度回饋;而行動客戶端則可以設定目標,並根據回饋資訊進行監控或調整後續指令。
簡單來說就是一種在完成指定任務的過程中也會同時回饋當前任務進度的Message方式
行動伺服器 Action Server
與Service的架構相似,監聽Client發送的指令並完成指定任務,同時發送Feedback行動客戶端 Action Client
與Service的架構相似,也是發送指令的角色,但是不同的是在發送指令完後會一直去監聽Server發送的Feedback
參數 PARAMETER / 參數伺服器 PARAMETER SERVER
很字面的意思,參數就是那些要提供給各節點的初始值,而怎麼給他呢,就是用參數伺服器,參數伺服器會在啟動時把參數載入到主節點,然後個節點會再向主節點索取他們需要的參數
套件相關
Catkin
簡單來說就是一個專門為ROS而設計的建置系統,這邊的建置系統指的是當開發者想要建立一個ROS的套件時,在以前我們會用另外一個內建工具 CMake 來直接編譯套建,但是因為相容性但其他種種問題所以後來工程師基於 CMake 們開發出了 Catkin 整合工具,優化了傳統CMake的各種問題
CMakeLists.txt
就是上面提到Catkin,在使用Catkin建置到件時會需要寫一個叫做CMakeLists.txt的檔案讓Catkin知道該如何去建立這個套件,例如套件名稱、版本、功能、目錄等
package.xml
與CMakeLists.txt基本上大同小異,異於package.xml是Catkin編譯完後的內容,這個檔案會與編譯好後的套件放在同一個資料夾內
指令
RosCore
接下來進入指令的部分,RosCore指令就是用來運行主節點的指令,一個網路中通常應該只需要運行一個主節點
同時主節點在運行時會有一串預設的 ROS_MASTER_URL
的參數,這是用來讓節點與主節點溝通的位置,預設位置是本機的 11311 Port
RosRun
這是一個運行節點的指令,在實際運行這個指令時後面還會有套件和節點名稱這兩個參數要設定,而連線位置會設定在參數伺服器中
RosLaunch
與 RosRun 相似,不同在於 RosLaunch 可以一次運行多個節點。開發者會把一個專案所需要用到的節點和參數寫在一個.launch的XML檔案中,如果有使用者需要使用就只需要使用這個指令所有的節點會自動運行
好啦其實這根本就是 docker compose up -d
,懂得應該馬上就懂了
Bag
就是一個ROS的Log檔案,這個檔案會錄製並記錄下來執行一次ROS時所有節點交換的訊息、數值、時間、來源等,所以如果有影像圖像等檔案這個檔案有可能也會很大