rosbag 源码阅读笔记-1

本文详细描述了如何在本地查找ROSbag命令的源码,通过分析`rosbag`脚本发现它实际上是Python包,主要负责解析参数并启动ROS节点。作者还展示了如何查看相关Python代码和ROS节点结构。
摘要由CSDN通过智能技术生成

这篇文字想通过在自己的机器上查找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” 就行啦。

  • 29
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ros-melodic-can-msgs 是一个 ROS 包,用于在 ROS 中使用和操作 Controller Area Network (CAN) 协议进行通信。其中包含了相关的消息和服务类型,用于在 ROS 系统中传输 CAN 相关的数据。你可以在这里找到 ros-melodic-can-msgs 的源代码:https://github.com/ros-drivers/can_msgs ros-melodic-can-msgs 是针对 ROS Melodic 版本开发的,Melodic 是 ROS 的一个发行版本。如果你正在使用其他版本的 ROS,你需要使用对应版本的 ros-can-msgs 包。 ### 回答2: ros-melodic-can-msgs是ROS(机器人操作系统)的一个软件包,它是用于CAN(控制器局域网络)通信的消息定义和工具。CAN是一种常用于车辆和其他实时控制系统中的网络通信协议。 这个软件包包含了一些重要的消息类型,用于在ROS中进行CAN数据的传输和解析。例如,它定义了CAN消息的ID、数据格式和长度等信息。这些消息类型可以让ROS系统和连接在CAN总线上的设备进行通信。 在ros-melodic-can-msgs源码中,我们可以看到定义了各种用于CAN通信的消息类型,比如CAN_Frame、CAN_FD_Frame和CAN_Error等。这些消息类型可以用于接收和发送CAN数据,并且还包括了一些附加的属性,比如时间戳等。 此外,源码中还提供了一些工具和函数,用于CAN数据的解析和处理。例如,它提供了一个解析CAN帧的函数,可以从CAN消息中提取数据和控制信息。同时,还可以将ROS中的消息转换为CAN消息,并将CAN消息转换为ROS消息,方便在ROS系统中使用CAN数据。 总之,ros-melodic-can-msgs是一个用于CAN通信的ROS软件包,提供了消息定义和工具,用于在ROS系统中处理和交换CAN数据。通过使用这个软件包,开发人员可以方便地使用ROS构建与CAN设备之间的通信,实现车辆控制和实时系统的开发。 ### 回答3: ros-melodic-can-msgs是ROS的一个软件包,用于处理Controller Area Network(CAN)通信协议的消息。这个软件包提供了在ROS系统中处理CAN消息的功能。 CAN是一种广泛应用于汽车、工业控制和机器人等领域的通信协议,它允许不同的设备通过总线共享数据。ros-melodic-can-msgs软件包的目的是为ROS系统添加对CAN通信的支持。 这个软件包包含了一系列的消息类型,用于定义在ROS系统中传输CAN消息。这些消息类型包括CAN帧消息类型、CAN控制器状态消息类型以及一些其他辅助消息类型。通过这些消息类型,ROS系统可以接收和发送CAN消息,实现与CAN总线上其他设备的通信。 除了消息类型,ros-melodic-can-msgs还提供了一些辅助工具和函数,用于处理CAN消息。这些工具和函数可以用于解析CAN帧消息、生成CAN帧消息以及读取和修改CAN控制器的状态。 使用ros-melodic-can-msgs,开发者可以将CAN通信集成到ROS系统中。他们可以通过订阅CAN消息话题来接收其他设备发送的CAN消息,并可以通过发布CAN消息话题来向其他设备发送CAN消息。这样,开发者可以方便地与CAN总线上的其他设备进行数据交换,并能够利用ROS系统提供的各种功能进行数据处理和分析。 总之,ros-melodic-can-msgs是一个在ROS系统中处理CAN通信的软件包,它提供了一系列的消息类型、工具和函数,使得开发者可以方便地与CAN总线上的设备进行数据交换和通信。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值