informed-rrt*代码实现

时间: 2023-12-26 18:05:05 浏览: 60
Informed-RRT* 是一种基于 RRT* 的路径规划算法,它在 RRT* 的基础上引入一个启发式函数来指导 RRT* 的生长方向,从而使得算法更加高效和优化。下面是 Informed-RRT* 的代码实现: ``` import numpy as np import matplotlib.pyplot as plt import math class Node: def __init__(self, x, y): self.x = x self.y = y self.parent = None self.cost = 0.0 class RRTStar: def __init__(self, start, goal, obstacleList, randArea, expandDis=0.5, goalSampleRate=20, maxIter=500): self.start = Node(start[0], start[1]) self.goal = Node(goal[0], goal[1]) self.minrand = randArea[0] self.maxrand = randArea[1] self.expandDis = expandDis self.goalSampleRate = goalSampleRate self.maxIter = maxIter self.obstacleList = obstacleList self.nodeList = [self.start] def planning(self): for i in range(self.maxIter): rnd = self.get_random_point() nearestInd = self.get_nearest_node_index(self.nodeList, rnd) nearestNode = self.nodeList[nearestInd] newNode = self.steer(nearestNode, rnd, self.expandDis) if self.check_collision(newNode, self.obstacleList): nearInds = self.find_near_nodes(newNode) newNode = self.choose_parent(newNode, nearInds) if newNode: self.nodeList.append(newNode) self.rewire(newNode, nearInds) if i % 5 == 0: self.try_goal_path() lastIndex = self.search_best_goal_node() if lastIndex is None: return None path = self.get_final_path(lastIndex) return path def steer(self, fromNode, toNode, extendLength=float("inf")): newnode = Node(fromNode.x, fromNode.y) dis, angle = self.get_distance_and_angle(newnode, toNode) newnode.cost = fromNode.cost + dis if extendLength > dis: extendLength = dis newnode.x += extendLength * math.cos(angle) newnode.y += extendLength * math.sin(angle) newnode.parent = fromNode return newnode def choose_parent(self, newNode, nearInds): if not nearInds: return None costs = [] for i in nearInds: nearNode = self.nodeList[i] tNode = self.steer(nearNode, newNode) if tNode and self.check_collision(tNode, self.obstacleList): costs.append(nearNode.cost + self.get_distance_and_angle(nearNode, newNode)[0]) else: costs.append(float("inf")) minCost = min(costs) if minCost == float("inf"): return None minInd = nearInds[costs.index(minCost)] newNode.cost = minCost newNode.parent = self.nodeList[minInd] return newNode def rewire(self, newNode, nearInds): for i in nearInds: nearNode = self.nodeList[i] tNode = self.steer(newNode, nearNode) if tNode and self.check_collision(tNode, self.obstacleList): nearCost = newNode.cost + self.get_distance_and_angle(newNode, nearNode)[0] if nearCost < nearNode.cost: nearNode.parent = newNode nearNode.cost = nearCost def search_best_goal_node(self): dist_to_goal_list = [self.get_distance_and_angle(n, self.goal)[0] for n in self.nodeList] goal_inds = [dist_to_goal_list.index(i) for i in dist_to_goal_list if i <= self.expandDis] safe_goal_inds = [ind for ind in goal_inds if self.check_collision(self.nodeList[ind], self.obstacleList)] if not safe_goal_inds: return None minCost = min([self.nodeList[ind].cost for ind in safe_goal_inds]) for ind in safe_goal_inds: if self.nodeList[ind].cost == minCost: return ind return None def find_near_nodes(self, newNode): n = len(self.nodeList) + 1 r = min(self.expandDis * math.sqrt((math.log(n) / n)), self.expandDis) dist_list = [(node.x - newNode.x) ** 2 + (node.y - newNode.y) ** 2 for node in self.nodeList] near_inds = [dist_list.index(i) for i in dist_list if i <= r ** 2] return near_inds def check_collision(self, node, obstacleList): for obs in obstacleList: if math.hypot(node.x - obs[0], node.y - obs[1]) <= obs[2]: return False return True def get_random_point(self): if np.random.randint(0, 100) > self.goalSampleRate: rand = [np.random.uniform(self.minrand, self.maxrand), np.random.uniform(self.minrand, self.maxrand)] else: rand = [self.goal.x, self.goal.y] return rand def get_nearest_node_index(self, nodeList, rnd): dlist = [(node.x - rnd[0]) ** 2 + (node.y - rnd[1]) ** 2 for node in nodeList] minIndex = dlist.index(min(dlist)) return minIndex def get_distance_and_angle(self, fromNode, toNode): dx = toNode.x - fromNode.x dy = toNode.y - fromNode.y return math.hypot(dx, dy), math.atan2(dy, dx) def try_goal_path(self): lastIndex = self.search_best_goal_node() if lastIndex is None: return False path = self.get_final_path(lastIndex) if path is None: return False dist_to_goal = self.get_distance_and_angle(self.nodeList[lastIndex], self.goal)[0] if dist_to_goal <= self.expandDis: return True return False def get_final_path(self, lastIndex): path = [] while self.nodeList[lastIndex].parent is not None: node = self.nodeList[lastIndex] path.append([node.x, node.y]) lastIndex = self.nodeList.index(node.parent) path.append([self.start.x, self.start.y]) return path ``` 在代码中,Node 类表示树中的一个节点,包含节点的坐标、父节点、以及到起点的代价 cost。RRTStar 类是整个算法的实现,包括路径规划的主要流程、启发式函数的计算以及树的生长和更新等。具体来说,算法主要分为以下几个步骤: 1. 初始化:设置起点、终点、随机采样区域、最大迭代次数、扩展步长等参数,创建一个包含起点的节点列表。 2. 随机采样:以一定概率在终点和随机采样区域中进行随机采样,得到一个随机点。 3. 最近邻节点:从节点列表中找到距离随机点最近的节点,作为新节点的父节点。 4. 扩展节点:将新节点从父节点处按照设定的步长扩展,得到一个新节点。 5. 碰撞检测:判断新节点是否与障碍物相撞,若碰撞,则跳过此节点。 6. 选择父节点:在新节点的周围一定距离内,选择一个代价最小的节点作为其父节点。 7. 更新代价:对于每个新节点的父节点,计算更新其代价。 8. 搜索最优路径:找到距离终点在一定范围内的所有节点,并计算它们到终点的代价,选择代价最小的节点作为最终目标节点。 9. 获取最终路径:从最终目标节点开始,沿着节点的父节点指针一直遍历到起点,得到最终路径。 在算法实现中,为了提高算法效率,增加了一些优化措施,如限制随机采样和碰撞检测的频率、使用启发式函数引导树的生长等。此外,要注意在实现碰撞检测时,需要将障碍物表示为圆形,判断节点是否与障碍物相撞时,需要计算节点与圆心之间的距离是否小于半径。

