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文件指定以下参数:
<launch>
<node pkg="rosserial_python" type="serial_node.py" name="serial_node">
<param name="port" value="/dev/ttyACM1"/>
<param name="baud" value="115200"/>
</node>
</launch>
1.2 rosserial_server
rosserial_server功能包包含主机端rosserial连接的C ++实现。它会自动处理已连接的启用rosserial的设备的设置,发布和订阅。
这些节点使用topic_tools/ShapeShifter元消息来重新发布来自客户机的消息,而不必在编译时了解它们。这种方法的惟一警告是服务器没有消息的完整文本定义(因为它不是存储在客户端或部分rosserial协议中)。它使用rosserial_python功能包中的message_info_service.py节点提供的辅助服务,该服务允许C ++驱动程序查找消息定义和散列字符串,而这些消息定义和散列字符串在编译时是未知的,从而使其可以完全发布来自微控制器的话题。
rosserial_server提供serial_node和socket_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 <string>
#include <stdio.h>
#include "ros.h"
#include <geometry_msgs/Twist.h>
#include <std_msgs/String.h>
#include <windows.h>
#include <iostream>
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";
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应用程序,可以看到订阅话题中的消息:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191027231307730.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NjeDgzNzY4NTAwMg==,size_16,color_FFFFFF,t_70)
同样,在ROS侧也可以看到Windows应用发布的消息:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191027232203307.bmp?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NjeDgzNzY4NTAwMg==,size_16,color_FFFFFF,t_70)
4 rosserial的限制
虽然rosserial可以让非ROS设备轻松的与ROS节点通信,但是它也存在一些限制:
- 发布者和订阅者的数量限制为25;
- 序列化和反序列化缓冲区的大小限制为512字节,即ROS消息的大小必须小于512字节;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)