Ros2_control淺析——一個(gè)機(jī)器人開(kāi)發(fā)通用框架的結(jié)構(gòu)(1)
引言:
最近在開(kāi)發(fā)一個(gè)送餐機(jī)器人,但是在電機(jī)和ros2系統(tǒng)交互時(shí)犯了難,不知道該怎么寫(xiě)才能讓系統(tǒng)架構(gòu)清晰一些,后來(lái)了解到ros2社區(qū)有一個(gè)規(guī)范的開(kāi)發(fā)框架,所以我會(huì)結(jié)合個(gè)人理解來(lái)分析一下這個(gè)架構(gòu),算是我的學(xué)習(xí)筆記吧,希望能夠?qū)δ袔椭?/p>
ros2_control是什么
ros2_control 是一個(gè)硬件無(wú)關(guān)的控制框架,用于抽象第三方解決方案(如 MoveIt2 和 Nav2 系統(tǒng))的硬件和低級(jí)控制,它提供了一些接口來(lái)實(shí)現(xiàn)標(biāo)準(zhǔn)化的硬件抽象和控制流程。
有點(diǎn)像是cpp的庫(kù)文件,讓上層系統(tǒng)不必關(guān)心過(guò)多細(xì)節(jié)。它通過(guò)硬件接口插件與真實(shí)設(shè)備通信,并通過(guò)控制器將硬件狀態(tài)發(fā)布為ROS2話題或?qū)OS2指令傳遞給硬件。
從而讓上層系統(tǒng)不必關(guān)心底層硬件的實(shí)現(xiàn),只需要使用ros2_control提供的接口,從而讓上層的應(yīng)用去調(diào)用來(lái)實(shí)現(xiàn)實(shí)際應(yīng)用中的功能。
官方文檔示例
這張圖就展示了這個(gè)框架的核心思想——抽象硬件接口,方便上層軟件的使用,實(shí)現(xiàn)軟硬件解耦

然后是官網(wǎng)文檔中的舉例圖,
可以看到客戶端可以不用去考慮硬件方面的資源開(kāi)銷(xiāo),從而最小化在實(shí)際客戶端應(yīng)用程序上花費(fèi)的資源。可以直接拓展自己的控制器,或者通過(guò)自定義的第三方軟件進(jìn)行控制操作。

這個(gè)框架的源代碼可以在以下兩個(gè)倉(cāng)庫(kù)中找到:
https://github.com/ros-controls/ros2_control
https://github.com/ros-controls/ros2_controllers
這兩個(gè)倉(cāng)庫(kù)里面包含了一些控制器的示例,可以本地克隆下來(lái)嘗試一下。
官方文檔給出的ros2_control框架的架構(gòu):

可以看到明顯的分成了上下兩個(gè)部分,兩個(gè)部分之間連接處是Controller Manager(控制器管理器)和Resource Manager(資源管理器),下面來(lái)解析一下圖中的概念。
架構(gòu)解析:
控制器管理器(Controller Manager 簡(jiǎn)稱(chēng)CM)
可以看作是用戶操作硬件的“調(diào)度中心”,它知道控制器需要的接口,也知道硬件提供的接口。它管理控制器及其所需接口,而且通過(guò)資源管理器訪問(wèn)硬件組件的接口,“承上啟下”,可以這樣理解。
用戶或者上層系統(tǒng)在這個(gè)框架下無(wú)法直接操作控制器,通過(guò)Ros2提供的服務(wù)(services)和控制器管理器交互。
CM支持自定義的集成,原生的CM是不帶執(zhí)行器的,一個(gè)節(jié)點(diǎn)想要處理回調(diào)需要執(zhí)行器(Executor)來(lái)運(yùn)行。比如一個(gè)節(jié)點(diǎn)中使用rclcpp::spin(),本質(zhì)上就是創(chuàng)建了一個(gè)默認(rèn)的執(zhí)行器,這樣就可以觸發(fā)節(jié)點(diǎn)對(duì)應(yīng)的回調(diào)函數(shù)。將cm嵌入到你的執(zhí)行器中后,就可以在你自己的節(jié)點(diǎn)中可以同時(shí)啟動(dòng)CM的服務(wù),即個(gè)人節(jié)點(diǎn)和CM在同一個(gè)進(jìn)程下運(yùn)行,從而避免進(jìn)程間的通信開(kāi)銷(xiāo)。
資源管理器(Resource Manager 簡(jiǎn)稱(chēng)RM)
RM所做的事情是將物理硬件及其驅(qū)動(dòng)程序(一個(gè)完整可調(diào)用的硬件模組)抽象化成硬件組件(Hardware Components),將硬件組件以插件的形式嵌入到框架之中,并管理它們的生命周期和組件的狀態(tài)
硬件組件(Hardware Components)
硬件組件是物理硬件的抽象化表示,主要分為以下三種類(lèi)型:System、Actuator、Sersor。
System(系統(tǒng)組件):相當(dāng)于一個(gè)組裝好的部分,控制多個(gè)自由度(比如機(jī)械臂,靈巧手),細(xì)節(jié)在內(nèi)部處理,ros2_control只關(guān)心關(guān)節(jié)位置和控制命令。
必須實(shí)現(xiàn)read()和write()操作(因?yàn)橐鞔_狀態(tài)和下達(dá)控制指令)。
Actuator(執(zhí)行器組件):通常對(duì)應(yīng)一個(gè)關(guān)節(jié),比如一個(gè)電機(jī)或者一個(gè)推桿、閥門(mén)。
每個(gè)執(zhí)行器之間獨(dú)立通信,通過(guò)執(zhí)行器之間的組合構(gòu)建出高自由度的系統(tǒng)。
必須實(shí)現(xiàn)write(),read()是可選的。
Sensor(傳感器組件):對(duì)應(yīng)感知類(lèi)的設(shè)備,比如IMU、攝像頭、編碼器,這些傳感器類(lèi)型的硬件,通常獨(dú)立于執(zhí)行器組件,因?yàn)楂@取到的外接信息的處理往往需要單獨(dú)處理。
只有read(),對(duì)于感知設(shè)備讀取即可。
本篇文章的參考來(lái)源:
ros2_control官方文檔:https://control.ros.org/master/doc/getting_started/getting_started.html#architecture
《通過(guò)控制器訪問(wèn)硬件的設(shè)計(jì)文檔》:https://github.com/ros-controls/roadmap/blob/master/design_drafts/hardware_access.md
ROSCon 2025 Workshop提供的ros2_control有關(guān)的幻燈片下載:https://control.ros.org/master/_downloads/facbcb9c9cc446bc58379564f481ee37/ROSCon2025-Workshop_Fun_with_Robot_Drivers.pdf

初學(xué)者結(jié)合個(gè)人理解來(lái)討論一下Ros2_control框架,有錯(cuò)誤煩請(qǐng)大佬批評(píng)指正。
浙公網(wǎng)安備 33010602011771號(hào)