VMware: Ubuntu 20.04
ROS:noetic
windows 10
Visual Studio 2019
1.在ubuntu命令行输入,安装rosserial_windows和rosserial服务器
sudo apt-get install ros-noetic-rosserial-windows
sudo apt-get install ros-noetic-rosserial-server
2.生成ros_lib
此步骤将生成Visual Studio项目中与ROS主服务器通信所需的代码。输入文件名,例如ros_win_library,创建好的文件放在/home/user/主目录下。
rosrun rosserial_windows make_libraries.py ros_win_library
在my_library这个文件夹下会生成ros_lib文件夹。
将上一步生成的文件拷贝到windows系统上面.
创建一个新的C++控制台应用程序。
给项目命名。我的项目名为send_pos_to_ros。
将拷到电脑的ros_win_library文件夹下的ros_lib文件夹复制到以下目录中。
x:\xxxxxxxxxxxxxxxxx(你的项目根目录)\send_pos_to_ros\.vs\send_pos_to_ros\v16\
将ros_lib文件夹下没有子文件夹的所有文件复制到x:\xxxxxxxxxxxxxxxxx(你的项目根目录)\send_pos_to_ros\send_pos_to_ros\。
项目->属性->C/C++->常规->附加包含目录,把ros_lib路径复制进去。
x:\xxxxxxxxxx\send_pos_to_ros\.vs\send_pos_to_ros\v16\ros_lib;%(AdditionalIncludeDirectories)
然后在头文件和源文件中分别添加 ros.h WindowsSocket.h duration.cpp time.cpp WindowsSocket.cpp这几个文件。
#include "stdafx.h" //error
#include
#include
#include "ros.h"
#include
#include
using std::string;
int _tmain (int argc, _TCHAR * argv[]) //error
{
//创建节点句柄
ros::NodeHandle nh;
//ROS所在主机IP
char *ros_master = "192.168.3.241"; //error
printf ("Connecting to server at %s\n", ros_master);
nh.initNode (ros_master);
printf ("Advertising cmd_vel message\n");//发布cmd_vel信息
//初始化消息类型
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 ();
//休眠100ms
Sleep (100);
}
printf ("All done!\n");
return 0;
}
但是,这么运行会报错。出现错误的位置标在代码里了。搞定错误需要做以下几步。
然后重新把我改好的代码覆盖原来的报错的代码
//#include "stdafx.h"
#include
#include
#include "ros.h"
#include
#include
#include
using std::string;
int _tmain(int argc, _TCHAR* argv[])
{
ros::NodeHandle nh;
char* ros_master = "192.168.3.241"; /接下来说明怎么搞虚拟机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 = 0.4;
twist_msg.linear.y = 0;
twist_msg.linear.z = 0;
twist_msg.angular.x = 0;
twist_msg.angular.y = 0;
twist_msg.angular.z = 0.2;
cmd_vel_pub.publish(&twist_msg);
nh.spinOnce();
Sleep(100);
}
printf("All done!\n");
return 0;
}
如果按照VMware默认的NAT模式,虚拟机和主机不在同一网段,因此直接运行前面的控制台调试,无法连接到ROS。
需要修改虚拟机网络连接模式为桥接模式。
在虚拟网络编辑器中修改以下设置,选择你能联网的网卡,不确定的话,去控制面板\网络和 Internet\网络和共享中心\更改适配器设置,查看一下
就能联网了。
Ubuntu输入ifconfig把ip地址拿到复制进vs项目里面ip地址的位置。
在Ubuntu命令行分别输入以下代码:
roscore
rosrun turtlesim turtlesim_node
rosrun rosserial_server socket_node /cmd_vel:=/turtle1/cmd_vel
在Windows Visual Studio 2019点击绿色箭头运行
小乌龟开始运动了。