rosserial简介

rosserial是用于非ROS设备与ROS设备进行通信的一种协议。它为非ROS设备的应用程序提供了ROS节点和服务的发布/订阅功能,使在非ROS环境中运行的应用能够通过串口或网络能够轻松地与ROS应用进行数据交互。

rosserial分为客户端服务器两部分。rosserial客户端运行在运行在没有安装ROS的环境的应用中,通过串口或网络与运行在ROS环境中的rosserial服务器连接,并通过服务器节点在ROS中发布/订阅话题。

1 rosserial服务器

rosserial服务器是运行在ROS设备中的一个节点,作为串行协议和ROS网络的连接。rosserial服务器有C++和Python两种语言的实现。

1.1 rosserial_python

rosserial_python是一个基于python的rosserial协议实现。它包含主机端rosserial连接的Python实现,能够自动处理连接的支持rosserial的设备的设置、发布和订阅(注意:需要安装pyserial才能使用)。

rosserial_python功能包的serial_node.py节点,与启用了rosserial的设备通过串口通信。该节点根据存储在设备中的配置信息自动启动订阅者和发布者。要使节点以指定的波特率与指定的串口设备连接,例如在/dev/ttyACM1,则必须在命令行上指定参数:

rosrun rosserial_python serial_node.py _port:=/dev/ttyACM1 _baud:=115200

也可以通过launch文件指定以下参数:


  "rosserial_python" type="serial_node.py" name="serial_node">
    "port" value="/dev/ttyACM1"/>
    "baud" value="115200"/>
  

1.2 rosserial_server

rosserial_server功能包包含主机端rosserial连接的C ++实现。它会自动处理已连接的启用rosserial的设备的设置,发布和订阅。

这些节点使用topic_tools/ShapeShifter元消息来重新发布来自客户机的消息,而不必在编译时了解它们。这种方法的惟一警告是服务器没有消息的完整文本定义(因为它不是存储在客户端或部分rosserial协议中)。它使用rosserial_python功能包中的message_info_service.py节点提供的辅助服务,该服务允许C ++驱动程序查找消息定义和散列字符串,而这些消息定义和散列字符串在编译时是未知的,从而使其可以完全发布来自微控制器的话题。

rosserial_server提供serial_nodesocket_node两个节点,分别用于串口连接和网络套接字连接。建议的用法是在消息信息节点侧启动主服务器节点。提供了启动文件以启动串行链接。服务器节点的启动方法如下:

roslaunch rosserial_server serial.launch port:=/dev/ttyUSB0

同样可以使用launch文件启动socket节点,其默认监听端口为11411:

roslaunch rosserial_server socket.launch

目前,rosserial_server正在实验中。它缺少rosserial_python提供的节点的关键功能,包括参数,日志记录和服务。如果您需要这些功能,请暂时使用标准的Python服务器。

2 rosserial客户端

rosserial_client包含通用的客户端rosserial实现,它主要为是微控制器设计的。客户端库使用户可以轻松地启动ROS节点并在各种系统上运行。这些客户端是常规ANSI C ++ rosserial_client库的端口。当前,这些软件包包括:

  • rosserial_arduino
  • rosserial_embeddedlinux
  • rosserial_windows
  • rosserial_mbed
  • rosserial_tivac
  • rosserial_vex_v5
  • rosserial_vex_cortex
  • rosserial_stm32
  • ros-teensy

3 示例:与Windows平台通信

Windows应用程序通常是通过socket与rosserial服务器建立连接,实现过程如下。

3.1 生成ros_lib

首先,在ROS侧安装rosserial-server和rosserial-windows,用安装的ROS版本名替代,如melodic:

sudo apt-get install ros-<distro>-rosserial-windows
sudo apt-get install ros-<distro>-rosserial-server

然后运行如下命令生成ros_lib:

rosrun rosserial_windows make_libraries.py my_library

此步骤将生成Visual Studio项目中与ROS主设备对话所需的代码。需要提将my_library目录下的ros_lib文件夹复制到VS工程中。

3.2 将ros_lib添加到VS工程中

将ros_lib文件夹拷贝到VS工程路径下,并VS工程中添加以下文件:

  • ros.h
  • duration.cpp
  • time.cpp
  • WindowsSocket.h
  • WindowsSocket.cpp

3.3 编写客户端代码

向ROS发布和订阅消息的示例代码如下:

#include 
#include 
#include "ros.h"
#include 
#include 
#include 

#include 

using std::string;

void chatter_callback(const std_msgs::String &msg)
{
    std::cout << strlen(msg.data) << std::endl;
}

int main(int argc, char* argv[])
{
    ros::NodeHandle nh;
    char *ros_master = "192.168.124.4";  // 运行rosseial服务器节点的主机IP

    printf("Connecting to server at %s\n", ros_master);
    nh.initNode(ros_master);

    printf("Advertising cmd_vel message\n");
    std_msgs::String string_msg;
    ros::Subscriber<std_msgs::String> chatter_sub("topic1", &chatter_callback);
    nh.subscribe(chatter_sub);
    ros::Publisher chatter_pub("topic2", &string_msg);
    
    while (1)
    {
        string_msg.data = "message from Windows";
        chatter_pub.publish(&string_msg);

        nh.spinOnce();
        Sleep(500);
    }

    printf("All done!\n");
    return 0;
}

:使用“ init_node”连接到ROS主机。 格式为“主机名:端口”。 如果未指定,则默认端口为11411。

3.4 运行节点

首先,在ROS侧启动roscore节点和socket_node节点:

roscore
rosrun rosserial_server socket_node

然后,运行Widnows应用程序,可以看到订阅话题中的消息:
rosserial简介_第1张图片
同样,在ROS侧也可以看到Windows应用发布的消息:
rosserial简介_第2张图片

4 rosserial的限制

虽然rosserial可以让非ROS设备轻松的与ROS节点通信,但是它也存在一些限制:

  • 发布者和订阅者的数量限制为25;
  • 序列化和反序列化缓冲区的大小限制为512字节,即ROS消息的大小必须小于512字节;

你可能感兴趣的:(ROS)