rosbag 源码阅读笔记-1

2024-01-07 22:12
文章标签 源码 笔记 阅读 rosbag

本文主要是介绍rosbag 源码阅读笔记-1,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这篇文字想通过在自己的机器上查找rosbag的源码在哪里(而不是通过google搜索),来和大家分享一些ros和python的常用命令,了解一下rosbag的调用过程。

怎么查到源码在哪里

当然我们可以直接上ros的官网去查看,路径在这里:https://wiki.ros.org/rosbag

本着程序员的好奇心,我们也可以不看官方文档,自己先去探索一下:
我们先来看看我们日常用的rosbag是个啥:

$ which rosbag

在这里插入图片描述

可以看到我们日常使用的rosbag命令的位置在/opt/ros/noetic/bin/rosbag
然后我们在看下这个路径是个啥文件:

$  file  /opt/ros/noetic/bin/rosbag 

在这里插入图片描述

唉,发现这个命令居然是个python脚本
进一步的,我们来看下这个python脚本的内容是什么

$ code /opt/ros/noetic/bin/rosbag  ## 这里用vscode打开文件来查看

在这里插入图片描述

哇,这个python脚本如此简单粗暴,只有一个导入和调用。
既然它是一个python包,那我们用pip来看看它在哪里:
在这里插入图片描述

我们起码看到了两个有用的信息:
● Home-page: https://wiki.ros.org/rosbag, 有了这个,我们已经可以上官网去看了
● Location: /opt/ros/noetic/lib/python3/dist-packages, 有了这个,我们可以去看下rosbag的python代码是啥
去官网查资料就没啥好说的了,下面说一下自己看rosbag的python代码:
我们用vscode打开一下rosbag路径:

$ code /opt/ros/noetic/lib/python3/dist-packages/rosbag

在这里插入图片描述

可以看到,python代码的文件还是比较少的。
在上面,我们看到,/opt/ros/noetic/bin/rosbag文件中执行的是rosbag.rosbagmain()
因此我们主要看下这个函数:
函数在/opt/ros/noetic/lib/python3/dist-packages/rosbag/rosbag_main.py

def rosbagmain(argv=None):cmds = RosbagCmds()cmds.add_cmd('record', record_cmd, "Record a bag file with the contents of specified topics.")cmds.add_cmd('info', info_cmd, 'Summarize the contents of one or more bag files.')cmds.add_cmd('play', play_cmd, "Play back the contents of one or more bag files in a time-synchronized fashion.")cmds.add_cmd('check', check_cmd, 'Determine whether a bag is playable in the current system, or if it can be migrated.')cmds.add_cmd('fix', fix_cmd, 'Repair the messages in a bag file so that it can be played in the current system.')cmds.add_cmd('filter', filter_cmd, 'Filter the contents of the bag.')cmds.add_cmd('compress', compress_cmd, 'Compress one or more bag files.')cmds.add_cmd('decompress', decompress_cmd, 'Decompress one or more bag files.')cmds.add_cmd('reindex', reindex_cmd, 'Reindexes one or more bag files.')if sys.platform != 'win32':cmds.add_cmd('encrypt', encrypt_cmd, 'Encrypt one or more bag files.')cmds.add_cmd('decrypt', decrypt_cmd, 'Decrypt one or more bag files.')if argv is None:argv = sys.argvif '-h' in argv or '--help' in argv:argv = [a for a in argv if a != '-h' and a != '--help']argv.insert(1, 'help')if len(argv) > 1:cmd = argv[1]else:cmd = 'help'try:if cmd in cmds:cmds[cmd](argv[2:])else:cmds['help']([cmd])except KeyboardInterrupt:pass

在这里,我们看到熟悉的rosbag命令的影子,比如 rosbag info, rosbag play等
看一下代码,可以知道这个函数其实就是组织了各个子命令,下面我们以play这个子命令来看一下流程:
play 子命令调用的是play_cmd(argv)这个函数,
而看了这个函数内部的实现,它主要干了两件事:

  • 解析参数,比如 --rate, --duration等
  • 找到rosbag这个ros node:playpath = roslib.packages.find_node('rosbag', 'play')生成一个启动该rosnode的shell命令, 比如 rosbag play --rate 2 --duration 3 xxx.bag, 然后使用process = subprocess.Popen(cmd)去执行这个shell命令,启动这个rosnode

到这里,我们先来总结一下前面的内容:

  • 我们日常使用的rosbag命令,其实是一个pyhton脚本
  • 这个python脚本位于一个叫rosbag的python package中
  • 这个python脚本其实并没有实现具体的功能,它只是负责解析参数,最后启动一个叫做rosbag的ros节点

下面我们来看下这个ros节点:
既然是ros节点,我们来切换到该节点的目录下:

$ roscd rosbag

在这里插入图片描述

然后,我们来看看这个节点的信息:
在这里插入图片描述

是不是很熟悉,我们来看下package.xml
在这里插入图片描述

这不就是我们要找的rosbag的源码路径了吗。
经过这一波折腾,是不是熟悉了一些ros和python的命令了呢?

当然,如果你不想折腾,直接google, “rosbag source code” 就行啦。

这篇关于rosbag 源码阅读笔记-1的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/581391

相关文章

Java汇编源码如何查看环境搭建

《Java汇编源码如何查看环境搭建》:本文主要介绍如何在IntelliJIDEA开发环境中搭建字节码和汇编环境,以便更好地进行代码调优和JVM学习,首先,介绍了如何配置IntelliJIDEA以方... 目录一、简介二、在IDEA开发环境中搭建汇编环境2.1 在IDEA中搭建字节码查看环境2.1.1 搭建步

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟 开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚 第一站:海量资源,应有尽有 走进“智听

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

Java ArrayList扩容机制 (源码解读)

结论:初始长度为10,若所需长度小于1.5倍原长度,则按照1.5倍扩容。若不够用则按照所需长度扩容。 一. 明确类内部重要变量含义         1:数组默认长度         2:这是一个共享的空数组实例,用于明确创建长度为0时的ArrayList ,比如通过 new ArrayList<>(0),ArrayList 内部的数组 elementData 会指向这个 EMPTY_EL

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

如何在Visual Studio中调试.NET源码

今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。 我一般的做法是先判断是否为null,再判断Count。 看了一下Count的源码如下: 1 [__DynamicallyInvokable]2 public int Count3 {4 [__DynamicallyInvokable]5 get

工厂ERP管理系统实现源码(JAVA)

工厂进销存管理系统是一个集采购管理、仓库管理、生产管理和销售管理于一体的综合解决方案。该系统旨在帮助企业优化流程、提高效率、降低成本,并实时掌握各环节的运营状况。 在采购管理方面,系统能够处理采购订单、供应商管理和采购入库等流程,确保采购过程的透明和高效。仓库管理方面,实现库存的精准管理,包括入库、出库、盘点等操作,确保库存数据的准确性和实时性。 生产管理模块则涵盖了生产计划制定、物料需求计划、

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear

Spring 源码解读:自定义实现Bean定义的注册与解析

引言 在Spring框架中,Bean的注册与解析是整个依赖注入流程的核心步骤。通过Bean定义,Spring容器知道如何创建、配置和管理每个Bean实例。本篇文章将通过实现一个简化版的Bean定义注册与解析机制,帮助你理解Spring框架背后的设计逻辑。我们还将对比Spring中的BeanDefinition和BeanDefinitionRegistry,以全面掌握Bean注册和解析的核心原理。

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2