rosserial是一种ROS串行通信协议,通过串行传输介质实现ROS的P2P通信。这种协议通过简单的添加包头和包尾可以实现了多主题或者服务共享串行通信介质(如串口,网络socket)。
1st Byte - Sync Flag (Value: 0xff) 2nd Byte - Sync Flag / Protocol version 3rd Byte - Message Length (N) - Low Byte 4th Byte - Message Length (N) - High Byte 5th Byte - Checksum over message length 6th Byte - Topic ID - Low Byte 7th Byte - Topic ID - High Byte N Bytes - Serialized Message Data Byte N+8 - Checksum over Topic ID and Message Data
不同ROS发行版对应不同协议版本字段定义(0xff:ROS Groovy, 0xfe on ROS Hydro, Indigo, and Jade.)。
Topics ID 0-100为系统功能专用主题使用, 这些主题类似于消息 rosserial_msgs/TopicInfo 中定义的那些特定主题。
长度和data的checksum字段用于确保包的完整性,data的checksum可以按照如下公式计算:
255 - ( (Topic ID Low Byte + Topic ID High Byte + data byte values) % 256)
在数据传输之前,PC/平板一侧必须先向Arduino或者其它嵌入式设备发送主题查询请求,确定将要发送或者订阅的主题的名字和消息类型。
主题协商由主题查询请求,响应和主题定义组成。主题查询请求使用的topic ID为0。
主题查询请求类似于如下所示:
0xff 0xfe 0x00 0x00 0xff 0x00 0x00 0xff
主题查询响应包 (消息类型为rosserial_msgs/TopicInfo) 包含了特定主题信息,使用如下的数据信息:
uint16 topic_id string topic_name string message_type string md5sum int32 buffer_size
上面的topic_name是主题名称,如 "cmd_vel", message_type是消息类型,如"geometry_msgs/Twist"。
注意:如果响应包未收到,查询会重发。
相互之间的时间同步通过发送消息 std_msgs::Time实现。 嵌入式设备可以向PC/平板发送空的时间消息获取当前时间,响应返回的时间可以用于时间同步(检查时钟偏差)。
通过这些库用户可以方便的让ROS节点在各种系统上启动和运行。下面这些库是通用ANSI C++ rosserial_client 库的具体化,目前包括如下:
rosserial_arduino |
Arduino, especially UNO and Leonardo |
rosserial_embeddedlinux |
support for Embedded Linux (eg, routers) |
rosserial_windows |
support for communicating with Windows applications |
rosserial_mbed |
support for mbed platforms |
rosserial_tivac |
support for TI's Launchpad boards, TM4C123GXL and TM4C1294XL |
运行rosserial的众多设备需要通过在主机上运行的节点来把它们桥接起来,接入更广的ROS网络拓扑。
rosserial_python |
A Python-based implementation (recommended for PC usage). |
rosserial_server |
A C++ implementation based on the ShapeShifter message, some limitations compared to rosserial_python but recommended for high-performance applications. |
rosserial_java |
A Java-based implementation. This implementation is only recommended when you need a Java OSGI based rosserial module or when you want to use rosserial with the Android ADK. |