【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> 