ROS2 话题通信

news2025/2/19 15:57:08

1. 基本概念

  • 发布-订阅模型:节点间通过话题(Topic)异步通信,发布者(Publisher)发送消息,订阅者(Subscriber)接收消息。

  • 话题(Topic):数据的传输通道,由名称唯一标识(如 /cmd_vel)。

  • 消息(Message):话题中传输的数据结构,支持标准类型(如 std_msgs/String)或自定义类型。

话题通信模型

2. 核心组件

  • 发布者(Publisher):向指定话题发送消息。

  • 订阅者(Subscriber):监听话题并接收消息。

  • 消息接口(Interface):定义数据的格式(如 .msg 文件)。

3. 实现示例(以 Python 为例)

(1) 创建发布者节点

import rclpy

from rclpy.node import Node

from std_msgs.msg import String



class PublisherNode(Node):

    def __init__(self):

        super().__init__('my_publisher')

        self.publisher = self.create_publisher(String, 'chatter', 10)

        timer_period = 1.0 # 每秒发布一次

        self.timer = self.create_timer(timer_period, self.timer_callback)

    

    def timer_callback(self):

        msg = String()

        msg.data = 'Hello, ROS2!'

        self.publisher.publish(msg)

        self.get_logger().info(f'Publishing: "{msg.data}"')



def main(args=None):

    rclpy.init(args=args)

    node = PublisherNode()

    rclpy.spin(node)

    node.destroy_node()

    rclpy.shutdown()



if __name__ == '__main__':

    main()

(2) 创建订阅者节点

import rclpy

from rclpy.node import Node

from std_msgs.msg import String



class SubscriberNode(Node):

    def __init__(self):

        super().__init__('my_subscriber')

        self.subscription = self.create_subscription(String,'chatter',self.listener_callback,10)

    def listener_callback(self, msg):

        self.get_logger().info(f'Received: "{msg.data}"')



def main(args=None):

    rclpy.init(args=args)

    node = SubscriberNode()

    rclpy.spin(node)

    node.destroy_node()

    rclpy.shutdown()



if __name__ == '__main__':

    main()

(3) 配置依赖和编译
  • package.xml:添加 rclpystd_msgs 依赖。

<depend>rclpy</depend>

<depend>std_msgs</depend>

  • setup.py:确保入口点已注册。

entry_points={

    'console_scripts': [

        'publisher = my_package.publisher:main',

        'subscriber = my_package.subscriber:main',

    ],

}

(4) 编译

colcon build --packages-select my_package

source install/setup.bash

(5) 运行与测试
  • 启动发布者

    
    ros2 run my_package publisher
    
    
  • 启动订阅者

    
    ros2 run my_package subscriber
    
    
  • 查看话题列表

    
    ros2 topic list
    
    
  • 手动发布消息

    
    ros2 topic pub /chatter std_msgs/String "{data: 'Manual message'}"
    
    

4. 服务质量(QoS)配置

ROS2 通过 QoS 策略控制通信行为,常用配置:

  • 可靠性(Reliability)

    • Reliable:确保消息不丢失(适用于关键数据)。

    • BestEffort:允许丢包(适用于高频低优先级数据)。

  • 持久性(Durability)

    • TransientLocal:订阅者可接收发布者历史消息。
  • 示例


from rclpy.qos import QoSProfile, QoSReliabilityPolicy, QoSDurabilityPolicy



qos_profile = QoSProfile(

    depth=10,#队列的深度,也就是发布者或订阅者能保存的消息数量

    reliability=QoSReliabilityPolicy.RELIABLE,

    durability=QoSDurabilityPolicy.TRANSIENT_LOCAL

)



self.publisher = self.create_publisher(String, 'chatter', qos_profile)

QoSDurabilityPolicy参数

  • 可选值:
    • TRANSIENT_LOCAL:发布者保留历史消息
    • VOLATILE:不保留历史消息

在这里插入图片描述

5. 高级特性

  • 自定义消息

    1. msg 目录下创建 .msg 文件(如 MyMessage.msg)。

    2. CMakeLists.txtpackage.xml 中声明消息生成依赖。

  • 多话题通信:一个节点可同时作为多个话题的发布者/订阅者。

  • 同步与异步通信:默认异步,可通过 wait_for_message() 实现同步接收。

6. 话题通信常用命令

$ ros2 topic list                # 查看话题列表
$ ros2 topic info <topic_name>   # 查看话题信息
$ ros2 topic hz <topic_name>     # 查看话题发布频率
$ ros2 topic bw <topic_name>     # 查看话题传输带宽
$ ros2 topic echo <topic_name>   # 查看话题数据
$ ros2 topic pub <topic_name> <msg_type> <msg_data>   # 发布话题消息

7.实际应用

话题命名:使用/namespace/topic_name结构
消息设计:避免超过1MB的大消息
频率控制:合理设置发布频率(建议≤100Hz)

  • 话题无数据

    • 检查话题名称是否一致:ros2 topic list | grep <topic_name>

    • 确认消息类型匹配:ros2 topic info <topic_name>

    • 检查 QoS 配置是否兼容(如发布者使用 BestEffort,订阅者需相同)。

  • 消息延迟

    • 增大 QoS 的 depth 参数以缓冲更多消息。

    • 优化节点性能,减少回调函数处理时间。


