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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL 临时表

MySQL 临时表 MySQL 临时表在我们需要保存一些临时数据时是非常有用的。 临时表只在当前连接可见,当关闭连接时,MySQL 会自动删除表并释放所有空间。 在 MySQL 中,临时表是一种在当前会话中存在的表,它在会话结束时会自动被销毁…

构建异步高并发服务器:Netty与Spring Boot的完美结合

前言 「作者主页」:雪碧有白泡泡 「个人网站」:雪碧的个人网站 ChatGPT体验地址 文章目录 前言IONetty1. 引入依赖2. 服务端4. 客户端结果 总结引导类-Bootstarp和ServerBootstrap连接-NioSocketChannel事件组-EventLoopGroup和NioEventLoopGroup 送书…

数字人克隆系统开发公司?

广州硅基技术开发限公司是一家位于中国广东省广州市的科技公司。该公司专注于人工智能(AI)领域的研发和创新。广州硅基以技术创新和解决方案为核心,致力于为客户提供高质量的人工智能产品和服务。 广州硅基技术的主要业务包括但不限于&#x…

面试算法90:环形房屋偷盗

题目 一条环形街道上有若干房屋。输入一个数组表示该条街道上的房屋内财产的数量。如果这条街道上相邻的两幢房屋被盗就会自动触发报警系统。请计算小偷在这条街道上最多能偷取的财产的数量。例如,街道上5家的财产用数组[2,3,4,5…

二叉树的深度和高度问题(算法村第八关白银挑战)

二叉树的最大深度 104. 二叉树的最大深度 - 力扣(LeetCode) 给定一个二叉树 root ,返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1: 输入:root [3,9,20,null,null…

基于SSM的基金投资交易管理网站的设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

深入理解神经网络训练与反向传播

目录 前言1 损失函数1.1 交叉熵(Cross Entropy):1.2 均方差(Mean Squared Error): 2 梯度下降与学习率2.1 梯度下降2.2 学习率 3 正向传播与反向传播3.1 正向传播3.2 反向传播 4 链式法则和计算图4.1 链式法…

数据结构入门到入土——链表(2)

目录 一,与链表相关的题目(2) 1.输入两个链表,找出它们的第一个公共节点 2.给定一个链表,判断链表中是否有环 3.给定一个链表,返回链表开始入环的第一个节点,若无则返回null 一,…

autodl学术加速

今天使用autodl加载预训练BERT模型失败,在官方文档里面找到了官方给的代理使用方法。 直接在bash输入: 开启学术加速: source /etc/network_turbo取消学术加速: unset http_proxy && unset https_proxy据说是只能访问这…

RabbitMQ高级

文章目录 一.消息可靠性1.生产者消息确认2.消息持久化3.消费者确认4.消费者失败重试 MQ的一些常见问题 1.消息可靠性问题:如何确保发送的消息至少被消费一次 2.延迟消息问题:如何实现消息的延迟投递 3.高可用问题:如何避免单点的MQ故障而导致的不可用问题 4.消息堆积问题:如…

MySQL——用户管理

目录 一.用户管理 二.用户 1.用户信息 2.创建用户 3.删除用户 4. 修改用户密码 三.数据库的权限 1.给用户授权 2.回收权限 一.用户管理 如果我们只能使用root用户,root的权限非常大,这样存在安全隐患。这时,就需要使用MySQL的用户管理&#xff…

Packet Tracer - Configure AAA Authentication on Cisco Routers

Packet Tracer - 在思科路由器上配置 AAA 认证 地址表 目标 在R1上配置本地用户账户,并使用本地AAA进行控制台和vty线路的身份验证。从R1控制台和PC-A客户端验证本地AAA身份验证功能。配置基于服务器的AAA身份验证,采用TACACS协议。从PC-B客户端验证基…