bagpy是一个 Python 包,用于方便读取基于语义数据类型的 rosbag 文件。
bagpy 提供了一个用 python 编写的包装类 bagreader,它提供了一个易于使用的接口,用于读取 rosbag record 命令记录的包文件。这个包装类在内部使用 ROS 的 python API rosbag 来执行所有操作。使用 bagreader 的有趣特性之一是用户无需提供 rostopic 名称即可提取相关数据。可以根据用户正在寻找的数据类型提取数据。
Ubuntu 18.04 或更高版本
Python 3.5 或更高版本。实测python3.9安装失败,使用python3.8安装成功。
pip 安装,推荐使用 Python 3.x 虚拟环境。
pip install python
根据作者介绍,开发这个项目背后的理念是让一切尽可能简单和不那么混乱。因此,bagreader类致力于用最简单的方式提取相关数据,没有提供太多选项或使用自由。如果您需要多种选择,用户可以直接使用 ROS 的 rosbag python 包或 MATLAB 提供的 Robotics System Toolbox API。但是,如果您正在寻找简单,bagpy 是一个优雅的选择。
import bagpy
from bagpy import bagreader
import pandas as pd
fpath = r"D:\Document\vrtk_292590_medium_2022-01-19-12-12-55_0.bag"
b = bagreader(fpath)
#查看所有的topics
b.topic_table
# topics = b.topic_table#['Topics']
[INFO] Data folder D:\Document\vrtk_292590_medium_2022-01-19-12-12-55_0 already exists. Not creating.
Topics | Types | Message Count | Frequency | |
---|---|---|---|---|
0 | /customer_output/poi/geodetic | fixposition_msgs/PoseTwistWithVarStamped | 2168 | 20.006506 |
1 | /customer_output/poi/odometry | nav_msgs/Odometry | 2166 | 19.976681 |
2 | /gnss1/epoch | fixposition_msgs/GnssEpoch | 541 | 5.005363 |
3 | /gnss1/epoch/proc | fixposition_msgs/GnssEpoch | 541 | 4.997336 |
4 | /gnss1/latency | fixposition_msgs/GnssLatency | 21 | 0.199996 |
5 | /gnss1/raw | fixposition_msgs/RawGnss | 8863 | 11037.642105 |
6 | /gnss1/status | fixposition_msgs/GnssStatus | 108 | 0.999607 |
7 | /gnss2/epoch | fixposition_msgs/GnssEpoch | 539 | 4.999445 |
8 | /gnss2/epoch/proc | fixposition_msgs/GnssEpoch | 539 | 4.988625 |
9 | /gnss2/latency | fixposition_msgs/GnssLatency | 21 | 0.199960 |
10 | /gnss2/raw | fixposition_msgs/RawGnss | 8945 | 11765.228612 |
11 | /gnss2/status | fixposition_msgs/GnssStatus | 106 | 0.999911 |
12 | /imu/data | sensor_msgs/Imu | 21222 | 206.504062 |
13 | /magn/data | sensor_msgs/MagneticField | 10725 | 100.604543 |
14 | /ntrip/latency | fixposition_msgs/GnssLatency | 21 | 0.199797 |
15 | /ntrip/raw | fixposition_msgs/RawGnss | 450 | 9939.109005 |
16 | /rosout_agg | rosgraph_msgs/Log | 166 | 2.903802 |
17 | /tf_static | tf2_msgs/TFMessage | 1 | NaN |
18 | /vio/diagnostics | diagnostic_msgs/DiagnosticStatus | 533 | 4.938510 |
19 | /vio/imu_biases | sensor_msgs/Imu | 1919 | 19.041173 |
20 | /vio/odometry | nav_msgs/Odometry | 1917 | 19.484963 |
21 | /vio/status | actionlib_msgs/GoalStatusArray | 532 | 4.939386 |
b.message_by_topic("/customer_output/poi/geodetic")
#该代码会在讲该topic提取到如下路径
'D:\\Document\\vrtk_292590_medium_2022-01-19-12-12-55_0/customer_output-poi-geodetic.csv'
也可以使用pandas包读取csv写入到指定文件夹
georesout=b.message_by_topic("/customer_output/poi/geodetic")
geo=pd.read_csv(georesout)
sdir='d://'
geo.to_csv(sdir+"georesult1.csv")
geo
Time | header.seq | header.stamp.secs | header.stamp.nsecs | header.frame_id | p.frame_id | p.vector3.x | p.vector3.y | p.vector3.z | p_var.frame_id | ... | v_var.frame_id | v_var.vector3.x | v_var.vector3.y | v_var.vector3.z | omega.frame_id | omega.vector3.x | omega.vector3.y | omega.vector3.z | imu_clipping | imu_noise_level | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1.642594e+09 | 3029 | 1642594379 | 409827471 | NaN | GEODETIC | 39.978816 | 116.340648 | 41.030391 | ENU | ... | ENU | 1.807072e-03 | 1.683540e-03 | 1.692392e-03 | ENU | -0.000459 | 0.030601 | 0.029922 | False | 0 |
1 | 1.642594e+09 | 3030 | 1642594379 | 459481478 | NaN | GEODETIC | 39.978816 | 116.340648 | 41.030164 | ENU | ... | ENU | 3.773687e-03 | 3.650155e-03 | 3.659006e-03 | ENU | 0.002044 | 0.030743 | 0.023512 | False | 0 |
2 | 1.642594e+09 | 3031 | 1642594379 | 509822369 | NaN | GEODETIC | 39.978816 | 116.340648 | 41.029772 | ENU | ... | ENU | 1.815601e-03 | 1.688440e-03 | 1.697381e-03 | ENU | 0.000041 | 0.029265 | 0.025929 | False | 0 |
3 | 1.642594e+09 | 3032 | 1642594379 | 559783936 | NaN | GEODETIC | 39.978816 | 116.340648 | 41.029530 | ENU | ... | ENU | 1.812177e-03 | 1.686710e-03 | 1.695694e-03 | ENU | 0.000486 | 0.029039 | 0.027208 | False | 0 |
4 | 1.642594e+09 | 3033 | 1642594379 | 609865904 | NaN | GEODETIC | 39.978816 | 116.340648 | 41.031945 | ENU | ... | ENU | 1.947760e-03 | 1.822090e-03 | 1.831144e-03 | ENU | 0.001055 | 0.029367 | 0.026176 | False | 0 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
2163 | 1.642594e+09 | 5192 | 1642594487 | 559528540 | NaN | GEODETIC | 39.978815 | 116.340617 | 41.108435 | ENU | ... | ENU | 1.819870e-05 | 1.807509e-05 | 1.810780e-05 | ENU | -0.000506 | 0.021536 | 0.022465 | False | 0 |
2164 | 1.642594e+09 | 5193 | 1642594487 | 609496314 | NaN | GEODETIC | 39.978815 | 116.340617 | 41.108559 | ENU | ... | ENU | 1.535582e-08 | 6.339071e-09 | 9.016743e-09 | ENU | 0.000562 | 0.021945 | 0.021546 | False | 0 |
2165 | 1.642594e+09 | 5194 | 1642594487 | 659486088 | NaN | GEODETIC | 39.978815 | 116.340617 | 41.108559 | ENU | ... | ENU | 1.535582e-08 | 6.339071e-09 | 9.016743e-09 | ENU | 0.000562 | 0.021945 | 0.021546 | False | 0 |
2166 | 1.642594e+09 | 5195 | 1642594487 | 710855245 | NaN | GEODETIC | 39.978815 | 116.340617 | 41.108406 | ENU | ... | ENU | 3.829014e-05 | 3.779387e-05 | 3.792404e-05 | ENU | 0.001034 | 0.022955 | 0.021147 | False | 0 |
2167 | 1.642594e+09 | 5196 | 1642594487 | 759737647 | NaN | GEODETIC | 39.978815 | 116.340617 | 41.108539 | ENU | ... | ENU | 5.943846e-06 | 5.922461e-06 | 5.928380e-06 | ENU | 0.000797 | 0.022454 | 0.021330 | False | 0 |
2168 rows × 35 columns
关于更多有关示例,请参阅 https://github.com/jmscslgroup/bagpy/tree/master/notebook 上的notebook和 python 脚本。