机器人路径规划:基于D*算法的机器人路径规划(提供Python代码)

本文介绍了D*算法,一种适用于部分环境已知或不断变化情况的路径寻优方法。它通过动态调整代价函数,结合原有规划信息,实现了最优性和实时性的结合。文章还展示了部分Python代码实现和状态表示方法。
摘要由CSDN通过智能技术生成

一、D*算法介绍

 D*算法(Dynamic A Star)的主要思想是先利用静态规划算法计算出各个节点距离目标节点的最短路径,再从起始节点向后追溯,如果下一节点的状态发生变化,则调整弧的代价函数并重新搜索。相对于静态规划算法, D*算法的特点是可用于仅部分环境已知或环境不断变化的状况下的路径寻优,与其他重规划算法 的思想不同,动态的 D*算法是一种不完全重规划算法,利用原有的规划信息,在一定的程度上实现最优性及实时性的结合。

参考文献:

[1] Stentz A .Optimal and efficient path planning for partially-known environments[J].IEEE, 1994.DOI:10.1109/ROBOT.1994.351061.

[2] Stentz A .Optimal and Efficient Path Planning for Unknown and Dynamic Environments[J].International Journal of Robotics and Automation, 2003, 10(3).DOI:doi:10.1108/01439919510098461.

[3]谷润平,崔朋,唐建勋,等.基于D*算法的场面滑行动态规划研究[J].科学技术与工程, 2015(1):6.DOI:10.3969/j.issn.1671-1815.2015.01.059.

二、部分代码

import math


from sys import maxsize

import matplotlib.pyplot as plt

show_animation = True


class State:

    def __init__(self, x, y):
        self.x = x
        self.y = y
        self.parent = None
        self.state = "."
        self.t = "new"  # tag for state
        self.h = 0
        self.k = 0

    def cost(self, state):
        if self.state == "#" or state.state == "#":
            return maxsize

        return math.sqrt(math.pow((self.x - state.x), 2) +
                         math.pow((self.y - state.y), 2))

    def set_state(self, state):
        """
        .: new
        #: obstacle
        e: oparent of current state
        *: closed state
        s: current state
        """
        if state not in ["s", ".", "#", "e", "*"]:
            return
        self.state = state

三、部分结果

四、完整Python代码

