如何实现fastdds的topic调试工具

news2024/10/7 18:28:19

        在使用fastdds进行实际的开发调试中发现,常常需要对已经发布的话题进行进一步的调试,比如话题存在,话题内容,话题频率等等信息都需要确认,尤其是话题内容。这时候就需要一个能进行这项操作的调试工具。可能对于用过ros的同学来说,这很简单,因为ros、ros2提供的命令行调试调试工具就已经包含了该功能。那么fastdds作为ros2的底层支持是否直接支持了调试功能呢?如果想开发类似ros topic 的命令行的话题调试工具需要如何实现?

一、原生fastdds的支持情况

通过查看eProsima github和官网下载中心,可以确认eProsima提供了一系列的调试工具,其中包括:

monitor,用于查看已有实体和话题的归属图,构建话题发布的时序图

router,用于做网络路由方便远程网络进行dds组网

dds_py,用于对py开发者的python支持

结果是并没有一款直接可以用来查看话题内容的工具,那么我们是否可以直接依赖fastdds库开发一个类似工具呢?

实际上利用fastdds库现在无法实现话题内容调试的困难主要有两点,一是在接收到订阅的话题之后需要对应的反序列化文件去解析该话题实体,二是即使上层维护了对应的序列化文件,工具肯定是需要用户输入的参数来确认订阅的话题名称,这对C++这种编译时确定程序的语言来说是不可能实现。三是echo功能即便是订阅并反序列化话题内容后如何实现对所有idl里面struct的内容进行逐个打印。

二、ros2的ros2 topic功能是如何实现的

fastdds并没有提供直接的话题内容调试工具,那么既然ros2的底层是fastdds,ros2又是如何实现的呢?带着上面的几个问题去ros2_cli源码里面找一找答案。

ros2的cli是使用py开发的脚本命令行调试工具,下载cli代码进行初步分析,找到了我想要的功能 ros2 topic echo实现在ros2topic/verb/echo.py

主函数里面也是直接通过消息类型,话题名称,回调,qos创建话题订阅者,这和C++的创建订阅者的参数基本是一样的

 

实际上这里我们就已经注意到 message_type和topic_name已经完成了赋值,通过ros2 topic echo <topic_name>命令,用户只输入了topic_name,message_type是一个根据topic_name确认的一个对应的序列化类的实体,那么message_type的类从哪里定义的?message_type是从哪里实例化的?

 

 通过查阅源码,get_msg_class->_get_msg_class->get_message->import_message_from_namespaced_type,我们发现import_message_from_namespaced_type最终通过import_module接口动态加载了话题对应的序列化库,并返回了对应的序列化类名,这就解决了第一和第二个问题。话题文件在编译的时候会生成对应的序列化库,而调试程序通过python的import_module动态的加载了对应的库。

那继续往下看,echo是如何知道话题内容结构中的属性和属性的类型的?这个问题我们肯定能想到是在收到消息后进行的,对应代码也就是订阅的回调函数

 通过查阅源码,_subscriber_callback->_print_yaml->message_to_yaml->message_to_ordereddict,我们发现message_to_ordereddict 将msg._slots_和msg.SLOT_TYPES的内容做了解析,将属性名和属性值映射到了一个字典,这样打印的时候直接打印字典的键和值就好了。

以Num的msg为例,全局搜索了一下_slots_字段,发现_slots_是存放的消息内容,而这部分实现是在Num.py,是ros2生成消息的产物。这就解决了第三个问题,消息在编译的时候不仅会生成对应的序列化库也会生成_slots_结构,用于字段解析;

 三、仿照ros2如何开发一个dds话题调试程序

通过第一二部分的了解,我们知道开发topic调试程序需要解决的问题对应应的措施如下:

1、通过idl生成序列化文件的同时生成一个py库(fastddsgen支持同时生成py辅助库)

2、生成序列化文件的同时生成一个存储idl结构的一个py结构,用于解析收到后的全结构解析

完成以上两点后,就可以基于py开发一个简单的topic调试程序,程序接收用户输入的参数话题名,通过话题名去匹配序列化类名,然后动态加载对应的库,创建订阅者,当收到消息后,在回调中做整个消息结构的解析和显示。 

        通过以上步骤基本能实现内容调试功能,但是由于工具是直接创建了对应的话题发布者,基于dds的发现策略,可能会有消息匹配的延迟。一个更好的补充是效仿ros2再开发一个中间件守护进程用于存储整个分布式系统的实体和话题地图,这样调试工具就可以直接从守护进程拿到对应消息的信息,进行静态发现,从而减少实体发现的时间。

 

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

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

