大家好,我是努力Work 的小鱼,最近在探索 ROS 2 在 IOT 上的可能行,分享几篇来自 micro-ROS 相关的文章。
microROS 和 rosserial 对比
在ROS中,有一个包在通过串行通信发送ROS消息时非常突出。这个包就是rosserial。
rosserial允许基于微控制器的平台与普通计算机通信,代表它们与ROS网络通信。
rosserial提供了设置这种通信的协议,采用了客户端-服务器架构方法。
rosserial客户端将数据序列化到串行链接中,然后串行化的数据被rosserial服务器接收,并转发到常规的ROS网络。
从ROS网络向微控制器转发数据也是类似的过程。
这个rosserial服务器可以用C++或Python编写;而rosserial客户端有一系列支持的微处理器可用。
这个解决方案通常用于将硬件组件集成到使用ROS的机器人中。
在这些情况下,rosserial充当了硬件通信协议与ROS网络之间的桥梁。
Micro XRCE-DDS
Micro XRCE-DDS的一个功能是在微控制器和支持DDS/ROS 2的计算机之间使用串行连接。
这种连接得益于使用OMG的DDS-XRCE标准和一个串行传输层。
这个解决方案采用了与rosserial相同的客户端-服务器架构,这是在微控制器通信方面最合适的方法之一。
负责实现这种架构的库是Client和Agent。
客户端在代理中生成实体,这些实体将代表客户端在DDS网络上进行操作。
正如你所见,这种用法类似于rosserial所使用的用法,但它们在实现上有微妙的差别,我们将在本文中详细说明。
Micro XRCE-DDS vs rosserial
现在我们对rosserial和Micro XRCE-DDS有了基本的了解,接下来我们将对它们进行比较。
Micro XRCE-DDS的串行传输
Micro XRCE-DDS在使用串行传输时(它也允许使用其他传输方式,如UDP、TCP等),采用了预定义格式的串行协议。
该格式在以下帧解析中进行了说明:
0 8 16 24 40 X X+16
+--------+--------+--------+--------+--------+--------//--------+--------+--------+
| FLAG | SADD | RADD | LEN | PAYLOAD | CRC |
+--------+--------+--------+--------+--------+--------//--------|--------+--------+
FLAG
: 同步标志 (0xFF)。SADD
: 源地址。RADD
: 远程地址。LEN
: 未进行帧处理的有效载荷长度(小尾端的2字节)。PAYLOAD
: 带有XRCE头的序列化消息。CRC
: 经过填充后的消息CRC。
这是在链路层上进行串行化的消息。
这个消息通过发布和订阅两种不同的操作,从微控制器到计算机以及反向传输。
Micro XRCE-DDS vs rosserial
rosserial
相比之下,这是rosserial的帧结构:
0 8 16 32 40 56 X X+16
+-------+-------+-------+-------+-------+-------+-------+-------//-------+------+------+
| FLAG | PROT | LEN | LCRC | TOPID | PAYLOAD | MCRC |
+-------+-------+-------+-------+-------+-------+-------+-------//-------|------+------+
FLAG
: 同步标志 (0xFF).PROT
: 协议版本.LEN
: 载荷长度 (2 bytes,小端序).LCRC
: 长度 CRC.TOPID
: 主题 ID.PAYLOAD
: 序列化消息.MCRC
: 消息 CRC.
与Micro XRCE-DDS串行帧进行比较,可以看到它使用了完全不同的帧结构。
比较
以下表格总结了两种实现的关键方面:
Micro XRCE-DDS 串行 | rosserial | |
---|---|---|
API | C/C++ | C++ |
完整性 | HDLC 帧格式 | 无 |
安全性 | CRC-16-CCITT | 模糊的 CRC (% 256) |
内存拷贝 | uxr_stream —> serial_buffer —> hardware_buffer | serialization_buffer —> hardware_buffer |
内存使用 | uxr_stream + (2 * aux-buffer[42 B]) | 2 * serialization_buffer |
消息大小限制 | uxr_stream 大小 | hardware_buffer 大小 |
可靠性 | 是 | 否 |
路由 | 是 | 否 |
开销 | 7 B + 12 B* | 9 B |
架构 | 客户端-服务器 | 客户端-服务器 |
* 开销分为帧格式 7 B 和 DDS-XRCE 协议增加的 12 B.
正如表中所述,Micro XRCE-DDS 串行增加了内存操作次数,但极大地减少了串行通信所需的内存,因为硬件缓冲区不需要与序列化缓冲区大小相同。
这种缓冲区的使用减少了内存占用。
此外,Micro XRCE-DDS 串行提供了路由和可靠性功能,而rosserial则不提供。
DDS-XRCE 协议在某些部分采用了标准,如使用标准 CRC 或标准帧格式。
小鱼补充:HDLC
高级数据链路控制(High-Level Data Link Control或简称HDLC),是一个在同步网上传输数据、面向比特的协议的数据链路层协议,它是由国际标准化组织制订的。
国际电信联盟已把HDLC规程引入到X.25协议栈。HDLC是修改自IBM的SDLC,后者作为数据链路层协议用于IBM自己开发的系统网络架构(SNA)。现在HDLC作为同步点对点协议(PPP)的基础已经被用于很多服务中来接入广域网,通常最常见的是因特网。
HDLC的帧格式规定以01111110(十六进制7E)的位组合作为它的起始和结束的标志,这种位组合也被称为帧界定符。
在HDLC的帧格式中,在起始标志后的是地址字段和控制字段,然后是长度在0到5000八位位组(octet)的数据字段和帧检验序列字段(FCS),最后是作为结束标志的帧界定符。一点需要指出的是,当暂时没有信息传送时,帧界定符被连续地发送直到下一次数据发送为止,产生如下图的连续比特流:
01111110011111100111111001111110
______ ______ ______ ______
_ __ __ __ _
这种方法被用于调制解调器,通过锁相环(phase-locked loop)来训练时钟同步。