【ros2】ROS2 C++节点创建指南 - 教程

ROS2 C++节点创建指南

(基于《ROS2机器人开发:从入门到实践》第2章及拓展知识)

一、核心概念:C++节点的定位与优势

节点(Node)是ROS2系统中独立的功能执行单元,封装了特定业务逻辑(如传感器数据处理、运动控制、算法计算等)。C++作为ROS2开发的核心语言之一,其节点实现具有运行效率高、实时性强、内存管理灵活的优势,适合机器人控制、高性能数据处理等场景。

核心特征:

  • 独立性:每个节点专注单一功能,通过ROS2通信机制(话题、服务等)与其他节点解耦交互。
  • 标识性:通过唯一节点名区分,支持命名空间隔离,避免冲突。
  • 可扩展性:支持动态参数配置、生命周期管理等高级特性,适配复杂机器人系统。

二、基于书中第2章的C++节点创建核心步骤

1. 前置准备:创建C++功能包

节点需依托功能包管理,首先创建支持C++的ROS2功能包:

# 创建ament_cmake类型功能包(C++专用),依赖rclcpp(ROS2 C++核心库)
ros2 pkg create cpp_node_demo --build-type ament_cmake --dependencies rclcpp
  • 关键说明:
    • --build-type ament_cmake:指定为C++功能包构建类型(Python功能包为ament_python)。
    • --dependencies rclcpp:声明依赖ROS2 C++核心库,提供节点、日志、通信等基础API。

2. 编写节点代码(基础框架)

在功能包的src目录下创建节点文件(如simple_node.cpp),核心结构遵循“继承Node类 + 实现业务逻辑 + 主函数初始化”的模式:

// src/simple_node.cpp
#include "rclcpp/rclcpp.hpp"  // 包含ROS2 C++核心API
// 定义节点类,继承自rclcpp::Node
class SimpleNode : public rclcpp::Node {

public:
// 构造函数:初始化节点名称(必须唯一)
SimpleNode() : Node("simple_node") {

// 日志输出(ROS2标准日志接口)
RCLCPP_INFO(this->get_logger(), "C++简单节点已启动!");
}
};
// 主函数:初始化ROS2并运行节点
int main(int argc, char * argv[]) {

// 1. 初始化ROS2系统
rclcpp::init(argc, argv);
// 2. 创建节点实例(使用智能指针管理内存,避免泄漏)
auto node = std::make_shared<SimpleNode>();
  // 3. 运行节点(进入事件循环,等待回调触发)
  rclcpp::spin(node);
  // 4. 退出时清理资源
  rclcpp::shutdown();
  return 0;
  }

3. 配置功能包编译规则(CMakeLists.txt)

C++节点需通过CMake配置编译流程,修改功能包下的CMakeLists.txt

cmake_minimum_required(VERSION 3.8)
project(cpp_node_demo)
# 编译选项:开启警告,支持C++17标准(ROS2推荐)
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  add_compile_options(-Wall -Wextra -Wpedantic -std=c++17)
endif()
# 查找依赖包(必须与功能包创建时的依赖一致)
find_package(rclcpp REQUIRED)
# 1. 生成可执行文件:参数(目标名,源文件)
add_executable(simple_node src/simple_node.cpp)
# 2. 链接依赖库:将节点与rclcpp库关联
ament_target_dependencies(simple_node rclcpp)
# 3. 安装可执行文件:将编译产物安装到install目录(支持ros2 run调用)
install(TARGETS
  simple_node
  DESTINATION lib/${PROJECT_NAME}  # 安装路径:lib/功能包名
)
# 功能包声明(必须放在文件末尾)
ament_package()

4. 配置功能包清单(package.xml)

声明功能包元信息和依赖,确保ROS2能识别节点,修改package.xml

<?xml version="1.0"?>
  <?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
      <package format="3">
    <name>cpp_node_demo</name>
    <version>0.0.0</version>
    <description>ROS2 C++节点示例</description>
    <maintainer email="your@email.com">用户名</maintainer>
    <license>Apache-2.0</license>
      <!-- 编译依赖:构建时需要的库 -->
      <buildtool_depend>ament_cmake</buildtool_depend>
      <build_depend>rclcpp</build_depend>
        <!-- 运行依赖:节点运行时需要的库 -->
        <exec_depend>rclcpp</exec_depend>
          <!-- 测试依赖(可选) -->
          <test_depend>ament_lint_auto</test_depend>
          <test_depend>ament_lint_common</test_depend>
            <export>
            <build_type>ament_cmake</build_type>
            </export>
          </package>

5. 编译与运行节点

# 1. 进入工作空间根目录
cd ~/ros2_ws
# 2. 编译指定功能包(提高编译效率)
colcon build --packages-select cpp_node_demo
# 3. 生效环境变量(让ROS2识别节点)
source install/setup.bash
# 4. 运行节点:格式→ros2 run 功能包名 可执行文件名(与CMakeLists.txt中目标名一致)
ros2 run cpp_node_demo simple_node

运行成功后,终端输出日志:[INFO] [simple_node]:C++简单节点已启动!

三、书中第2章核心功能:节点的基础通信能力

书中第2章重点介绍了C++节点的话题发布/订阅定时器核心功能,以下是完整实现:

1. 话题发布者(Publisher)

节点通过发布者向指定话题周期性发送数据(如控制指令、传感器数据):

// src/talker_node.cpp
#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"  // 标准字符串消息类型
#include <chrono>  
posted @ 2025-12-14 14:45  clnchanpin  阅读(1)  评论(0)    收藏  举报