无人驾驶(移动机器人)路径规划之A star(Tie Breaker)算法及其matlab实现

     在自动驾驶与移动机器人路径规划时,必定会用到经典的算法A star。下面是我未加入与加入Tie Breaker 的matlab实现效果。可以发现加入Tie Breaker之后效果明显改善。

目录

一、效果比较

1.未加入Tie Breaker(黑色为障碍物,菱形绿色为目标点与起始点,红色为close,绿色为open,黄色为最终路径)

2.加入Tie Breaker(黑色为障碍物,菱形绿色为目标点与起始点,红色为close,绿色为open,黄色为最终路径)

二、A star算法

1.算法背景与原理

2.算法流程

3.算法应用与优化

4.算法特点与局限性

5.总结与展望

6.A star的Tie Breaker

三、核心代码

1.Main代码

2.A star算法

3.地图创建


一、效果比较

1.未加入Tie Breaker(黑色为障碍物,菱形绿色为目标点与起始点,红色为close,绿色为open,黄色为最终路径)

代码链接:

移动机器人自主路径规划之Astar算法MATLAB实现代码资源-CSDN文库

(1)原始地图信息。

(2)规划地图信息

(3)路径信息

2.加入Tie Breaker(黑色为障碍物,菱形绿色为目标点与起始点,红色为close,绿色为open,黄色为最终路径)

𝑑𝑥1 = 𝑎𝑏𝑠 𝑛𝑜𝑑𝑒. 𝑥 − 𝑔𝑜𝑎𝑙. 𝑥
𝑑𝑦1 = 𝑎𝑏𝑠(𝑛𝑜𝑑𝑒. 𝑦 − 𝑔𝑜𝑎𝑙. 𝑦)
𝑑𝑥2 = 𝑎𝑏𝑠 𝑠𝑡𝑎𝑟𝑡. 𝑥 − 𝑔𝑜𝑎𝑙. 𝑥
𝑑𝑦2 = 𝑎𝑏𝑠 𝑠𝑡𝑎𝑟𝑡. 𝑦 − 𝑔𝑜𝑎𝑙. 𝑦
𝑐𝑟𝑜𝑠𝑠 = 𝑎𝑏𝑠(𝑑𝑥1 × 𝑑𝑦2 − 𝑑𝑥2 × 𝑑𝑦1)
h = ℎ + 𝑐𝑟𝑜𝑠𝑠 × 0.001

代码链接:

无人驾驶(移动机器人)路径规划之Astar(TieBreaker)算法及其matlab实现资源-CSDN文库

(1)原始地图信息。

(2)规划地图信息

(3)路径信息

二、A star算法

       Astar算法是一种广泛使用的路径规划算法,它通过启发式搜索的方式,在图形或网络中寻找两个节点之间的最短路径。A算法结合了广度优先搜索和最佳优先搜索的特点,通过评估每个可能的路径,以找到从起点到目标节点的最佳路径。以下是对A*算法的详细介绍。

1.算法背景与原理

        A*算法最早于1964年在IEEE Transactions on Systems Science and Cybernetics中的论文《A Formal Basis for the Heuristic Determination of Minimum Cost Paths》中首次提出。它属于经典的启发式搜索方法,其核心思想在于当前搜索结点往下选择下一步结点时,可以通过一个启发函数来进行选择,选择代价最少的结点作为下一步搜索结点而跳转其上。

        在Astar算法中,每个节点都有两个关键值:G值和H值。G值表示从起点到当前节点的实际代价,即已经走过的路径长度;H值表示从当前节点到目标节点的估计代价,即预计还需要走多远才能达到目标。Astar算法在搜索过程中,始终选择F值最小的节点进行扩展,其中F=G+H。这种策略使得A*算法能够尽可能地沿着最短路径进行搜索,从而提高搜索效率。

2.算法流程