相关文章

hit_os_lab2 操作系统启动

前置知识 1.1 基础概念 入理论课程的学习。 如果网易云上的课程无法查看&#xff0c;也可以看 Bilibili 上的 操作系统哈尔滨工业大学李治军老师。 L2 开始揭开钢琴的盖子L3 操作系统启动 同济大学赵炯博士的《Linux 内核 0.11 完全注释&#xff08;修正版 V3.0&#xff09…

防火墙练习实验

♥️作者&#xff1a;小刘在C站 ♥️每天分享云计算网络运维课堂笔记&#xff0c;一起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的&#xff0c;绽放。 目录 二. 实验命令 一.实验图纸 二. 实验命令 ciscoasa> en Password: ciscoasa# co…

DJ12-2-4 串操作指令

目录 1. REP 重复前缀 2. 串操作指令的基本概念 3. 串操作指令的指令类型 &#xff08;1&#xff09;串传送指令 MOVS &#xff08;2&#xff09;串传送指令 CMPS &#xff08;3&#xff09;串扫描指令 SCAS &#xff08;4&#xff09;串装入指令 LODS &#xff08;5&a…

如果把网络原理倒过来看,从无到有,一切如此清晰(下)

人生若只如初见。 前言 当我在台灯下&#xff0c;听着远隔17年前五月天的歌&#xff0c;而在数日后&#xff0c;我的文字也会纵使相隔万里远的来到你的屏幕前&#xff0c;就觉得这一切妙不可言。 OSI 网络七层模型 《如果把网络原理倒过来看&#xff0c;从无到有&#xff0c…

Metabase学习教程:仪表盘-5

如何进行时间段比较 我们通过不同的方法来比较一个指标在不同日期范围内的表现。 我们将研究不同的策略来比较两个不同时期的指标&#xff0c;比如将本周与上周、去年同期与上一周进行比较。我们将使用Metabase附带的示例数据库&#xff0c;这样您就可以继续学习了。这个示例…

【Android App】Vulkan实现宇宙中旋转雷达动画效果(附源码和原始视频 超详细必看)

需要源码请点赞关注收藏后评论区留言私信~~~ 一、Vulkan简介 Vulkan是一个跨平台的图形绘制接口&#xff0c;被称为下一代OpenGL&#xff0c;因为尽管OpenGL提供了丰富的图形API&#xff0c;但他在底层实现的C代码早已封装起来&#xff0c;由于开发者修改不了底层代码&#xf…

社区系统项目复盘-5

文章目录Kafka消息队列实现系统通知功能什么是Kafka&#xff1f;Spring是怎么整合Kafka的&#xff1f;发送系统通知显示系统通知Kafka消息队列实现系统通知功能 阻塞队列 可以用阻塞队列来实现消息队列&#xff0c;阻塞队列是一个接口&#xff1a;BlockingQueue&#xff0c;可以…

易云维医院后勤综合管理平台为医院智慧后勤的建设与发展做出贡献

近年来&#xff0c;随着国家医疗卫生改革进程的不断推进&#xff0c;越来越多的医院开始关注运营成本控制问题&#xff0c;医院后勤管理服务模式的创新和优化变得越来越重要。利用医院后勤综合管理平台将医院后勤管理信息化将极大地提高医院智慧后勤建设与发展。在这种形势下&a…

Mac下安装Hadoop

1、引言 如果想在Mac下安装Hadoop而且让Hadoop能正常运行&#xff0c;那安装之前需要先安装java&#xff0c;在Mac环境下安装Hadoop。 2、配置ssh环境 在Mac下如果想使用Hadoop&#xff0c;必须要配置ssh环境&#xff0c; 如果不执行这一步&#xff0c;后面启动hadoop时会出现…

Spring MVC应该怎么学?这份教程带你快速入门,深入剖析源码!

前言: 什么是MVC&#xff1f; MVC&#xff08;Model-View-Controller&#xff09;&#xff1a;它是一种软件架构设计模式&#xff0c;分为三个部分&#xff1a; Model&#xff08;模型&#xff09;&#xff1a;业务的数据模型&#xff1b; View&#xff08;视图&#xff09;&…