见下方联系方式

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
机器⼈python路径规划_基于Q-learning的机器⼈路径规划系统 (matlab) 0 引⾔ Q-Learning算法是由Watkins于1989年在其博⼠论⽂中提出,是强化学习发展的⾥程碑,也是⽬前应⽤最为⼴泛的强化学习算法。Q- Learning⽬前主要应⽤于动态系统、机器⼈控制、⼯⼚中学习最优操作⼯序以及学习棋类对弈等领域。 1 项⽬概述 Q学习在机器⼈路径规划领域有较为⼴泛的应⽤,由于其只需要与环境进⾏交互,且仅需感知当前状态和环境即可对下⼀步动作进⾏决策。 本研究以 MATLAB为基础,设计基于Q学习的最短路径规划算法,并考虑智能体的斜 向运动,更加符合实际情况。同时使⽤DQN⽹络对Q 值更新进⾏⼀定的优 化,使得Q值表能够更加符合实际应⽤。 本次研究的具体步骤如下: 设计⼀个有障碍物的地图,⽤户可以修改障碍物布局,可以指定起点和终点; 使⽤MATLAB编程实现Q-learning算法,⽤于机器⼈规划最短路径,学习算法参数可以由⽤户设置; 使⽤⽤可视化界⾯演⽰Q值变化过程及最短路径探测过程。 2 Q-learning算法思想 Q-Learning算法是⼀种off-policy的强化学习算法,⼀种典型的与模型⽆关的算法算法通过每⼀步进⾏的价值来进⾏下⼀步的动作。基于 QLearning算法智能体可以在不知道整体环境的情况下,仅通过当前状态对下⼀步做出判断。 Q-Learning是强化学习算法中value-based的算法,Q是指在某⼀时刻的某⼀状态下采取某⼀动作期望获得的收益。环境会根据智能体的动 作反馈相 应的回报,所以算法的主要思想就是将状态与动作构建成⼀张Q值表,然后根据Q值来选取能够获得最⼤的收益的动作。 3 算法步骤 (⼀)Q-学习步骤 初始化Q值表。构造⼀个n⾏n列(n为状态数)的 Q值表,并将表中的所有值初始化为零。 基于当前Q值表选取下⼀个动作a。初始状态时,Q值 均为零,智能体可有很⼤的选择空间,并随机选择下⼀步动作。随着迭代次数增 加,Q值表不断更新,智能体 将会选择回报最⼤的动作。 计算动作回报。采⽤动作a后,根据当前状态和奖励,使⽤Bellman ⽅程更新上⼀个状态的Q(s, t)。 NewQ(s,a) = (1 α)Q(s,a) + α(R(s,a) + γmaxQ (s ,a )) 其中, NewQ(s,a)——上⼀个状态s和动作a的新Q值 Q(s,a)——当前状态s和动作a的Q值 R(s,a)——当前状态s和动作a的奖励r maxQ (s ,a )——新的状态下所有动作中最⼤的Q值 重复步骤3,直到迭代结束,得到最终的Q值表。 根据Q值表选择最佳路径。 (⼆)算法改进 避免局部最优 Q-learning本质上是贪⼼算法。如果每次都取预期奖励最⾼的⾏为去 做,那么在训练过程中可能⽆法探索其他可能的⾏为,甚⾄会进 ⼊"局部 最优",⽆法完成游戏。所以,设置系数,使得智能体有⼀定的概率采取 最优⾏为,也有⼀定概率随即采取所有可采取的⾏动。 将⾛过的路径纳⼊ 记忆库,避免⼩范围内的循环。 增加斜向运动 将斜向运动的奖励值设置为 2/ 2 ,取近似值0.707,可以避免出现如机器 ⼈先向左上⽅移动再向左下⽅移动⽽不选择直接向左移动两格 的情况。设 置为此值是根据地图的两格之间的相对距离确定的。 4 MATLAB实现代码 %% 基于Q-learning算法的机器⼈路径规划系统 clear %% ⾸先创造⼀个机器⼈运动的环境 % n是该运动的运动环境的矩阵environment(n,n)的⾏列⼤⼩ n = 20; % 新建⼀个全为1的n*n维environment矩阵 environment = ones(n,n); %下⾯设置环境中的障碍物,将其在矩阵中标为值-100(可⾃⾏设置障碍物) environment(2,2:5)=-100; environment(5,3:5)=-100; environment(4,11:15)=-100; environment(2,13:17)=-100; environment(7,14:18)=-100; environment(3:10,19)=-100; environment(15:18,19)=-100; environment(3:10,19)=-100; environment(3:10,7)=-100; environment(9:19,2)=-100; environment(15:17,7)=-100; environment(10,3:7)=-100; environment(13,5:8)=-100; environment(6:8,4)=-100; environment(13:18,4)=-100; environment(6
D*算法是一种增量式的路径规划算法,它可以在已知起点和终点的情况下,通过不断地更新地图信息,实现快速的路径规划。下面是一个简单的Python实现: ```python import heapq class Dstar: def __init__(self, graph): self.graph = graph self.start = None self.goal = None self.U = [] self.km = 0 self.rhs = {} self.g = {} self.parent = {} self.open_list = [] self.close_list = [] def initialize(self, start, goal): self.start = start self.goal = goal self.rhs[self.goal] = 0 self.g[self.goal] = float('inf') heapq.heappush(self.open_list, (self.calculate_key(self.goal), self.goal)) def calculate_key(self, u): return min(self.g.get(u, float('inf')), self.rhs.get(u, float('inf'))) + self.heuristic(self.start, u) + self.km def heuristic(self, u, v): return self.graph.distance(u, v) def update_vertex(self, u): if u != self.goal: self.rhs[u] = min([self.graph.distance(u, v) + self.g[v] for v in self.graph.neighbors(u)]) if u in self.U: self.U.remove(u) if self.g.get(u, float('inf')) != self.rhs.get(u, float('inf')): heapq.heappush(self.U, (self.calculate_key(u), u)) def compute_shortest_path(self): while self.open_list and (self.open_list[0][0] < self.calculate_key(self.start) or self.g.get(self.start, float('inf')) != self.rhs.get(self.start, float('inf'))): k_old, u = heapq.heappop(self.open_list) if k_old < self.calculate_key(u): heapq.heappush(self.open_list, (self.calculate_key(u), u)) elif self.g.get(u, float('inf')) > self.rhs.get(u, float('inf')): self.g[u] = self.rhs[u] for v in self.graph.neighbors(u): self.update_vertex(v) else: self.g[u] = float('inf') self.update_vertex(u) for v in self.graph.neighbors(u): self.update_vertex(v) def search(self, start, goal): self.initialize(start, goal) self.compute_shortest_path() path = [] if self.g.get(self.start, float('inf')) == self.rhs.get(self.start, float('inf')): u = self.start while u != self.goal: path.append(u) min_cost = float('inf') min_cost_node = None for v in self.graph.neighbors(u): cost = self.graph.distance(u, v) + self.g[v] if cost < min_cost: min_cost = cost min_cost_node = v u = min_cost_node path.append(self.goal) return path ``` 这个实现中,我们使用了一个优先队列来存储需要更新的节点,每次从队列中取出最小的节点进行更新。同时,我们使用了一个rhs字典来存储每个节点的rhs值,g字典来存储每个节点的g值,parent字典来存储每个节点的父节点。在更新节点时,我们首先更新rhs值,然后根据g和rhs的值来判断是否需要将节点加入优先队列中。在计算路径时,我们从起点开始,每次选择一个邻居节点中代价最小的节点作为下一个节点,直到到达终点。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值