A*算法的流程大致如下:

  1. 初始化:创建一个开放列表和一个关闭列表,用于存储待探索和已探索的节点。将起点加入开放列表。
  2. 选择节点:从开放列表中选择F值最小的节点作为当前节点。如果开放列表为空,则算法结束,表示没有找到路径。
  3. 扩展节点:将当前节点从开放列表移到关闭列表,并检查其所有邻居节点。对于每个邻居节点,如果它已经在关闭列表中,则忽略它;如果它不在开放列表和关闭列表中,则计算其G值、H值和F值,并将其添加到开放列表;如果它已经在开放列表中,但新计算的G值更小,则更新其G值和F值。
  4. 重复搜索:重复步骤2和3,直到目标节点被加入关闭列表或开放列表为空。如果目标节点被加入关闭列表,则算法找到了一条从起点到目标节点的路径;如果开放列表为空,则算法结束,表示没有找到路径。

3.算法应用与优化

        Astar算法在游戏开发、机器人学和其他相关领域有着广泛的应用。在游戏中,Astar算法被用来实现人物的寻路功能,使得角色能够智能地找到从起点到终点的最短路径。在机器人学中,A*算法被用于机器人的路径规划,帮助机器人避开障碍物并高效地到达目的地。

      为了提高A*算法的性能和效率,研究者们进行了大量的优化工作。例如,通过改进数据结构(如使用优先队列来存储开放列表中的节点),可以减少算法的时间复杂度;通过引入预处理技术(如构建网格地图或生成路标图),可以进一步提高算法的搜索速度;通过引入动态障碍物处理和实时地图更新机制,可以使算法更好地适应复杂和动态的环境。

4.算法特点与局限性

        Astar算法具有方向性、智能性等特点,能够结合搜索任务中的环境情况,缩小搜索范围,提高搜索效率。然而,Astar算法也存在一些局限性。首先,它依赖于启发式函数的选择,如果启发式函数设计不当,可能导致算法性能下降或无法找到最优解。其次,Astar算法在复杂的环境或图形中可能不是最优的,因为它需要对每个可能的路径进行评估和比较。此外,Astar算法的空间复杂度较高,需要存储大量的节点信息,这可能导致内存消耗较大。

5.总结与展望

        Astar算法作为一种高效的路径规划算法,在多个领域得到了广泛应用。通过不断优化和改进算法的实现方式,可以进一步提高Astar算法的性能和效率,使其更好地适应复杂和动态的环境。未来,随着人工智能和机器人技术的不断发展,A*算法有望在更多领域发挥重要作用,为智能系统的路径规划和决策提供支持。

     请注意,以上是对A star算法的简要介绍,实际应用中可能还需要考虑更多的细节和特殊情况。此外,由于篇幅限制,这里无法对Astar算法的每个方面都进行深入的探讨。如果需要更详细或专业的介绍,建议查阅相关学术论文或技术文档。

6.A star的Tie Breaker

        A star算法中的Tie Breaker(平局决胜者)是一个解决在搜索过程中遇到多个具有相同F值的节点时,如何选择下一个扩展节点的问题的机制。在A star算法中,当开放列表中存在多个具有相同最小F值的节点时,如果没有明确的选择标准,算法可能会陷入非确定性的行为,导致每次运行的结果不一致或者搜索性能下降。

     Tie Breaker的作用就是提供一个确定性的选择标准,确保在面临多个相同F值的节点时,算法能够一致地选择下一个扩展节点。这样可以提高算法的稳定性和可预测性。

     Tie Breaker的具体实现方式可以有多种。一种常见的做法是按照节点的其他属性进行排序,比如按照节点的G值或者H值进行次级排序。如果G值和H值也相同,还可以考虑使用节点的位置、编号或者其他自定义的属性进行排序。这样,当遇到多个具有相同F值的节点时,算法会根据Tie Breaker的规则选择一个确定的节点进行扩展。

        另外,有些实现中还可能采用随机选择的方式来处理平局情况,但这通常不是首选方法,因为它可能导致算法的不稳定性和不可预测性。

      总之,Tie Breaker是A算法中一个重要的机制,用于解决在选择扩展节点时遇到的平局情况,确保算法的一致性和稳定性。通过合理地设计Tie Breaker的规则,可以提高A算法的性能和可靠性。

