【MATLAB】ROS bag 激光雷达数据处理

该博客介绍了如何使用MATLAB处理ROSbag中的LaserScan数据,通过调整极坐标画点函数解决乱码问题,并实现与RVIZ数据的对应。接着,博主展示了对雷达数据进行聚类的初步算法,旨在实现动态障碍物的实时避障策略。最终,博主计划在ROS++中验证算法效果,并逐步完善包括检测框和滤波在内的功能。

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

基本步骤

rosbag record  /scan 打包数据
rosbag info 2021-11-12-16-54-23.bag  查看打包信息
clc,clear
filepath=fullfile('~/','2021-11-12-16-54-23.bag');
bag=rosbag(filepath);
geometry_message=select(bag,'MessageType','sensor_msgs/LaserScan');多个类型消息时选取雷达信息
data=readMessages(geometry_message);  
for i=1:1:360
    polarscatter(i,data{1,1}.Ranges(i),'.')极坐标画点
    hold on
end

在这里插入图片描述

problem:

rviz数据很规则,有聚堆现象为啥MATLAB,这么乱…在这里插入图片描述原来MATLAB的极坐标画点函数是弧度制,修改后:

clc,clear
filepath=fullfile('~/','2021-11-13-16-22-08.bag');
bag=rosbag(filepath);
geometry_message=select(bag,'MessageType','sensor_msgs/LaserScan');
data=readMessages(geometry_message);  
for i=1:1:360
    polarscatter(i*0.0174,data{1,1}.Ranges(i),'.')
    hold on
end

在这里插入图片描述
nice!

与RVIZ odom坐标对应

clc,clear
filepath=fullfile('~/','2021-11-13-16-22-08.bag');
bag=rosbag(filepath);
geometry_message=select(bag,'MessageType','sensor_msgs/LaserScan');
data=readMessages(geometry_message);  
for i=1:1:360
    if i < 180
    polarscatter(-(180-i)*0.0174,data{1,1}.Ranges(i),'.')
    hold on
    elseif i>= 180
    polarscatter((i-180)*0.0174,data{1,1}.Ranges(i),'.')
    hold on
    end
end

在这里插入图片描述
在这里插入图片描述两个包数据不一样,看最下面两个静态障碍物,可确定坐标已对齐
OK!

雷达聚类算法障碍物检测算法准备

clc,clear
%定义雷达分辨率
resolution=2*pi/360;
%读取ROS bag 数据包
filepath=fullfile('~/','2021-11-13-16-22-08.bag');
bag=rosbag(filepath);
%从bag数据包中选择指定类型读取
geometry_message=select(bag,'MessageType','sensor_msgs/LaserScan');
data=readMessages(geometry_message); 
%定义数组以极坐标形式保存雷达数据
LaserData=double(data{1,1}.Ranges(:));
%绘制雷达原始数据
for i=1:1:360
    if i < 180
    polarscatter(-(180-i)*resolution,LaserData(i),'.')
    LaserData(i,2)=-(180-i)*resolution;%在原始雷达数据中为点添加角度信息,用于后续计算点与点之间的距离
    hold on
    elseif i>= 180
    polarscatter((i-180)*resolution,LaserData(i),'.')    
    LaserData(i,2)=(i-180)*resolution;
    hold on
    end
end
%////核心代码,雷达数据聚类////TODO

NICE!什么都有了,可以利用原始数据,编写和验证自己的算法了,未完待续…
看了一篇文献,大致在MATLAB中粗略地尝试了,step1.
Real-Time Avoidance Strategy of Dynamic Obstacles via Half Model-Free Detection and Tracking With 2D Lidar for Mobile Robots二维雷达聚类算法

clc,clear
%定义雷达分辨率
resolution=2*pi/360;
%读取ROS bag 数据包
filepath=fullfile('~/','2021-11-13-16-22-08.bag');
bag=rosbag(filepath);
%从bag数据包中选择指定类型读取
geometry_message=select(bag,'MessageType','sensor_msgs/LaserScan');
data=readMessages(geometry_message); 
%定义数组以极坐标形式保存雷达数据
LaserData=double(data{1,1}.Ranges(:));
%绘制雷达原始数据
figure('Name','原始雷达信息','NumberTitle','off');

