A*算法原理

A算法是一种经典的路径搜索算法,A算法的原理初学者可以去网上搜索算法原理详解,讲得很好
链接:http://www.gamedev.net/reference/articles/article2003.asp
截图回忆

算法牛人或者进阶者,可能只是忘了算法的一些关键点,这里进行回顾

A*算法简单来说就是一个寻找一条最小代价路径的算法
核心公式为:
F = G + H
F:总损失
G:从起点到当前位置的实际移动代价
H:从当前位置到终点的估算代价

FGH好吧,唱首歌ABCDE FGH IJK…

A*算法理解

A*算法的代价

换句话说,A*算法为每个路径点贴上了一个标签,标签上写了一个数字,那就是F。F是如何构成的呢,那就是从起点走到当前位置,你付出的代价是多少,你从当前位置到终点,估计你还要付出多少代价
总代价 = 实际移动代价 + 未来移动估算代价

那么在算法设计过程中,代价的设计就至关重要了。而设计自然也分实际移动代价和估算代价两个部分。
举个例子,一个简单的计算方式就是:
机器人直线运动前进或者倒退的实际代价设为1,向左走或者向右走的实际代价设为2。未来移动估算代价可以设为地图上两点间的曼哈顿距离(d(i,j)=|X1-X2|+|Y1-Y2|)

A*算法的算法逻辑

代价的设计方式有很多,假设我们已经定义了一种方式,那么让A*算法生效的逻辑是什么呢?解释如下

算法维护两个list,正确而简单的理解就是
open list:该list中的点还要被搜索
closed list:该list中的点不需要被搜索了

算法步骤如下

  1. open list中最开始只有一个点——路径的起点

  2. 把路径起点周围的点放入open list中,计算他们的F值,并将他们的父节点设为起点,将起点放入closed list中

  3. 选取open list中F值最小的点,把它自己放入closed list中

  4. 重要的一步:

    (1) 第3步中选取的F值最小的点,我们称他为“小明”,称小明的周围点为“小明的同桌们”,同桌们有的已经在open list中了,有的还没有在open list中;

    (2) 没有在open list中的点,自然没计算过F值,那么现在计算他们的F值,并把小明设为这些同桌的父节点

    (3) 已经在open list中的点,以小明作为父亲,重新计算一下已经在open list 的同桌们的G值(注意,是G值);

    (4) 如果新计算的G值小于他们固有的G值,那么“小明是这位同桌的爸爸”。哈哈,意思就是说:从小明移动到这位同桌的路径,比之前计算得到的、能够移动到这位同桌的路径要好。把小明设置为这些同桌的父节点。

    (5) 如果新计算的G值大于他们固有的G值,那么“小明不是这些同桌的爸爸”。小明移动到这些同桌,不如之前计算的路径代价小,那么这些同桌们的爸爸不变。什么操作都不要有…小明,别想当人家爹了,人家的爹还是不变的

    (6) 进行过“父亲辨认”后,把同桌们都放入open list中;

  5. 循环,请执行第3步,直到第3步在 open list 中选取的F值最小的点其实就是终点。

  6. 从终点开始,倒推每个节点的父节点,直到倒推回起点,这就是你要的路径

A*算法终极理解

简单几句话:

A*,就是在已知位置中不断地搜索代价最小的点,并且更新一下所有已知位置的最优到达路径,通过在搜索过程中明确点与点之间的父与子关系,最终确定最优路径。

A*在移动机器人路径规划的应用思考

A*算法用在移动机器人路径规划是没有问题的,在程序层面需要设计的部分包括

  • open list的维护:很显然,一个最简单的方法是维护一个有排好序的open list,取值时只取F值最小的位置就行了。小地图这样可以,大地图列表有可能过大影响效率,二叉堆是一个优化效率的好方法(TODO)

  • 多机器人的规划:多机器人怎么处理互相的碰撞,都在运动怎么计算出避免碰撞的路径(设定都首先向一个方向躲避还是?)

  • 寻路速度:

    1. 使用小地图(呵呵,我就想在大地图里翱翔就没办法了)
    2. 不要多个机器人一起去规划(没办法的办法)
    3. 地图分辨率(重要:地图分辨率决定了你的路径规划速度,比如你有100平方米,地图分辨率2cm和2mm规划起来效率肯定不一样啊)
    4. 路径点系统(重要:大区域规划出来的路径,应该是一系列主要的路径点构成的,不可能移动时你要记住路径的每一个点)
    5. 设定一些不能到达的区域(重要:因为这是很实际的,移动机器人的工作区域往往只是地图的一小部分,剩余部分是它绝对不能进入的)
    6. 不同的地形损耗(比如地势高的地方代价就要大,不好走的地方代价就要大。其实这很有必要,只不过目前移动机器人不太需要这一条,实际很少人去用。原因?因为依靠SLAM的移动机器人现在没那么厉害,能够平地不出错就万事大吉了)
    7. 维护未探测的区域(需要这个时可能偏游戏了,因为移动机器人在路径规划时,已经靠SLAM拥有了一张工作区域完整的地图)
    8. 平滑路径(重要:A*算法得到的路径并不平滑,移动机器人需要另外的算法去平滑这些路径点。这样机器人走起来不会摆来摆去)
    9. 非方形搜索区域(也就是不用正方形的格子计算F值了。暂时不知道这个在移动机器人里的应用。因为一般,移动机器人是将地图按照像素划分的)

待完善的知识点

根据这篇文章,我们也简单思考了他在移动机器人上的具体应用逻辑。移动机器人能够完全自主的在工作区域行动,哪怕是已知了由SLAM构建完成的地图,只有A*算法仍然是不够的。

