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

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

基本步骤

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显示,未完待续…

  • 6
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

RockWang.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值