rosbag数据解析

文章介绍了如何解析Helios_5515激光雷达的XYZIRT格式数据,并将其转换为PCD文件,同时提到从rosbag提取geometry_msgs/Vector3Stamped数据的修改。讨论了ROS帧与雷达帧的关系,以及未来研究方向——垂直切片起始位置的固定性。

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

背景:

        rosbag的数据需要解析才能可视化,故本文借助Helios_5515激光雷达录制XYZIRT格式的rosbag,以研究以XYZIRT储存的数据。

1.pcd头文件含义

        以下是录制的rosbag转成的pcd,PCD文件必须用ASCII字符编码。文件格式头(file format header)说明文件中存储的点云数据的格式。每个格式声明及点云数据之间用\n字符隔开。

# .PCD v0.7 - Point Cloud Data file format
VERSION 0.7//PCD文件版本
FIELDS x y z intensity ring timestamp//每个点包含哪些维度,xyz表示XYZ三维坐标,intensity表示激光反射强度,ring表示线号,timestamp表示时间戳
SIZE 4 4 4 4 2 8//每个维度的数据占用字节大小
TYPE F F F F U F//每个维度的数据类型,I表示有符号类型int8(char)、int16(short)、int32(int),U表示无符号类型uint8(unsigned char)、uint16(unsigned short)、uint32(unsigned int),F表示浮点型,包括float,double,long double
COUNT 1 1 1 1 1 1//每个维度含有多少个元素(如果未提供COUNT属性,默认值为1)
WIDTH 32//用点的数量表示点云数据集的宽度。有两种含义:1.无序数据集的点云中点的数量 2.有序点云数据集的宽度(一行中点的数量),有序点云数据集中,点云类似图片或矩阵的结构,分为行和列,这种数据通常来自于立体摄像机(stereo camera)、时间飞行摄像机(Time Of Flight camera,使用红外线或者光脉冲来估计光线从发射到检测到的时间延迟来测量距离),知道点的相邻关系,使算法计算更高效。
VIEWPOINT 0 0 0 1 0 0 0//指定数据集合中点的采集视点。可以用来后续可能的坐标转换,或者求平面法线坐标。格式是平移(tx ty tz) + 四元数(qw qx qy qz),默认是0 0 0 1 0 0 0。
POINTS 57600//点云中点的总数(冗余字段)
DATA binary//点云数据的存储类型,0.7版本支持两种存储方式:ascii和binary

2.字节,位

  1. 1字节(byte) = 8位(bit)
  2. 在64位的系统中(比如win64)1字(word)= 8字节(byte)=64(bit)

整型:

        包括char,short,int,long和long long。short至少16位,int至少与short一样长,long至少32位,且至少与int一样长,long long至少64位,且至少与long一样长。

浮点数:

        float至少32位,double至少48位,且不少于float,long double至少和double一样多。通常float为32位, double为64位,long double为80、96或128位。

由有无符号以及字节大小可以确定数据类型 :
 

xyzirt
floatfloatfloatfloatunsigned shortdouble

3.改写代码

        原代码是以提取geometry_msgs/Vector3Stamped类型话题中的时间和x,y到三个不同的txt文件,需要改成将XYZIRT输出到同一个txt文件。

C++提取rosbag中的数据到txt文件_rosbag数据提取-优快云博客

 无人驾驶汽车系统入门(二十四)——激光雷达的地面-非地面分割和pcl_ros实践-优快云博客

4.使用代码

roscore
source devel/setup.bash
rosrun get_data_node get_data_node
rosbag play t.bag

5.结论

雷达工作在10Hz下,转速为600rmp,雷达每转一圈为1雷达帧。

一个ROS帧包括32*1800=57600点云。32值32通道雷达的一组垂直切片;1800指激光发射器旋转一周发射的次数,也就是0.2°发射一次.

故(其实是假设,目前没办法证明):1雷达帧等于1ROS帧。

ROS帧的信息:(如下图)
ROS的Header的stamp=此帧最后一个点云的timestamp;

第一组:从编号31到0依次排列;

第二组:同上

6.展望

每帧的垂直切片起始位置可能在0°,或者其他位置。如果是固定的,那将会很有研究价值。