三、核心代码

1.Main代码

function Main()
%主程序
clc
clear all
close all;
disp('A Star Path Planing start!!');
[map,node,obstacle]=createmap();map_start = node(1:2);
map_goal = node(3:4);
xmax = size(map,1);
ymax = size(map,2);
figure;
pause(3);
axis([1 xmax+1 1 ymax+1])
set(gca,'YTick',0:1:xmax);
set(gca,'XTick',0:1:ymax);
grid on;
hold on;
% 绘制边界和障碍点
plot(obstacle(:,1)+.5,obstacle(:,2)+.5,'o',  'MarkerFaceColor', 'k', 'MarkerEdgeColor', 'k');
hold on;
% 绘制起始点
plot(map_start(1)+.5,map_start(2)+.5,'d','MarkerFaceColor','g');
hold on;
text(map_start(1)+.5,map_start(2)+.5,'Start');
hold on;
% 绘制终止点
plot(map_goal(1)+.5,map_goal(2)+.5,'d','MarkerFaceColor','g');
hold on;
text(map_goal(1)+1,map_goal(2)+.5,'Target');hold on;
path = FAstar(obstacle,map,map_start,map_goal);% A*算法%画出路径
figure;
axis([1 xmax+1 1 ymax+1])
set(gca,'YTick',0:1:xmax);
set(gca,'XTick',0:1:ymax);
grid on;
hold on;
% 绘制边界和障碍点
plot(obstacle(:,1)+.5,obstacle(:,2)+.5,'o',  'MarkerFaceColor', 'k', 'MarkerEdgeColor', 'k');
hold on;
% 绘制起始点
plot(map_start(1)+.5,map_start(2)+.5,'d','MarkerFaceColor','g');
hold on;
text(map_start(1)+.5,map_start(2)+.5,'Start');
% 绘制终止点
plot(map_goal(1)+.5,map_goal(2)+.5,'d','MarkerFaceColor','g');
hold on;
text(map_goal(1)+1,map_goal(2)+.5,'Target');
if length(path)>=1plot(path(:,1)+0.5,path(:,2)+0.5,'-y','LineWidth',3);hold on;
end
%}grid on;
hold on;
pause(5);
%close(figure(1));end

2.A star算法

function path  = FAstar(obstacle,map,map_start,map_goal)
%Tie Breaker
dx0 = abs(map_goal(1)-map_start(1));
dy0 = abs(map_goal(2)-map_start(2));
% A*程序算法
path = [] ;
%openlist
open = [];
%closelist
close = [];%findflag用于判断while循环是否结束
findflag = false;
%1.起始点放在openlist中
open = [map_start(1),map_start(2),0+h(map_start,map_goal),0,map_start(1),map_start(2)];%节点坐标、代价值F,G,父节点
%更新八节点
next = model();
while ~findflag%首先判断是否到达目标点if isempty(open(:,1))disp('No path to goal!');return;end%判断目标点是否在open中[openflag,id] = Isopen(map_goal,open);if openflagdisp('Find goal!');close = [open(id,:);close];%close的第一行findflag = true;break;end%判断openlist中F排序%寻找F最小点[Y,I] = sort(open(:,3));open =open(I,:);%F值排序后的open%将F最小的节点(open中第一行节点)放到closeclose = [open(1,:);close];current = open(1,:);open(1,:) = [];%open第一行置为空%对当前节点周围4个相邻节点进行判断for in = 1:length(next(:,1))%获得相邻节点的坐标,F置为0,G置为0%父坐标暂定为0m = [current(1,1)+next(in,1) , current(1,2)+next(in,2),0,0,0,0];m(4) = current(1,4) + next(in,3);%相邻节点Gm(3) = m(4) + h1(m(1:2),map_goal,dx0,dy0);%相邻节点F%判断当前节点是否为阻碍点if Isobstacle(m,obstacle)continue;end%{如果相邻节点,在closelist中,则flag=1 targetInd=其close的行数如果相邻节点,不在openlist中,则flag=2 targetInd=[]如果相邻节点,在openlist中,则flag=3 targetInd=其open的行数%}[flag,targetInd] = Findlist(m,open,close);%如果它在Closelist中,忽略此相邻节点if flag==1continue;%如果它不在Openlist中,加入Openlist,并把当前节点设置为它的父节点elseif flag==2m(5:6) = [current(1,1),current(1,2)];open = [open;m];%剩下的情况就是它在Openlist中,检查由当前节点到相邻节点是否更好% 如果更好则将当前节点设置为其父节点,并更新F,G值;否则不操作else%由当前节点到达相邻节点更好(targetInd是此相邻节点在open中的行号 此行的第3列是代价函数F值)if m(3) < open(targetInd,3)m(5:6) = [current(1,1),current(1,2)];open(targetInd,:) = m;      %更好,则将此相邻节点的父节点设置为当前节点,否则不作处理endendendplotmap(map,open,close);
end
%追溯路径
path = getpath(close,map_start);end

