rosserial通信协议简介

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/x_r_su/article/details/52734403

1 概述   

    rosserial是一种ROS串行通信协议,通过串行传输介质实现ROS的P2P通信。这种协议通过简单的添加包头和包尾可以实现了多主题或者服务共享串行通信介质(如串口,网络socket)。

2 协议包格式

 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)

3 主题协商

    在数据传输之前,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"。

     注意:如果响应包未收到,查询会重发。

  4 同步

    相互之间的时间同步通过发送消息 std_msgs::Time实现。 嵌入式设备可以向PC/平板发送空的时间消息获取当前时间,响应返回的时间可以用于时间同步(检查时钟偏差)。

 

5 rosserial相关包

5.1 客户端库

    通过这些库用户可以方便的让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


5.2 ROS厕接口

    运行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.


阅读更多
换一批

没有更多推荐了,返回首页