在ROS2 Jazzy中,自定义C++库及其应用需要遵循ROS2的规范,以确保库能够正确编译、安装并被其他包调用。以下是一个详细的范例,包括自定义C++库的创建、编译以及在另一个包中的应用。

一、自定义C++库的创建与编译

  1. 创建库包

    • 创建一个新的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
    
  2. 编写库头文件

    • 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
    
  3. 编写库源文件

    • 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
    
  4. 配置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()
    
  5. 编译库

    • 返回工作空间根目录并编译:
    cd ~/ros2_ws
    colcon build --packages-up-to ros2_cpp_lib
    

二、在另一个包中应用自定义库

  1. 创建应用包

    • src/目录下创建一个新的包,用于应用自定义库:
    ros2 pkg create --build-type ament_cmake --license Apache-2.0 ros2_cpp_lib_demos --dependencies rclcpp ros2_cpp_lib
    
  2. 编写应用节点

    • 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;
    }
    
  3. 配置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()
    
  4. 编译并运行应用

    • 返回工作空间根目录并编译:
    cd ~/ros2_ws
    colcon build --packages-up-to ros2_cpp_lib_demos
    
    • 运行应用节点:
    source install/setup.bash
    ros2 run ros2_cpp_lib_demos demo_node
    
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