### 如何解析 ROSBag 中的图像数据 解析 `rosbag` 文件中的图像数据可以通过多种方法实现,具体取决于使用的编程环境以及需求复杂程度。以下是几种常见的方法及其工具: #### 方法一:通过命令行提取图像 可以利用 ROS 提供的内置功能来快速提取图像数据并将其保存为文件形式。例如,使用 `image_view` 节点可以从指定话题中提取图像帧。 运行以下命令可以在终端中完成这一操作: ```bash rosrun image_view extract_images _sec_per_frame:=<time_interval> image:=<topic_name> ``` 其中 `<time_interval>` 表示每张图片之间的时间间隔(单位为秒),而 `<topic_name>` 则是发布图像消息的话题名称[^2]。 #### 方法二:编写 Python 或 C++ 程序读取图像数据 对于更复杂的场景或者需要进一步处理的情况,则建议开发自定义脚本来访问这些信息。下面分别介绍基于两种主流语言——Python 和 C++ 的解决方案。 ##### 使用 Python 进行读取 借助于官方支持库 `rospy` 可轻松加载 `.bag` 文件内容,并从中筛选出所需的传感器消息类型如 `sensor_msgs/Image` 。之后再调用 OpenCV 库将原始字节流转换成便于后续分析的形式。 代码样例如下所示: ```python import rospy import rosbag from cv_bridge import CvBridge, CvBridgeError import cv2 def read_rosbag_image(bag_file_path, topic_name): bridge = CvBridge() with rosbag.Bag(bag_file_path, 'r') as bag: for _, msg, t in bag.read_messages(topics=[topic_name]): try: # Convert the ROS Image message to a CV2 image cv_img = bridge.imgmsg_to_cv2(msg, desired_encoding="bgr8") # Optionally save or process each frame here cv2.imwrite(f'frame_{t.to_sec()}.png', cv_img) except CvBridgeError as e: print(e) if __name__ == "__main__": bag_filepath = "/path/to/bagfile.bag" img_topic = "/camera/color/image_raw" read_rosbag_image(bag_filepath, img_topic) ``` 此段程序会遍历给定主题下的所有记录项并将它们逐一转化为标准格式存储下来以便后期查看或计算[^3]。 ##### 使用 C++ 实现相同目标 如果偏好性能更高的方式可以选择采用 C++ 编写相应逻辑。同样依赖于 `cv::bridge` 来桥接不同框架之间的差异之处。 实例片段如下: ```cpp #include <ros/ros.h> #include <rosbag/bag.h> #include <rosbag/view.h> #include <sensor_msgs/Image.h> #include <opencv2/highgui.hpp> int main(int argc, char **argv){ std::string bag_filename("/path/to/your_bag_file"); std::vector<std::string> topics; topics.push_back(std::string("/camera/color/image_raw")); rosbag::Bag bag; bag.open(bag_filename.c_str(), rosbag::bagmode::Read); rosbag::View view(bag, rosbag::TopicQuery(topics)); int count=0; BOOST_FOREACH(rosbag::MessageInstance const m, view){ sensor_msgs::ImageConstPtr imsg = m.instantiate<sensor_msgs::Image>(); if(imsg != NULL){ cv_bridge::CvImagePtr cv_ptr; try{ cv_ptr = cv_bridge::toCvCopy(imsg, sensor_msgs::image_encodings::BGR8); // Save images sequentially. cv::imwrite("output"+std::to_string(count++)+".jpg", cv_ptr->image); }catch (cv_bridge::Exception& e){ ROS_ERROR("Could not convert from '%s' to 'bgr8'.", imsg->encoding.c_str()); } } } bag.close(); } ``` 以上展示了另一种途径用于获取封装好的视觉资料集[^1]。 --- ### 工具推荐 除了手动编码之外还有几个专门设计用来简化此类任务流程的应用可供选用: - **Rqt Bag Viewer**: GUI界面应用程序允许用户直观地浏览各种类型的ROS通信流量其中包括视频序列。 - **Matlab Toolbox For Robotics**: 支持导入`.bag`档案并通过图形化手段展示其内部结构同时提供API接口方便二次开发人员集成至其他项目当中去[^1].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值