是否存在类似Numpy、Pandas的向量化方式遍历处理ROS bag文件消息?
可用的向量化处理ROS bag方案
有两类成熟的类Numpy/Pandas向量化处理方式,可替代逐消息遍历的原生rosbag接口,计算效率提升显著:
- 通用结构化消息处理首选
rosbag_pandas库,可直接将指定topic的消息批量解析为Pandas DataFrame,自动展开嵌套字段,原生支持Pandas向量化操作:
import rosbag_pandas import numpy as np # 读取bag中指定topic转为DataFrame df = rosbag_pandas.bag_to_dataframe('bag_file_name.bag', include=['/tf']) # 直接对整列数据做向量化计算,无需逐行遍历 x_coords = df['/tf.transforms_0_translation_x'].to_numpy() y_coords = df['/tf.transforms_0_translation_y'].to_numpy() # 批量计算欧式距离 distances = np.sqrt(x_coords**2 + y_coords**2)
- 处理高频二进制消息(点云、图像)可选
rosbags库,支持跳过冗余序列化步骤,直接将消息载荷转为Numpy结构化数组:
from rosbags.rosbag1 import Reader from rosbags.typesys import Stores, get_typestore import numpy as np typestore = get_typestore(Stores.ROS1_NOETIC) tf_data = [] with Reader('bag_file_name.bag') as reader: target_conns = [c for c in reader.connections if c.topic == '/tf'] for conn, ts, raw_data in reader.messages(connections=target_conns): msg = typestore.deserialize_ros1(raw_data, conn.msgtype) # 只提取需要的字段,减少内存占用 tf_data.append((ts, msg.transforms[0].translation.x, msg.transforms[0].translation.y)) # 转为结构化Numpy数组后做向量化计算 tf_arr = np.array(tf_data, dtype=[('ts', 'u8'), ('x', 'f8'), ('y', 'f8')]) distances = np.sqrt(tf_arr['x']**2 + tf_arr['y']**2)
实测大体积bag文件下,先批量提取字段转为Numpy数组再计算的方案,比原生rosbag逐消息循环处理速度快5~10倍。
内容的提问来源于stack exchange,提问作者rigidlab
相关产品推荐
相关产品推荐

