正文
目录会跟随阅读位置移动。
阅读进度

在 ROS 2 里,节点之间最常见的通信方式就是 话题(Topic)通信。
它包含两个角色:
可以把它理解成广播模式:
发布/订阅适合处理 连续的数据流,例如:
这些数据的共同特点是:
所以这类场景通常不用 service,而是用 topic。
以一个字符串话题为例,流程如下:
publish() 发送消息简化理解:
发布者 -> Topic -> 订阅者
发布者最核心的步骤有四个:
典型代码:
publisher_ = this->create_publisher<std_msgs::msg::String>("chatter", 10);
这句话的含义是:
std_msgs::msg::String 的发布者chatter10发布消息时一般写:
publisher_->publish(msg);
这表示把 msg 发送到对应的话题上。
订阅者最核心的步骤有三个:
典型代码:
subscription_ = this->create_subscription<std_msgs::msg::String>(
"chatter",
10,
std::bind(&MySubscriber::topic_callback, this, std::placeholders::_1)
);
这句话的含义是:
chatter 这个话题std_msgs::msg::String10topic_callback典型回调函数:
void topic_callback(const std_msgs::msg::String::SharedPtr msg)
{
RCLCPP_INFO(this->get_logger(), "收到消息: %s", msg->data.c_str());
}
其中:
msg 就是收到的消息msg->data 是字符串内容发布者主要负责:
常见写法是配合定时器:
timer_ = this->create_wall_timer(
500ms,
std::bind(&MyPublisher::timer_callback, this)
);
意思是每隔 500ms 调用一次发布函数。
订阅者主要负责:
比如:
无论是发布者还是订阅者,创建时常会看到一个数字,比如:
10
它一般表示消息队列深度,可以理解成缓存区大小。
含义是:
初学时写 10 就够用了。
特点:
适合:
特点:
适合:
所以:
create_publisher
publish
create_subscription
callback
只要你在源码里看到这些函数,基本就能快速判断这个节点在做什么。
当你看一个 ROS 2 节点源码时,可以先找这些关键字:
create_publisher
publish
说明这个节点是 发布者 或至少包含发布功能。
create_subscription
std::bind(...callback...)
说明这个节点是 订阅者 或至少包含订阅功能。
通常一个节点不一定只有一种身份,它可能同时:
这在机器人系统里非常常见。
例如雷达驱动节点和建图节点:
所以整个 ROS 系统常常是:
节点A发布 -> 节点B订阅并处理 -> 节点B再发布 -> 节点C订阅
这其实就是很多机器人系统的数据流本质。
created by jokerbai