Windows-Ros利用rosserial_windows实现通信

系统环境:
Linux:18.0
Ros:melodic
Windows: Windows10 + VS2017

目的:使用Windows上生成的命令控制Linux系统上ROS控制的小海龟移动。

工作流程

1.从基于ROS的系统中,生成ros_lib代码
2.将ros_lib代码放入Visual Studios解决方案中
3.编写代码以使用ros_lib连接到ROS主服务器并发送/接收消息
4.在ROS master上运行rosserial_server套接字
5.编译并运行Windows应用程序。

第一步 生成ros_lib(Linux系统)

1.安装rosserial_windows(Linux系统)

在ROS上安装rosserial_windows和rosserial服务器:

sudo apt-get install ros-melodic-rosserial-windows
sudo apt-get install ros-melodic-rosserial-server

2.生成ros_lib(Linux系统)

此步骤将生成Visual Studio项目中与ROS主服务器通信所需的代码。提供一个文件名,例如my_library,将完成的文件就会存储到的提供的文件夹的名称所在地。

rosrun rosserial_windows make_libraries.py my_library

在my_library这个文件夹下会生成ros_lib文件夹。

第二步 将ros_lib添加到Visual Studio Project(Windows系统)

步骤:

1.将上一步生成的ros_lib文件拷贝到windows系统上面,创建一个新的控制台应用程序。

打开Visual Studio2017
文件 - >新建->项目
在Visual C ++ - > Windows桌面下找到Windows桌面向导
为项目命名。我们将使用Windows-Ros_Test。

在这里插入图片描述
选择 控制台应用程序、空项目,点击确定
在这里插入图片描述
右键源文件,点击添加新建项,为项目添加main.cpp.

在这里插入图片描述

2.将ros_lib复制到项目中。

首先 将ros_lib复制到工程所在的目录中
在这里插入图片描述
接着 将ros_lib文件夹下没有子文件夹的所有文件复制一份至源文件所在的目录下。

在这里插入图片描述

3.在VS2017属性中配置附加包含ros_lib路径

首先 右键项目->属性->C/C+±>常规->附加包含目录,添加"…/ros_lib" 的路径。
在这里插入图片描述

然后 在头文件和源文件中分别添加 ros.h WindowsSocket.h duration.cpp time.cpp WindowsSocket.cpp这几个文件。

在这里插入图片描述

编写代码(Windows系统)

1.将以下代码复制到main.cpp文件中:

#include <string>
#include <stdio.h>
#include "ros.h"
#include <geometry_msgs/Twist.h>
#include <windows.h>
#include <tchar.h> 

using std::string;

int _tmain(int argc, _TCHAR * argv[])
{
	//创建节点句柄
	ros::NodeHandle nh;
	//ROS所在主机IP 
	char *ros_master = "192.168.1.3";

	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;
}

2.编译

编译时遇到错误:

vs2017 “初始化”: 无法从“const char [8]”转换为“char *”

解决方法:将项目属性中将语言符合模式改成否即可;

在这里插入图片描述
3.运行

运行程序需要用网线将windows主机和Ubuntu主机连接起来,不连接网线的时候运行程序出现以下现象:

在这里插入图片描述

进行网络设置

在Windows和Linux通信之前,需要在windows和Ubuntu系统上进行网络设置,将两台计算机组建成局域网,才能使用Tcp/IP进行通信。

windows设置
1.打开“打开网络和Internet”设置。点击网络和共享中心。

在这里插入图片描述

2.点击以太网。
在这里插入图片描述

3.点击属性。

在这里插入图片描述

4.双击Internet 协议版本4(TCP/IPv4)

在这里插入图片描述

5.设置IP地址。

在这里插入图片描述
Ubuntu设置

1.点击左侧系统设置,选择网络。
在这里插入图片描述
2.点击USB以太网选项的加号,增加一项
在这里插入图片描述
注意:IP地址和网关要与Windows系统的不同,否则无法通信。

4.保存之后就设置好了,断开其他网络,打开有线连接,可以在Ubuntu的终端中查看ip是否设置好了。

测试

1.用一根网线连接两个电脑。

2.在Ubuntu终端输入命令查看是否设置正确。

 ifconfig -a

3.在windows系统下打开命令行工具(cmd),测试Ubuntu设置的IP地址。

命令如下:测试Ubuntu系统的IP地址,检查两台电脑是否通信。

ping 192.168.1.3

在这里插入图片描述
出现上图所示的结果就说明可以通信,网络设置结束。接下来可以运行程序,进行通信。

ROS端启动服务(Linux系统)

在终端中分别执行:

 roscore

//启动服务

 rosrun rosserial_server socket_node

//查看Windows下发送的话题

 rostopic echo /cmd_vel

可以在终端上看到Windows系统发送的消息:

在这里插入图片描述

控制小乌龟(Linux系统)

可以使用以下命令控制小乌龟进行移动

在Ubuntu中不同终端分别运行:

roscore

rosrun rosserial_server socket_node /cmd_vel:=turtle1/cmd_vel

//运行小海龟节点

rosrun turtlesim turtlesim_node

在windows上运行程序,可以看到小乌龟开始打圈圈

在这里插入图片描述

在连接两台电脑时,有时可以通信,有的时候连接不上,出现以下情况:

在这里插入图片描述
在检查之后,发现Ubuntu系统设置了两个以太网,其中一个是我一直使用的校园网,另一个是以上设置的与Windows通信的以太网。Ubuntu系统与Windows系统通信时,Ubuntu系统的以太网一直连接设置的校园网,导致windows系统所需的IP不正确,所以在通信时尽量只设置一个以太网。

注意:保证windows-ros一直有对钩出现,否则没有连接,无法通信。

在这里插入图片描述

  • 2
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值