ROS 2 话题:使用C++进行发布与订阅

news2024/9/21 8:01:51

ROS 2 话题:使用C++进行发布与订阅

ROS 2提供了一种强大而灵活的通信机制,称为话题(Topics)。话题允许节点之间进行异步消息传递,从而实现松耦合的通信模式。在本文中,我们将介绍如何使用C++编程语言在ROS 2中创建发布者和订阅者节点,以实现话题通信。

前提条件

在开始之前,请确保您已经安装了ROS 2,并且已经设置好了工作环境。如果尚未安装,请参阅ROS 2的官方安装指南。

创建一个新的ROS 2包

首先,我们需要创建一个新的ROS 2包。打开终端并导航到您的工作空间(例如~/ros2_ws/src),然后运行以下命令:

cd ~/ros2_ws/src
ros2 pkg create my_topic_package --build-type ament_cmake --dependencies rclcpp

这将创建一个名为my_topic_package的包,并包含基本的目录结构和文件。

编写C++发布者节点

1. 创建发布者节点源文件

my_topic_package/src目录中创建一个名为publisher_node.cpp的文件,并添加以下代码:

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

using namespace std::chrono_literals;

class PublisherNode : public rclcpp::Node {
public:
    PublisherNode() : Node("publisher_node"), count_(0) {
        publisher_ = this->create_publisher<std_msgs::msg::String>("topic", 10);
        timer_ = this->create_wall_timer(
            500ms, std::bind(&PublisherNode::timer_callback, this));
    }

private:
    void timer_callback() {
        auto message = std_msgs::msg::String();
        message.data = "Hello, ROS 2: " + 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_;
};

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

2. 修改CMakeLists.txt

打开CMakeLists.txt文件,并添加以下内容以包含发布者节点:

find_package(std_msgs REQUIRED)
add_executable(publisher_node src/publisher_node.cpp)
ament_target_dependencies(publisher_node rclcpp std_msgs)

install(TARGETS
  publisher_node
  DESTINATION lib/${PROJECT_NAME})

3. 构建包

返回到工作空间的根目录,并构建包:

cd ~/ros2_ws
colcon build

4. 运行发布者节点

构建完成后,使用以下命令运行发布者节点:

source ~/ros2_ws/install/setup.bash
ros2 run my_topic_package publisher_node

您应该会在终端中看到类似“Publishing: ‘Hello, ROS 2: 0’”的输出。

编写C++订阅者节点

1. 创建订阅者节点源文件

my_topic_package/src目录中创建一个名为subscriber_node.cpp的文件,并添加以下代码:

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

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

2. 修改CMakeLists.txt

打开CMakeLists.txt文件,并添加以下内容以包含订阅者节点:

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

install(TARGETS
  subscriber_node
  DESTINATION lib/${PROJECT_NAME})

3. 构建包

再次返回到工作空间的根目录,并构建包:

cd ~/ros2_ws
colcon build

4. 运行订阅者节点

构建完成后,使用以下命令运行订阅者节点:

source ~/ros2_ws/install/setup.bash
ros2 run my_topic_package subscriber_node

在运行订阅者节点的终端中,您应该会看到类似“I heard: ‘Hello, ROS 2: 0’”的输出。

在这里插入图片描述

结论

通过本文,您已经学习了如何在ROS 2中使用C++创建发布者和订阅者节点,实现话题通信。这是ROS 2中一种基本而重要的通信机制,广泛应用于机器人开发中。掌握话题通信后,您可以进一步探索更多高级功能,如服务(Services)、动作(Actions)和参数(Parameters)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1984758.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

常见中间件漏洞大全及其修复方法(未完成)

一.Tomcat tomcat 是一个开源而且免费的 jsp 服务器&#xff0c;默认端口 : 8080 &#xff0c;属于轻量级应用服务器。它可以实现 JavaWeb程序的装载&#xff0c;是配置 JSP &#xff08; Java Server Page &#xff09;和 JAVA 系统必备的一款环境。 1.1 CVE-2017-12615 Tomc…

Transformers 中的Softmax 和 Layer Norm 如何并行?

1.Softmax 如何并行&#xff1f; Softmax 计算公式&#xff1a; 安全的 Softmax 运算&#xff1a; softmax 有个问题&#xff0c;那就是很容易溢出。比如采用半精度&#xff0c;由于float16的最大值为65504&#xff0c;所以只要x>11&#xff0c;那么softmax就溢出了。即使是…

C语言新手小白详细教程(6)函数

希望文章能够给到初学的你一些启发&#xff5e; 如果觉得文章对你有帮助的话&#xff0c;点赞 关注 收藏支持一下笔者吧&#xff5e; 阅读指南&#xff1a; 开篇说明为什么要使用函数&#xff1f;1.定义一个函数2.调用函数3.定义函数详解 开篇说明 截止目前&#xff0c;我们已…

华清IOday7 24-8-5

文章目录 使用有名管道实现&#xff0c;一个进程用于给另一个进程发消息&#xff0c;另一个进程收到消息后&#xff0c;展示到终端上&#xff0c;并且将消息保存到文件上一份使用有名管道实现两个进程间相互通信 使用有名管道实现&#xff0c;一个进程用于给另一个进程发消息&a…

服务器数据恢复—raid5阵列上层Oracle数据库数据恢复案例

服务器数据恢复环境&故障&#xff1a; 一台服务器上有8块SAS硬盘&#xff0c;其中的7块硬盘组建了一组RAID5阵列&#xff0c;另外1块硬盘作为热备盘使用。划分了6个LUN&#xff0c;服务器上部署有oracle数据库。 RAID5磁盘阵列中有2块硬盘出现故障并离线&#xff0c;RAID5阵…

浮点数在计算机中的编码方式

一、前言 我们常能听到&#xff0c;直接用浮点数做运算得出的结果是不准确的了&#xff1b;或者也能看到涉及到浮点数时&#xff0c;会出现一些奇奇怪怪的问题&#xff0c;比如&#xff1a; public class DecimalTest {public static void main(String[] args) {float f1 1.…

STK12.2+Python开发(二):添加访问约束,新建场景、卫星、地面站等,获取当前场景的信息

新建场景 1.获取当前打开的场景 #获取当前打开的场景 scenario root.CurrentScenario2.设置当前场景的时间 scenario.SetTimePeriod(Today,24hr)3.添加一个地面目标到当前的场景 scenario.SetTimePeriod(Today,24hr)4.添加一个地面目标到当前的场景&#xff0c;括号内是三…

空气质量传感器 - 从零开始认识各种传感器【二十八期】

空气质量传感器|从零开始认识各种传感器 1、什么是空气质量传感器&#xff1f; 空气质量传感器是一种检测空气中污染物浓度的设备&#xff0c;广泛应用于环境监测、智能家居、工业控制和健康管理等领域。 2、空气质量传感器是如何工作的&#xff1f; 对于每个人都关心的空气质…

效率何止10倍!利用输入法瞬间调用提示词

我们在日常工作/学习/生活有很多场景需要使用提示词&#xff0c;比如说&#xff1a; 快速总结文章快速排版解释概念翻译其它经常面对的任务 但是使用提示词有几个痛点&#xff1a; 你很难临时写一个非常完整的提示词你凑合写的提示词&#xff0c;又担心结果不满意如果已经保…

前端使用css动画绘制简易的进度条,数据多条的时候可以切换

文章目录 一、效果图二、使用步骤1.公共的进度条组件2.使用 总结 一、效果图 二、使用步骤 1.公共的进度条组件 我这里命名的progressBar.vue&#xff0c; 你们使用的时候直接复制粘贴到自己的项目里面即可。 文件中代码如下&#xff08;示例&#xff09;&#xff1a; <t…

EasyX 碰撞检测

代码&#xff1a; #define _UNICODE #define UNICODE#include <array> #include <cmath> #include <ctime> #include <format> #include <graphics.h> #include <vector>typedef struct tagRECTF {double left;double top;double right;d…

You Only Look Once:Unified, Real-Time Object Detection 论文阅读

论文名&#xff1a;You Only Look Once:Unified, Real-Time Object Detection 论文作者&#xff1a;Joseph Redmon et.al. 期刊/会议名&#xff1a;CVPR 2016 发表时间&#xff1a;2016-5 ​论文地址&#xff1a;https://arxiv.org/pdf/1506.02640 1.摘要 我们提出了一种新的目…

论文辅导 | 结合变种残差模型和 Transformer 的城市公路短时交通流预测

辅导文章 模型描述 城市公路交通流的预测受到历史交通流量和相邻车道交通流量的影响&#xff0c;蕴含了复杂的时空特征。针对传统交通流预测模型卷积长短时记忆网络(ConvLSTM)进行交通流预测时&#xff0c;未将时空特征分开提取而造成的提取不充分、特征信息混淆和特征信息缺失…

视频融合技术

三维视频融合技术遵循数字孪生多源数据融合的原则&#xff0c;比视频窗口、矩阵更加直观高效&#xff0c;省去了人脑理解空间的时间&#xff0c;可有效提升数字孪生城市在物联感知操作、虚实融合交互等方面的能力&#xff0c;动静一体、虚实结合&#xff0c;让三维场景“动起来…

常见的SQL注入

联合查询 如下&#xff0c;要求我们传入一个id值过去。传参?id1&#xff0c;当我们输入id1和id2时&#xff0c;页面中name值和password的值会发生变化&#xff0c;说明此时我们输入的数据和数据库有交互并且将数据显示在屏幕上了 输入?id1&#xff0c;页面发生报错&#xf…

手机联网如何设置动态ip

在现代社会&#xff0c;手机已成为我们日常生活中不可或缺的一部分&#xff0c;无论是工作、学习还是娱乐&#xff0c;都离不开网络的支持。而在手机联网的过程中&#xff0c;IP地址的分配方式显得尤为重要。动态IP地址因其灵活性和安全性&#xff0c;成为了许多用户的首选。那…

电子合同怎么制作?9款常用电子合同软件

文章将介绍了以下9个工具&#xff1a;e签宝、文书宝、签通云、快签宝、法天使、Zycus iContract、airSlate WorkFlow、Lightico、KeepSolid Sign。 在数字化快速发展的今天&#xff0c;电子合同成为了业务操作中不可或缺的一部分&#xff0c;但许多人仍然面临如何有效创建和管理…

Redis vs Memcached:Redis的三大优势

Redis vs Memcached&#xff1a;Redis的三大优势 1. 数据类型2. 数据持久化能力3. 高性能与灵活性 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 1. 数据类型 Redis&#xff1a;支持多样化的数据类型&#xff0c;包括字符串&#xff08;S…

前端性能优化-回流与重绘

前言 本文总结回流与重绘相关的知识点 回流与重绘的基本概念 重绘&#xff08;Repaint&#xff09;&#xff1a; 当元素样式发生改变&#xff0c;但不影响其几何属性的时候&#xff0c;浏览器只需要重新绘制这个元素&#xff0c;这个过程被称为重绘。 回流&#xff08;Refl…

Linux_监测CPU和内存

通过TOP持续获取进程的CPU和内存消耗&#xff0c;并写入到表格 # 配置进程名 processvm-agent # 配置次数 number100 # 配置间隔时间 time5 # csv结果文件 filecm_$(date %s).csv echo "%CPU,%MEM">${file} pid$(ps -aux | grep ${process} | awk -F {OFS"…