精华内容
下载资源
问答
  • rosbag解包
    千次阅读
    2020-11-23 21:51:21

    新建一个文件夹(建立result文件夹),图片会保存在该文件夹下,在该文件下运行命令:
    (这里保存的是jpg格式图片)
    首先播放已有的数据包:

    rosbag play my.bag
    

    然后运行图像拆解节点:

    rosrun image_view extract_images _sec_per_frame:=0.01 image:=/camera/color/image_raw 
    

    根据自己的rosbag包修改topic名称。

    更多相关内容
  • rosbag数据解包

    千次阅读 2021-11-19 20:11:58
    数据解包 将后缀为.bag或 .bag.active文件复制到 ~/sailboat_ws/src/2019-sailboat-ros/Sailboat-Ros/Scripts/bag_to_csv目录下。...rosbag reindex xxx.bag.active 然后手动重命名去掉.bag.active文件的.

    数据解包

    1. 将后缀为.bag.bag.active文件复制到 ~/sailboat_ws/src/2019-sailboat-ros/Sailboat-Ros/Scripts/bag_to_csv目录下。

    2. 将不需要解包的.bag文件移出该目录,否则程序会读取并解包当前目录下的所有.bag文件,造成时间浪费。

    3. 如果是.bag.active文件,则需要先运行以下命令:(xxx为包的名称)

      rosbag reindex xxx.bag.active
      

      然后手动重命名去掉.bag.active文件的.active后缀,转换成.bag文件

    4. 在当前目录右键打开终端,运行命令

      python bag_to_csv.py
      

    此时终端将提示读取到了哪些包,等待10秒后会自动开始解包。运行命令进行解包

    数据分析

    数据含义

    打开解包出来的数据文件夹,正常情况下有如下数据:
    解包出来的文件_slash_看作斜杠/,则每个文件对应一个 ROS 话题(topic)产生的数据。csv文件是可以用excel或在ubuntu的默认应用程序打开查看的。

    话题数据
    /mach程序输出的帆角、舵角,也即 python 程序中的 mach_np 数组
    /sensor_kalman_msg滤波后的传感器数据,也是程序读取到的传感器数据
    /spare_function_out程序自定义输出的数据,也即 python 程序中的 out_np 数组
    /spare_function_para动态参数数据,也即 python 程序中的 para_cfg 数组
    /arduinoarduino输出的帆和舵的角度
    /wtst传感器原始数据

    跨文件对齐时间戳

    有时候我们需要查看的数据不在同一个文件里,比如我想查看不同的动态参数对应的帆角舵角,但是动态参数的数据在/spare_function_para中,帆角舵角的数据在/mach/spare_function_out中。这时,我们需要知道哪些数据是同一时间记下的。
    如果两个csv文件总行数一样,数据基本是按行对应的。如果两个文件行数相差较大,则需要手动对比第一列rosbagTimestamp,将第一个文件的rosbagTimestamp复制到第二个文件中去搜索。注意,此时不会搜到结果,因为不同文件的两条对应数据之间是有细微的时间差的,因此在对比rosbagTimestamp时,需要每次删除末尾一个数字来放宽搜索条件,直到匹配到结果。
    如果希望省略对齐时间戳的步骤,最好的办法是提前在 python 程序中将分析需要的数据放到 out_np 数组中,这样数据都会记录在同一个文件/spare_function_out文件中。

    展开全文
  • rosbag录制数据与解包

    千次阅读 2021-07-13 22:22:52
    文章目录一、rosbag录制数据二、bag数据播放三、bag解包出图像数据(两种方式)1.ROS Wiki提供的roslaunch文件解包2.python解包总结 一、rosbag录制数据 使用rosbag record命令 rosbag record -O [bag_name] [topic...


    一、rosbag录制数据

    使用rosbag record命令

    rosbag record -O [bag_name] [topic1] [topic2] [...]    #不加中括号
    

    -O大写,后面对录制的bag命名,再之后跟要录制的topic名字(用rostopic list查询当前所有的topic)。

    录制结束后,在当前shell所在路径会生成后缀为.bag的数据包,使用rosbag info来查看该数据包的信息

    rosbag info [bag_file]    #不加中括号
    

    应该会输出该bag存储的topic名字和帧数,如果报错,说明该包有损坏(常见于U盘拷贝的情况)。正常输出类似于下面这样:
    在这里插入图片描述

    tips:这里顺便记录一下rostopic的用法
    查看当前所有的topic:rostopic list
    查看某个topic的输出:rostopic echo [topic_name]
    查看某个topic的发布频率:rostopic hz [topic_name]
    查看某个topic的数据格式:rostopic echo [topic_name]/encoding

    二、bag数据播放

    用rosbag play命令

    rosbag play [bag_file]    #不加中括号
    

    播放的意思是指将bag所记录的所有内容重新进行了一遍,按空格暂停和继续。播放时可在rviz里add相应的topic进行查看。

    三、bag解包出图像数据(三种方式)

    参考链接https://www.codeleading.com/article/11362024892/的内容,这里介绍两种解包的方法。

    1.ROS Wiki提供的roslaunch文件解包

    新建launch文件(文件在哪无所谓) : bag2img.launch

    <launch>
      <node pkg="rosbag" type="play" name="rosbag" required="true" args="/home/user/test1.bag"/>
      <node name="extract" pkg="image_view" type="extract_images" respawn="false" required="true" output="screen" cwd="ROS_HOME">
      <remap from="image" to="/zed2/zed_node/depth/depth_registered"/>
      <param name="sec_per_frame" value="0.03"/>
      </node>
     </launch>
    

    args="/home/user/test1.bag"是bag的存放路径,"/zed2/zed_node/depth/depth_registered"是要解析的topic名称。
    **< param name=“sec_per_frame” value=“0.03”/>**这句话是说,以每一帧花费0.03s的时间,这个条件对你的bag文件进行图像提取,如果没有这句话,就是默认0.1s,也就是没秒10帧的速率对图像提取。经过我的测试发现,无论怎么调整这个值,都无法跟bag文件中的信息数目匹配,因此来说,这种方法存在一定的图像缺失的情况,只能无限接近袁原始图像的数目,比如我的原始数据有640帧,但经过调整sec_per_frame的值,最高的时候还是只能到639,多数情况下到637,默认值0.1的时候,只有200多张图像。原因是实际录制时相机的帧率不是绝对稳定的,而解析时设置了固定的时间间隔,这个误差会累积下去,帧数越多,最后漏掉的就越多。

    运行roslaunch:

    roslaunch bag2img.launch
    

    提取成功的图像存储在home文件夹下的.ros文件夹下,一般是隐藏的文件夹,使用crtl+h可显示出来。

    优点:操作简单,使用ros即可;缺点:提取信息与原始录制的信息并不完全一致,主要体现在提取的图片数量和ros录制的时候的信息数量不一致,会少。此外,不含有时间戳;

    2.python解包

    通过编写Python程序按照我们想要的信息及方式来提取,在与bag文件同级目录下建立.py文件(方便操作,若不是同级目录,下面代码中要写绝对路径)

    代码如下(示例):

    # coding:utf-8
    #!/usr/bin/python
         
    # Extract images from a bag file.
         
    #PKG = 'beginner_tutorials'
    import roslib;   #roslib.load_manifest(PKG)
    import rosbag
    import rospy
    import cv2
    from sensor_msgs.msg import Image
    from cv_bridge import CvBridge
    from cv_bridge import CvBridgeError
         
    # Reading bag filename from command line or roslaunch parameter.
    #import os
    #import sys
         
    rgb_path = '/home/david/workspace/bags/rgb/'   #已经建立好的存储rgb彩色图文件的目录
    depth_path= '/home/david/workspace/bags/depth/' # 已经建立好的存储深度图文件的目录
         
    class ImageCreator():
        def __init__(self):
            self.bridge = CvBridge()
            with rosbag.Bag('/home/andy/bag_folder/file_name.bag', 'r') as bag:  #要读取的bag文件;
                for topic,msg,t in bag.read_messages():
                    if topic == "camera/rgb/image_raw": #图像的topic;
                            try:
                                cv_image = self.bridge.imgmsg_to_cv2(msg,"bgr8")
                            except CvBridgeError as e:
                                print e
                            timestr = "%.6f" %  msg.header.stamp.to_sec()
                            #%.6f表示小数点后带有6位,可根据精确度需要修改;
                            image_name = timestr+ ".png" #图像命名:时间戳.png
                            cv2.imwrite(rgb_path + image_name, cv_image)  #保存;
                    elif topic == "camera/depth_registered/image_raw": #图像的topic;
                            try:
                                cv_image = self.bridge.imgmsg_to_cv2(msg,"16UC1")
                            except CvBridgeError as e:
                                print e
                            timestr = "%.6f" %  msg.header.stamp.to_sec()
                            #%.6f表示小数点后带有6位,可根据精确度需要修改;
                            image_name = timestr+ ".png" #图像命名:时间戳.png
                            cv2.imwrite(depth_path + image_name, cv_image)  #保存;
         
    if __name__ == '__main__':
        #rospy.init_node(PKG)
        try:
            image_creator = ImageCreator()
        except rospy.ROSInterruptException:
            pass
    
    
    

    上边这段代码是原博客给的,我又根据自己需求改了一份,同时解析双目rgb和深度图,其中深度图的存储格式由默认的uint8改为float(而且我的深度图是32FC1格式的,不是16UC1)
    代码如下:

    # coding:utf-8
    #!/usr/bin/python
         
    # Extract images from a bag file.
         
    #PKG = 'beginner_tutorials'
    import roslib;   #roslib.load_manifest(PKG)
    import rosbag
    import rospy
    import cv2
    import sys
    import numpy as np
    from sensor_msgs.msg import Image
    from cv_bridge import CvBridge
    from cv_bridge import CvBridgeError
         
    # Reading bag filename from command line or roslaunch parameter.
    #import os
    #import sys
     
    rgb_path_left = '/home/user/dynamic_data/left/'     
    rgb_path_right = '/home/user/dynamic_data/right/'   #已经建立好的存储rgb彩色图文件的目录
    depth_path= '/home/user/dynamic_data/depth_pfm/' # 已经建立好的存储深度图文件的目录
         
    class ImageCreator():
        def __init__(self):
            self.bridge = CvBridge()
            with rosbag.Bag('/home/user/test1.bag', 'r') as bag:  #要读取的bag文件;
                for topic,msg,t in bag.read_messages():
                    if topic == "/zed2/zed_node/left_raw/image_raw_color": #图像的topic;
                            try:
                                cv_image = self.bridge.imgmsg_to_cv2(msg,"bgr8")
                            except CvBridgeError as e:
                                print (e)
                            timestr = "%.6f" %  msg.header.stamp.to_sec()
                            #%.6f表示小数点后带有6位,可根据精确度需要修改;
                            image_name = timestr+ ".png" #图像命名:时间戳.png
                            cv2.imwrite(rgb_path_left + image_name, cv_image)  #保存;
                    elif topic == "/zed2/zed_node/right_raw/image_raw_color": #图像的topic;
                            try:
                                cv_image = self.bridge.imgmsg_to_cv2(msg,"bgr8")
                            except CvBridgeError as e:
                                print (e)
                            timestr = "%.6f" %  msg.header.stamp.to_sec()
                            #%.6f表示小数点后带有6位,可根据精确度需要修改;
                            image_name = timestr+ ".png" #图像命名:时间戳.png
                            cv2.imwrite(rgb_path_right + image_name, cv_image)  #保存;
                    elif topic == "/zed2/zed_node/depth/depth_registered": #图像的topic;
                            try:
                                cv_image = self.bridge.imgmsg_to_cv2(msg,"32FC1")
                            except CvBridgeError as e:
                                print (e)
                            timestr = "%.6f" %  msg.header.stamp.to_sec()
                            #%.6f表示小数点后带有6位,可根据精确度需要修改;
                            image_name = timestr+ ".pfm" #图像命名:时间戳.png
                            # print('image max:',np.max(cv_image))
                            # cv2.imwrite(depth_path + image_name, cv_image)  #保存;
                            write_pfm(depth_path + image_name, cv_image)
     
    def write_pfm(path, image, scale=1):
        """Write pfm file.
        Args:
            path (str): pathto file
            image (array): data
            scale (int, optional): Scale. Defaults to 1.
        """
    
        with open(path, "wb") as file:
            color = None
    
            if image.dtype.name != "float32":
                raise Exception("Image dtype must be float32.")
    
            image = np.flipud(image)
    
            if len(image.shape) == 3 and image.shape[2] == 3:  # color image
                color = True
            elif (
                len(image.shape) == 2 or len(image.shape) == 3 and image.shape[2] == 1
            ):  # greyscale
                color = False
            else:
                raise Exception("Image must have H x W x 3, H x W x 1 or H x W dimensions.")
    
            file.write("PF\n" if color else "Pf\n".encode())
            file.write("%d %d\n".encode() % (image.shape[1], image.shape[0]))
    
            endian = image.dtype.byteorder
    
            if endian == "<" or endian == "=" and sys.byteorder == "little":
                scale = -scale
    
            file.write("%f\n".encode() % scale)
    
            image.tofile(file)
            
    if __name__ == '__main__':
        #rospy.init_node(PKG)
        try:
            image_creator = ImageCreator()
        except rospy.ROSInterruptException:
            pass
    
    

    优点:没有信息损失,完全按照你录制的数据完整提取,且具有时间戳。缺点:使用python2,要装一些库,如OpenCV

    3.用kalibr的一个工具解包

    https://github.com/ethz-asl/kalibr/wiki/bag-format.
    kalibr里的这个东西不仅可以从bag里解出image、IMU信息,还能把image、IMU信息打包成bag格式。但是kalibr解包出的image是灰度图(kalibr本身是一个标定工具,标定用的是灰度图)。

    关于解包这块,问了高手,他们都是自己写的代码订阅某个topic,每收到一个message就做一次输出,避免了官方给的launch文件定时提取造成的漏帧BUG。自己写个也挺好,这玩意复用性还挺强的。


    总结

    算是记录一下rosbag的一些常见用法,包括录制,播放,解包。
    这里还有个链接,里面介绍了rosbag一些更丰富的功能:
    http://zhaoxuhui.top/blog/2021/02/24/ros-bag-processing-scripts.html.

    展开全文
  • 是要提取的bag文件的列表。这是由空格分隔的路径列表的字符串。 相对路径是相对于当前工作目录的。 允许使用通配符( * )。 ..和. 也可以正确解析。 目录路径将在目录中找到所有包文件(仅1级) 其他操作可从...
  • ROSbag解压图片

    2020-12-08 09:34:48
    ROSbag解压图片1.用ros工具从bag文件中提取图片 参考1. 参考2. 1.用ros工具从bag文件中提取图片 1). 首先需要安装一些图片处理依赖的包: MJPEG, ffmpeg sudo apt-get install mjepgtools sudo apt-get install ...

    1.用ros工具从bag文件中提取图片

    1). 首先需要安装一些图片处理依赖的包: MJPEG, ffmpeg

    sudo apt-get install mjepgtools
    sudo apt-get install ffmpeg
    

    2). 新建文件夹用于储存提取后的图片,并执行:

    rosrun image_view extract_images _sec_per_frame:=0.01 image:=<IMAGETOPICINBAGFILE> # <IMAGETOPICINBAGFILE>为bag文件中储存图片的topic
    

    如果输出的图片数量与rosbag info命令查询得到的数量不符,可以减少_sec_per_frame参数的值。
    3). 打开另一个终端,导向新建的文件夹,然后执行:

     rosbag play <BAGFILE> # <BAGFILE>为bag文件的路径
    
    展开全文
  • 又是一个深夜,这是一个除夕的凌晨,我已经在csdn上找了很多用于从rosbag中提取图片的方法,但毫无例外都报错了。 主要是因为我这部分是CompressedImage类型,与无压缩的图片存在一定的差别。于是乎,我打开了wiki...
  • rosbag 常用命令

    2020-05-07 14:40:30
    rosbag记录话题消息数据重现数据回放.bag文件转.txt 记录话题消息 $ rosbag record -a # 记录所有的话题 数据重现 $ rosbag info <bagfile_name> 数据回放 $ rosbag play <bagfile_name> .bag文件转....
  • bag包的数据转换成excel rostopic echo -b <BAGFILE> -p <TOPIC> > <output>.csv BAGFILE是bag文件,TOPIC为数据所在的topic 例如 rostopic echo -b file.bag -p /differ/demo > cross_...
  • 激光雷达点云数据录制的rosbag文件转换成csv文件
  • 解析rosbag中的.bag文件,得到.jpg图片数据和.pcd点云数据 使用ros系统对Pandora进行数据获取,得到 .bag文件 22222 2 2 222 2 2 2
  • Robosense速腾激光雷达如何录制与解码rosbag 1 录包 1.1 将packet发送至ROS 首先在线连接雷达并将点云发送至ROS。如果对此不太了解, 请先阅读Robosense速腾激光雷达如何在线连接雷达并发送点云数据到ROS。 现在可以...
  • import rosbag bag_file = ‘/home/ubuntu/01tools/draw_map/bags/20210129_170428.bag’ #bag包路径 bag = rosbag.Bag(bag_file, “r”) info = bag.get_type_and_topic_info() #读取信息 print(info)
  • rosbag数据包所在文件夹下新建终端输入如下代码即可查看数据包详细信息。 rosbag info *.bag //*为你自己的数据包的名称 如下图,注意topics这一信息,包含有你的数据的节点信息如图片为/image_raw,点云为/...
  • rosbag中提取照片或视频

    千次阅读 2018-12-12 16:58:39
    网上已经有很多相关帖,但试过之后不好使,研究了一下相关资料。 首先给出官网资料,可以翻墙的话直接看原...rosbag&quot; type=&quot;play&quot; name=&quot;rosbag&quot; args=&quot;-d 2 $
  • 使用MATLAB读取分析ros记录的.bag文件

    千次阅读 2019-03-01 15:04:28
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////一定要关闭所有的...setenv('ROS_MASTER_...
  • ROS2的Python包

    2022-01-14 13:20:43
    Package组成 源码 运行文件 配置文件 #mermaid-svg-OyBCZCVkqsao0B1I .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-...
  • ROS@Ubuntu16.04体验记录

    2021-09-19 13:33:44
    安装下载源: $ sudo sh -c 'echo "deb ... /etc/apt/sources.list.d/ros-latest.list' $ sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 $
  • ROS二进制日志包 ROS binary logger package

    千次阅读 2017-02-09 13:43:46
    原文网址:1 http://www.ros.org/news/2017/02/ros-binary-logger-package.html2 ...该包装设计为rosbag的替代品,当下列情况时:需要多个和长消息采集(二进制文件具有较小的尺寸)仅需要离线数据分析,并且在RO
  • Cartographer ROS 整合(翻译) 2019.4.2更新

    千次阅读 多人点赞 2019-03-27 15:15:57
    Cartographer ROS 整合         Cartographer 是一个提供2D和3D实时定位与建图(SLAM)功能的系统,支持跨越多个平台与多传感器配置融合。 编译 Cartographer ROS 包 系统...
  • ubuntu16.04下ros基本命令

    千次阅读 2020-05-02 13:26:47
    ros中重要命令总结 (一)linux系统简介 1.1 linux系统概要 Linux,全称GNU/Linux,是一套免费使用和自由传播的类UNIX操作系统,是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要...
  • RealSense深度相机录制的bag文件提取...bag=rosbag(filepath); %%bag=rosbag('name.bag'); %对文件进行解包,读取整个bag包 bSel_rgb = select(bag,'Topic','/device_0/sensor_1/Color_0/image/data'); %从bag包中
  • ROS的树莓派与stm32的地面移动机器人构建问题

    千次阅读 多人点赞 2019-12-02 17:08:07
    数据的打包方式(和stm32的解包相对应): #BB BB 0b 03 ff 07 xx xx xx xx xx xx xx xx check 其中0xBB 0xBB是数据开始,0x0b是数据长度,0x03是地面移动机器人的ID,07是消息类型(速度信息/位置信息),...
  • configuration_directory、configuration_basename参数最终来源于launch的配置文件中,以src/carto_slam/launch/demo_slam_bag.launch为例,配置参数在launch文件中,save_state_filename参数也在此处 carto_config...

空空如也

空空如也

1 2 3
收藏数 41
精华内容 16
关键字:

rosbag解包