论文算法学习实现(5):动态障碍物的检测和剔除2

前言背景: 根据前面讲到的动态障碍物检测和剔除算法,结合视角椎视野模型,实现动态障碍物剔除如下。


前言研究一:动态障碍物的检测和剔除算法解析

前言研究二:视角椎的实现和数据剔除


一. 动态障碍物检测去除算法更新如下:

结合上一节中对障碍物检测讨论
  1. 利用视角锥检测相机视野空间中障碍物的变化,可以判断出哪些点是新的点哪些点是旧的的点,因此我们对比两次点集的不一致进行比较区分;

  2. 现在可以利用视角椎滤出得到的数据(3D点云数据),是在相机视野范围内的数据,且可以根据相机的移动(获取相机位姿),
    实时更新Frustum的视野范围,即可以实时得到当前视野范围内的点云数据。

二. 分别利用C++代码和ROS节点消息实现了障碍物的去除

1. 将分别有障碍物和无障碍物的点云地图保存下来,检测动态障碍物的位置:

在这里插入图片描述

检测在同一片区域内、同样的视角椎范围内地图的不同点;

2.将检测到的动态障碍物用不同颜色标注,显示在同一个窗口,可以对比看出哪些是要剔除的部分:

在这里插入图片描述

从上图中可以看出,蓝色与白色是地图中的静态障碍物, 而红色是在地图中保留、当前帧中没有的数据,我们需要将其剔除;

3. 将检测到的动态障碍物剔除,并将剔除动态障碍物后的地图与原地图进行对比:

图三

下面图是原地图数据(保留有rgb颜色), 上图中的右图为处理过程中的图,标出了需要除掉了障碍物(红色物体), 上图中的左图为最后处理得到的图。

三. 小结

总而言之, 针对算法的解析和设计,实现了基于视锥体的障碍物检测和剔除。但是还需要对其进一步优化,保证其算法的稳定性。

  • 1
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
以下是MATLAB上的Theta*算法代码实现: ```matlab function [path, closed] = theta_star(start, goal, map) %start:起点坐标 %goal:终点坐标 %map:地图数据,0表示可行,1表示障碍物 %初始化路径和封闭集合 path = []; closed = zeros(size(map)); %定义节点类 classdef Node properties x; y; g; h; f; parent; obstacle; end methods function obj = Node(x, y, g, h, parent, obstacle) obj.x = x; obj.y = y; obj.g = g; obj.h = h; obj.f = obj.g + obj.h; obj.parent = parent; obj.obstacle = obstacle; end end end %启发式函数 function h = heuristic(node1, node2) h = sqrt((node1.x - node2.x)^2 + (node1.y - node2.y)^2); end %计算代价 function g = cost(node1, node2) if abs(node1.x - node2.x) == 1 && abs(node1.y - node2.y) == 1 g = sqrt(2); else g = 1; end end %创建起点和终点节点 start_node = Node(start(1), start(2), 0, heuristic(start, goal), [], false); goal_node = Node(goal(1), goal(2), 0, 0, [], false); %将起点加入开放集合 open = []; open = [open, start_node]; %循环直到开放集合为空 while ~isempty(open) %找到f值最小的节点 [~, index] = min([open.f]); curr_node = open(index); %将当前节点从开放集合中删除,并加入封闭集合 open(index) = []; closed(curr_node.x, curr_node.y) = 1; %如果当前节点是终点,则构造路径 if curr_node.x == goal_node.x && curr_node.y == goal_node.y path = [goal_node.x, goal_node.y]; node = curr_node; while ~isempty(node.parent) path = [node.parent.x, node.parent.y; path]; node = node.parent; end return end %遍历当前节点的邻居节点 for i = curr_node.x-1:curr_node.x+1 for j = curr_node.y-1:curr_node.y+1 %如果越界或者是当前节点,则跳过 if i < 1 || j < 1 || i > size(map, 1) || j > size(map, 2) || (i == curr_node.x && j == curr_node.y) continue; end %如果是障碍物,则标记为障碍物节点 if map(i, j) == 1 n = Node(i, j, Inf, Inf, [], true); %否则创建节点 else n = Node(i, j, Inf, heuristic([i, j], goal), [], false); end %如果该节点已在封闭集合中,则跳过 if closed(i, j) == 1 continue; end %计算节点的g值 if abs(i - curr_node.x) == 1 && abs(j - curr_node.y) == 1 tentative_g = curr_node.g + sqrt(2)*cost(curr_node, n); else tentative_g = curr_node.g + cost(curr_node, n); end %如果该节点已在开放集合中且g值更小,则更新节点的g值和父节点 index = find([open.x] == n.x & [open.y] == n.y); if ~isempty(index) && tentative_g < open(index).g open(index).g = tentative_g; open(index).f = open(index).g + open(index).h; open(index).parent = curr_node; %否则将该节点加入开放集合 elseif isempty(index) n.g = tentative_g; n.f = n.g + n.h; n.parent = curr_node; open = [open, n]; end %如果该节点在终点和当前节点之间,并且不是障碍物,则检查是否可以直接连接 if ~n.obstacle && (abs(i - goal_node.x) + abs(j - goal_node.y) == 1) dx = i - curr_node.x; dy = j - curr_node.y; if map(curr_node.x+dx, curr_node.y+dy) == 0 && map(i-dx, j-dy) == 0 g = curr_node.g + cost(curr_node, n) + cost(n, goal_node); if g < goal_node.g goal_node.g = g; goal_node.parent = curr_node; end end end end end end end ``` 该代码实现了Theta*算法,其中使用了节点类来存储节点的属性。算法的核心是启发式函数和代价函数的设计,以及对节点的处理和更新。算法的输出为路径和封闭集合。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

爱发呆de白菜头

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

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

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

打赏作者

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

抵扣说明:

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

余额充值