ros2 命令加载过程
ros2 topic代码位置:ros2\src\ros2cli\ros2topic
最终运作在ros2topic文件中
setup.py 定义挂载点,加载命令的执行函数

from setuptools import find_packages
from setuptools import setup
package_name = 'ros2topic'
setup(name=package_name,version='0.13.1',packages=find_packages(exclude=['test']),data_files=[('share/' + package_name, ['package.xml']),('share/ament_index/resource_index/packages',['resource/' + package_name]),],install_requires=['ros2cli'],zip_safe=True,author='Dirk Thomas',author_email='dthomas@osrfoundation.org',maintainer='Claire Wang, Mabel Zhang',maintainer_email='clairewang@openrobotics.org, mabel@openrobotics.org',url='https://github.com/ros2/ros2cli/tree/master/ros2topic',download_url='https://github.com/ros2/ros2cli/releases',keywords=[],classifiers=['Environment :: Console','Intended Audience :: Developers','License :: OSI Approved :: Apache Software License','Programming Language :: Python',],description='The topic command for ROS 2 command line tools.',long_description="""\
The package provides the topic command for the ROS 2 command line tools.""",license='Apache License, Version 2.0',tests_require=['pytest'],entry_points={'ros2cli.command': ['topic = ros2topic.command.topic:TopicCommand',],'ros2cli.extension_point': ['ros2topic.verb = ros2topic.verb:VerbExtension',],'ros2topic.verb': ['bw = ros2topic.verb.bw:BwVerb','delay = ros2topic.verb.delay:DelayVerb','echo = ros2topic.verb.echo:EchoVerb','find = ros2topic.verb.find:FindVerb','hz = ros2topic.verb.hz:HzVerb','info = ros2topic.verb.info:InfoVerb','list = ros2topic.verb.list:ListVerb','pub = ros2topic.verb.pub:PubVerb','type = ros2topic.verb.type:TypeVerb',],}
)

例如: ros2 topic list .会运行ros2topic.verb.list:ListVerb
先运行下面的main函数

from ros2cli.command import add_subparsers_on_demand
from ros2cli.command import CommandExtensionclass TopicCommand(CommandExtension):"""Various topic related sub-commands."""def add_arguments(self, parser, cli_name):self._subparser = parserparser.add_argument('--include-hidden-topics', action='store_true',help='Consider hidden topics as well')# add arguments and sub-commands of verbsadd_subparsers_on_demand(parser, cli_name, '_verb', 'ros2topic.verb', required=False)def main(self, *, parser, args):if not hasattr(args, '_verb'):# in case no verb was passedself._subparser.print_help()return 0extension = getattr(args, '_verb')# call the verb's main methodreturn extension.main(args=args)

下面执行 ros2\src\ros2cli\ros2topic\ros2topic\verb\list.py

from ros2cli.node.strategy import add_arguments as add_strategy_node_arguments
from ros2cli.node.strategy import NodeStrategy
from ros2topic.api import get_topic_names_and_types
from ros2topic.verb import VerbExtensionclass ListVerb(VerbExtension):"""Output a list of available topics."""# topic 后面参数解析def add_arguments(self, parser, cli_name):add_strategy_node_arguments(parser)parser.add_argument('-t', '--show-types', action='store_true',help='Additionally show the topic type')parser.add_argument('-c', '--count-topics', action='store_true',help='Only display the number of topics discovered')# duplicate the following argument from the command for visibilityparser.add_argument('--include-hidden-topics', action='store_true',help='Consider hidden topics as well')parser.add_argument('-v', '--verbose', action='store_true',help='List full details about each topic')@staticmethoddef show_topic_info(topic_info, is_publisher):message = ('Published' if is_publisher else 'Subscribed') + ' topics:\n'for (topic_name, topic_types, pub_count, sub_count) in topic_info:count = pub_count if is_publisher else sub_countif count:topic_types_formatted = ', '.join(topic_types)count_str = str(count) + ' ' + ('publisher' if is_publisher else 'subscriber') \+ ('s' if count > 1 else '')message += f' * {topic_name} [{topic_types_formatted}] {count_str}\n'return messagedef main(self, *, args):topic_info = []# NodeStrategy包括两个实现DirectNode和DaemonNode,DaemonNode在localhost 11511+domain 端口上,DirectNode#下面代码走DaemonNode分支 with NodeStrategy(args) as node:topic_names_and_types = get_topic_names_and_types(node=node,include_hidden_topics=args.include_hidden_topics)for (topic_name, topic_types) in topic_names_and_types:if args.verbose:pub_count = node.count_publishers(topic_name)sub_count = node.count_subscribers(topic_name)topic_info.append((topic_name, topic_types, pub_count, sub_count))else:topic_info.append((topic_name, topic_types, 0, 0))#输出发现主题个数, -cif args.count_topics:  print(len(topic_names_and_types))elif topic_names_and_types:# 列出有关每个主题的完整详细信息 -vif args.verbose:print(self.show_topic_info(topic_info, is_publisher=True))print(self.show_topic_info(topic_info, is_publisher=False))else:# ros2 topic list 默认输出for (topic_name, topic_types, _, _) in topic_info:msg = '{topic_name}'topic_types_formatted = ', '.join(topic_types)if args.show_types:msg += ' [{topic_types_formatted}]'print(msg.format_map(locals()))

