路径规划;a*算法 demo_路径规划A*算法
(做封面图片,可真是费了很长时间)
前言
路径规划涉及到很多内容。
但路径规划的起点,应该都是A*这个来自斯坦福大学算法。
说起A*,网上有很多相关的内容。各种博客,各种解释。
但是我愣是没看明白。 可能我比较笨把。
弄明白了之后,我发现网上的很多词语有点太高大上了。
(这里声明,并不是说高大上的词不好,相反就应该用高大上的专业词汇才能精准的表达。只不过,有些内容比如A*里面的heuristic用专业词语,就有点不明所以)
今天我就想用封面图片 + 我的大白话,解释一下A*算法工作的过程。
A* 算法理念
首先,其实 A* 算法的基本理念超级简单。
典型的例子就是:现在我在 X 网吧,决赛圈了,但快上课了,所以得找个去学校最快的小路,然后抄小路去,省时间, 避免在路上碰上教导主任。
这里核心问题为4个。(前提:不能翻学校的围墙)
- 通往学校的路到底有多少条?
- 我能不能飞起来?我能不能瞬间移动?我能不能跳跃失控?我能不能突然觉醒获得超能力?
- 那么从 X 网吧出发的时候,哪条路可以最快到达学校?
- 得绕开教导主任
对于踩点的老手,应该一瞬间计算好了各种路径。
A*算法说:我也是这么想的。
A算法是一个搜索出最优路径的算法。只要有通向终点的路径,那么A*给出的路径是最优的。
但是A*算法是基于一个个独立的小格子。一般机器人中叫格栅。正因为是一个个小格子,导致了A*是一个离散的算法。离散归离散,这是和控制相关的东西,我们暂且不讨论。这里就先讨论,A*怎么得到的最短的路径。
其实很简单。
A*会推演,如果自己在不撞墙,不走回头路的情况下,走出下一步,那么距离终点的位置是不是变得更近了?这样,推演的最终输出就是,可以最快到达终点的路径。
下面的图是啥呢?是我整理的A*算法演示图。一张图(我认为)就可以较好的说明A*。
第一,不管是人还是机器人,都要心里有数。自己能不能飞起来,心里没数吗?
第二,没什么人(机器)想撞到墙上,所以不能去的领域,想都不用想。图片里面的表达就是,被占用的格栅。
第三,好汉不吃回头草,走过的路,就不用被考虑进路径。(好汉吃回头草???)图片里面的表达就是,路径。
第四,根据自己可以移动的方式来判断,哪些路径是可以被考虑的,如果移动的话,得走几步?
第五,某些路段总是能碰上麻烦事,能绕开就绕开,尽量不考虑这些路段。每一步移动,有没有让自己更接近终点?图片里面的表达就是,损失函数。
第六,可能还有其他顾虑和约束,自行定义。比如某个路段,晚上太黑,有怪叔叔之类的。
第七,考虑所有层的(贯穿所有层的那条竖线)的情况下, 得出最终优化的路径。其实就是找到损失函数为最小的的那条路径。也就是
下面是用python写的简单的A*算法。是sebastian大神的视频里面的内容。无需任何额外库。用来尝鲜,理解非常好~
# ----------
# User Instructions:
#
# Implement the function optimum_policy2D below.
#
# You are given a car in grid with initial state
# init. Your task is to compute and return the car's
# optimal path to the position specified in goal;
# the costs for each motion are as defined in cost.
#
# There are four motion directions: up, left, down, and right.
# Increasing the index in this array corresponds to making a
# a left turn, and decreasing the index corresponds to making a
# right turn.forward = [[-1, 0], # go up[ 0, -1], # go left[ 1, 0], # go down[ 0, 1]] # go right
forward_name = ['up', 'left', 'down', 'right']# action has 3 values: right turn, no turn, left turn
action = [-1, 0, 1]
action_name = ['R', '#', 'L']# EXAMPLE INPUTS:
# grid format:
# 0 = navigable space
# 1 = unnavigable space
grid = [[1, 1, 1, 0, 0, 0],[1, 1, 1, 0, 1, 0],[0, 0, 0, 0, 0, 0],[1, 1, 1, 0, 1, 1],[1, 1, 1, 0, 1, 1]]init = [4, 3, 0] # given in the form [row,col,direction]# direction = 0: up# 1: left# 2: down# 3: rightgoal = [2, 0] # given in the form [row,col]cost = [2, 1, 20] # cost has 3 values, corresponding to making # a right turn, no turn, and a left turn# EXAMPLE OUTPUT:
# calling optimum_policy2D with the given parameters should return
# [[' ', ' ', ' ', 'R', '#', 'R'],
# [' ', ' ', ' ', '#', ' ', '#'],
# ['*', '#', '#', '#', '#', 'R'],
# [' ', ' ', ' ', '#', ' ', ' '],
# [' ', ' ', ' ', '#', ' ', ' ']]
# ----------# ----------------------------------------
# modify code below
# ----------------------------------------def optimum_policy2D(grid,init,goal,cost):value = [ [[999 for row in range(len(grid[0]))] for col in range(len(grid))],[[999 for row in range(len(grid[0]))] for col in range(len(grid))],[[999 for row in range(len(grid[0]))] for col in range(len(grid))],[[999 for row in range(len(grid[0]))] for col in range(len(grid))] ]policy = [ [[' ' for row in range(len(grid[0]))] for col in range(len(grid))],[[' ' for row in range(len(grid[0]))] for col in range(len(grid))],[[' ' for row in range(len(grid[0]))] for col in range(len(grid))],[[' ' for row in range(len(grid[0]))] for col in range(len(grid))] ]policy2D = [[' ' for row in range(len(grid[0]))] for col in range(len(grid))]change = Truewhile change:change = Falsefor x in range(len(grid)):for y in range(len(grid[0])):for orientation in range(4):if goal[0] == x and goal[1] == y:if value[orientation][x][y] > 0:change = Truevalue[orientation][x][y] = 0policy[orientation][x][y] = '*'elif grid[x][y] == 0:for i in range(3):# The reason why moduler 4 is for the cycular buffer for the simulated grid.o2 = (orientation + action[i]) % 4# this is the motion modelx2 = x + forward[o2][0]y2 = y + forward[o2][1]if x2 >= 0 and x2 < len(grid) and y2 >=0 and y2 < len(grid[0]) and grid[x2][y2] == 0:v2 = value[o2][x2][y2] + cost[i]if v2 < value[orientation][x][y]:value[orientation][x][y] = v2policy[orientation][x][y] = action_name[i]change = Truex = init[0]y = init[1]orientation = init[2]policy2D[x][y] = policy[orientation][x][y]while policy[orientation][x][y] != '*':if policy[orientation][x][y] == '#':o2 = orientationelif policy[orientation][x][y] == 'R':o2 = (orientation -1 ) % 4elif policy[orientation][x][y] == 'L':o2 = (orientation + 1) % 4x = x + forward[o2][0]y = y + forward[o2][1]orientation = o2policy2D[x][y] = policy[orientation][x][y]return policy2Dpolicy = optimum_policy2D(grid,init,goal,cost)for i in range(len(policy)):print(policy[i])
总结
其实路径规划的内容还有很多。包括损失函数该如何生成,各个损失函数的权衡该如何平衡,不确定性该如何考虑,马尔科夫决策,路径生成和行为决策等等等。
以后有空慢慢写,不着急
20190523
路径规划;a*算法 demo_路径规划A*算法相关推荐
- 多边形之间相交求交点的算法_路径规划算法总结
本文来自知乎网友@搬砖的旺财,地平线机器人算法工程师.作者根据自己本科和硕士阶段的学习经历,整理归纳了所接触过的规划算法. 1.自主机器人近距离操作运动规划体系 在研究自主运动规划问题之前,首先需建立 ...
- rrt算法流程图_RRT算法移动机器人路径规划(快速扩展随机树).pdf
( ) 第 34 卷 第 5期 南京理工大学学报 自然科学版 Vo l. 34 No. 5 20 10年 10 月 Journal of N anj ing Un iversity of Scienc ...
- matlab8邻域搜索算法,一种基于可搜索连续邻域A*算法的路径规划方法与流程
本发明涉及的是一种UUV全局路径规划方法. 背景技术: 无人水下航行器(Unmanned underwater vehicle,UUV)作为一种高技术手段,在海洋这块未来极具价值的发展空间中起着至关重 ...
- 详细介绍用MATLAB实现基于A*算法的路径规划(附完整的代码,代码逐行进行解释)(一)--------A*算法简介和环境的创建
本系列文章主要介绍基于A*算法的路径规划的实现,并使用MATLAB进行仿真演示.本文作为本系列的第一篇文章主要介绍如何进行环境的创建,还有一定要记得读前言!!! 本系列文章链接: ------- ...
- 【APF三维路径规划】基于matlab人工势场算法无人机三维路径规划【含Matlab源码 168期】
一.获取代码方式 获取代码方式1: 通过订阅紫极神光博客付费专栏,凭支付凭证,私信博主,可获得此代码. 获取代码方式2: 完整代码已上传我的资源:[三维路径规划]基于matlab人工势场算法无人机三维 ...
- 基于人工势场法和果蝇优化算法的路径规划(Matlab代码实现)
目录 1 概述 2 运行结果 2.1 算例1 2.2 算例2 3 Matlab代码实现 4 参考文献 1 概述 近年来,智能机器人逐渐应用于医疗服务﹑航空等众多领域.路径规划作为机器人实现智能自 ...
- 【DE三维路径规划】基于matlab改进的差分算法多无人机协同三维路径规划【含Matlab源码 169期】
⛄一.无人机简介 0 引言 随着现代技术的发展,飞行器种类不断变多,应用也日趋专一化.完善化,如专门用作植保的大疆PS-X625无人机,用作街景拍摄与监控巡察的宝鸡行翼航空科技的X8无人机,以及用作水 ...
- 【路径规划】基于matlab遗传优化模拟退火算法避障路径规划【含Matlab源码 889期】
⛄一.简介 路径规划主要是让目标对象在规定范围内的区域内找到一条从起点到终点的无碰撞安全路径.路径规划中有静态路径规划以及动态路径规划,本文所讨论的问题仅针对静态路径规划.具体问题描述如下: 给定起点 ...
- 25-混合A星算法Hybrid_Astar路径规划MATLAB代码
资源: Hybrid-Astar(混合A星算法)路径规划MATLAB代码-电子商务文档类资源-CSDN文库 主要内容: 以车辆的运动学模型为节点,以当前点到终点的Astar距离和RS距离两者最大的距离 ...
最新文章
- 从源码分析Hystrix工作机制
- 雁栖湖会议研讨:计算机能代替程序员吗?
- 在IIS(64位)上部署WCF服务访问Oracle数据库
- there are no packages available for installation插件安装问题和如何配置浏览器的快捷键...
- caioj 1158 欧拉函数
- php 验证微信token_php之微信公众号验证token获取access_token
- 拷贝boost::exception的测试程序
- Angular.js 页面里的按钮点击事件处理
- kvm连接服务器显示不全有重影,KVM延长器系列常见问题及解决方法
- 【原】AMR音频解码插件开发总结
- mysql - 内存表使用总结
- Python 并行分布式框架 Celery
- Silverlight Blend动画设计系列七:模糊效果(BlurEffect)与阴影效果(DropShadowEffect)...
- 第一篇 Windows 8 开发Windows Metro style app环境配置
- js高级学习笔记(b站尚硅谷)-11-变量提升与函数提升
- JavaScript 文件下载,二进制下载,文本下载的几种方式
- java jvm dump文件_各种获取JVM DUMP的方法
- uefi 懒人版黑苹果_macOS Sierra 10.12.6(16G29) 变色龙引导懒人版CDR黑苹果镜像
- win10去快捷方式箭头
- 写一个PE的壳_Part 5:PE格式修复+lief源码修改
热门文章
- 在IntelliJ IDEA配置Tomcat
- Javascript第五章改变CSS样式节点两种方法,制作导航背景切换效果第十课
- uniapp 模糊搜索文字添加颜色
- sar偏移量追踪技术_SAR指标配合阶段高低价的量化交易策略
- mysql pdo 获取最后一条sql_一条sql语句的执行过程-mysql
- ide循环执行用例 selenium_Selenium Web自动化Page Object设计模式——循环执行测试用例...
- vscode中前端vue项目详解_web前端Vue项目实战-Music
- 谷歌浏览器修改CSS和js后同步保存到文件中 (译)
- webots python e-puck 集群通信案例
- 无计算机权限无法更改时间,Win10电脑没权限不允许更改时间怎么办?Win10获取更改时间权限的方法...