大家好,我是努力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),最后是作为结束标志的帧界定符。一点需要指出的是,当暂时没