3.地图创建

function [map,node,obstacle] = createmap()
%创建地图
clear all;
figure;%创建新窗口%地图参数初始化
max_x = 100;%长
max_y = 100;%宽
p_obstacle = 0.3;%阻碍率%设置阻碍点
obstacle0 = ones( max_x ,max_y ) * p_obstacle;%创建矩阵
%MAP中阻碍点设为-1,非阻碍点设为9998
map = 9999*((rand(max_x,max_y))>obstacle0) - 1;%-1代表阻碍物
YMAX = size(map,2);%y轴最大
XMAX = size(map,1);%x轴最大
obstacle = [];
for i1 = 0 : (YMAX+1)obstacle = [obstacle;[0 i1]];
end
for i2 = 0 : (XMAX+1)obstacle = [obstacle;[i2 0]];
end
for i3 = 0 : (YMAX+1)obstacle = [obstacle;[XMAX+1 i3]];
end
for i4 = 0 : (XMAX+1)obstacle = [obstacle;[i4 YMAX+1]];
end
%障碍点坐标
for i = 1 : XMAXfor j = 1 : YMAXif map(i,j) == -1obstacle = [obstacle;[i j]];endend
end
axis([1 max_x + 1 1 max_y + 1])%x,y轴1-50图像
set(gca,'XTick',0:1:max_x);%x轴的间隔为1
set(gca,'YTick',0:1:max_y);%y轴的间隔为1
grid on;%设置网格线
hold on;%保持图形
%绘制地图障碍物
for i = 1 : max_xfor j = 1 : max_yif map(i,j) == -1plot(i+0.5, j+0.5, 'o',  'MarkerFaceColor', 'k', 'MarkerEdgeColor', 'k');  %中心位置绘制点endend
end
pause(1);%延时一秒
%初始点
h=msgbox('初始位置标记!');%弹出初始框提示标记初始位置
uiwait(h,3);%3s后关闭对话框
if ishandle(h) == 1%删除对话框delete(h);
end
xlabel('请设置初始点X轴! ','Color','black');%设置x轴
but = 0;
while(but ~= 1)%收到左键点击[xval,yval,but] = ginput(1);xval=floor(xval);yval=floor(yval);
end
xstart = xval;%初始位置
ystart = yval;
map(xval,yval) = 0;
plot(xval + 0.5,yval + 0.5,'d','MarkerFaceColor','g');%绘制初始点
text(xval + 1,yval + 0.5,'Start');
pause(1);%延时一秒
%目标点
h=msgbox('目标位置标记!');%弹出目标提示标记目标位置
uiwait(h,3);%3s后关闭对话框
if ishandle(h) == 1%删除对话框delete(h);
end
xlabel('请设置目标点X轴! ','Color','black');%设置x轴
but1 = 0;
while(but1 ~= 1)%收到左键点击[xval,yval,but1] = ginput(1);xval=floor(xval);yval=floor(yval);
end
xTarget = xval;%目标位置
yTarget = yval;
map(xval,yval) = 9998;
plot(xval + 0.5,yval + 0.5,'d','MarkerFaceColor','g');%绘制目标点
text(xval + 1,yval + 0.5,'Target');
node = [xstart,ystart,xTarget,yTarget];h=msgbox('请确认地图信息!');%确认地图信息
uiwait(h,3);%3s后关闭对话框
if ishandle(h) == 1%删除对话框delete(h);
end
pause(5);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/771144.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python3游戏GUI--开心打地鼠游戏By:PyQt5(附下载地址)

