python同步解析ROS BAG包

博客介绍了两种处理ROSbag包的方法。一是命令行解析方式,包括开启roscore、查看信息、播放包、解析图片及查看topic;二是直接使用rqt_bag播放,打开所需的rosbag包即可。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

from __future__ import print_function, division
from PIL import Image
try:
    from cStringIO import StringIO
except ImportError:
    from io import StringIO
import rosbag
import sys
if sys.getdefaultencoding() != 'utf-8':
    reload(sys)
    sys.setdefaultencoding('utf-8')
bag_name = '20180822104624.bag'
dst_dir = '20180822104624/'

if dst_dir[-1] == '/':
    img_name = dst_dir + "{:0>10d}.jpg"
    imu_info_name = dst_dir + "IMUInformation.txt"
    info_name = dst_dir + "Information.txt"

else :
    img_name = dst_dir + "/{:0>10d}.jpg"
    imu_info_name = dst_dir + "/IMUInformation.txt"
    info_name = dst_dir + "/Information.txt"

topics = ["/inspva_info",
    "/vehicle_speed",
    "/imu_data",
    "/camera/compressed"
]
bag = rosbag.Bag(bag_name)

picture_cnt = 0
imu_infos = []
infos = []
front_radar_infos = []
left_radar_infos = []
right_radar_infos = []

front_x_data = [None] * 64
front_y_data = [None] * 64

left_x_data = [None] * 64
left_y_data = [None] * 64

right_x_data = [None] * 64
right_y_data = [None] * 64


for topic, msg, t in bag.read_messages(topics = topics): #print(topic)# print(msg.header)
  
    header = msg.header
    header_seq = header.seq
    stamp_sec = header.stamp.secs
    stamp_nsec = header.stamp.nsecs
    frame_id = header.frame_id

    #parse topic inspva_infos
    if (topic == str('/inspva_info')): #inspva info 
        time_stamp = msg.time_stamp
        latitude = msg.latitude
        longitude = msg.longitude
        height = msg.height
        vehicle_x = msg.vehicle_x
        vehicle_y = msg.vehicle_y
        roll = msg.roll
        pitch = msg.pitch
        azimuth = msg.azimuth
        acc_x = msg.acc_x
        acc_y = msg.acc_y
        acc_z = msg.acc_z
        valid = msg.valid# Bool#
    #parse topic vehicle_speed
    if (topic == str('/vehicle_speed')): #vehicle speed# sys_time_us = msg.sys_time_us
        vehicle_speed_isvalid = msg.vehicle_speed_isvalid# bool
        vehicle_speed = msg.vehicle_speed#
    #parse topic imu_data
    if (topic == str('/imu_data')): #imu_data# sys_time_us = msg.sys_time_us
        measurement_time = msg.measurement_time
        status = msg.status
        measurement_span = msg.measurement_span
        linear_acceleration_x = msg.linear_acceleration_x
        linear_acceleration_y = msg.linear_acceleration_y
        linear_acceleration_z = msg.linear_acceleration_z
        linear_acceleration_covariance = msg.linear_acceleration_covariance# tuple
        angular_velocity_x = msg.angular_velocity_x
        angular_velocity_y = msg.angular_velocity_y
        angular_velocity_z = msg.angular_velocity_z
        angular_velocity_covariance = msg.angular_velocity_covariance# tuple
        orientation_pitch = msg.orientation_pitch
        orientation_roll = msg.orientation_roll
        orientation_yaw = msg.orientation_yaw
        orientation_quternion_1 = msg.orientation_quternion_1
        orientation_quternion_2 = msg.orientation_quternion_2
        orientation_quternion_3 = msg.orientation_quternion_3
        orientation_quternion_4 = msg.orientation_quternion_4
        orientation_covariance = msg.orientation_covariance# tuple
    #parse topic camara
    if (topic == '/camera/compressed'): 
        im_format = msg.format
        data = msg.data
        def imgmsg_to_pil(img_msg, rgba = True):
            pil_img = Image.open(StringIO(img_msg))
            if pil_img.mode != 'L':
                pil_img.convert("RGB")
            return pil_img
        image = imgmsg_to_pil(msg.data)
        image.save(img_name.format(picture_cnt))

    ## dump info when image
    if (topic == '/camera/compressed'): 
        dum_str = "{:0>10d} {} {} {} {} {} {} {} {} {} {} {}".format(picture_cnt,
                                     header_seq,
                                     stamp_sec,
                                     stamp_nsec,
                                     latitude,
                                     longitude,
                                    # vehicle_speed,
                                     roll,
                                     pitch,
                                     azimuth,
                                     acc_z,
                                     acc_y,
                                     acc_x)# print(picture_cnt)
           
        print (dum_str)
        infos.append(dum_str)
        #except:
        #    pass
    picture_cnt += 1
    
