rosbag 源码阅读笔记-1

news2024/11/24 17:02:18

这篇文字想通过在自己的机器上查找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.argv

    if '-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” 就行啦。

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

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

相关文章

Tmux 使用小记

本文参考自 阮一峰老师Tmux 使用教程[1] Tmux,不仅仅是分屏那么简单。。。 与tmux类似的工具是screen 会话管理 将窗口与会话"解绑" 对于没有图形界面只有shell的场景(如服务器),尤其有用..这是其最核心解决的问题(窗口管理啥的只能算锦上添花的辅助功能)…

1.7~1.8数算总复习PART1

偶数结点就一定是左孩子,奇数结点就一定是右孩子,判断两相邻编号的两节点是否为兄弟,就看他们除以2后的结果是否相同即可 由于先序遍历是“根――左子树――右子树”,而后序遍历是“左子树――右子树――根”,若某二叉…

【OpenMP】 2.1 简单示例

1、C中的OMP显示构造 OpenMP在C/C中通常以编译指令的方式进行使用&#xff0c;一个指令和一个结构化块组成构造。 #pragma omp parallel [clause[[,]clause]... ]#pragma omp parallel private(x) {//并行代码 } 示例代码: #include <iostream> #include <omp.h&g…

阿里与上交大提出 LLM 长文本计算新解法:可处理文本长达 1900k 字节

在实际应用大模型的过程中&#xff0c;尤其是处理长文本的上下文信息时&#xff0c;如何高效灵活地调度计算资源成为一个学术界与工业界共同关注的问题。 大语言模型所能容纳的上下文长度直接影响了诸如 ChatGPT 等高级应用与用户交互体验的优劣程度&#xff0c;这给云环境下的…

【问题】SpringBoot项目中log4j与logback的Jar包冲突问题

这篇文章主要给大家介绍了解决SpringBoot项目中log4j与logback的Jar包冲突问题,文中有详细的解决方法和冲突的原因。 SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/C:/Users/lx/.m2/repository/org/slf4j/slf4j-log4j12/1.7.25/sl…

Java学习笔记(六)——基本数据类型及其对应的包装类

文章目录 包装类基本数据类型及其对应的包装类获取Integer对象的方式(了解)获取Integer对象两种方式的区别(掌握) 包装类的计算&#xff1a;自动装箱和自动拆箱Integer成员方法综合练习练习1练习2练习3练习4练习5 包装类 包装类&#xff1a;基本数据类型对应的引用数据类型。 …

10本医护升职称可用的医药普刊推荐,参数大全!

医、药、护、技及医学工程等相关的人员&#xff0c;进行卫生高级职称评审时&#xff0c;需要在专业期刊上公开发表本专业学术论文&#xff0c;论文的方向、内容质量以及发表的刊物都至关重要。今天常笑医学给大家整理了10本不错的医药普刊&#xff0c;供大家参考&#xff01; 1…

x-cmd pkg | busybox - 嵌入式 Linux 的瑞士军刀

目录 简介首次用户功能特点竞品和相关作品 进一步阅读 简介 busybox 是一个开源的轻量级工具集合&#xff0c;集成了一批最常用 Unix 工具命令&#xff0c;只需要几 MB 大小就能覆盖绝大多数用户在 Linux 的使用&#xff0c;能在多款 POSIX 环境的操作系统&#xff08;如 Linu…

普中STM32-PZ6806L开发板(有点悲伤的故事续-人灯还未了)

简介 继上篇 普中STM32-PZ6806L开发板(有点悲伤的故事) 说到 关于 普中STM32-PZ6806L开发板的LED流水灯也被烧坏掉了&#xff0c;再也无法玩流水灯, 内心充满了只会流水灯的不甘, 流水灯就是单片机的Hello World&#xff0c;怎么能没有呢&#xff1f; 事情发展 好巧不巧想起最近…

十九:爬虫最终篇-平安银行商城实战

