日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > ChatGpt >内容正文

ChatGpt

ROS2学习(五).ROS概念 - ROS_DOMAIN_ID

發布時間:2023/12/15 ChatGpt 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ROS2学习(五).ROS概念 - ROS_DOMAIN_ID 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

ROS_DOMAIN_ID

  • domain ID的選擇
  • Domain Participant
  • 端口號的計算[^2]
    • 例一
    • 例二
  • 平臺限制
  • 參與者限制
    • domain端口重疊
    • 平臺預留端口重疊
  • 參考

ROS2 默認使用的通信中間件是DDS。
DDS基于Domain ID在一個物理網絡內切分為若干邏輯網絡。
在同一域(domain)中的ROS 2節點可以被自由發現并通信,在不同域中則不能互通。
所有的ROS 2節點默認使用domain ID 0。
為避免消息混淆,同網絡內運行ROS 2的不同組的設備應該使用不同的domain ID1

domain ID的選擇

ROS_DOMAIN_ID有兩種(short version / long version)。
正常使用推薦short version,在[0, 101]之間進行選擇即可。
long version則可以在[0, 232]之間進行選擇。

Domain Participant

每個ROS節點在DDS中被稱為參與者(participant)。默認情況下,每個Domain Participant需要打開四個UDP/IP端口:其中兩個端口是組播端口,在同一個DomainId的所有Domain Participant之間共享;另外兩個是單播端口,對于計算機中的每個參與者都不相同。
根據DDS-RTPS規范,用于發現的組播的IP地址默認為239.255.0.1。

端口號的計算2

在DDS中,端口號由DDS的domain ID以及通信域中的參與者數量決定。包括:
Multicast Ports (通常用于基于同一domainID的所有應用的廣播通信):

DiscoveryMulticastPort = PB + DG * domainId + d0
UserMulticastPort = PB + DG * domainId + d2

Unicast Ports (對每個參與者不同,用于點對點通信):

DiscoveryUnicastPort = PB + DG * domainId + d1 + PG * participantId
UserUnicastPort = PB + DG * domainId + d3 + PG * participantId

上述公式依賴于兩個變量 domainId和participantId

domainId DDS的Domain ID participantId 從0開始的的參與者的編碼,在一個操作系統(虛擬機或者實際的計算機)內進行排序給出;第一個參與者為0,第二個為1,以此類推。

公式還涉及到一些常量,遵循OMG的DDS-RTPS標準,常量如下:

d0 (builtin_multicast_port_offset) = 0
d2 (user_multicast_port_offset) = 1
d1 (builtin_unicast_port_offset) = 10
d3 (user_unicast_port_offset) = 11
PB (port_base) = 7400
DG ( domain_id_gain) = 250
PG (participant_id_gain) = 2

注意:
按照上述公式,我們可以算出當participant Id到達120時,兩個UnicastPort會與下一個domain ID的MulticastPort重疊,我們在使用時要注意ID的重疊情況。
如果您不能確定局域網內的domainId的情況,請不要在一個Domain中使用超過120個[0, 119]的節點。

例一

在domainId=0下進行運行,如果我們的計算機中有兩個參與者,則使用的端口如下:
所有節點共用

DiscoveryMulticastPort = 7400
UserMulticastPort = 7401

第一個ROS節點

DiscoveryUnicastPort = 7410
UserUnicastPort = 7411

第二個ROS節點

DiscoveryUnicastPort = 7412
UserUnicastPort = 7413

例二

如果我們在domainId=0上進行通信,那么UDP端口范圍[7400, 7649]將可以映射到各參與者使用。
其中7400是participantId=0使用的最低端口,7649是participantId=119使用的最高端口。
如果我們再domainId=10上通信,那么相應的UDP端口范圍則為[9900, 10149]。

平臺限制

基于上述,為了使DDS在不同系統中獲得兼容性,選擇域ID時應遵循附加于平臺的一些約束。特別要注意避免在操作系統的臨時端口范圍分配domain Id,從而避免ROS 2節點使用的端口與計算機上其他網絡服務沖突。

Linux

默認情況下,Linux內核使用端口32768-60999作為臨時端口。
這意味我們可以安全地使用的domain id范圍是[0-101]和[215-232]。
當然,如果有需要,在Linux中,可以通過在/proc/sys/net/ipv4/ip_local_port_range中調整臨時端口范圍。

macOS

默認情況下,macOS上的臨時端口范圍為49152 ~ 65535。
這意味著可以安全地使用的domain id的范圍是[0-166]。
通過設置net.inet.ip.portrange.first和net.inet.ip.portrange.last的自定義sysctl值,可以在macOS中配置臨時端口范圍。

Windows

Windows系統默認的臨時端口范圍與macOS一致,為49152 ~ 65535。
這意味著可以安全地使用的domain id的范圍是[0-166]。
臨時端口范圍可以在Windows中使用netsh進行配置。 如果使用自定義臨時端口范圍,則可能需要相應地調整上述數字。

基于上述限制,若我們要構建跨平臺的ROS網絡,則可選擇的domain ID范圍應該是[0, 101]。

參與者限制

對計算機上運行的每個ROS 2節點,將創建一個DDS participant。

domain端口重疊

由于每個DDS參與者都使用了計算機上的兩個端口,因此在一臺計算機上運行超過120個ROS 2進程可能會溢出到其他域id所對應的端口,或系統臨時端口。

例如,我們考慮domain ID 1和2:

  • Domain ID 1使用端口7650和7651作為組播使用;
  • Domain ID 2使用端口7900和7901作為組播使用;
  • domain ID 1的0號參與者,使用端口7660和7661作為單播使用;
  • domain ID 1的119號參與者,使用端口7898和7899作為單播使用;
  • domain ID 1的120號參與者,使用端口7900和7901作為單播使用;這兩個端口同domain ID 2組播使用的端口沖突了。

當然,若我們在計算機上一次僅使用一個domain ID,且這個domain ID取的是一個較小的值,那么我們就可以使用超過120個的ROS2節點。

平臺預留端口重疊

當我們選擇了一個接近平臺限制上限的domain ID,那么我們需要考慮一些額外的限制。

例如,我們考慮在Linux平臺上使用domain ID 101

  • 0號ROS 2參與者將會使用端口32650, 32651, 32660和32661;
  • 1號ROS 2參與者將會使用端口32650, 32651, 32662和32663;
  • 53號ROS 2參與者將會使用端口32650, 32651, 32766和32767;
  • 54號ROS 2參與者將會使用端口32650, 32651, 32768和32769;此時,這里用到的端口就同平臺的預留端口沖突了。

因此,在Linux上,當我們使用domain ID 101時,最多只能使用54個ROS2 節點。
在macOS和Windows上也是同樣的情況,僅僅是數字可能不同。當我們選擇domain ID 166時,ROS 2的最大進程數不要超過120,以免同預留端口沖突。

參考


  • The ROS_DOMAIN_ID ??

  • Ports used by DDS Discovery ??

  • 總結

    以上是生活随笔為你收集整理的ROS2学习(五).ROS概念 - ROS_DOMAIN_ID的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。