当前位置: 首页 > news >正文

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

文章目录

  • ROS2 C++节点创建指南
    • 一、核心概念:C++节点的定位与优势
    • 二、基于书中第2章的C++节点创建核心步骤
      • 1. 前置准备:创建C++功能包
      • 2. 编写节点代码(基础框架)
      • 3. 配置功能包编译规则(CMakeLists.txt)
      • 4. 配置功能包清单(package.xml)
      • 5. 编译与运行节点
    • 三、书中第2章核心功能:节点的基础通信能力
      • 1. 话题发布者(Publisher)
      • 2. 话题订阅者(Subscriber)
      • 3. 更新CMakeLists.txt编译多节点
      • 4. 运行发布者与订阅者
    • 四、书外拓展知识:C++节点高级特性与最佳实践
      • 1. 节点命名与命名空间
      • 2. 日志系统高级用法
      • 3. 动态参数配置
      • 4. 节点生命周期管理
      • 5. 内存管理最佳实践
      • 6. 调试工具
    • 五、常见问题与解决方案
    • 六、总结

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(TARGETSsimple_nodeDESTINATION 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>  
http://www.dtcms.com/a/613420.html

相关文章:

  • 可编程逻辑器件学习(day18):FPGA时序理论与数字电路基础深度解析
  • 大数据Spark(七十三):Transformation转换算子glom和foldByKey使用案例
  • 工业显示器在真空包装机中的应用
  • 西安网站建设咪豆广告发布与制作
  • 无锡网站设计服务电子商务网站技术
  • 跨平台账号矩阵高效协同术
  • Ubuntu重新挂载Windows C盘以及如何安全退出外挂硬盘
  • 前端微前端框架原理,qiankun源码分析
  • 深入HarmonyOS打印服务:从基础到高级应用开发
  • 在ubuntu中创建根文件系统
  • 科大讯飞哪些做教学资源的网站泰安网络推广seo
  • 建站资源共享怎样在阿里云做网站
  • 前端无障碍开发检查清单,WCAG合规
  • 【软考 位示图大小计算问题】物理块|字长|字数
  • 用Ai生成webos设计稿
  • DNS练习
  • 学生可以做的网站兼职门户网站建设哪专业
  • Python 编程实战 · 实用工具与库 — Flask 路由与模板
  • Wayland 会话下使用 Fcitx 5 输入法与 GNOME Shell 的兼容性
  • 第39节:3D打印输出:模型导出准备
  • 买空间的网站好wordpress萌
  • sql基本增删改查语句汇总
  • vue3-封装权限按钮组件和自定义指令
  • 物联网定位技术实验报告|实验一 Wi-Fi指纹定位
  • 标签的ref属性
  • 网站站内的seo怎么做拍卖网站建设需求
  • 微服务即时通讯系统(服务端)——消息转发微服务设计与实现详解(5)
  • 抽象工厂模式在智慧蔬菜大棚物联网系统中的应用
  • 新建站点的步骤网站建设工具的公司
  • 【微服务】【Nacos 3】 ① 深度解析:架构演进、核心组件与源码剖析