ROS¶
警告
此功能为实验性功能,可能会有破坏性更改。更多信息请参阅Conan 稳定性部分。
Conan 提供了对基于 C/C++ 的机器人操作系统 (ROS) 项目的集成。这将允许您在 ROS 包项目中消耗 Conan 包。可以使用为该目的创建的 ROSEnv 生成器 在 CMake 中安装和使用 Conan 包。
它提供了一种干净的集成,无需在您的 CMakeLists.txt 中进行 Conan 特定的修改。
重要
此集成支持 ROS2,它是使用 Kilted 版本开发的,目标是 继续支持更新的版本。如果您在使用其他 ROS 版本时遇到任何问题,请通过在我们的 GitHub 仓库中提交 issue 来告知我们。
注意
运行示例的先决条件
为了运行示例,预计您拥有一个安装了 ROS2 的 Ubuntu 环境。为了方便起见,您也可以使用此 Dockerfile 代替
FROM osrf/ros:kilted-desktop RUN apt-get update && apt-get install -y \ curl \ python3-pip \ git \ ros-kilted-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-kilted .构建您的镜像,最后使用docker run -it conanio/ros-kilted运行它。
也可以在 Windows 上运行 ROS2。请按照 [ROS 2 文档中的安装说明](https://docs.ros.org/en/kilted/Installation/Windows-Install-Binary.html) 进行操作。
此示例的文件可以在 我们的示例仓库 中找到。像这样克隆它以开始使用
$ 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 用于安装所需依赖项并生成用于执行构建的文件。
[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 环境文件。
现在我们可以 source 我们的 ROS 环境,然后 source Conan ROSEnv 环境,以便 CMake 找到 conan 安装的包,然后我们可以像往常一样使用 Colcon 构建 str_printer 包。
$ source /opt/ros/kilted/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_printers 的 CMakeLists.txt 中使用 ament_export_dependencies() 以通常的方式完成
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 包,您可以像往常一样进行操作(确保在构建之前 source 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
另请参阅
关于 ROSEnv 生成器 的参考。