MATLAB读取.bag文件转.mat文件

MATLAB读取.bag文件转.mat文件

2D slam matlab仿真

代码下载:https://github.com/weihaotobe94/LaserSLAM
转载于:https://blog.csdn.net/weixin_28747937/article/details/115888534?spm=1001.2014.3001.5506

.bag文件下载与解压

bag文件下载

数据来源:https://google-cartographer-ros.readthedocs.io/en/latest/data.html
这里我下载名为b0-2014-07-11-11-00-49.bag的文件。
matlab只能读取未压缩的文件,直接下载的bag文件是压缩后的文件,因此首先需要解压缩。

在ros环境中解压缩bag文件

在ros环境下对原始的bag文件进行解压缩,得到解压后的bag文件。

rosbag decompress b0-2014-07-11-11-00-49.bag

解压后大小为674MB。

在matlab下对bag文件中的数据进行提取和保存

matlab提供了ros相关的函数来提取数据,但是一次对所有的数据进行处理,会发生内存不足的问题。比如我用如下的代码读取bag文件:

bag = rosbag(‘b2-2014-12-12-14-41-29.bag’);%读取所有数据
%读取水平雷达topic 数据
laser = select(bag, ‘Time’, …
[bag.StartTime bag.EndTime], ‘Topic’, ‘/horizontal_laser_2d’);
x = readMessages(laser);

matlab报错(内存不足):

Error in robotics.ros.BagSelection/readMessages (line 194)
msgs = obj.deserializeMessages(obj.MessageList, rows);
Error in LoadMeasurements (line 47)
msgs = readMessages(bag);

因此,采用循环的方式逐一读取数据,代码如下:

clear;clc;
bag = rosbag(‘b2-2014-12-12-14-41-29.bag’);%读取所有数据
%读取水平雷达topic 数据
laser = select(bag, ‘Time’, …
[bag.StartTime bag.EndTime], ‘Topic’, ‘/horizontal_laser_2d’);
%% 从文件中查找数据的大小
N = laser.NumMessages;%雷达数据条数
x = readMessages(laser,1);
[M,~] = size(x{1,1}.Ranges);
times = zeros(N,1);%时间参数
ranges = zeros(N,M);%距离参数
%% 循环读取数据 :整体读取时会出现内存不足的情况
for i=1:N
temp = readMessages(laser,i);
times(i) = temp{1,1}.Header.Stamp.Sec;%时间
ranges_temp = temp{1,1}.Ranges;%雷达测量(1079维数据)
for j = 1:M %不知道如何整体读取,所以加了循环
laser_echo = ranges_temp(j,1).Echoes;
[xx,yy] = size(laser_echo);
if xxyy<1 %当laser_echo为空时,跳出当前循环
continue
end
ranges(i,j) = laser_echo(1);%雷达测量的距离数据
end
%显示进度
if mod(i,100)==0
disp([‘处理进度%:’, num2str(i/N
100)]);
end
end
%数据保存为mat文件
save new_laser_data.mat times ranges

以上三个步骤得到了从激光SLAM建图需要的激光雷达ranges数据和times数据并保存到.mat文件中! 转载于:https://zhuanlan.zhihu.com/p/51577331?ivk_sa=1024320u

注意

转化后的.mat文件包含激光SLAM建图需要的激光雷达ranges数据和times数据,在2D slam matlab仿真代码中的main文件中,需要更改部分代码
27-28行

%lidar_data = load(‘dataset/horizental_lidar.mat’);
lidar_data = load(‘dataset/new_laser_data.mat’);
%N = size(lidar_data.timestamps, 1); % 扫描次数 (timestamps)时间戳
N = size(lidar_data.times, 1);

45行

%time = lidar_data.timestamps(scanIdx) * 1e-9; % 时间设置成每 1e-9扫描一次
time = lidar_data.times(scanIdx) * 1e-9; % 时间设置成每 1e-9扫描一次

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值