rosserial_windows对rosserial_client在wondows系统运行提供了特定的扩展支持,它会生成一个含有头文件和若干cpp文件的包,使用中你需要将这些文件添加到你的visual studio工程来实现Windows和ROS 运行系统之间的通信(通常是基于TCP socket)。
以下是该包常用使用场景介绍:
1 借助rosserial_windows从Windows发布消息给ROS节点管理器
1.1 简介
由于Windows系统能够支持很多其它系统(如Ubuntu)不能支持的软件或者应用 ,如果我们期望运行在Ubuntu系统的ROS能够使用这些Windows的特有功能,我们可以借助rosserial_windows来架起一座通信桥梁。将rosserial_windows生成的文件添加到windows的visual studio中可以开发应用实现在windows系统收发ROS消息。一般流程如下:
1)在ROS运行系统生成生成ros_lib
2)将ros_lib加入到windows的Visual Studios
3)在windows端调用ros_lib创建可以连接到ROS master并收发消息的应用
4)在ROS master端运行rosserial_server
5)启动3)中生成的Windows 应用
下面提供以上步骤的一个实例验证。
1.2 创建ros_lib
1.2.1 安装rosserial_windows和rosserial server
sudo apt-get install ros-hydro-rosserial-windows sudo apt-get install ros-hydro-rosserial-server
1.2.2 生成ros_lib
这一步将生成用于和ROS master通信的代码,这些代码需要添加到windows的visual studio中。
rosrun rosserial_windows make_libraries.py my_library
1.3 添加ros_lib到visual studio工程
Note:以下说明基于Visual Studio 2013 Express Desktop
1.3.1 按照如下步骤创建win32 console应用
1)打开Visual Studio
2)文件 -> 新建Project
3)在Installed -> Templates -> Visual C++ -> Win32下找到Win32 Console应用
4)给项目取名,如rosserial_hello_world
5)保留预编译头文件
1.3.2 拷贝ros_lib文件夹到rosserial_hello_world文件夹下,拷贝后文件夹结构如下:
rosserial_hello_world/
WindowsSocket.cpp
ReadMe.txt
WindowsSocket.h
WindowsSocket.cpp
1)右键点击rosserial_hello_world项目,选择最下角的“属性”
2)在C/C++的选项中,点击“添加包含目录”,ros_lib的路径添加到目录中
1.3.3 向ros master发送命令示例代码
向ros master发布cmd_vel消息,让机器人前进并旋转。
1 // rosserial_hello_world.cpp : Example of sending command velocities from Windows using rosserial
2 //
3 #include "stdafx.h"
4 #include
5 #include
6 #include "ros.h"
7 #include
8 #include
9
10 using std::string;
11
12 int _tmain (int argc, _TCHAR * argv[])
13 {
14 ros::NodeHandle nh;
15 char *ros_master = "1.2.3.4"; /*changed to ros master IP*/
16
17 printf ("Connecting to server at %s\n", ros_master);
18 nh.initNode (ros_master);
19
20 printf ("Advertising cmd_vel message\n");
21 geometry_msgs::Twist twist_msg;
22 ros::Publisher cmd_vel_pub ("cmd_vel", &twist_msg);
23 nh.advertise (cmd_vel_pub);
24
25 printf ("Go robot go!\n");
26 while (1)
27 {
28 twist_msg.linear.x = 5.1;
29 twist_msg.linear.y = 0;
30 twist_msg.linear.z = 0;
31 twist_msg.angular.x = 0;
32 twist_msg.angular.y = 0;
33 twist_msg.angular.z = -1.8;
34 cmd_vel_pub.publish (&twist_msg);
35
36 nh.spinOnce ();
37 Sleep (100);
38 }
39
40 printf ("All done!\n");
41 return 0;
42 }
为了让windows端的rosserial_windows能够和ROS master通信,我们需要在ROS master一侧启动一个server来建立连接。示例中我们采用TCP建立连接,理论上也可以用串口建立连接。运行命令如下:
roscore
rosrun rosserial_server socket_node
rostopic echo /cmd_vel
1.3.5 windows端运行应用
如果你在gazebo中有一个机器人模拟器,你可以看到机器人按照你从windows端发来的命令在运动。
2 借助rosserial_windows在windows系统接收消息
2.1 使用回调函数
接收消息与发送消息相比稍微复杂一点。需要告知节点句柄收到消息时候应该做什么,为此我们需要使用一个回调函数来完成做什么。
比如说我们希望接收机器人位姿消息,当收到后将其打印出来。 void estimated_pose_callback (const geometry_msgs::PoseWithCovarianceStamped & pose)
{
printf ("Received pose %f, %f, %f\n", pose.pose.pose.position.x,
pose.pose.pose.position.y, pose.pose.pose.position.z);
}
回调函数注册方法如下:
ros::Subscriber < geometry_msgs::PoseWithCovarianceStamped >
poseSub ("estimated_pose", &estimated_pose_callback);
nh.subscribe (poseSub);
2.2 接收消息
while (1)
{
nh.spinOnce ();
Sleep (100);
}
#include "stdafx.h"
2 #include
3 #include
4 #include "ros.h"
5 #include
6 #include
7
8 using std::string;
9
10 void estimated_pose_callback (const geometry_msgs::PoseWithCovarianceStamped & pose)
11 {
12 printf ("Received pose %f, %f, %f\n", pose.pose.pose.position.x,
13 pose.pose.pose.position.y, pose.pose.pose.position.z);
14 }
15
16 int _tmain (int argc, _TCHAR * argv[])
17 {
18 ros::NodeHandle nh;
19 char *ros_master = "1.2.3.4";
20
21 printf ("Connecting to server at %s\n", ros_master);
22 nh.initNode (ros_master);
23
24 ros::Subscriber < geometry_msgs::PoseWithCovarianceStamped >
25 poseSub ("estimated_pose", &estimated_pose_callback);
26 nh.subscribe (poseSub);
27
28 printf ("Waiting to receive messages\n");
29 while (1)
30 {
31 nh.spinOnce ();
32 Sleep (100);
33 }
34
35 printf ("All done!\n");
36 return 0;
37 }