文章目录 一&#xff0e;前言二&#xff0e;游戏预览1.启动2.开始游戏3.游戏结束4.排行榜 三&#xff0e;游戏思路四&#xff0e;总结 一&#xff0e;前言 第一次用PyQt做游戏&#xff0c;有点小紧张呢。本次使用PyQt5制作一款简单的打地鼠游戏&#xff0c;支持基本游戏玩法、…

Bytebase 签约 PropertyGuru,助力东南亚最大地产科技平台跨国多地数据库变更自动化

PropertyGuru 是东南亚最大的在线房地产平台&#xff0c;于2022年于纽交所&#x1f4c8;上市&#xff0c;总部位于新加坡 &#x1f1f8;&#x1f1ec;。公司利用先进的技术&#xff0c;建立了一个连接多方的在线房产平台&#xff0c;一方面为中介代理商、开发商、银行等机构提供…

Kimi是什么?免费Kimi chat介绍

1. Kimi是什么&#xff1f; Kimi是由月之暗面科技有限公司&#xff08;Moonshot AI&#xff09;开发的人工智能助手&#xff0c;专注于提供高质量的对话和信息处理服务。 月之暗面公司创立于2023年3月&#xff0c;创始团队核心成员参与了Google Gemini、Google Bard、盘古NLP、…

文献学习-22-Surgical-VQLA:具有门控视觉语言嵌入的转换器,用于机器人手术中的视觉问题本地化回答

Authors: Long Bai1† , Mobarakol Islam2† , Lalithkumar Seenivasan3 and Hongliang Ren1,3,4∗ , Senior Member, IEEE Source: 2023 IEEE International Conference on Robotics and Automation (ICRA 2023) May 29 - June 2, 2023. London, UK Abstract: 尽管有计算机辅…

Jira 软件缺陷管理 (软件测试)

内容来源&#xff1a;总结黑马课程 1.软件缺陷信息 2.创建缺陷问题 2.1 缺陷模板 2.2 创建缺陷问题模板

CTF题型 Python中pickle反序列化进阶利用例题opache绕过