补充:

1.与 ROS1 的主要区别

  • 底层协议:ROS2 使用 DDS(数据分发服务),支持更灵活的通信配置。

  • 节点生命周期:ROS2 节点需显式初始化和销毁。

  • 命令行工具:ROS2 使用 ros2 替代 roscore,无需主节点(Master)。

ros2 topic pub命令

  ros2 topic pub [选项] <话题名称> <消息类型> "<消息内容>"

一、命令参数详解

ros2 topic pub 
/chatter              # 目标话题名称
std_msgs/String       # 消息类型(包名/消息名)
"{data: 'Manual message'}"  # YAML格式的消息内容

二、各部分功能说明

  1. 话题名称

    • 必须是已存在的活跃话题
    • 查看所有话题:ros2 topic list
  2. 消息类型

    • 标准消息:如std_msgs/String, geometry_msgs/Twist
    • 自定义消息:package_name/msg/MyMessage
  3. 消息内容

    • YAML格式或Python字典格式
    • 必须严格匹配消息结构

三、自定义消息步骤

  1. 查看消息结构

    ros2 interface show std_msgs/msg/String
    # 输出:string data
    
  2. 复杂消息示例

    # 发布geometry_msgs/Twist
    ros2 topic pub /cmd_vel geometry_msgs/Twist "
    linear:
      x: 0.5
      y: 0.0
      z: 0.0
    angular:
      x: 0.0
      y: 0.0
      z: 0.3"
    
  3. 常用选项参数

    -1      # 发布一次后退出
    -r 10   # 以10Hz频率持续发布
    -w 2    # 等待2秒后发布
    

四、实用技巧

  1. 自动补全

    ros2 topic pub /chatter std_msgs/String <按Tab键补全>
    
  2. 调试建议

    # 先使用echo验证话题
    ros2 topic echo /chatter
    # 再发布测试消息
    

五、常见错误处理

  1. 格式错误

    • 错误:缺少缩进或冒号
    • 解决:使用YAML校验工具检查
  2. 类型不匹配

    # 错误示例:字符串赋给数值字段
    "{data: 'hello'}"  # 用于std_msgs/Int32会报错
    
  3. 字段缺失

    • 必须完整填写所有required字段

即使最高的山,也不比最低的山谷更靠近天空。任何地方都不比另一个地方拥有更多的天空。 —辛波斯卡

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

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

相关文章

【学习资源】时间序列数据分析方法(1)

时间序列数据分析是一个有趣的话题&#xff0c;让我们多花一些时间来研究。此篇为第一篇文章。主要介绍特征提取方法、深度学习时序数据分析模型、参考资源。期望能帮助大家解决工业领域的相关问题。 1 特征提取方法&#xff1a;信号处理 (来源:INTELLIGENT FAULT DIAGNOSIS A…

Streamlit与Qlib:量化投资策略可视化实战

Streamlit与Qlib&#xff1a;量化投资策略可视化实战 1. 项目背景 在量化投资领域&#xff0c;数据可视化是理解和展示投资策略的关键。本文将详细介绍如何使用Streamlit和Qlib构建一个交互式的量化投资策略可视化应用。 2. 环境准备 2.1 安装依赖 # 安装必要的库 pip ins…

Ceph集群搭建2025(squid版)

squid版本维护年限 apt install -y cephadmecho >> "deb http://mirrors.163.com/ceph/debian-squid/ bookworm main" echo >> "deb-src http://mirrors.163.com/ceph/debian-squid/ bookworm main"#安装源 cephadm install #开始初始化一个最…

机器学习实战(3):线性回归——预测连续变量

第3集&#xff1a;线性回归——预测连续变量 在机器学习的世界中&#xff0c;线性回归是最基础、最直观的算法之一。它用于解决回归问题&#xff0c;即预测连续变量&#xff08;如房价、销售额等&#xff09;。尽管简单&#xff0c;但线性回归却是许多复杂模型的基石。今天我们…

【漫话机器学习系列】093.代价函数和损失函数(Cost and Loss Functions)

代价函数和损失函数&#xff08;Cost and Loss Functions&#xff09;详解 1. 引言 在机器学习和深度学习领域&#xff0c;代价函数&#xff08;Cost Function&#xff09;和损失函数&#xff08;Loss Function&#xff09;是核心概念&#xff0c;它们决定了模型的优化方向。…

LabVIEW 天然气水合物电声联合探测

天然气水合物被认为是潜在的清洁能源&#xff0c;其储量丰富&#xff0c;预计将在未来能源格局中扮演重要角色。由于其独特的物理化学特性&#xff0c;天然气水合物的探测面临诸多挑战&#xff0c;涉及温度、压力、电学信号、声学信号等多个参数。传统的人工操作方式不仅效率低…