xss-labs/level5

输入 <script>alert(xss)</script> 查看回显 如下所示 能够发现script被恶意替换为scr_ipt 查看源代码 第一个输出点被转义了 所以没有利用价值了 第二个输出点如同刚才所言被进行了关键字的恶意替换操作 那没办法 我们只能继续尝试一下在标签内部构造一个新…

91183-98-1,UDP-N-acetylglucosamine,5′-二磷酸尿嘧啶核苷-N-乙酰半乳糖胺二钠盐

5′-二磷酸尿嘧啶核苷-N-乙酰半乳糖胺二钠盐 英文名称&#xff1a;UDPAG&#xff1b;UDP-GlcNAc&#xff1b;UDP-N-acetylglucosamine&#xff1b;Uridine 5′-diphospho-N-acetylglucosamine sodium salt 其他名称&#xff1a;尿苷-5′-二磷酸-N-乙酰基-葡糖胺钠盐 CAS号&am…

Linux进阶-进程

目录 终端查询进程参数 进程状态 进程状态转换 子进程被Linux内核调入CPU执行的过程 子进程进入睡眠状态 子进程结束 进程控制 pid_t fork(void)&#xff1a;创建子进程 exec()函数族&#xff1a;运行一个可执行文件。 void exit(int status)&#xff1a;结束进程 w…

Illuminate/22圆桌回顾:Web3互操作性的未来现已到来

Illuminate/22 由Moonbeam主办的Illuminate/22于2022年11月10-11日成功举办。为期2天的线上会议聚集了60演讲嘉宾超过40个话题讨论。通过本次会议&#xff0c;来自行业领先的项目及负责人分享了通过互操作性和跨互连合约实现的最新进展。 本次以“Web3互操作性的未来现已到来”…

AI是如何影响全球的安防监控产业

全球AI安防市场现状 人工智能安防监控技术正在以更快的速度传播到更广泛的国家。全球176个国家中&#xff0c;至少有75个国家正在积极将AI技术用于监视目的。其中包括&#xff1a;智慧城市/安全城市平台&#xff08;56个国家&#xff09;&#xff0c;面部识别系统&#xff08;6…

【torch】如何把给定mask按比例选取再次划分mask?

背景 在以torch为基础的很多框架下有一些集成的数据集&#xff0c;数据集往往自带已经划分好的mask。但是如何能够把框架给出的mask再次划分&#xff1f;比如按比例划分出来80%的train mask。 解决 新生成一个每个元素都是0-1分布的与mask2的true位置相同的矩阵&#xff0c;…

xss-labs/level4

首先还是输入我们最熟悉的payload <script>alert(xss)</script> 查看界面回显 发现表单中的尖括号都消失了 说明后台服务器将尖括号删除了 再去查看源代码 通过源代码我们可以知道存在两个有意义的输出点 第一个输出点被转义了 没办法利用了script标签去执行js代…

亲戚小孩月薪17k,而我只有4k+,好慌......

我们总是在悲观与乐观中反复折磨自己&#xff0c;感觉自己一事无成。总是眼高手低&#xff0c;总以为大运会砸到自己&#xff0c;遇到挫折就会感到很沮丧。 大学四年没考到英语六级证书&#xff0c;小学教资考了两次。现在想要考研&#xff0c;但总是觉得来不及&#xff0c;或…

SpringBoot概念、创建和运行

文章目录什么是Spring Boot &#xff1f;为什么要学Spring Boot &#xff1f;Spring Boot 优点Spring Boot 项目创建项目目录介绍和运行约定大于配置什么是Spring Boot &#xff1f;为什么要学Spring Boot &#xff1f; Spring 的诞生是为了简化 Java 程序的开发的&#xff0c…

外汇天眼:外汇市场为何在周末休市?为什么周末行情有波动?

虽然从理论上而言&#xff0c;货币市场从不休市&#xff0c;但您很难见到有人在周日交易。新手甚至会认为&#xff0c;交易活动的停止是因为外汇经纪商周末休息。但如下文所述&#xff0c;实际情况并非如此。 外汇市场中的主要参与者 货币交易主要是为了促进贸易和旅游业。而且…