RosSerial:Windows与ROS通信(一):向虚拟机上的ROS传输数据

运行环境:

VMware: Ubuntu 20.04

ROS:noetic

windows 10

Visual Studio 2019

生成ros_lib

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文件夹。

将ros_lib复制到Visual Studio 2019项目目录

将上一步生成的文件拷贝到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\。

Visual Studio 2019工程设置

项目->属性->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这几个文件。

 为Hello World添加代码到main

 #include "stdafx.h"                       //error
 #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[])    //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 <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;
    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;
}

设置虚拟机ROS的ip地址

如果按照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点击绿色箭头运行

 

小乌龟开始运动了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值