【记忆化搜索】最长递增子序列

文章目录 300. 最长递增子序列解题思路&#xff1a;递归 -> 记忆化搜索 300. 最长递增子序列 300. 最长递增子序列 ​ 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 ​ 子序列 是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&am…

Tomcat的升级

一、为什么Tomcat需要升级 在生产环境中&#xff0c;我们都会指定对应的Tomcat版本进行安排配置&#xff0c;但是由于Tomcat厂商对于小版本的更新迭代会将一些Bug修复&#xff0c;这个时候在生产中出现问题/预防出现问题&#xff0c;可以通过小版本的升级解决前提&#xff1a;…

4-制作UI

创建模块文件夹 Unity编辑器->Tools->YIUI自动化工具&#xff0c;在新增模块名称那里输入模块名字并点击创建。便可看到在GameRes/YIUI文件夹下有新建的文件夹与内容了。里面包含图集、预制体、Sprites。如果进行预制体的修改&#xff0c;则需要双击进入再修改&#xff0…

vue3+element-plus中的el-table表头和el-table-column内容全部一行显示完整(hook函数)

hook函数封装 export const useTableColumnWidth _this > {const { refTable } _thisconst columnWidthObj ref()const getTableColumnWidth cb > {nextTick(() > {columnWidthObj.value {}// 获取行rowsconst tableEle refTable?.refBaseTable?.$elif (!tab…

DeepSeek 助力 Vue 开发:打造丝滑的开关切换(Switch)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…

使用Python爬虫实时监控行业新闻案例

目录 背景环境准备请求网页数据解析网页数据定时任务综合代码使用代理IP提升稳定性运行截图与完整代码总结 在互联网时代&#xff0c;新闻的实时性和时效性变得尤为重要。很多行业、技术、商业等领域的新闻都可以为公司或者个人发展提供有价值的信息。如果你有一项需求是要实时…

语言大模型基础概念 一(先了解听说过的名词都是什么)

SFT&#xff08;监督微调&#xff09;和RLHF&#xff08;基于人类反馈的强化学习&#xff09;的区别 STF&#xff08;Supervised Fine-Tuning&#xff09;和RLHF&#xff08;Reinforcement Learning from Human Feedback&#xff09;是两种不同的模型训练方法&#xff0c;分别…

DeepSeek v3 技术报告阅读笔记

注 本文参考 DeepSeek-v3 / v2 / v1 Technical Report 及相关参考模型论文本文不包括基础的知识点讲解&#xff0c;为笔记/大纲性质而非教程&#xff0c;建议阅读技术报告原文交流可发送至邮箱 henryhua0721foxmail.com 架构核心 核心&#xff1a; MLA 高效推理DeepSeekMOE 更…

GESP2024年9月认证C++七级( 第三部分编程题(1)小杨寻宝)

参考程序&#xff1a; #include <bits/stdc.h> using namespace std; const int N 1e510; vector<int> g[N]; // 图的邻接表 int col[N], dep[N], has[N];// 深度优先遍历&#xff0c;计算每个节点的深度 void dfs(int x, int fa) {dep[x] dep[fa] 1; // 计算…

解锁电商数据宝藏:淘宝商品详情API实战指南

在电商蓬勃发展的今天&#xff0c;数据已成为驱动业务增长的核心引擎。对于商家、开发者以及数据分析师而言&#xff0c;获取精准、实时的商品数据至关重要。而淘宝&#xff0c;作为国内最大的电商平台&#xff0c;其海量商品数据更是蕴含着巨大的价值。 本文将带你深入探索淘…

webshell通信流量分析

环境安装 Apatche2 php sudo apt install apache2 -y sudo apt install php libapache2-mod-php php-mysql -y echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/info.php sudo ufw allow Apache Full 如果成功访问info.php&#xff0c;则环境安…

在 rtthread中,rt_list_entry (rt_container_of) 已知结构体成员的地址,反推出结构体的首地址

rt_list_entry (rt_container_of)宏定义&#xff1a; /*** rt_container_of - return the start address of struct type, while ptr is the* member of struct type.*/ #define rt_container_of(ptr, type, member) \((type *)((char *)(ptr) - (unsigned long)(&((type *…

趣味魔法项目 LinuxPDF —— 在 PDF 中启动一个 Linux 操作系统

最近&#xff0c;一位开源爱好者开发了一个LinuxPDF 项目&#xff08;ading2210/linuxpdf: Linux running inside a PDF file via a RISC-V emulator&#xff09;&#xff0c;它的核心功能是在一个 PDF 文件中启动并运行 Linux 操作系统。它通过巧妙地使用 PDF 文件格式中的 Ja…

【Linux】Socket编程—TCP

&#x1f525; 个人主页&#xff1a;大耳朵土土垚 &#x1f525; 所属专栏&#xff1a;Linux系统编程 这里将会不定期更新有关Linux的内容&#xff0c;欢迎大家点赞&#xff0c;收藏&#xff0c;评论&#x1f973;&#x1f973;&#x1f389;&#x1f389;&#x1f389; 文章目…