rosserial是用于非ROS设备与ROS设备进行通信的一种协议。它为非ROS设备的应用程序提供了ROS节点和服务的发布/订阅功能,使在非ROS环境中运行的应用能够通过串口或网络能够轻松地与ROS应用进行数据交互。
rosserial分为客户端和服务器两部分。rosserial客户端运行在运行在没有安装ROS的环境的应用中,通过串口或网络与运行在ROS环境中的rosserial服务器连接,并通过服务器节点在ROS中发布/订阅话题。
rosserial服务器是运行在ROS设备中的一个节点,作为串行协议和ROS网络的连接。rosserial服务器有C++和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"/>
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服务器。
rosserial_client包含通用的客户端rosserial实现,它主要为是微控制器设计的。客户端库使用户可以轻松地启动ROS节点并在各种系统上运行。这些客户端是常规ANSI C ++ rosserial_client库的端口。当前,这些软件包包括:
Windows应用程序通常是通过socket与rosserial服务器建立连接,实现过程如下。
首先,在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工程中。
将ros_lib文件夹拷贝到VS工程路径下,并VS工程中添加以下文件:
向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。
首先,在ROS侧启动roscore节点和socket_node节点:
roscore
rosrun rosserial_server socket_node
然后,运行Widnows应用程序,可以看到订阅话题中的消息:
同样,在ROS侧也可以看到Windows应用发布的消息:
虽然rosserial可以让非ROS设备轻松的与ROS节点通信,但是它也存在一些限制: