3.1 分布式
場景
在許多機器人相關(guān)的應(yīng)用場景中都涉及到多臺ROS2設(shè)備協(xié)作,比如:無人車編隊、無人機編隊、遠程控制等等,那么不同的ROS2設(shè)備之間是如何實現(xiàn)通信的呢?
概念
分布式通信是指可以通過網(wǎng)絡(luò)在不同主機之間實現(xiàn)數(shù)據(jù)交互的一種通信策略。
ROS2本身是一個分布式通信框架,可以很方便的實現(xiàn)不同設(shè)備之間的通信,ROS2所基于的中間件是DDS,當(dāng)處于同一網(wǎng)絡(luò)中時,通過DDS的域ID機制(ROS_DOMAIN_ID)可以實現(xiàn)分布式通信,大致流程是:在啟動節(jié)點之前,可以設(shè)置域ID的值,不同節(jié)點如果域ID相同,那么可以自由發(fā)現(xiàn)并通信,反之,如果域ID值不同,則不能實現(xiàn)。默認情況下,所有節(jié)點啟動時所使用的域ID為0,換言之,只要保證在同一網(wǎng)絡(luò),你不需要做任何配置,不同ROS2設(shè)備上的不同節(jié)點即可實現(xiàn)分布式通信。
作用
分布式通信的應(yīng)用場景是較為廣泛的,如上所述:機器人編隊時,機器人可能需要獲取周邊機器人的速度、位置、運行軌跡的相關(guān)信息,遠程控制時,則可能需要控制端獲取機器人采集的環(huán)境信息并下發(fā)控制指令...... 這些數(shù)據(jù)的交互都依賴于分布式通信。
實現(xiàn)
多機通信時,可以通過域ID對節(jié)點進行分組,組內(nèi)的節(jié)點之間可以自由通信,不同組之間的節(jié)點則不可通信。如果所有節(jié)點都屬于同一組,那么直接使用默認域ID即可,如果要將不同節(jié)點劃分為多個組,那么可以在終端中啟動節(jié)點前設(shè)置該節(jié)點的域ID(比如設(shè)置為6),具體執(zhí)行命令為:
export ROS_DOMAIN_ID=6
上述指令執(zhí)行后,該節(jié)點將被劃分到ID為6的域內(nèi)。
如果要為當(dāng)前設(shè)備下的所有節(jié)點設(shè)置統(tǒng)一的域ID,那么可以執(zhí)行如下指令:
echo "export ROS_DOMAIN_ID=6" >> ~/.bashrc
執(zhí)行完畢后再重新啟動終端,運行的所有節(jié)點將自動被劃分到ID為6的域內(nèi)。
演示
注意
在設(shè)置ROS_DOMAIN_ID的值時并不是隨意的,也是有一定約束的:
建議ROS_DOMAIN_ID的取值在[0,101] 之間,包含0和101;
每個域ID內(nèi)的節(jié)點總數(shù)是有限制的,需要小于等于120個;
如果域ID為101,那么該域的節(jié)點總數(shù)需要小于等于54個。
DDS 域 ID 值的計算規(guī)則
域ID值的相關(guān)計算規(guī)則如下:
DDS是基于TCP/IP或UDP/IP網(wǎng)絡(luò)通信協(xié)議的,網(wǎng)絡(luò)通信時需要指定端口號,端口號由2個字節(jié)的無符號整數(shù)表示,其取值范圍在[0,65535]之間;
端口號的分配也是有其規(guī)則的,并非可以任意使用的,根據(jù)DDS協(xié)議規(guī)定以7400作為起始端口,也即可用端口為[7400,65535],又已知按照DDS協(xié)議默認情況下,每個域ID占用250個端口,那么域ID的個數(shù)為:(65535-7400)/250 = 232(個),對應(yīng)的其取值范圍為[0,231];
操作系統(tǒng)還會設(shè)置一些預(yù)留端口,在DDS中使用端口時,還需要避開這些預(yù)留端口,以免使用中產(chǎn)生沖突,不同的操作系統(tǒng)預(yù)留端口又有所差異,其最終結(jié)果是,在Linux下,可用的域ID為[0,101]與[215-231],在Windows和Mac中可用的域ID為[0,166],綜上,為了兼容多平臺,建議域ID在[0,101] 范圍內(nèi)取值。
每個域ID默認占用250個端口,且每個ROS2節(jié)點需要占用兩個端口,另外,按照DDS協(xié)議每個域ID的端口段內(nèi),第1、2個端口是Discovery Multicast端口與User Multicast端口,從第11、12個端口開始是域內(nèi)第一個節(jié)點的Discovery Unicast端口與User Unicast,后續(xù)節(jié)點所占用端口依次順延,那么一個域ID中的最大節(jié)點個數(shù)為:(250-10)/2 = 120(個);
特殊情況:域ID值為101時,其后半段端口屬于操作系統(tǒng)的預(yù)留端口,其節(jié)點最大個數(shù)為54個。
上述計算規(guī)則了解即可。
附:



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