ROS2学习(7)------ROS2 话题介绍

  • 操作系统: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;
}

运行结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

村北头的码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值