平安银行商场实战 需求 获取该商城商品信息 目标网址 https://m.yqb.com/bank/product-item-50301196.html?mcId1583912328849970&loginModepab&historyy&sceneModem&traceid30187_4dXJVel1iop详细步骤 1、寻找数据接口 2、对比payload寻找可疑参数 3、多…

Spring——基于注解的AOP控制事务

基于注解的AOP控制事务 1.拷贝上一次代码 2.applicationContext.xml <!-- 开启spring对注解事务的支持 --> <tx:annotation-driven transaction-manager"transactionManager"/> 3.service Service Transactional(readOnlytrue,propagation Propagatio…

RT_Thread 调试笔记:时间相关,时钟管理函数,延时,定时器、 毫秒转换为时分秒 等

说明&#xff1a;记录日常使用 RT_Thread 开发时做的笔记。 持续更新中&#xff0c;欢迎收藏。 1. 延时函数 1. us延时函数 rt_hw_us_delay(rt_uint32_t us);//输如数据是us rt_hw_us_delay(200);//输入数据是us 2. ms延时函数 rt_thread_mdelay(1000);//输入数据是ms 2…

Android Matrix (二)具体图形变换参数的获取

Android Matrix &#xff08;二&#xff09;具体图形变换参数的获取 Matrix 类在 Android 中用于表示 3x3 的变换矩阵。这个矩阵可以应用于画布&#xff08;Canvas&#xff09;&#xff0c;视图&#xff08;View&#xff09;或者位图&#xff08;Bitmap&#xff09;&#xff0…

C#设计模式之单例模式

介绍 单例模式&#xff08;Singleton&#xff09;保证一个类仅有一个实例&#xff0c;并提供一个访问它的全局访问点。 单例模式的结构图如下所示&#xff1a; 使用单例模式的原因 对一些类来说&#xff0c;只有一个实例是很重要的。如何才能保证一个类只有一个实例并且这个…

【JAVA】Iterator 怎么使用?有什么特点

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; JAVA ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 Iterator 接口的主要方法&#xff1a; 例子 特点&#xff1a; 结语 我的其他博客 前言 在编程的世界里&#xff0c;迭代…

【QML COOK】- 000-创建Project

1. 文件->New Project... 2. Application(Qt)->Qt Quick Application(compat) 3. 填好【名称】和【创建路径】 4. 选择CMake 5. 选择QT6.2 6. 直接【下一步】 7. 直接下一步 8. 直接下一步 9. 出现工程文件 10. 点击运行 11. 出现窗口

npm报错error:03000086:digital envelope routines::initialization error

可能是因为node版本过高&#xff0c;与现在的项目不符合 这是降低node版本的命令&#xff0c;然后重新运行 npm install npm8.1.2 -g

张留念瞰游天下总经理与汤加政府签署合作备忘 将于2024年隆重启动

汤加是南太平洋上一个美丽的岛国&#xff0c;是南太平洋唯一维持君主立宪制的国家&#xff0c;全国由173个海岛组成&#xff0c;海洋、海岛旅游资源丰富&#xff0c;是个原生态的旅游胜地。 中汤两国建交25年以来&#xff0c;两国政府高级官员和代表团互访频繁&#xff0c;在政…

【源码预备】Calcite基础知识与概念:关系代数概念、查询优化、sql关键字执行顺序以及calcite基础概念

文章目录 一. 关系代数的基本知识二. 查询优化三. SQL语句的解析顺序1. FROM2. WHERE3. GROUP BY4. HAVING5. SELECT 四. Apache Calcite中的基本概念1. Adapter2. Calcite中的关系表达式2.1. 关系表达式例子2.2. 源码底层结构 3. Calcite的优化规则4. Calcite的Trait--算子物理…

自动挡的闪300?QJ要做第一个吃螃蟹的人了?

其实在发布会当天&#xff0c;有一台车在现场热度是比赛921还高的&#xff0c;因为四缸大跑车大家可能都见多了&#xff0c;而QJ带来一台自动挡的闪300&#xff0c;这个自动挡其实是需要加个引号的&#xff0c;因为升档的时候是需要你按一下手把上的按键的&#xff0c;有点类似…