ros2 消息订阅与发布示例 c++
以下是一个完整的ROS2 C++消息订阅与发布示例,包含节点创建、订阅者、发布者及回调函数实现:
#include <rclcpp/rclcpp.hpp>
#include <std_msgs/msg/string.hpp>using namespace std::chrono_literals;class MinimalNode : public rclcpp::Node {
public:MinimalNode() : Node("minimal_node"), count_(0) {// 创建发布者(话题名:message,队列大小10)publisher_ = this->create_publisher<std_msgs::msg::String>("message", 10);// 创建订阅者(话题名:chatter,队列大小10)subscription_ = this->create_subscription<std_msgs::msg::String>("chatter", 10, std::bind(&MinimalNode::topic_callback, this, std::placeholders::_1));// 创建定时器(周期2秒)timer_ = this->create_wall_timer(2s, std::bind(&MinimalNode::timer_callback, this));}private:// 定时器回调:发布消息void timer_callback() {auto message = std_msgs::msg::String();message.data = "Hello ROS2! Count: " + std::to_string(count_++);RCLCPP_INFO(this->get_logger(), "发布消息: '%s'", message.data.c_str());publisher_->publish(message);}// 订阅回调:处理接收到的消息void topic_callback(const std_msgs::msg::String & msg) {RCLCPP_INFO(this->get_logger(), "收到消息: '%s'", msg.data.c_str());}rclcpp::TimerBase::SharedPtr timer_;rclcpp::Publisher<std_msgs::msg::String>::SharedPtr publisher_;rclcpp::Subscription<std_msgs::msg::String>::SharedPtr subscription_;size_t count_;
};int main(int argc, char * argv[]) {rclcpp::init(argc, argv);rclcpp::spin(std::make_shared<MinimalNode>());rclcpp::shutdown();return 0;
}
代码解析
-
节点初始化:
- 继承
rclcpp::Node
创建MinimalNode
类 - 构造函数中初始化节点名称为
minimal_node
- 继承
-
发布者设置:
- 使用
create_publisher
创建发布者 - 话题名称:
message
- 消息类型:
std_msgs::msg::String
- 队列大小:10
- 使用
-
订阅者设置:
- 使用
create_subscription
创建订阅者 - 话题名称:
chatter
- 绑定回调函数
topic_callback
- 使用
std::bind
处理回调参数
- 使用
-
定时器机制:
- 每2秒触发一次
timer_callback
- 发布包含计数器的消息
- 每2秒触发一次
-
回调函数:
timer_callback
:构造并发布消息topic_callback
:处理接收到的订阅消息
编译配置(CMakeLists.txt)
cmake_minimum_required(VERSION 3.5)
project(ros2_example)find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(std_msgs REQUIRED)add_executable(minimal_node src/minimal_node.cpp)
ament_target_dependencies(minimal_node rclcpp std_msgs)install(TARGETS minimal_nodeDESTINATION lib/${PROJECT_NAME}
)ament_package()
运行步骤
- 编译:
colcon build --packages-select ros2_example
source install/setup.bash
- 运行节点:
ros2 run ros2_example minimal_node
- 测试效果:
- 终端1:运行节点
- 终端2:发布测试消息
ros2 topic pub /chatter std_msgs/String "data: 'Test Message'"
- 终端3:查看发布的话题
ros2 topic echo /message
关键特性说明
-
生命周期管理:
- 自动处理节点初始化、自旋和关闭
- 使用
rclcpp::spin
保持节点活跃
-
QoS配置:
- 默认使用
system_default
服务质量 - 可通过
rclcpp::QoS
自定义配置(如可靠性、历史记录等)
- 默认使用
-
日志系统:
- 使用
RCLCPP_INFO
等宏输出日志 - 支持不同日志级别(DEBUG, INFO, WARN, ERROR)
- 使用
-
时间处理:
- 使用
std::chrono_literals
定义时间间隔 - 支持纳秒级精度控制
- 使用
此示例展示了ROS2 C++开发的核心模式,包括节点创建、话题通信、定时器使用及日志处理,可作为复杂应用的基础模板。