admin管理员组

文章数量:1565787

将ros包移植到Windows 10系统

在移植之初,读者需要先在Windows系统中安装好ROS系统,本教程安装的melodic版本,为 Windows 构建 ROS 项目需要 Visual Studio,这里安装的是 Visual Studio 2017 (Community)。
具体安装过程可以参考以下两个连接
ROS on Windows installation
视频教程

温馨提示
按照Ros 用于 Windows 移植说明书,需要将ROS的工作区放到C盘的根目录。因为Visual Studio 2017体积过于庞大,我这里安装在D盘,在运行ros程序的时候只要在创建 ROS 命令窗口快捷方式时修改好相应的路径,也能够使得程序正常运行。
例如我在创建ROS命令窗口快捷方式时的设置:

C:\Windows\System32\cmd.exe /k "D:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\Tools\VsDevCmd.bat" -arch=amd64 -host_arch=amd64&& set ChocolateyInstall=c:\opt\chocolatey&& c:\opt\ros\melodic\x64\setup.bat

以古月居21讲中发布话题为例


1、Windows系统中创建ROS工作空间
在Windows系统和在Linux系统创建功能包没有太大区别,我这里将catkin_ws设置在c盘的根目录下。

mkdir c:\catkin_ws\src
cd c:\catkin_ws\src
catkin_init_workspace

2、Windows系统中编译ROS工作空间
输入以下两条指令,这个时候虽然没有功能包,但是是可以正常编译的。

cd c:\catkin_ws
catkin_make

结果如下:

3、创建功能包

cd c:\catkin_ws\src
catkin_create_pkg learning_topic roscpp rospy std_msgs geometry_msgs turtlesim

4、在learning_topic中的创建一个c++文件,输入以下代码。(有古月居21讲的例程代码,可以直接将learning_topic中的velocity_publisher.cpp文件复制过来。)
如果是新手,不知道这部分代码什么意思可以去看这个视频。古月居21讲

/**
 * 该例程将发布turtle1/cmd_vel话题,消息类型geometry_msgs::Twist
 */
 
#include <ros/ros.h>
#include <geometry_msgs/Twist.h>

int main(int argc, char **argv)
{
	// ROS节点初始化
	ros::init(argc, argv, "velocity_publisher");

	// 创建节点句柄
	ros::NodeHandle n;

	// 创建一个Publisher,发布名为/turtle1/cmd_vel的topic,消息类型为geometry_msgs::Twist,队列长度10
	ros::Publisher turtle_vel_pub = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 10);

	// 设置循环的频率
	ros::Rate loop_rate(10);

	int count = 0;
	while (ros::ok())
	{
	    // 初始化geometry_msgs::Twist类型的消息
		geometry_msgs::Twist vel_msg;
		vel_msg.linear.x = 0.5;
		vel_msg.angular.z = 0.2;

	    // 发布消息
		turtle_vel_pub.publish(vel_msg);
		ROS_INFO("Publsh turtle velocity command[%0.2f m/s, %0.2f rad/s]", 
				vel_msg.linear.x, vel_msg.angular.z);

	    // 按照循环频率延时
	    loop_rate.sleep();
	}

	return 0;
}

5、配置CMakeLists.txt中的编译规则
设置需要编译的代码和生成的可执行文件,设置链接库。
这里执行的操作是将以下两句话拷贝到learning_topic目录下的CMakeLists.txt中照片所示的位置。

add_executable(velocity_publisher src/velocity_publisher.cpp)
target_link_libraries(velocity_publisher ${catkin_LIBRARIES})


6、再次进行编译

cd c:\catkin_ws
catkin_make

再次执行编译出现了如下报错:

C:\ros_ws\src\learning_topic\src\velocity_publisher.cpp: warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请 将该文件保存为 Unicode 格式以防止数据丢失
C:\ros_ws\src\learning_topic\src\velocity_publisher.cpp(28): error C2065: “vel_msg”: 未声明的标识符
C:\ros_ws\src\learning_topic\src\velocity_publisher.cpp(29): error C2065: “vel_msg”: 未声明的标识符
C:\ros_ws\src\learning_topic\src\velocity_publisher.cpp(32): error C2065: “vel_msg”: 未声明的标识符
C:\ros_ws\src\learning_topic\src\velocity_publisher.cpp(33): error C2065: “vel_msg”: 未声明的标识符
C:\ros_ws\src\learning_topic\src\velocity_publisher.cpp(37): error C2065: “loop_rate”: 未声明的标识符
NMAKE : fatal error U1077: “D:\PROGRA~1\MICROS~1\2017\COMMUN~1\VC\Tools\MSVC\1416~1.270\bin\Hostx64\x64\cl.exe”: 返回 代码“0x2”
Stop.
NMAKE : fatal error U1077: “"D:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\bin\HostX64\x64\nmake.exe"”: 返回代码“0x2”
Stop.
NMAKE : fatal error U1077: “"D:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\bin\HostX64\x64\nmake.exe"”: 返回代码“0x2”
Stop.
Invoking "nmake" failed

解决这个问题需要使用Visual Studio 2017打开我们创建的(或者直接复制过来的)velocity_publisher.cpp文件,点击"文件",点击"高级保存选项",在编码这栏中选择Unicode(UTF-8 带签名)- 代码页65001,然后点击确定即可。
参考网页

再次保存文件,再次执行catkin_make指令。

7、在执行程序之前,需要设置坏境变量
在Linux系统中执行要运行这个发布者的程序需要进行以下步骤

在Windows系统中只有第三行命令的执行的方式不同,在cmd中不能识别source这个命令,而且在Windows系统中在devel文件中生成的是setup.bat文件,windows系统中与source devel/setup.bash执行相同效果的是,进入到devel文件,并执行setup.bat文件。

cd devel
setup.bat

这就走完了在windows下执行一个发布者程序的所有坑。

实验过程

1、双击ROS命令窗口快捷方式,输入roscore。

2、运行海龟仿真器

3、运行自己功能包指令
直接在命令窗口输入指令的话他会出现错误提示。

我们需要先执行以下命令,才能让小海龟顺利跑起来。

cd c:\catkin_ws
catkin_make
cd devel
setup.bat
rosrun learning_topic velocity_publisher

##存在的问题
在linux中,每次执行source devel/setup.bash会很麻烦,一般会将该命令加入到隐藏文件.bashrc文件中,这样就不用每次在终端执行这条指令。
在Windows中,我考虑的解决办法是右击ROS命令窗口快解方式,点击属性,在目标那一栏加入&& c:\catkin_ws\devel\setup.bat,这样可以起到相同的效果。

本文标签: 功能系统Windowsros