dds通信协议原理详解,Dds通信
0.前言我们都知道ROS2比ROS1好很多。例如:
去中心化主节点、ROS和ROS2中间件的区别在于ROS2取消了主节点。去中心化后,所有节点都可以通过DDS节点发现彼此,所有节点都是平等的,可以一对一、一对n、n对n地相互通信。
不是制造通信的轮子,而是直接用DDS代替通信。通信采用DDS通信,增强了ROS2的可实现性、可靠性和连续性。
同时,ROS2中还有许多新功能:
用Python写的启动文件支持多机器人协同通信,支持安全加密通信,支持多个节点使用ament管理数据包,支持Qos服务质量,支持节点生命周期管理的高效进程间通信,我们发现这些特性都是基于通信方式从TCP/IP到DDS的改变,所以本文想带大家了解一下ROS2 DDS做了什么。
1.多机通信DDS DDS是很多公司执行的工业标准,比如RTI的实现Connext和eProsima的实现Fast RTPS。ROS2支持多种实现。在选择DDS实现时,要考虑很多方面:法律上要考虑协议,技术上要考虑是否支持跨平台。不同的公司可能会提出多种DDS实施方案,以适应不同的场景。例如,RTI有许多用于不同目的的上下文变体。
基于DDS域ID,一个物理网络被划分为多个逻辑网络。ROS 2节点可以被自由发现并通信,在不同域中则不能互通同域。默认情况下,所有ROS 2节点都使用域ID 0。为了避免消息混淆,在网络中运行ROS 2的不同组中的设备应该使用不同的域id。ROS _ domain _ ids有两种(短版本/长版本)。正常使用建议short version,在[0, 101]之间进行选择。long version则可以在[0, 232]之间进行选择。
每个ROS节点被称为DDS中的一个参与者。为计算机上运行的每个ROS 2进程创建一个DDS“参与者”。因为每个DDS参与者将占用计算机上的两个端口,所以在一台计算机上运行120多个ROS 2进程可能会溢出到其他域id或临时端口。
所以我们需要控制节点的数量或者用一个进程控制多个节点来避免溢出。
设置domain id是分别在两个虚拟机中执行下面的指令(最好写成bashrc,当然不固定的除外)
Echo exportros _ domain _ id=1 ~/。bashrc # exportros _ domain _ id=1 2。中间件RMW需要一个ROS中间件(RMW软件包),以便能够在ROS2中使用DDS实现,这个包需要利用DDS程序提供的API和工具实现ROS中间件的接口。对于ROS2中使用一个DDS实现,有大量的工作需要做。但是为了防止ROS2的代码过于绑定某种DDS程序必须支持至少几种DDS程序。
和c Python节点都支持环境变量RMW实现,允许用户在运行ROS 2应用程序时选择要使用的RMW实现。
下面是ROS2常用的RMW中间件。
我们还展示了更换不同RMW编译的操作。
FastDDS: cycloneDDS已默认编译:RTI Connext Sudo Apt Install RTI-Connext-DDS-5 . 3 . 1 # Do export RTI _ license _ file=/opt/RTI . com/RTI _ Connext _ DDS-5 . 3 . 1/RTI _ license . datsource/opt/RTI . com/RTI _ Connext _ DDS-5 . 3 . 1/setenv _ ROS 2 RTI . bash执行
FastDDS:默认使用Cyclone DDS export RMW _ implementation=RMW _ Cyclone DDS _ CPP #然后执行ros2 run #或rmw _ implementation=rmw _ Cyclone DDS _ CP pros 2 run等命令.RTI Connext Export RTI _ license _ file=/Opt/RTI . com/RTI _ Connext _ DDS-5 . 3 . 1/RTI _ license.datsource/Opt/RTI . com/RTI _ Connext _ DDS-5 . 3 . 1/setenv _ ROS 2 RTI . bash Export rmw _ implementation=rmw _ Connext _ CPP #然后执行ros2 run #或rmw _ implementation=rmw _ Connext _ CP pros 2 run等命令.3.安全加密SROS加密安全只是在作者张relay的文章中提到过,并没有太多的介绍。而我们如何加密我们的通信,体现在ROS上,这次正好是一个DDS通信漫谈。我们也一起讨论一下这一块。网络信息安全对于多机器人系统非常重要。
当从源代码编译时,需要打开对fastrpts的安全支持。
col build-symlink-install-cmake-args-d security=on以创建密钥库
ros2安全创建密钥库演示密钥为空谈者和听众两个结节创建键和证书
ros2安全性create _ key demo _ keys/talkers 2安全性创建密钥演示密钥/监听器有可能你会遇到如下错误
lxml.etree.XMLSchemaParseError:属性用法(未知),属性“ref”:QName值“{ http://www。w3。org/XML/1998/namespace } base "未解析为(名词)属性声明。第34行修正这个问题如下
修改sros2的代码
CD ROS 2 _ ws/src/ROS 2/sros 2/sros 2/sros 2/policy/schemas wget http://www.w3.org/2001/03/xml.xsd #下载xml.xsdvim policy.xsd#修改如下@@ -4,7 4,7 @ @ xmlns:XML= http://www。w3。org/XML/1998/namespace elementFormDefault= qualified attributeFormDefault= unqualified xs:import namespace= http://www .w3。架构位置= 3http://www。w3。org/2001/03/XML。xsd“/schema location=”XML。xsd /…详情请参照古月居
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。