with open(info_name, "w") as fp:
    for it in infos:
        fp.write(it + "\n")
bag.close()

2.使用命令行解析方式:

第一步:开启roscore

roscore

第二步:查看rosbag具体信息

rosbag info + 具体包名

第三步:播放rosbag包

rosbag play ./test3_fei.bag  -r 0.5 -l

第四步:将图片从rosbag中解析出来

rosrun image_view extract_images image:=/lane_segment/camera_front/image _image_transport:=compressed

第五步:也可以查看rosbag中的topic

rostopic echo

3. 直接使用rqt_bag进行rosbag的播放

roscore
rqt_bag

会得到这样的界面,直接open你需要打开的rosbag包即可

### 如何将 KITTI 数据集转换为 ROS rosbag 格式 要实现将 KITTI 数据集转换为 ROS 的 `.bag` 文件格式,可以通过 `kitti2bag` 工具完成这一过程。以下是具体的操作说明: #### 安装工具 首先需要安装 `kitti2bag` 工具,这是一个专门用于将 KITTI 原始数据 (raw data) 转换为 ROS bag 文件的 Python 库[^4]。 ```bash pip install kitti2bag ``` #### 下载 KITTI 数据集 在执行转换之前,需先从官方或其他可信资源下载所需的 KITTI 数据集。这些数据通常分为多个部分,括摄像头图像、激光雷达点云以及同步信息等[^3]。 #### 使用 kitti2bag 进行转换 一旦完成了上述准备工作,就可以运行以下命令来启动转换流程。假设已经下载并解压了 KITTI raw data 至本地目录 `/path/to/kitti_data/` 中,则可按照如下方式调用脚本: ```bash rosrun kitti2bag convert.py --date 2011_09_26 --city /path/to/kitti_data/ ``` 此命令中的参数解释如下: - `--date`: 指定日期字符串,对应于特定的数据采集日。 - `--city`: 表明所处理的是城市环境下的数据;如果涉及乡村或高速公路场景,请替换为此类选项。 更多可用选项可通过查看帮助文档获取: ```bash rosrun kitti2bag convert.py -h ``` 以上操作完成后,将会生成一个或多個 `.bag` 文件存放在指定输出路径下,便于后续利用 ROS 平台展开进一步研究与开发工作[^1]。 #### 处理可能遇到的问题 在整个过程中可能会碰到若干技术难题,比如依赖库版本冲突或是硬件性能不足等问题。针对这些问题已有相应的解决方案被记录下来供参考使用者查阅解决办法。 ```python import rospy from cv_bridge import CvBridge bridge = CvBridge() def callback(data): try: # Convert your ROS Image message to OpenCV2 cv2_img = bridge.imgmsg_to_cv2(data, "bgr8") except Exception as e: print(e) ``` 上述代码片段展示了如何借助 `cv_bridge` 实现 ROS 图像消息到 OpenCV 格式的转换,这对于解析由 `.bag` 文件回放出来的传感器数据非常有用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值