相关推荐

最新推荐

recommend-type

node-v6.15.0-darwin-x64.tar.xz

Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
recommend-type

本人通过学习动手学习深度学习这本书后,跟着书本写出的基于pytorch的练习集合.zip

本人通过学习动手学习深度学习这本书后,跟着书本写出的基于pytorch的练习集合.zip
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

机器学习怎么将excel转为csv文件

机器学习是一种利用计算机算法和统计数据的方法来训练计算机来进行自动学习的科学,无法直接将excel文件转为csv文件。但是可以使用Python编程语言来读取Excel文件内容并将其保存为CSV文件。您可以使用Pandas库来读取Excel文件,并使用to_csv()函数将其保存为CSV格式。以下是代码示例: ```python import pandas as pd # 读取 Excel 文件 excel_data = pd.read_excel('example.xlsx') # 将数据保存为 CSV 文件 excel_data.to_csv('example.csv', index=
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。
recommend-type

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依
recommend-type

实现实时监控告警系统:Kafka与Grafana整合

![实现实时监控告警系统:Kafka与Grafana整合](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X2pwZy9BVldpY3ladXVDbEZpY1pLWmw2bUVaWXFUcEdLT1VDdkxRSmQxZXB5R1lxaWNlUjA2c0hFek5Qc3FyRktudFF1VDMxQVl3QTRXV2lhSWFRMEFRc0I1cW1ZOGcvNjQw?x-oss-process=image/format,png) # 1.1 Kafka集群架构 Kafka集群由多个称为代理的服务器组成,这
recommend-type

写出一个拉格朗日多项式插值程序,并调用该函数做图

好的,以下是一个使用拉格朗日多项式进行插值的 Python 代码: ``` import numpy as np import matplotlib.pyplot as plt def lagrangeInterpolation(x, y, x_interp): """ 使用拉格朗日多项式进行插值 x: 已知点的 x 坐标数组 y: 已知点的 y 坐标数组 x_interp: 插值点的 x 坐标数组 """ n = len(x) m = len(x_interp) L = np.zeros([n, m]) fo