for i=1:1:360
    if i < 180
     polarscatter(-(180-i)*resolution,LaserData(i),'.')
    LaserData(i,2)=-(180-i)*resolution;%在原始雷达数据中为点添加角度信息,用于后续计算点与点之间的距离
     hold on
    elseif i>= 180
     polarscatter((i-180)*resolution,LaserData(i),'.')    
    LaserData(i,2)=(i-180)*resolution;
    hold on
    end
end
%////核心代码,雷达数据聚类////TODO
minNum = 2 ;
r = 0.10 ;
N =1;
flag =0;
tempN=1;
ncluster=[];
for i=1:1:359
    if (LaserData(i+1,1)*cos(LaserData(i+1,2))-LaserData(i,1)*cos(LaserData(i,2)))^2+(LaserData(i+1,1)*sin(LaserData(i+1,2))-LaserData(i,1)*sin(LaserData(i,2)))^2 <= (r)^2

        if flag==0
            N=N+1;
            ncluster(N,tempN)=i;
            flag=1;
        end
        ncluster(N,tempN)=i;
        tempN=tempN+1;
    
    else
        flag=0;
        tempN=1;
    end
end
[m,n]=size(ncluster)
color=['b*','y.','gv','r^','black*','b.','rv','y^',];
figure('Name','粗略聚类效果','NumberTitle','off');
for i=1:1:m
    for j=1:1:n
        if ncluster(i,j)~=0
           polarscatter(LaserData(ncluster(i,j),2),LaserData(ncluster(i,j),1),color(mod(i,8)+1))
           hold on
        end
    end
end


效果:
在这里插入图片描述还行吧,不知道在ROS C++中效果怎么样,后续把检测框部分,滤波部分加上,然后在RVIZ显示,未完待续…

### 使用MATLAB读取激光雷达数据的.bag文件 为了读取存储于`.bag`文件中的激光雷达数据,在MATLAB环境中可以采用如下方法: 通过指定路径加载`.bag`文件,并利用特定的消息类型筛选出所需的传感器数据。对于激光雷达而言,通常关注的是`sensor_msgs/LaserScan`类型的数据[^1]。 ```matlab clc; clear; filepath = fullfile('path_to_your_bag_file', 'your_rosbag_filename.bag'); bag = rosbag(filepath); geometry_message = select(bag, 'MessageType', 'sensor_msgs/LaserScan'); data = readMessages(geometry_message); for i = 1:length(data{1, 1}.Ranges) polarscatter(i, data{1, 1}.Ranges(i), '.') hold on end ``` 上述代码片段展示了如何从`.bag`文件中提取激光雷达扫描(`LaserScan`)消息,并将其转换成可视化的形式展示出来。这里假设每条记录都包含了完整的360度范围内的距离测量值。 另外一种方式是从网络上获取预定义好的`.bag`文件并直接用于分析工作。这可以通过调用辅助函数来完成下载操作[^2]。 ```matlab outputFolder = fullfile(tempdir, 'RosbagFile'); rosbagURL = ['https://example.com/path/to/rosbag/file.zip']; helperDownloadRosbag(outputFolder, rosbagURL); ``` 这段脚本说明了怎样自动下载远程服务器上的ROS bag压缩包至本地临时目录内供后续处理使用。 #### Python环境下读取.bag文件中的激光雷达数据 如果偏好Python编程语言,则可借助`rosbag`库来进行相同的操作。下面给出了一段简单的例子用来遍历整个`.bag`文件的内容,并针对其中的每一项执行自定义逻辑处理[^4]。 ```python import rosbag with rosbag.Bag('/absolute_or_relative_path_to_the_bags/your_rosbag_filename.bag', 'r') as bag: for topic, msg, t in bag.read_messages(topics=['/scan']): # Process each LaserScan message here. print(len(msg.ranges)) # Example action: Print number of range measurements per scan. ``` 该循环结构允许开发者逐帧访问所有的激光雷达扫描事件及其关联的时间戳信息,从而便于进一步的数据挖掘或可视化呈现。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RockWang.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值