rosserial_windows入门 对Hello World from Windows的调试
wiki.ros.org上介绍了rosserial_windows调试Hello World的基本流程,但在实践过程中还是遇到了不少问题,特此写一篇博文记录下遇到的问题以及解决办法,在此附上链接供大家参考Hello World from Windows 。
0、准备工作
需要两台电脑,一台装有ros的Ubuntu系统,以及一台装有VS的Windows系统。没有尝试过虚拟机的方式,应该没有问题。尽管文档要求VS版本为2013,但经过调试VS2010一样可以调通。接下来按照文档的标号一步一步进行介绍
1、Introduction(略)
2、Generating the ros_lib
2.1、Installing rosserial_windows
在ubuntu系统上安装 rosserial windows 和 rosserial server,终端命令如下
sudo apt-get install ros-hydro-rosserial-windows
sudo apt-get install ros-hydro-rosserial-server
本人版本为indigo,所以需要将hydro替换为indigo,否则会出现安装错误
sudo apt-get install ros-indigo-rosserial-windows
sudo apt-get install ros-indigo-rosserial-server
2.2、Generate ros_lib
rosrun rosserial_windows make_libraries.py my_library
终端命令应该切换到make_libraries.py所在的位置进行
3、Add ros_lib to Visual Studio Project
3.1、Create a new Win32 Console Application
打开Visual Studio2010 文件->新建 ->项目
模板 ->Visual C++ ->win32 win32控制台应用程序
将项目命名为rosserial_hello_world,点击确定。预编译头文件保留,不需要取消
3.2、Copy ros_lib into the project
将ros_lib中的文件添加到rosserial_hello_world项目的文件夹中,rosserial_hello_world文件夹结构如下:
- ros.h
- duration.cpp
- time.cpp
-
WindowsSocket.cpp
1)右键点击rosserial_hello_world项目,选择最下角的“属性”
2)在C/C++的选项中,点击“添加包含目录”,ros_lib的路径添加到目录中
在rosserial_windows文件夹中我并没有找到duration.cpp和time.cpp两个文件,而且在下一步rosserial_hello_world.cpp还会因为缺少geometry_msgs/Twist.h报错。我并没有找到解决方案,还好有之前同学做过的项目,所以将之前的ros_lib文件整体移植过来
4、Add code to main for Hello World
修改sserial_hello_world.cpp,代码如下:
// rosserial_hello_world.cpp : Example of sending command velocities from Windows using rosserial
//
#include "stdafx.h"
#include <string>
#include <stdio.h>
#include "ros.h"
#include <geometry_msgs/Twist.h>
#include <windows.h>
using std::string;
int _tmain (int argc, _TCHAR * argv[])
{
ros::NodeHandle nh;
char *ros_master = "1.2.3.4"; //Ubuntu系统的IP地址
printf ("Connecting to server at %s\n", ros_master);
nh.initNode (ros_master);
printf ("Advertising cmd_vel message\n");
geometry_msgs::Twist twist_msg;
ros::Publisher cmd_vel_pub ("cmd_vel", &twist_msg);
nh.advertise (cmd_vel_pub);
printf ("Go robot go!\n");
while (1)
{
twist_msg.linear.x = 5.1;
twist_msg.linear.y = 0;
twist_msg.linear.z = 0;
twist_msg.angular.x = 0;
twist_msg.angular.y = 0;
twist_msg.angular.z = -1.8;
cmd_vel_pub.publish (&twist_msg);
nh.spinOnce ();
Sleep (100);
}
printf ("All done!\n");
return 0;
}
ros_master为Ubuntu系统的IP地址,如果不清楚的话,在系统终端使用ifconfig命令查看
可以尝试debug一下,如果没有出现错误,结果如下:
5、 Start ROS and rosserial_server
回到Ubuntu系统,在第一个终端输入:
roscore
第二个终端输入:
rosrun rosserial_server socket_node
第三个终端输入:
rostopic echo /cmd_vel
6、Run the app
回到Windows系统,再次debug,控制台输出已经有变化了
在Ubuntu这边
基本已经完成