CTF题型 pickle反序列化进阶&例题&opache绕过 文章目录 CTF题型 pickle反序列化进阶&例题&opache绕过一.基础的pickle反序列化例题1.[HFCTF 2021 Final]easyflask2.[0xgame 2023 Notebook]3.[[HZNUCTF 2023 preliminary\]pickle](https://www.nssctf.cn/proble…

蓝桥杯java---螺旋矩阵

解题思路&#xff1a; int [][] arr new int[n][m];int i 0, j -1, temp 1;while (n * m > 0){for (int p 0; p < m; p)//从左自右arr[i][jj1] temp;n--;if (n * m 0) break;for (int p 0; p < n; p)//从上自下arr[ii1][j] temp;m--;if (n * m 0) break;fo…

分享一个免费查海关(HS)编码的工具

用过海关数据的朋友就会发现&#xff0c;因为现在大部分的海关数据都是国外的进口数据&#xff0c;所以如果要用海关编码去查相关产品的海关交易记录的话&#xff0c;最好的方法就是用当地的海关编码去搜。 各个国家的海关编码是不一样的&#xff0c;比如美国的一般是6-8位&am…

构造函数与析构函数

构造函数 每次创建类的新对象时执行构造函数的名称与类名相同&#xff0c;不带类型&#xff0c;可以有参数也可以没参数构造函数有时给成员函数付初值 析构函数 每次删除所创建的对象时执行析构函数与构造函数类似&#xff0c;前面多个~不带任何参数&#xff0c; #include …

FPGA时钟资源详解(3)——全局时钟资源

FPGA时钟系列文章总览&#xff1a;FPGA原理与结构&#xff08;14&#xff09;——时钟资源https://ztzhang.blog.csdn.net/article/details/132307564 一、概述 全局时钟是 FPGA 中的一种专用互连网络&#xff0c;旨在将时钟信号分配到 FPGA 内各种资源的时钟输入处。这种设计…

免费redis可视化工具windows/mac都可以使用,开源免费

官方地址&#xff1a;RedisInsight | The Best Redis GUI github开源地址&#xff1a;GitHub - RedisInsight/RedisDesktopManager Redis Desktop Manager – Redis可视化管理工具、redis图形化管理工具、redis可视化客户端、redis集群管理工具。 官方下载方式 滚动到页面底…

FPGA时钟资源详解(4)——区域时钟资源

FPGA时钟系列文章总览&#xff1a;FPGA原理与结构&#xff08;14&#xff09;——时钟资源https://ztzhang.blog.csdn.net/article/details/132307564 目录 一、概述 二、Clock-Capable I/O 三、I/O 时钟缓冲器 —— BUFIO 3.1 I/O 时钟缓冲器 3.2 BUFIO原语 四、区域时钟…

High 级别反射型 XSS 攻击演示(附链接)

环境准备 如何搭建 DVWA 靶场保姆级教程&#xff08;附链接&#xff09;https://eclecticism.blog.csdn.net/article/details/135834194?spm1001.2014.3001.5502 测试 打开靶场找到该漏洞页面 先右键检查输入框属性 还是和之前一样的&#xff0c;所以直接输入 HTML 标签提交…

Vue 发送Ajax请求多种方式

1. 发送ajax请求的方式 方案一&#xff1a;jq 的ajax&#xff08;在 vue 中不推荐同时使用&#xff09;方案二&#xff1a;js 原始官方 fetch方法方案三&#xff1a;axios 第三方 2. 方案一 后端视图函数 from rest_framework.viewsets import ViewSet from rest_framework…

云数据库认识

云数据库概述 说明云数据库厂商概述Amazon 云数据库产品Google 的云数据库产品Microsoft 的云数据库产品 云数据库系统架构UMP 系统概述UMP 系统架构MnesiaRabbitMQZooKeeperLVSController 服务器Proxy 服务器Agent 服务器日志分析服务器 UMP 系统功能容灾 读写分离分库分表资源…

刚删除的文件怎么找回?刚删除的文件重新找回方法

电脑是我们办公、生活和娱乐必不可缺少的设备,里面存储着我们很多重要的文件。但是,有时候我们不小心误删了文件,或者是不小心删除了一些重要的数据等,要怎么进行恢复呢?今天,小编就专门给大家讲下刚删除的文件重新找回方法。 方法一: 文件不小心删除了,请立即停止对硬…

JavaParser 手动安装和配置

目录 前言 一、安装 Maven 工具 1.1 Maven 软件的下载 1.2 Maven 软件的安装 1.3 Maven 环境变量配置 1.4 通过命令检查 Maven 版本 二、配置 Maven 仓库 2.1 修改仓库目录 2.2 添加国内镜像 三、从 Github 下载 JavaParser 3.1 下载并解压 JavaParser 3.2 从路径打…

蓝桥杯单片机快速开发笔记——利用定时器计数器设置定时器

一、基本原理 参考本栏http://t.csdnimg.cn/iPHN0 二、具体步骤 三、主要事项 如果使用中断功能记得打开总中断EA 四、示例代码 void Timer0_Isr(void) interrupt 1 { }void Timer0_Init(void) //10毫秒12.000MHz {AUXR & 0x7F; //定时器时钟12T模式TMOD & 0xF0;…

python网络爬虫实战教学——requests的使用(2)

文章目录 专栏导读1、POST请求2、响应3、Cookie设置 专栏导读 ✍ 作者简介&#xff1a;i阿极&#xff0c;CSDN 数据分析领域优质创作者&#xff0c;专注于分享python数据分析领域知识。 ✍ 本文录入于《python网络爬虫实战教学》&#xff0c;本专栏针对大学生、初级数据分析工程…