首页 > 其他分享 >ROS2 如何实现发布者和订阅者

ROS2 如何实现发布者和订阅者

时间:2024-10-11 16:20:33浏览次数:11  
标签:std 订阅 msgs rclcpp listener talker 发布者 msg ROS2

1、创建工作空间

ros2_workspace cd qhr_ws/src    

ros2 pkg create test_moudle --build-type ament_cmake --dependencies rclcpp

目录格式如上图

2、创建订阅者和发布者code

创建发布者节点

在路径:/qhr_ws/src/test_moudle/src 下创建

 talker.cpp 的文件,内容如下:

#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"

using namespace std::chrono_literals;

class Talker : public rclcpp::Node {
public:
    Talker() : Node("talker") {
        publisher_ = this->create_publisher<std_msgs::msg::String>("topic", 10);
        auto publish_msg = [this]() -> void {
            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());
            this->publisher_->publish(message);
        };
        timer_ = this->create_wall_timer(500ms, publish_msg);
    }

private:
    rclcpp::TimerBase::SharedPtr timer_;
    rclcpp::Publisher<std_msgs::msg::String>::SharedPtr publisher_;
    size_t count_ = 1;
};

int main(int argc, char * argv[]) {
    rclcpp::init(argc, argv);
    rclcpp::spin(std::make_shared<Talker>());
    rclcpp::shutdown();
    return 0;
}

创建订阅者节点

在同一路径下,创建一个名为 listener.cpp 的文件,内容如下:

#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"

class Listener : public rclcpp::Node
{
public:
    Listener() : Node("listener")
    {
        subscription_ = this->create_subscription<std_msgs::msg::String>("topic", 10, std::bind(&Listener::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<Listener>());
    rclcpp::shutdown();
    return 0;
}

3、修改依赖

package.xml文件确保有:

  <buildtool_depend>ament_cmake</buildtool_depend>

  <depend>rclcpp</depend>
  <depend>std_msgs</depend>

CMakeLists.txt

find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(std_msgs REQUIRED)


add_executable(talker src/talker.cpp)
ament_target_dependencies(talker rclcpp std_msgs)

add_executable(listener src/listener.cpp)
ament_target_dependencies(listener rclcpp std_msgs)

install(TARGETS
  talker listener
  DESTINATION lib/${PROJECT_NAME})

4、编译执行

qhr_ws 工作空间下执行

colcon build

编译成功后,开两个终端执行

source install/setup.zsh  (zsh)
source install/setup.bash (bash)

#发布者
ros2 run test_moudle talker

#订阅者
ros2 run test_moudle listener

结束 再次撒花

标签:std,订阅,msgs,rclcpp,listener,talker,发布者,msg,ROS2
From: https://blog.csdn.net/qhr_1012/article/details/142855515

相关文章

  • Unity游戏通用框架——事件的订阅和发布(观察者模式)
    在游戏开发的基本思想中,逻辑与表现的分离极为重要,相互之间并不关心具体实现,只注册对应的事件,有事件发生时才调用相应的函数事件管理器usingSystem.Collections;usingSystem.Collections.Generic;publicclassevent_manager:Singletom<event_manager>{public......
  • 简单的c++实现消息发布/订阅机制例子(成员函数被其他类掉调用的例子)
    以下是一个简单的使用C++实现发布/订阅机制的示例代码。这个示例包含一个简单的事件系统,其中有发布者(Publisher)和订阅者(Subscriber)。以下代码需要C++11以上支持#include<iostream>#include<vector>#include<functional>//事件参数结构体,可以根据实际需求修改struc......
  • ROS2二十一讲学习——ROS2命令行操作
    Linux中的命令行命令行界面(Command-lineinterface,缩写:CLI):通常认为,命令行界面(CLI)没有图形用户界面(GUI)那么方便用户操作。因为,命令行界面的软件通常需要用户记忆操作的命令,但是,由于其本身的特点,命令行界面要较图形用户界面节约计算机系统的资源。在熟记命令的前提下,使用......
  • 国庆期间不停歇—学习ROS2第四天
    1.现在终端中创建文件其次在该文件目录下打开,最后在VS中创建两个文件夹,最后一个是src在终端中创建pkg,  ros2pkgcreatedemo_python_topic--build-typeament_python--dependenciesrclpyexample_interfaces--licenseApache-2.0ros2中创建功能包包的名字demo_py......
  • Redis 发布订阅模式
    概述Redis的发布/订阅是一种消息通信模式:发送者(Pub)向频道(Channel)发送消息,订阅者(Sub)接收频道上的消息。Redis客户端可以订阅任意数量的频道,发送者也可以向任意频道发送数据。在发送者向频道发送一条消息后,这条消息就会被发送到订阅该频道的客户端(Sub)Redis有两种发布/订阅模式......
  • 计算机毕业设计 基于Python的新闻采集与订阅平台的设计与实现 Python+Django+Vue 前后
    ......
  • 数据订阅与消费中间件Canal 服务搭建(docker)
    MySQLBin-log开启进入mysql容器dockerexec-itmysql5.7bash开启mysql的binlogcd/etc/mysql/mysql.conf.dvimysqld.cnf#在文件末尾处添加如下配置(如果没有这个文件就创建一个)[mysqld]#开启binloglog-bin=mysql-bin#log-bin=/var/lib/mysql/mysql-bin#或者配......
  • ChatGPT 订阅价或涨到 44 美元;研究称 AI 可 100% 绕过 reCAPTCHA V2 验证丨RTE 开发者
       开发者朋友们大家好: 这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(Real-TimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编辑的个人观......
  • 如何注册和使用Disney+?Disney+会员账号可以合租?Disney+会员账号订阅购买使用教程
    Disney+是什么,Disney+介绍详情移步至底部参考文章查看哦~Disney+账户分类Disney+的账号分类比较复杂,有国际版、Hotstar版和日本版三种,接下来将分别介绍这三种账号,让你在注册DisneyPlus账号时不再纠结。详情移步至底部参考文章查看哦~国内Disney+使用教程通过上面对Dis......
  • 【小白向】如何订阅支付DeepL,订阅DeepL Pro以及申请DeepL API?
    什么是DeepL?详情移步至底部原文查看哦~早在2008年12月,前Google科学家GereonFrahling在德国科隆创立了LingueeGmbH,DeepL的前身,并推出了创新的在线双语词典——Linguee。详情移步至底部原文查看哦~如何订阅支付DeepL翻译器,订阅DeepLPro以及申请DeepLAPI详情移步至底部原......