列如
ros2 topic list -c
ros2 topic list -v
ros2 topic list -t
ros2 topic list --include-hidden-topics

ros2 topic 源码解析相关推荐

  1. ros2 代码结构及源码解析

    一.ros2 软件架构 ROS 2 Documentation: Rolling 这部分网上内容很多 ROS2应用开发框架 消息数据流 二.ros2 命令代码解析 ros2 加载过程 ros2 act ...

  2. RocketMQ源码解析:Filtersrv

    ???关注微信公众号:[芋艿的后端小屋]有福利: RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表 RocketMQ / MyCAT / Sharding-JDB ...

  3. Kafka核心源码解析 - KafkaController源码解析

    在进入源码解析之前,我先来介绍一些KafkaController在Kafka集群中的作用. (1)负责监听zookeeper上所有的元数据变更请求: (2)负责topic的partition迁移任务分 ...

  4. 【kafka】Kafka 源码解析:Group 协调管理机制

    1.概述 转载:Kafka 源码解析:Group 协调管理机制 在 Kafka 的设计中,消费者一般都有一个 group 的概念(当然,也存在不属于任何 group 的消费者),将多个消费者组织成一个 ...

  5. 跟我学RocketMQ之批量消息发送源码解析

    上篇文章 跟我学RocketMQ之消息发送源码解析 中,我们已经对普通消息的发送流程进行了详细的解释,但是由于篇幅问题没有展开讲解批量消息的发送.本文中,我们就一起来集中分析一下批量消息的发送是怎样的 ...

  6. loraserver 源码解析 (六) lora-app-server

    目录 下载源码 升级 npm 安装一些必要的依赖库 pq_trgm extension run 调用 handleDataDownPayloads 开启一个Goroutine  G1 run再调用 s ...

  7. 6、RocketMQ 源码解析之 Broker 启动(上)

    上面一篇我们介绍了 RocketMQ 的元数据管理,它是通过自定义一个 KV 服务器.并且其它服务在 NameServer 注册服务信息的时候都是全量注册.如果 RocketMQ 的拓扑图当中有多台 ...

  8. hashmap与concurrenthashmap源码解析

    hashmap源码解析转载:http://www.cnblogs.com/ITtangtang/p/3948406.html 一.HashMap概述 HashMap基于哈希表的 Map 接口的实现.此 ...

  9. Kafka生产者和消费者分区策略部分源码解析

    之前我在看其他的博客时,发现对于kafka consumer的RoundRobin的缺点分析中,有两种观点,一种认为缺点在于如果消费者组中消费者消费的主题不同,或者消费者线程数不同,那么会造成消费者消 ...

  10. Semantic SLAM源码解析

    这个语义SLAM建图是基于ROS的 下面上源码解析: 首先从semantic_cloud.py出发,这里接收相机读入的topic, 会得到RGB图和深度图, 同时会起orb_slam2计算位姿,我们这 ...

最新文章

  1. Toronto-3D:用于城市道路语义分割的大规模移动激光雷达数据集
  2. 【二级java】二叉树序列
  3. 功能测试怎么学?阿里测试工程师教你4个步骤
  4. java Executor实例_Executor框架+实例
  5. 转:java中static、final、static final的区别
  6. uboot load address、entry point、 bootm address以及kernel运行地址的意义及联系
  7. notepad++是什么软件_对比国外更优秀的五款国产软件,却不被国人所熟悉
  8. Spring简化Java开发_第1章—Spring之旅—简化Spring的java开发
  9. 英文文献中常见拉丁字母缩写
  10. 公园智慧路灯解决方案
  11. ai训练 样本大小_成本低、周期短,小样本学习能否成为AI落地的速效药?
  12. 利用antd进行轻量级表单开发,获取验证码
  13. 1.1 pug常用命令
  14. 一个域名引发的血案……
  15. 洛谷P4598 解高次方程,数论
  16. uva 10306 e-Coin
  17. 微信平台 签名生成工具
  18. Java中的RSA加解密工具类:RSAUtils
  19. 工信部通报下架60款APP:关联有赞、三六零、唯品会等上市公司
  20. 在安装了Sql2000的基础上安装Sql2005的详细过程

热门文章

  1. MacBook Air 2013全新安装Win7
  2. 计算机应用后期影音制作,影音制作工具(ImTOO Movie Maker)
  3. 解决Ubuntu 20.04 虚拟机克隆出多台造成的IP地址冲突的问题
  4. Java 中的 String、StringBuffer、StringBuilder
  5. 谈谈人们常说的“一时糊涂,鬼迷心窍”!
  6. oracle lob函数,Oracle可以处理LOB字段的常用字符函数
  7. 亲测有效,解决C盘空间不足问题
  8. 各双拼输入方案之间有明显的优劣之分吗?
  9. Android 梯形TextView
  10. echart-pie