这篇文章只是讲了A*算法原理。值得进一步去探索的知识点包括:

  • 提高A*计算效率:快速有效的排序算法
  • 优化小车的行为:平滑路径的算法
  • 解决多机器人会车:多机器人规划算法

我会一一编写文章的,今天就这样,谢谢!

移动机器人路径规划算法及思考——A*算法相关推荐

  1. rrt算法流程图_RRT算法移动机器人路径规划(快速扩展随机树).pdf

    ( ) 第 34 卷 第 5期 南京理工大学学报 自然科学版 Vo l. 34 No. 5 20 10年 10 月 Journal of N anj ing Un iversity of Scienc ...

  2. 3 移动机器人路径规划(5- DWA路径规划算法)

    3 移动机器人路径规划 5.1 DWA路径规划基本原理 5.2 DWA路径规划流程 5.3 栅格地图上绘制XY图像 5.3.1 栅格地图和XY坐标系关系 5.3.2 栅格行列位置转坐标系函数sub2c ...

  3. 【RRT三维路径规划】基于matlab RRT算法无人机三维路径规划【含Matlab源码 155期】

    一.获取代码方式 获取代码方式1: 通过订阅紫极神光博客付费专栏,凭支付凭证,私信博主,可获得此代码. 获取代码方式2: 完整代码已上传我的资源:[三维路径规划]基于matlab RRT算法无人机三维 ...

  4. 【RRT三维路径规划】基于matlab RRT算法无人机三维路径规划【含Matlab源码 1363期】

    一.获取代码方式 获取代码方式1: 通过订阅紫极神光博客付费专栏,凭支付凭证,私信博主,可获得此代码. 获取代码方式2: 完整代码已上传我的资源:[三维路径规划]基于matlab RRT算法无人机三维 ...

  5. 【路径规划】基于matlab灰狼算法机器人栅格地图最短路径规划【含Matlab源码 2334期】

    ⛄一.灰狼算法的厂房巡检机器人路径规划简介 0 引言 近年来,我国各行各业的不断发展使相关工作流程得到了完善,其中巡检岗位是一个不可或缺的职位,尤其是在电厂.燃气厂房和煤矿等危险领域中的工作,更不能缺 ...

  6. 【路径规划】基于A星算法结合floyd和动态窗口法实现机器人栅格地图路径规划附matlab代码

    1 简介 针对移动机器人在静态环境中的特点,为了提高路径规划效率和精度,设计了A~*算法与Floyd算法结合的路径规划.我们根据实际环境,在栅格地图的基础上,利用A~*算法进行初步路径规划,找到了一条 ...

  7. 【路径规划】基于matlab DWA算法机器人局部避障路径规划【含Matlab源码 890期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[路径规划]基于matlab DWA算法机器人局部避障路径规划[含Matlab源码 890期] 获取代码方式2: 通过订阅紫极神光博客付费 ...

  8. 【路径规划】基于蚁群算法求解运钞车路径规划VRPSD问题matlab代码

    1 简介 近年来,国内各大城市陆续建立了专业的金融押运企业,为银行网点的现钞运送提供服务.为了实现运钞智能化,降低银行运营成本,需要对银行现钞运送车辆路径规划提供决策支持.而银行运钞车路线规划问题是车 ...

  9. java动态规划货车运输_多堆场集装箱卡车路径规划的混合蚁群算法

    多堆场集装箱卡车路径规划的混合蚁群算法 发布时间:04-15-19 张建同,宋玉坚,叶春明 <工业工程与管理>第22卷第2期 2017年4月 推荐理由 集装箱运输作为一种高效率高质量的运输 ...

最新文章

  1. 李沐团队半年离开六人,MxNet是否英雄落幕?贾扬清:关键能否解决新痛点
  2. 《把时间当作朋友》读书笔记(十四)--积累(二)
  3. ocx js php,JS实现OCX控件的事件响应示例_javascript技巧
  4. APT***的那些事
  5. mysql_upgrade --force_社区投稿 | MySQL 8.0.16 告别mysql_upgrade升级方式
  6. 【UIKit】UITableView 3
  7. 挑战练习10.6 实现高效的RecyclerView刷新
  8. Typora一次编辑,知乎、CSDN等多平台快速发布:Typora + PicGo + 图床
  9. 中文文字校对软件,找我们,字根科技
  10. iptv鉴权 php,[转]关于openwrt用于dhcp客户端协议突破iptv的dhcp+鉴权(ipoe)
  11. 常用矢量图有哪些格式?AI文件存储为psd分层
  12. 2021年茶艺师(初级)考试及茶艺师(初级)新版试题
  13. 确认OHS版本的方法
  14. 吴恩达《深度学习专项》笔记(十一): CNN示例学习:VGG, ResNet, MobileNet
  15. 怎么恢复大疆无人机TF卡误删除格式化的MP4和MOV视频
  16. 4k显示服务器,远程服务器4k显示器
  17. Oracle 10g 版本10.2.0.1.0升级到Oracle 10g 10.2.0.3.0过程
  18. Oracle日期函数add_months()、last_day()、months_between()的用法
  19. IE浏览器不能上网其他浏览器可以解决办法
  20. 打豆豆游戏c语言编程,C语言程序打豆豆(函数版)分享!

热门文章

  1. 设置vim 显示行号
  2. 图像分类算法优化技巧
  3. DaVinci:调整大小
  4. 【解决方案】RTSP/Onvif安防视频直播解决方案EasyNVR在某省高速上云项目中的应用分析
  5. 对国家最新战略“新基建”的解读,一起把握赚钱的机会
  6. Machine Learning introduction
  7. 嵌入式uClinux及其应用开发(1)
  8. luogu P4390 [BOI2007]Mokia 摩基亚
  9. 批量分析中通快运单号物流,并查看是否签收
  10. python的re_research是什么意思_research在线翻译_英语_读音_用法_例句_海词词典