在ROS2 Jazzy中,自定义C++库及其应用需要遵循ROS2的规范,以确保库能够正确编译、安装并被其他包调用。以下是一个详细的范例,包括自定义C++库的创建、编译以及在另一个包中的应用。
一、自定义C++库的创建与编译
创建库包
- 创建一个新的ROS2工作空间(如果尚未创建):
mkdir-p ~/ros2_ws/srccd~/ros2_ws/src- 创建一个新的包,用于存放自定义库:
ros2 pkg create --build-type ament_cmake --license Apache-2.0 ros2_cpp_lib- 进入包目录并创建必要的文件夹结构:
cdros2_cpp_libmkdir-p include/ros2_cpp_lib src编写库头文件
- 在
include/ros2_cpp_lib/目录下创建头文件ros2_cpp_lib.hpp:
#ifndefROS2_CPP_LIB_HPP#defineROS2_CPP_LIB_HPP#include"rclcpp/rclcpp.hpp"namespaceros2_cpp_lib{classros2_cpp_lib:publicrclcpp::Node{public:ros2_cpp_lib(conststd::string&node_name);~ros2_cpp_lib();voidsum(inta,intb);};}// namespace ros2_cpp_lib#endif// ROS2_CPP_LIB_HPP- 在
编写库源文件
- 在
src/目录下创建源文件ros2_cpp_lib.cpp:
#include"ros2_cpp_lib/ros2_cpp_lib.hpp"namespaceros2_cpp_lib{ros2_cpp_lib::ros2_cpp_lib(conststd::string&node_name):Node(node_name){RCLCPP_INFO(this->get_logger(),"ros2_cpp_lib_node has been started.");}ros2_cpp_lib::~ros2_cpp_lib(){RCLCPP_INFO(this->get_logger(),"ros2_cpp_lib_node has been stopped.");}voidros2_cpp_lib::sum(inta,intb){RCLCPP_INFO(this->get_logger(),"Sum of %d and %d is %d",a,b,a+b);}}// namespace ros2_cpp_lib- 在
配置CMakeLists.txt
- 编辑
CMakeLists.txt文件,添加以下内容:
cmake_minimum_required(VERSION 3.8) project(ros2_cpp_lib) 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(rclcpp REQUIRED) # COMPILE add_library(ros2_cpp_lib SHARED src/ros2_cpp_lib.cpp) target_compile_features(ros2_cpp_lib PUBLIC cxx_std_17) target_include_directories(ros2_cpp_lib PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> $<INSTALL_INTERFACE:include/ros2_cpp_lib> ) ament_target_dependencies(ros2_cpp_lib PUBLIC rclcpp) # EXPORTS ament_export_targets(export_ros2_cpp_lib HAS_LIBRARY_TARGET) ament_export_dependencies(rclcpp) # INSTALL install( DIRECTORY include/ros2_cpp_lib DESTINATION include ) install( TARGETS ros2_cpp_lib EXPORT export_ros2_cpp_lib ARCHIVE DESTINATION lib LIBRARY DESTINATION lib RUNTIME DESTINATION bin INCLUDES DESTINATION include ) if(BUILD_TESTING) find_package(ament_lint_auto REQUIRED) set(ament_cmake_uncrustify_FOUND TRUE) set(ament_cmake_xmllint_FOUND TRUE) ament_lint_auto_find_test_dependencies() endif() ament_package()- 编辑
编译库
- 返回工作空间根目录并编译:
cd~/ros2_ws colcon build --packages-up-to ros2_cpp_lib
二、在另一个包中应用自定义库
创建应用包
- 在
src/目录下创建一个新的包,用于应用自定义库:
ros2 pkg create --build-type ament_cmake --license Apache-2.0 ros2_cpp_lib_demos --dependencies rclcpp ros2_cpp_lib- 在
编写应用节点
- 在
ros2_cpp_lib_demos/src/目录下创建节点文件demo_node.cpp:
#include"rclcpp/rclcpp.hpp"#include"ros2_cpp_lib/ros2_cpp_lib.hpp"classDemoNode:publicrclcpp::Node{public:DemoNode():Node("demo_node"){autolib_node=std::make_shared<ros2_cpp_lib::ros2_cpp_lib>("lib_node");lib_node->sum(3,4);}};intmain(intargc,char**argv){rclcpp::init(argc,argv);rclcpp::spin(std::make_shared<DemoNode>());rclcpp::shutdown();return0;}- 在
配置CMakeLists.txt
- 编辑
ros2_cpp_lib_demos/CMakeLists.txt文件,添加以下内容:
cmake_minimum_required(VERSION 3.8) project(ros2_cpp_lib_demos) 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(rclcpp REQUIRED) find_package(ros2_cpp_lib REQUIRED) # COMPILE add_executable(demo_node src/demo_node.cpp) target_compile_features(demo_node PUBLIC cxx_std_17) ament_target_dependencies(demo_node rclcpp ros2_cpp_lib) # INSTALL install(TARGETS demo_node DESTINATION lib/${PROJECT_NAME} ) if(BUILD_TESTING) find_package(ament_lint_auto REQUIRED) set(ament_cmake_uncrustify_FOUND TRUE) set(ament_cmake_xmllint_FOUND TRUE) ament_lint_auto_find_test_dependencies() endif() ament_package()- 编辑
编译并运行应用
- 返回工作空间根目录并编译:
cd~/ros2_ws colcon build --packages-up-to ros2_cpp_lib_demos- 运行应用节点:
sourceinstall/setup.bash ros2 run ros2_cpp_lib_demos demo_node