全局路徑規劃

一、什麼是全局路徑規劃

全局路徑規劃是指在給定的地圖中,通過使用搜索算法和路徑規划算法,尋找從起點到目標點的最佳路徑,並將其轉換為機器人可以遵循的指令序列,使得機器人能夠在給定地圖上避開障礙物,沿最優路徑到達目標點。

全局路徑規劃通常用於自動駕駛車輛、無人機及移動機器人等領域,在實際應用中起到了重要的作用。

二、全局路徑規劃的算法

1. Dijkstra算法

Dijkstra算法是一種常見的最短路徑搜索算法,適用於無權圖或者權值都為正數的圖。它以起點為中心向外層層擴展,直到擴展到目標點位置。

def dijkstra(graph, start, end):
    #初始化
    inf = float('inf')
    distance = {vertex: inf for vertex in graph}
    path = {vertex: [] for vertex in graph}
    visited = []
    queue = [start]
    distance[start] = 0

    #搜索
    while queue:
        current = queue.pop(0)
        visited.append(current)
        
        if current == end:
            break
        
        for neighbor in graph[current]:
            if neighbor not in visited:
                new_distance = distance[current] + graph[current][neighbor]
                if new_distance < distance[neighbor]:
                    distance[neighbor] = new_distance
                    path[neighbor] = path[current] + [current]
                queue.append(neighbor)

    return path[end] + [end]

2. A*算法

A*算法結合了Dijkstra算法和啟發式函數(Heuristic Function)的思想,在搜索過程中通過評估函數評估某個節點是否為最優解。它適用於連續空間的最短路徑規劃,具有搜索速度快、路徑優秀等優點。

def heuristic(node1, node2):
    #曼哈頓距離
    return abs(node1.x - node2.x) + abs(node1.y - node2.y)

def a_star(start, end):
    #初始化
    open_list = [start]
    closed_list = []
    start.g = 0
    start.f = start.h = heuristic(start, end)
    
    #搜索
    while open_list:
        current = min(open_list, key = lambda x:x.f)
        
        if current == end:
            path = []
            while current.parent != None:
                path.append(current)
                current = current.parent
            path.append(start)
            path.reverse()
            return path

        open_list.remove(current)
        closed_list.append(current)
        
        for neighbor in current.adjacent:
            if neighbor in closed_list:
                continue
            
            if neighbor not in open_list:
                neighbor.g = current.g + heuristic(current, neighbor)
                neighbor.h = heuristic(neighbor, end)
                neighbor.f = neighbor.g + neighbor.h
                neighbor.parent = current
                open_list.append(neighbor)
                
            else:
                new_g = current.g + heuristic(current, neighbor)
                if neighbor.g > new_g:
                    neighbor.g = new_g
                    neighbor.f = neighbor.g + neighbor.h
                    neighbor.parent = current
    return None

三、實例

下面是一個簡單的例子,給定一個地圖和起點終點,使用A*算法尋找最優路徑。

class Node:
    def __init__(self, value, x, y):
        self.value = value
        self.x = x
        self.y = y
        self.adjacent = []
        self.parent = None
        self.f = 0
        self.g = 0
        self.h = 0

def create_graph(grid):
    height = len(grid)
    width = len(grid[0])
    graph = {}
    for i in range(height):
        for j in range(width):
            node = Node(grid[i][j], i, j)
            if i+1 < height and grid[i+1][j] != "#":
                node.adjacent.append(Node(grid[i+1][j], i+1, j))
            if j+1 < width and grid[i][j+1] != "#":
                node.adjacent.append(Node(grid[i][j+1], i, j+1))
            graph[(i, j)] = node
    return graph

grid = [
  ["S", 0, 0, "#"],
  [0, "#", 0, "#"],
  ["#", 0, 0, 0],
  ["#", "#", 0, "E"]
]
graph = create_graph(grid)
start = graph[(0, 0)]
end = graph[(3, 3)]

print(a_star(start, end))

四、總結

全局路徑規劃是自動駕駛車輛、無人機等移動機器人領域必備的技術之一,Dijkstra算法、A*算法是其中常用的兩種算法,它們都可以用來尋找起點到目標點的最短路徑。對於不同場景可以根據需要選擇不同的算法進行路徑規劃。

原創文章,作者:DVDOR,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/332598.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
DVDOR的頭像DVDOR
上一篇 2025-01-24 18:46
下一篇 2025-01-24 18:47

相關推薦

  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • 如何使用HTML修改layui內部樣式影響全局

    如果您想要使用layui來構建一個美觀的網站或應用,您可能需要使用一些自定義CSS來修改layui內部組件的樣式。然而,修改layui組件的樣式可能會對整個頁面產生影響,甚至可能破…

    編程 2025-04-29
  • Python文件路徑賦值

    Python中文件操作是非常基本的操作,而文件路徑是文件操作的前提。本文將從多個方面闡述如何在Python中賦值文件路徑。 一、絕對路徑和相對路徑 在Python中,路徑可以分為絕…

    編程 2025-04-28
  • JS圖片沿着SVG路徑移動實現方法

    本文將為大家詳細介紹如何使用JS實現圖片沿着SVG路徑移動的效果,包括路徑製作、路徑效果、以及實現代碼等內容。 一、路徑製作 路徑的製作,我們需要使用到SVG,SVG是可縮放矢量圖…

    編程 2025-04-27
  • 如何通過knife4j設置全局token

    本文將介紹如何在使用knife4j作為接口文檔管理工具時,通過設置全局token來提高接口文檔的安全性。 一、什麼是knife4j Knife4j是一款基於springfox的開源…

    編程 2025-04-27
  • Python3文件路徑操作

    Python3中文件路徑操作是日常編程中常用到的基礎操作之一。在Python中,我們可以使用內置庫os來操作文件路徑,包括創建、刪除、移動、複製等文件操作。本文將深度解析Pytho…

    編程 2025-04-27
  • Python文件相對路徑怎麼寫

    Python是一門被廣泛使用的編程語言,Python腳本通常需要對文件進行讀寫操作。而那些需要讀寫的文件,其路徑往往並不在Python腳本的同一目錄下,這就需要我們了解Python…

    編程 2025-04-27
  • C#全局錯誤捕獲

    C#全局錯誤捕獲是指在程序執行過程中遇到異常時,程序能夠自動捕獲並進行處理的機制。該機制可以讓程序員更快地定位和解決錯誤,提高程序的穩定性和可靠性。 一、全局錯誤捕獲的作用 1、提…

    編程 2025-04-27
  • 關鍵路徑的詳細闡述

    關鍵路徑是項目管理中非常重要的一個概念,它通常指的是項目中最長的一條路徑,它決定了整個項目的完成時間。在這篇文章中,我們將從多個方面對關鍵路徑做詳細的闡述。 一、概念 關鍵路徑是指…

    編程 2025-04-25
  • idea全局搜索功能

    在編程開發過程中,快速找到所需的文件、代碼塊和對象標識符對於開發者來說非常重要。JetBrains公司開發的IDEA(IntelliJ IDEA)是一個集成開發環境,被廣泛認為是最…

    編程 2025-04-25

發表回復

登錄後才能評論