导航

    蓝鲸ROS机器人论坛

    • 注册
    • 登录
    • 搜索
    • 版块
    • 话题
    • 热门
    ROS交流群
    ROS Group
    产品服务
    Product Service
    开源代码库
    Github
    官网
    Official website
    技术交流
    Technological exchanges
    激光雷达
    LIDAR
    ROS教程
    ROS Tourials
    深度学习
    Deep Learning
    机器视觉
    Computer Vision

    如何在Windows上使用roscpp

    技术交流
    windows roscpp boost ros教程
    4
    11
    6539
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • weijiz
      weijiz 最后由 weijiz 编辑

      原理说明

      基本想法就是把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 文件夹内找到我们需要的文件。

      e1bfef77-4000-45d0-ac05-51af1c956da1-image.png

      其中我们要用到的是include文件夹内的内容和lib文件夹的内容。上面的编译方式是生成静态链接库,在windows上对应.lib文件。我们把生成的头文件和静态链接库文件添加到自己的项目依赖里面就可以使用roscpp了。

      创建项目使用roscpp库

      c552797d-6c00-4bc3-8121-a5cd20b4d511-image.png

      在Visual Studio中创建一个新的Windows控制台程序,命名为roscppExample

      进入到项目目录然后创建一个include文件夹和lib文件夹

      50450419-632b-4354-bbee-fdb84f21f0bf-image.png

      把boost的头文件内容和caktin工作空间install里面的头文件内容复制进去
      复制完成后的include文件夹内容如下所示

      1a3edd10-2b33-40d2-9f1b-4cc54b0ca993-image.png

      然后从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文件夹如下图所示

      86f781f1-a356-4217-9f46-0d8da2ac28e7-image.png

      注意上面的库编译的是64位Debug版本。如果需要Release版本对上面cmake的参数进行调整。
      设置Visual Studio项目位64 Debug版。

      打开项目属性,设置VC++目录

      d47a550a-c94b-4228-8aad-1acaa0bd5351-image.png

      在包含目录里面添加刚才创建的include目录

      5d25965a-d0af-4b2a-b062-4348513a91b0-image.png

      同理在库目录里面添加刚才创建的lib文件夹。现在的项目路径如下图所示

      c6e03adb-f98a-48d2-9576-2a106820cf91-image.png

      打开链接器输入,附加依赖项。添加上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
      

      aabffcc7-8a94-4ae6-8b88-96f1c1373811-image.png

      现在就可以在程序中使用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看一下运行效果

      82a084bd-4d61-4d9c-8409-d749d0b66e92-image.png

      此时订阅/chatter可以看到输入

      b19ff302-44a2-4e9c-b6ec-b4ac1ad02f97-image.png

      这个roscppExample项目已经上传至Github。下载完成后用Visual Studio 2017可以直接打开编译运行,不需要安装其他依赖。如果想要在自己的其他项目里面使用roscpp可以把这个项目include和lib对应的添加到自己项目里。

      1 条回复 最后回复 回复 引用 0
      • 五仁馅冰皮月饼
        五仁馅冰皮月饼 最后由 编辑

        我运行的时候,在编译安装这一步出现了问题,网上没有查到类似问题的解决办法,请问楼主有没有遇到过:
        3be8381e-a626-42c1-8ef2-f53c92a73706-image.png
        前面都是按照楼主说的步骤做的,软件都已经下载配置,build文件夹里面的内容也是删除过的,请帮我看一看,谢谢~

        weijiz 2 条回复 最后回复 回复 引用 0
        • weijiz
          weijiz @五仁馅冰皮月饼 最后由 编辑

          @五仁馅冰皮月饼 你的Visual Studio版本,Python版本和我不一样,也许是这个问题导致的

          1 条回复 最后回复 回复 引用 0
          • weijiz
            weijiz @五仁馅冰皮月饼 最后由 编辑

            @五仁馅冰皮月饼 应该是Python版本的问题,我换了Python3之后也编译失败

            五仁馅冰皮月饼 1 条回复 最后回复 回复 引用 0
            • 五仁馅冰皮月饼
              五仁馅冰皮月饼 @weijiz 最后由 五仁馅冰皮月饼 编辑

              @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 1 条回复 最后回复 回复 引用 0
              • weijiz
                weijiz @五仁馅冰皮月饼 最后由 编辑

                @五仁馅冰皮月饼 这里都是编译好的

                五仁馅冰皮月饼 2 条回复 最后回复 回复 引用 0
                • 五仁馅冰皮月饼
                  五仁馅冰皮月饼 @weijiz 最后由 编辑

                  @weijiz 太感谢了,我试试哈👏

                  1 条回复 最后回复 回复 引用 0
                  • 五仁馅冰皮月饼
                    五仁馅冰皮月饼 @weijiz 最后由 编辑

                    @weijiz 例程可以正常运行了✌ ,谢谢~

                    1 条回复 最后回复 回复 引用 0
                    • Shawn_Ma
                      Shawn_Ma 最后由 编辑

                      此回复已被删除!
                      1 条回复 最后回复 回复 引用 0
                      • 静听松风寒
                        静听松风寒 最后由 编辑

                        我都是按照步骤做的,但是出现这个问题:
                        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”.
                        请问下搂主遇到过没呢?

                        weijiz 1 条回复 最后回复 回复 引用 0
                        • weijiz
                          weijiz @静听松风寒 最后由 编辑

                          @静听松风寒 这个已经太过久远了,很多都不合适了,比如python现在都已经用3了。windows好像本身也可以直接装ros了

                          1 条回复 最后回复 回复 引用 0
                          • 1 / 1
                          • First post
                            Last post
                          Copyright © 2015-2023 BlueWhale community