2.1 通信機(jī)制簡介
在ROS2中通信方式雖然有多種,但是不同通信方式的組成要素都是類似的,比如:通信是雙方或多方行為、通信時都需要將不同的通信對象關(guān)聯(lián)、都有各自的模型、交互數(shù)據(jù)時也必然涉及到數(shù)據(jù)載體等等。本節(jié)將會介紹通信中涉及到的一些術(shù)語。
1.節(jié)點(diǎn)
在通信時,不論采用何種方式,通信對象的構(gòu)建都依賴于節(jié)點(diǎn)(Node),在ROS2中,一般情況下每個節(jié)點(diǎn)都對應(yīng)某一單一的功能模塊(例如:雷達(dá)驅(qū)動節(jié)點(diǎn)可能負(fù)責(zé)發(fā)布雷達(dá)消息,攝像頭驅(qū)動節(jié)點(diǎn)可能負(fù)責(zé)發(fā)布圖像消息)。一個完整的機(jī)器人系統(tǒng)可能由許多協(xié)同工作的節(jié)點(diǎn)組成,ROS2中的單個可執(zhí)行文件(C++程序或Python程序)可以包含一個或多個節(jié)點(diǎn)。
2.話題
話題(Topic)是一個紐帶,具有相同話題的節(jié)點(diǎn)可以關(guān)聯(lián)在一起,而這正是通信的前提。并且ROS2是跨語言的,有的節(jié)點(diǎn)可能是使用C++實(shí)現(xiàn),有的節(jié)點(diǎn)可能是使用Python實(shí)現(xiàn)的,但是只要二者使用了相同的話題,就可以實(shí)現(xiàn)數(shù)據(jù)的交互。
3.通信模型
不同的通信對象通過話題關(guān)聯(lián)到一起之后,以何種方式實(shí)現(xiàn)通信呢?在ROS2中,常用的通信模型有四種:
1.話題通信:是一種單向通信模型,在通信雙方中,發(fā)布方發(fā)布數(shù)據(jù),訂閱方訂閱數(shù)據(jù),數(shù)據(jù)流單向的由發(fā)布方傳輸?shù)接嗛喎健?/p>
2.服務(wù)通信:是一種基于請求響應(yīng)的通信模型,在通信雙方中,客戶端發(fā)送請求數(shù)據(jù)到服務(wù)端,服務(wù)端響應(yīng)結(jié)果給客戶端。
3.動作通信:是一種帶有連續(xù)反饋的通信模型,在通信雙方中,客戶端發(fā)送請求數(shù)據(jù)到服務(wù)端,服務(wù)端響應(yīng)結(jié)果給客戶端,但是在服務(wù)端接收到請求到產(chǎn)生最終響應(yīng)的過程中,會發(fā)送連續(xù)的反饋信息到客戶端。
4.參數(shù)服務(wù):是一種基于共享的通信模型,在通信雙方中,服務(wù)端可以設(shè)置數(shù)據(jù),而客戶端可以連接服務(wù)端并操作服務(wù)端數(shù)據(jù)。
4.接口
在通信過程中,需要傳輸數(shù)據(jù),就必然涉及到數(shù)據(jù)載體,也即要以特定格式傳輸數(shù)據(jù)。在ROS2中,數(shù)據(jù)載體稱之為接口(interfaces)。通信時使用的數(shù)據(jù)載體一般需要使用接口文件定義。常用的接口文件有三種:msg文件、srv文件與action文件。每種文件都可以按照一定格式定義特定數(shù)據(jù)類型的“變量”。
1.msg文件
msg文件是用于定義話題通信中數(shù)據(jù)載體的接口文件,一個典型的.msg
文件示例如下。
int64 num1
int64 num2
在文件中聲明了一些被傳輸?shù)念愃朴贑++變量的數(shù)據(jù)。
2.srv文件
srv文件是用于定義服務(wù)通信中數(shù)據(jù)載體的接口文件,一個典型的.srv
文件示例如下。
int64 num1
int64 num2
---
int64 sum
文件中聲明的數(shù)據(jù)被---
分割為兩部分,上半部分用于聲明請求數(shù)據(jù),下半部分用于聲明響應(yīng)數(shù)據(jù)。
3.action文件
action文件使用用于定義動作通信中數(shù)據(jù)載體的接口文件,一個典型的.action
文件示例如下。
int64 num
---
int64 sum
---
float64 progress
文件中聲明的數(shù)據(jù)被---
分割為三部分,上半部分用于聲明請求數(shù)據(jù),中間部分用于聲明響應(yīng)數(shù)據(jù),下半部分用于聲明連續(xù)反饋數(shù)據(jù)。
4.變量類型
不管是何種接口文件,在文件中每行聲明的數(shù)據(jù)都由字段類型和字段名稱組成,可以使用的字段類型有:
int8, int16, int32, int64 (或者無符號類型: uint*)
float32, float64
string
time, duration
其他msg文件
變長數(shù)組和定長數(shù)組
ROS中還有一種特殊類型:Header
,標(biāo)頭包含時間戳和ROS2中常用的坐標(biāo)幀信息。許多接口文件的第一行包含Header
標(biāo)頭。
另外,需要說明的是:
參數(shù)通信的數(shù)據(jù)無需定義接口文件,參數(shù)通信時數(shù)據(jù)會被封裝為參數(shù)對象,參數(shù)客戶端和服務(wù)端操作的都是參數(shù)對象。
本階段大家對數(shù)據(jù)載體做簡單的了解即可,其具體使用后續(xù)章節(jié)有詳細(xì)介紹。
準(zhǔn)備工作
1.請先創(chuàng)建工作空間ws01_plumbing
,本章以及第3章代碼部分內(nèi)容存儲在該工作空間下。
2.實(shí)際應(yīng)用中一般建議創(chuàng)建專門的接口功能包定義接口文件,當(dāng)前教程也遵循這一建議,預(yù)先創(chuàng)建教程所需使用的接口功能包(需要注意的是,目前為止無法在Python功能包中定義接口文件),終端下進(jìn)入工作空間的src
目錄,執(zhí)行如下命令:
ros2 pkg create --build-type ament_cmake base_interfaces_demo
該功能包將用于保存本章教程中自定義的接口文件。

B站有完整的ros系列教程視頻,可以觀看完整內(nèi)容ros課程ROS2理論與實(shí)踐
更多內(nèi)容將在猛獅知識星球社區(qū)更新最新課程,后續(xù)將推出更多優(yōu)質(zhì)內(nèi)容——詳情可關(guān)注猛獅集訓(xùn)營公眾號和猛獅集訓(xùn)營官方網(wǎng)站。