ROS Group 产品服务
Product Service 开源代码库
Github 官网
Official website 技术交流
Technological exchanges 激光雷达
LIDAR ROS教程
ROS Tourials 深度学习
Deep Learning 机器视觉
Computer Vision
如何在Windows上使用roscpp
-
原理说明
基本想法就是把roscpp库编译成dll或者lib的形式,然后项目通过引用对应的链接库文件使用roscpp的功能。
roscpp的代码本身是支持在Windows平台编译的。但是这个库依赖于其他很多ros库。有些库不支持在Windows平台上编译,有些库在Windows平台上编译非常麻烦。所以我们要对相关文件进行修改,删除不必要的依赖就可以编译了。下面是具体的编译方法。如果你不想自己编译相关的库,想要直接使用,那么可以跳到最后,看创建项目使用roscpp的内容。
安装boost
下载boost库源代码 下载链接
注意版本,版本应该是越新越好。我使用的是1.66版本。解压后以管理员身份开启一个powershell窗口,cd到boost源代码目录。然后执行下面指令
.\bootstrap.bat .\b2.exe variant=release threading=multi threadapi=win32 link=static runtime-link=shared --prefix=C:\boost address-model=64 architecture=x86 install -j8 .\b2.exe variant=debug threading=multi threadapi=win32 link=static runtime-link=shared --prefix=C:\boost address-model=64 architecture=x86 install -j8
这样程序会在C:/boost文件夹内安装boost库
安装CMake
下载相关安装包 下载地址
安装完成即可,注意cmake的路径也要添加到系统环境变量里面。
安装catkin_pkg
如果系统没有安装Python2.7需要先安装Python2.7。并且设置好环境变量把python添加到Path里面去
以管理员权限打开一个powershell窗口,然后执行下面的指令
pip install catkin_pkg
准备ros工作空间
创建一个文件夹名称随意,这里取为catkin_ws,作为caktin的工作空间。
执行下面指令下载相关源代码cd [到你的工作空间] mkdir src cd src git clone https://github.com/ros/catkin git clone https://github.com/ros/gencpp git clone https://github.com/jsk-ros-pkg/geneus git clone https://github.com/ros/genlisp git clone https://github.com/ros/genmsg git clone https://github.com/RethinkRobotics-opensource/gennodejs git clone https://github.com/ros/genpy git clone https://github.com/ros/message_generation git clone https://github.com/ros/message_runtime git clone https://github.com/BluewhaleRobot/rosconsole git clone https://github.com/BluewhaleRobot/roscpp_core git clone https://github.com/BluewhaleRobot/ros_comm git clone https://github.com/ros/ros_comm_msgs git clone https://github.com/ros/std_msgs
编译安装
cd [到你的工作空间] python .\src\catkin\bin\catkin_make # 此时会提示错误,但是没有关系。这个程序会帮我们创建很多相关文件 cd build # 把build文件夹内容删除后执行下面的指令 cmake E:\workspace\catkin_ws\src -DCATKIN_DEVEL_PREFIX=E:\workspace\catkin_ws\devel -DCMAKE_INSTALL_PREFIX=E:\workspace\catkin_ws\install -G "Visual Studio 15 2017 Win64" -DCATKIN_ENABLE_TESTING=OFF -DBoost_USE_STATIC_LIBS=ON -DCMAKE_BUILD_TYPE=Debug -DBUILD_SHARED_LIBS=OFF # 其中的E:\workspace\catkin_ws\src是我的工作空间相关路径,你要换成自己的对应路径。Visual Studio 15 2017 Win64 为Visual Studio的版本信息,根据自己的Visual Studio版本进行设置。这个指令可以没有错误正常执行。
正常应该会有下面这样的输出
... -- ==> add_subdirectory(ros_comm/clients/roscpp) -- Using these message generators: gencpp;geneus;genlisp;gennodejs;genpy -- Boost version: 1.66.0 -- Found the following Boost libraries: -- chrono -- filesystem -- signals -- system -- roscpp: 1 messages, 3 services -- Configuring done -- Generating done -- Build files have been written to: E:/workspace/catkin_ws/build
然后我们就可以开始编译了。还是在build文件夹内,执行下面的指令。等待编译完成就可以了。
cmake --build . --config Debug --target INSTALL
编译完成后,我们可以在工作空间的install 文件夹内找到我们需要的文件。
其中我们要用到的是include文件夹内的内容和lib文件夹的内容。上面的编译方式是生成静态链接库,在windows上对应.lib文件。我们把生成的头文件和静态链接库文件添加到自己的项目依赖里面就可以使用roscpp了。
创建项目使用roscpp库
在Visual Studio中创建一个新的Windows控制台程序,命名为roscppExample
进入到项目目录然后创建一个include文件夹和lib文件夹
把boost的头文件内容和caktin工作空间install里面的头文件内容复制进去
复制完成后的include文件夹内容如下所示然后从boost/lib文件夹内复制一下的几个文件到刚才创建的lib文件夹
libboost_filesystem-vc141-mt-gd-x64-1_66.lib libboost_filesystem-vc141-mt-x64-1_66.lib libboost_chrono-vc141-mt-gd-x64-1_66.lib libboost_chrono-vc141-mt-x64-1_66.lib libboost_date_time-vc141-mt-gd-x64-1_66.lib libboost_date_time-vc141-mt-x64-1_66.lib libboost_system-vc141-mt-gd-x64-1_66.lib libboost_system-vc141-mt-x64-1_66.lib libboost_thread-vc141-mt-gd-x64-1_66.lib libboost_thread-vc141-mt-x64-1_66.lib libboost_regex-vc141-mt-gd-x64-1_66.lib libboost_regex-vc141-mt-x64-1_66.lib
然后把caktin工作空间install/lib文件夹内的几个.lib文件复制到之前创建的lib文件夹中
现在的lib文件夹如下图所示注意上面的库编译的是64位Debug版本。如果需要Release版本对上面cmake的参数进行调整。
设置Visual Studio项目位64 Debug版。打开项目属性,设置VC++目录
在包含目录里面添加刚才创建的include目录
同理在库目录里面添加刚才创建的lib文件夹。现在的项目路径如下图所示
打开链接器输入,附加依赖项。添加上lib中文件的文件名
libboost_filesystem-vc141-mt-x64-1_66.lib libboost_chrono-vc141-mt-x64-1_66.lib libboost_date_time-vc141-mt-x64-1_66.lib libboost_system-vc141-mt-x64-1_66.lib libboost_thread-vc141-mt-x64-1_66.lib libboost_regex-vc141-mt-x64-1_66.lib roscpp.lib roscpp_serialization.lib cpp_common.lib rosconsole.lib rosconsole_backend_interface.lib rosconsole_print.lib rostime.lib xmlrpcpp.lib
现在就可以在程序中使用roscpp了。下面是一个简单的发消息的cpp程序。
#include "stdafx.h" #define WIN32 #include "ros/ros.h" #include "std_msgs/String.h" #pragma comment(lib, "Ws2_32.lib") int main(int argc, char **argv) { std::map<std::string, std::string> params; params.insert(std::pair<std::string, std::string>("__master", "http://192.168.0.32:11311")); params.insert(std::pair<std::string, std::string>("__ip", "192.168.0.8")); ros::init(params, "talker"); ros::NodeHandle n; ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000); ros::Rate loop_rate(10); int count = 0; while (ros::ok()) { std_msgs::String msg; std::stringstream ss; ss << "hello world " << count; msg.data = ss.str(); std::cout << "send message: hello world" << std::endl; chatter_pub.publish(msg); ros::spinOnce(); loop_rate.sleep(); ++count; } return 0; }
编译完成就可以执行了。
按F5看一下运行效果
此时订阅/chatter可以看到输入
这个roscppExample项目已经上传至Github。下载完成后用Visual Studio 2017可以直接打开编译运行,不需要安装其他依赖。如果想要在自己的其他项目里面使用roscpp可以把这个项目include和lib对应的添加到自己项目里。
-
我运行的时候,在编译安装这一步出现了问题,网上没有查到类似问题的解决办法,请问楼主有没有遇到过:
前面都是按照楼主说的步骤做的,软件都已经下载配置,build文件夹里面的内容也是删除过的,请帮我看一看,谢谢~ -
@五仁馅冰皮月饼 你的Visual Studio版本,Python版本和我不一样,也许是这个问题导致的
-
@五仁馅冰皮月饼 应该是Python版本的问题,我换了Python3之后也编译失败
-
@weijiz 谢谢你~ 我又按照你的版本试了一下,生成了大部分的文件,但是没有生成ros_cpp.lib,我这边不知道还缺少什么文件,能不能麻烦你把生成的文件发我一份(1136295792@qq.com),我看帖子中给的github链接中也没有ros_cpp.lib文件
这里是我最后一步编译的报错,查了好几天了,一直没能解决,不知道你有没有办法解决:“C:\catkin_ws\build\INSTALL.vcxproj”(默认目标) (1) -> “C:\catkin_ws\build\ALL_BUILD.vcxproj”(默认目标) (3) -> “C:\catkin_ws\build\ros_comm\clients\roscpp\roscpp.vcxproj”(默认目标) (33) -> “C:\catkin_ws\build\ros_comm\clients\roscpp\roscpp_generate_messages_py.vcxproj”(默认目标) (43) -> (CustomBuild 目标) -> C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(20 9,5): error MSB6006: “cmd.exe”已退出,代码为 1。 [C:\catkin_ws\build\ros_comm\clients\roscpp\roscpp_generate_messages_py.vcxpro j] “C:\catkin_ws\build\INSTALL.vcxproj”(默认目标) (1) -> “C:\catkin_ws\build\ALL_BUILD.vcxproj”(默认目标) (3) -> “C:\catkin_ws\build\ros_comm\clients\roscpp\roscpp.vcxproj”(默认目标) (33) -> “C:\catkin_ws\build\ros_comm_msgs\rosgraph_msgs\rosgraph_msgs_generate_messages_py.vcxproj”(默认目标) (88) -> “C:\catkin_ws\build\std_msgs\std_msgs_generate_messages_py.vcxproj”(默认目标) (89) -> C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(20 9,5): error MSB6006: “cmd.exe”已退出,代码为 1。 [C:\catkin_ws\build\std_msgs\std_msgs_generate_messages_py.vcxproj] “C:\catkin_ws\build\INSTALL.vcxproj”(默认目标) (1) -> “C:\catkin_ws\build\ALL_BUILD.vcxproj”(默认目标) (3) -> “C:\catkin_ws\build\ros_comm_msgs\std_srvs\std_srvs_generate_messages.vcxproj”(默认目标) (94) -> “C:\catkin_ws\build\ros_comm_msgs\std_srvs\std_srvs_generate_messages_py.vcxproj”(默认目标) (102) -> C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(20 9,5): error MSB6006: “cmd.exe”已退出,代码为 1。 [C:\catkin_ws\build\ros_comm_msgs\std_srvs\std_srvs_generate_messages_py.vcxpr oj] 47 个警告 3 个错误
主要是这几个error,谢谢~~
-
-
@weijiz 太感谢了,我试试哈
-
@weijiz 例程可以正常运行了 ,谢谢~
-
此回复已被删除! -
我都是按照步骤做的,但是出现这个问题:
CMake Error at C:/boost/lib/cmake/Boost-1.79.0/BoostConfig.cmake:141 (find_package):
Found package configuration file:C:/boost/lib/cmake/boost_date_time-1.79.0/boost_date_time-config.cmake
but it set boost_date_time_FOUND to FALSE so package “boost_date_time” is
considered to be NOT FOUND. Reason given by package:No suitable build variant has been found.
The following variants have been tried and rejected:
-
libboost_date_time-vc143-mt-gd-x64-1_79.lib (vc143, detected vc142, set
Boost_COMPILER to override) -
libboost_date_time-vc143-mt-x64-1_79.lib (vc143, detected vc142, set
Boost_COMPILER to override)
Call Stack (most recent call first):
C:/boost/lib/cmake/Boost-1.79.0/BoostConfig.cmake:262 (boost_find_component)
D:/TSBrowserDownloads/cmake-3.22.3-windows-x86_64/share/cmake-3.22/Modules/FindBoost.cmake:594 (find_package)
roscpp_core/rostime/CMakeLists.txt:8 (find_package)– Configuring incomplete, errors occurred!
See also “D:/catkin_ws/CMakeFiles/CMakeOutput.log”.
See also “D:/catkin_ws/CMakeFiles/CMakeError.log”.
请问下搂主遇到过没呢? -
-
@静听松风寒 这个已经太过久远了,很多都不合适了,比如python现在都已经用3了。windows好像本身也可以直接装ros了