ros_logo ROS

警告

此功能为实验性功能,可能会发生重大更改。有关更多信息,请参阅 Conan 稳定性 部分。

Conan 为你的机器人操作系统 (ROS) C/C++ 项目提供集成。这将允许你在 ROS 包项目中使用 Conan 包。Conan 包可以在 CMake 中安装和使用,这得益于为此目的创建的 ROSEnv 生成器

它提供了干净的集成,无需在你的 CMakeLists.txt 中进行任何特定于 Conan 的修改。

重要提示

此集成支持 ROS2,它已使用其 Humble 版本 进行开发,目标是 支持未来的更新版本。 如果你在其他 ROS 版本中遇到任何问题,请通过在我们的 GitHub 存储库中打开一个 issue 来告知我们。

注意

运行示例的先决条件

  1. 为了运行示例,你应具备一个 Ubuntu 环境(首选 22.04 LTS),并安装了 ROS2 Humble 版本。为方便起见,你也可以使用此 Docker 文件

    FROM osrf/ros:humble-desktop
    RUN apt-get update && apt-get install -y \
    curl \
    python3-pip \
    git \
    ros-humble-nav2-msgs \
    && rm -rf /var/lib/apt/lists/*
    RUN pip3 install --upgrade pip && pip3 install conan==2.*
    RUN conan profile detect
    CMD ["bash"]
    

只需复制 Dockerfile,使用 docker build -t conanio/ros-humble . 构建你的镜像,最后使用 docker run -it conanio/ros-humble 运行它。

  1. 此示例的文件可以在 我们的示例存储库 中找到。像这样克隆它以开始

    $ git clone https://github.com/conan-io/examples2.git
    $ cd examples2/examples/tools/ros/rosenv
    

使用 ROSEnv 生成器消费 Conan 包

假设我们有一个名为 str_printer 的 ROS C++ 包,它使用第三方字符串格式化库 fmt 中的一些功能来打印花哨的字符串。

我们有以下项目结构

$  tree /f
workspace
├───str_printer
│      CMakeLists.txt
│      conanfile.txt
│      package.xml
│   ├───include
│      └──str_printer
│            str_printer.h
│   └───src
│          str_printer.cpp
└───consumer
       CMakeLists.txt
       package.xml
    └───src
           main.cpp

其中

  • str_printer 是一个实现功能的 ROS 包,依赖于 fmt Conan 包

  • consumer 也是一个 ROS 包,它依赖于 str_printer ROS 包,并在最终可执行文件中使用其功能。

str_printer 包与普通 ROS 包的唯一区别在于它包含一个 conanfile.txt 文件。这是 Conan 用来安装所需依赖项并生成执行构建所需的文件的文件。

str_printer/conanfile.txt
 [requires]
 fmt/11.0.2

 [generators]
 CMakeDeps
 CMakeToolchain
 ROSEnv

在这种情况下,我们将安装 11.0.2 版本的 fmt,Conan 将生成 CMake 和 ROS 的文件,以便我们稍后构建 str_printer 包。

要使用 Conan 安装 fmt 库,我们应该执行以下操作

$ cd workspace
$ conan install str_printer/conanfile.txt --build missing --output-folder install/conan
======== Computing dependency graph ========
fmt/11.0.2: Not found in local cache, looking in remotes...
fmt/11.0.2: Checking remote: conancenter
fmt/11.0.2: Downloaded recipe revision 5c7438ef4d5d69ab106a41e460ce11f3
Graph root
    conanfile.txt: /home/user/examples2/examples/tools/ros/rosenv/workspace/str_printer/conanfile.txt
Requirements
    fmt/11.0.2#5c7438ef4d5d69ab106a41e460ce11f3 - Downloaded (conancenter)

======== Computing necessary packages ========
Requirements
    fmt/11.0.2#5c7438ef4d5d69ab106a41e460ce11f3:29da3f322a17cc9826b294a7ab191c2f298a9f49#d8d27fde7061f89f7992c671d98ead71 - Download (conancenter)

======== Installing packages ========

-------- Downloading 1 package --------
fmt/11.0.2: Retrieving package 29da3f322a17cc9826b294a7ab191c2f298a9f49 from remote 'conancenter'
fmt/11.0.2: Package installed 29da3f322a17cc9826b294a7ab191c2f298a9f49
fmt/11.0.2: Downloaded package revision d8d27fde7061f89f7992c671d98ead71

======== Finalizing install (deploy, generators) ========
conanfile.txt: Writing generators to /home/user/examples2/examples/tools/ros/rosenv/workspace/install/conan
conanfile.txt: Generator 'CMakeDeps' calling 'generate()'
conanfile.txt: CMakeDeps necessary find_package() and targets for your CMakeLists.txt
    find_package(fmt)
    target_link_libraries(... fmt::fmt)
conanfile.txt: Generator 'CMakeToolchain' calling 'generate()'
conanfile.txt: CMakeToolchain generated: conan_toolchain.cmake
conanfile.txt: Preset 'conan-release' added to CMakePresets.json. Invoke it manually using 'cmake --preset conan-release' if using CMake>=3.23
conanfile.txt: If your CMake version is not compatible with CMakePresets (<3.23) call cmake like: 'cmake <path> -G "Unix Makefiles" -DCMAKE_TOOLCHAIN_FILE=/home/danimtb/examples2/examples/tools/ros/rosenv/workspace/install/conan/conan_toolchain.cmake -DCMAKE_POLICY_DEFAULT_CMP0091=NEW -DCMAKE_BUILD_TYPE=Release'
conanfile.txt: CMakeToolchain generated: CMakePresets.json
conanfile.txt: CMakeToolchain generated: ../../str_printer/CMakeUserPresets.json
conanfile.txt: Generator 'ROSEnv' calling 'generate()'
conanfile.txt: Generated ROSEnv Conan file: conanrosenv.sh
Use 'source /home/user/examples2/examples/tools/ros/rosenv/workspace/install/conan/conanrosenv.sh' to set the ROSEnv Conan before 'colcon build'
conanfile.txt: Generating aggregated env files
conanfile.txt: Generated aggregated env files: ['conanrosenv.sh']
Install finished successfully

这将下载 fmt Conan 包到本地缓存,并在 install 目录的 conan 子文件夹中生成 CMake 和 ROS 环境文件。

现在我们可以获取我们的 ROS 环境,然后获取 Conan ROSEnv 环境,以便 CMake 找到 conan 安装的包,然后我们可以像往常一样使用 Colcon 构建 str_printer 包。

$ source /opt/ros/humble/setup.bash
$ source install/conan/conanrosenv.sh
$ colcon build --packages-select str_printer
Starting >>> str_printer
Finished <<< str_printer [10.8s]

Summary: 1 package finished [12.4s]

将 Conan 提供的传递依赖项桥接到另一个 ROS 包

由于 consumer ROS 包依赖于 str_printer,因此应该导出传递依赖项的目标。这通常在 str_printersCMakeLists.txt 中使用 ament_export_dependencies() 完成

str_printer/CMakeLists.txt
 cmake_minimum_required(VERSION 3.8)
 project(str_printer)

 if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
 add_compile_options(-Wall -Wextra -Wpedantic)
 endif()

 # find dependencies
 find_package(ament_cmake REQUIRED)
 find_package(fmt REQUIRED)  # Retrieved with Conan C/C++ Package Manager

 add_library(str_printer src/str_printer.cpp)

 target_include_directories(str_printer PUBLIC
 $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include/str_printer>
 $<INSTALL_INTERFACE:include>)

 target_compile_features(str_printer PUBLIC c_std_99 cxx_std_17)  # Require C99 and C++17
 ament_target_dependencies(str_printer fmt)

 ament_export_targets(str_printerTargets HAS_LIBRARY_TARGET)
 ament_export_dependencies(fmt)

 install(
 DIRECTORY include/
 DESTINATION include
 )

 install(
 TARGETS str_printer
 EXPORT str_printerTargets
 LIBRARY DESTINATION lib
 ARCHIVE DESTINATION lib
 RUNTIME DESTINATION bin
 INCLUDES DESTINATION include
 )

 ament_package()

要构建 consumer ROS 包,你可以像往常一样继续(确保你在构建之前已获取了 ROS 环境和 Conan ROSEnv 环境,如上一步所示)

$ colcon build --packages-select consumer
Starting >>> consumer
Finished <<< consumer [7.9s]

Summary: 1 package finished [9.4s]

之后,我们的 consumer 应用程序应该准备好使用以下命令运行

$ source install/setup.bash
$ ros2 run consumer main
Hi there! I am using fmt library fetched with Conan C/C++ Package Manager

另请参阅