- 操作系统:ubuntu22.04
- IDE:Visual Studio Code
- 编程语言:C++11
- ROS版本:2
ROS 2(Robot Operating System 2)是一个用于编写机器人软件的灵活框架。它通过使用“话题”(topics)来促进节点之间的通信。下面将简要介绍ROS 2中的“话题”,包括如何发布和订阅话题,以及一些基本概念。
基本概念
- 节点 (Node):在ROS 2中,一个独立运行的进程称为节点。节点可以发布消息到话题或从话题接收消息。
- 话题 (Topic):话题是节点之间传递消息的通道。它们是有类型的,意味着所有通过特定话题发送的消息必须符合该话题定义的消息类型。
- 消息 (Message):消息是在话题上交换的数据包。每个消息都有一个明确的类型,例如std_msgs/String、sensor_msgs/Image等。
- 发布者 (Publisher):发布者是向特定话题发送消息的实体。一个节点可以有多个发布者,针对不同的或者相同的话题。
- 订阅者 (Subscriber):订阅者是从特定话题接收消息的实体。一个节点也可以拥有多个订阅者,监听不同的或者相同的话题。
发布和订阅话题
创建发布者和发送消息
以下是一个简单的例子,展示了如何创建一个发布者并向一个名为/chatter的话题发送字符串消息:
#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"
class MinimalPublisher : public rclcpp::Node
{
public:
MinimalPublisher() : Node("minimal_publisher")
{
publisher_ = this->create_publisher<std_msgs::msg::String>("/chatter", 10);
timer_ = this->create_wall_timer(
std::chrono::milliseconds(500),
std::bind(&MinimalPublisher::timer_callback, this));
}
private:
void timer_callback()
{
auto message = std_msgs::msg::String();
message.data = "Hello, world! " + std::to_string(count_++);
RCLCPP_INFO(this->get_logger(), "Publishing: '%s'", message.data.c_str());
publisher_->publish(message);
}
rclcpp::Publisher<std_msgs::msg::String>::SharedPtr publisher_;
rclcpp::TimerBase::SharedPtr timer_;
size_t count_ = 0;
};
int main(int argc, char * argv[])
{
rclcpp::init(argc, argv);
rclcpp::spin(std::make_shared<MinimalPublisher>());
rclcpp::shutdown();
return 0;
}
创建订阅者并接收消息
同样地,这里有一个例子展示了如何创建一个订阅者来监听同一话题/chatter上的消息:
#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"
class MinimalSubscriber : public rclcpp::Node
{
public:
MinimalSubscriber() : Node("minimal_subscriber")
{
subscription_ = this->create_subscription<std_msgs::msg::String>(
"/chatter", 10, std::bind(&MinimalSubscriber::topic_callback, this, std::placeholders::_1));
}
private:
void topic_callback(const std_msgs::msg::String::SharedPtr msg) const
{
RCLCPP_INFO(this->get_logger(), "I heard: '%s'", msg->data.c_str());
}
rclcpp::Subscription<std_msgs::msg::String>::SharedPtr subscription_;
};
int main(int argc, char * argv[])
{
rclcpp::init(argc, argv);
rclcpp::spin(std::make_shared<MinimalSubscriber>());
rclcpp::shutdown();
return 0;
}