ros2 jazzy 自定义c++库及应用详细范例
本文介绍了在ROS2 Jazzy中创建和使用自定义C++库的完整流程。首先详细说明了如何创建库包、编写头文件和源文件,并配置CMakeLists.txt进行编译安装。然后展示了在另一个包中引用该库的方法,包括创建依赖库的应用包、编写应用节点代码,以及相应的CMake配置。通过colcon build命令编译后,可以运行demo_node验证库的功能。整个过程遵循ROS2规范,确保库能被正确编译、安
·
在ROS2 Jazzy中,自定义C++库及其应用需要遵循ROS2的规范,以确保库能够正确编译、安装并被其他包调用。以下是一个详细的范例,包括自定义C++库的创建、编译以及在另一个包中的应用。
一、自定义C++库的创建与编译
-
创建库包
- 创建一个新的ROS2工作空间(如果尚未创建):
mkdir -p ~/ros2_ws/src cd ~/ros2_ws/src- 创建一个新的包,用于存放自定义库:
ros2 pkg create --build-type ament_cmake --license Apache-2.0 ros2_cpp_lib- 进入包目录并创建必要的文件夹结构:
cd ros2_cpp_lib mkdir -p include/ros2_cpp_lib src -
编写库头文件
- 在
include/ros2_cpp_lib/目录下创建头文件ros2_cpp_lib.hpp:
#ifndef ROS2_CPP_LIB_HPP #define ROS2_CPP_LIB_HPP #include "rclcpp/rclcpp.hpp" namespace ros2_cpp_lib { class ros2_cpp_lib : public rclcpp::Node { public: ros2_cpp_lib(const std::string& node_name); ~ros2_cpp_lib(); void sum(int a, int b); }; } // namespace ros2_cpp_lib #endif // ROS2_CPP_LIB_HPP - 在
-
编写库源文件
- 在
src/目录下创建源文件ros2_cpp_lib.cpp:
#include "ros2_cpp_lib/ros2_cpp_lib.hpp" namespace ros2_cpp_lib { ros2_cpp_lib::ros2_cpp_lib(const std::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."); } void ros2_cpp_lib::sum(int a, int b) { 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" class DemoNode : public rclcpp::Node { public: DemoNode() : Node("demo_node") { auto lib_node = std::make_shared<ros2_cpp_lib::ros2_cpp_lib>("lib_node"); lib_node->sum(3, 4); } }; int main(int argc, char** argv) { rclcpp::init(argc, argv); rclcpp::spin(std::make_shared<DemoNode>()); rclcpp::shutdown(); return 0; } - 在
-
配置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- 运行应用节点:
source install/setup.bash ros2 run ros2_cpp_lib_demos demo_node
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)