[Robotics_py] 路徑規劃算法 | 啟發式函數 | A*算法

第五章:路徑規劃算法

歡迎回來,未來的機器人專家-=≡(?ω?)

在之前的章節中,我們已為機器人配備了核心知識:它能夠跟蹤自身的機器人狀態/位姿,利用環境表示(柵格地圖)理解周圍環境,通過機器人運動模型預測運動軌跡,并借助定位濾波器精確定位。

現在,機器人已掌握"自身位置“和”環境信息"。但若要讓其從A點移動到B點呢?

當存在墻壁或障礙物時,它無法直線行進。它需要一份"移動計劃"。

這正是路徑規劃算法的用武之地!

什么是路徑規劃算法?

想象我們試圖在一個陌生城市中從當前位置前往朋友家。

打開手機GPS導航,它不僅能顯示直線距離,還會規劃出避開建筑、湖泊和單行道的實際路線

路徑規劃算法就如同機器人的高級GPS系統

其核心任務是:基于地圖(柵格地圖)信息避開障礙物,為機器人找到從起點到目標點的安全高效移動序列(即"路徑"),通常還需優化特定指標(如最短路徑或最快路徑)。

若無路徑規劃,機器人只會漫無目的游蕩或直接撞上首個障礙物!這是指導機器人高層移動決策的"大腦"


路徑規劃的核心概念

理解機器人路徑規劃需掌握以下關鍵概念:

概念描述類比
起點機器人的初始位置和朝向(基于機器人狀態/位姿)GPS上標注的當前位置
目標點機器人需要到達的最終位置和朝向朋友家的詳細地址
障礙物機器人不可進入或穿過的區域,通常定義在柵格地圖中地圖上的建筑物、河流或禁行區
路徑引導機器人從起點到目標點的中間點或狀態序列,需避開障礙物GPS推薦的藍色導航路線
代價表示路徑"成本"的數值,可以是距離、時間、能耗或其組合GPS顯示的預計行程時間或里程數
優化根據特定目標(如最短路徑、最快路徑)尋找最小化(或最大化)代價的路徑在GPS中選擇"最短路線"或"最快路線"選項

如何使用路徑規劃算法(A*算法示例)

PythonRobotics包含多種路徑規劃算法。

我們從A*(A-Star)搜索算法開始,這是一種廣為人知且直觀的算法,尤其適用于柵格地圖。

假設我們需要機器人在存在障礙物的地圖中從(10, 10)米移動到(50, 50)米。

以下是使用PathPlanning/AStar/a_star.pyAStarPlanner類設置并運行A*規劃器的典型流程:

import matplotlib.pyplot as plt # 可視化工具
from PathPlanning.AStar.a_star import AStarPlanner# 1. 定義起點和目標點坐標(單位:米)
sx, sy = 10.0, 10.0  # 起點X,Y
gx, gy = 50.0, 50.0  # 目標點X,Y# 2. 定義地圖屬性及機器人尺寸
grid_size = 2.0      # 每個柵格單元為2.0m×2.0m
robot_radius = 1.0   # 機器人視為半徑1.0m的圓形# 3. 定義障礙物(障礙物中心點坐標)
# 簡單示例:創建墻狀障礙物
ox, oy = [], []
for i in range(10, 40): # 在x=20處創建垂直墻(y從10到39)ox.append(20.0)oy.append(float(i))
for i in range(20, 50): # 在y=30處創建水平墻(x從20到49)ox.append(float(i))oy.append(30.0)# 4. 創建A*規劃器對象
planner = AStarPlanner(ox, oy, grid_size, robot_radius)# 5. 執行路徑規劃!
print("開始路徑規劃...")
# rx, ry將存儲規劃路徑的x,y坐標
rx, ry = planner.planning(sx, sy, gx, gy)if rx: # 找到路徑時print(f"找到包含{len(rx)}個路徑點的路徑")# 可進行可視化:# plt.plot(ox, oy, ".k") # 繪制障礙物# plt.plot(sx, sy, "og") # 繪制起點# plt.plot(gx, gy, "xb") # 繪制目標點# plt.plot(rx, ry, "-r") # 繪制路徑# plt.grid(True); plt.axis("equal"); plt.show()
else:print("未找到可行路徑!")

代碼解析:

  • 創建AStarPlanner對象時需提供障礙物坐標(ox, oy)、柵格尺寸(grid_size,用于生成內部柵格地圖)和機器人半徑(robot_radius,確保與障礙物保持安全距離)。
  • planning()方法接收起點(sx, sy)和目標點(gx, gy)坐標,返回表示最優路徑的rx, ry坐標列表。若目標點被阻塞則返回None

輸出結果rx, ry即為機器人應遵循的詳細路徑坐標序列


路徑規劃算法內部原理(A*算法拆解)

🎢啟發式函數

啟發式函數是一種“經驗法則”,用于估計從當前狀態目標狀態的近似距離,幫助算法更快找到最優路徑。比如在地圖導航中,啟發式函數可以簡單計算兩點間的直線距離。

A*算法是一種智能路徑搜索算法,通過結合當前路徑成本和預估剩余距離(啟發式函數)來高效找到最優路徑,類似導航軟件選擇最快路線。

A*算法與BFS

A*算法可以看作BFS的智能升級版。

  • BFS會盲目擴展所有可能路徑
  • 而A通過啟發式函數優先探索更接近目標的路徑。
    兩者都用隊列管理待探索節點,但A
    的隊列按“實際成本+預估成本”排序,效率更高。
A*算法高層流程

在這里插入圖片描述

A*代碼核心組件

AStarPlanner類管理地圖、障礙物及搜索過程,關鍵部分如下:

1. Node類:
A*算法中,"節點"代表算法正在考慮的柵格單元。其不僅包含x, y坐標,還存儲搜索所需信息(詳見第六章:路徑規劃搜索節點)。

PathPlanning/AStar/a_star.py中的簡化實現:

class AStarPlanner:# ... (其他代碼) ...class Node:def __init__(self, x, y, cost, parent_index):self.x = x            # 柵格單元X索引self.y = y            # 柵格單元Y索引self.cost = cost      # g_cost(從起點到本節點的累計代價)self.parent_index = parent_index # 到達本節點的父節點索引(用于路徑重建)

解析:

  • x, y:柵格索引(非實際米制坐標),由AStarPlanner內部轉換。
  • cost:即g_cost(從起點到當前節點的實際累計代價)。
  • parent_index:關鍵回溯信息,記錄到達當前節點的前一節點。找到目標后,沿此索引逆向重建完整路徑。

2. 運動模型(定義可行移動方向):
柵格化A*的"運動模型"定義了機器人可移動的相鄰單元。
a_star.py中的get_motion_model()靜態方法定義了8個可能方向(上下左右及對角線):

class AStarPlanner:# ... (其他代碼) ...@staticmethoddef get_motion_model():# dx, dy, costmotion = [[1, 0, 1],      # 右移(X+1,Y+0),代價1[0, 1, 1],      # 上移(X+0,Y+1),代價1[-1, 0, 1],     # 左移(X-1,Y+0),代價1[0, -1, 1],     # 下移(X+0,Y-1),代價1[-1, -1, math.sqrt(2)], # 對角線(X-1,Y-1),代價√2[-1, 1, math.sqrt(2)],  # 對角線(X-1,Y+1),代價√2[1, -1, math.sqrt(2)],  # 對角線(X+1,Y-1),代價√2[1, 1, math.sqrt(2)]]   # 對角線(X+1,Y+1),代價√2return motion

解析:

  • 每個子列表[dx, dy, cost]描述一種移動方式,dxdy為柵格索引變化量。
  • cost為移動代價。水平/垂直移動代價為1,對角線移動為實際距離√2,確保算法找到真正最短路徑。

3. 代價計算(f_cost = g_cost + h_cost):
A*算法通過"啟發式函數"引導搜索方向,避免盲目探索。每個節點包含兩種代價:

代價類型描述類比
g_cost從起點到當前節點的實際代價已從起點行走的實際距離
h_cost當前節點到目標的預估代價(啟發式)預估剩余距離(如直線距離猜測)
f_cost總預估代價(g_cost + h_cost路徑總長度的綜合預估

A*算法始終選擇開放集合中f_cost最低的節點擴展

a_star.py中的calc_heuristic方法通過歐氏距離計算h_cost

import mathclass AStarPlanner:# ... (其他代碼) ...@staticmethoddef calc_heuristic(n1, n2):# n1: 當前節點, n2: 目標節點# 計算兩柵格點間的直線距離d = math.hypot(n1.x - n2.x, n1.y - n2.y)return d

解析:

  • n1.x - n2.xn1.y - n2.y為坐標差。
  • math.hypot()計算直角三角形斜邊長度,作為引導A*高效搜索的"啟發式估計"。

4. 碰撞檢測(verify_node):
規劃器需確認新柵格單元的安全性,包括檢查地圖邊界及障礙物(基于柵格地圖生成的obstacle_map),并考慮機器人半徑的安全距離。

class AStarPlanner:# ... (其他代碼) ...def verify_node(self, node):# 將柵格索引轉換為實際坐標px = self.calc_grid_position(node.x, self.min_x)py = self.calc_grid_position(node.y, self.min_y)# 1. 檢查是否超出地圖邊界if not (self.min_x <= px < self.max_x and self.min_y <= py < self.max_y):return False# 2. 檢查障礙物碰撞# self.obstacle_map為二維數組(類似柵格地圖)# True表示占據/碰撞,False表示空閑if self.obstacle_map[node.x][node.y]: # 簡化檢測return Falsereturn True # 節點安全

解析:

  • calc_grid_position將柵格索引轉換為實際坐標以進行邊界檢查。
  • self.obstacle_map為預先生成的障礙物柵格圖,若obstacle_map[node.x][node.y]True,表示該單元存在碰撞風險。

PythonRobotics中的其他路徑規劃算法

盡管A*在柵格地圖中表現優異,PythonRobotics還提供多種適應不同場景的規劃算法:

  • 動態窗口法(DWA)(PathPlanning/DynamicWindowApproach/dynamic_window_approach.py):一種局部路徑規劃算法。DWA不預先規劃全局路徑,而是在實時窗口中評估可行的速度與轉向指令,結合機器人動力學障礙物規避目標趨近進行決策。常用于實時避障
  • 快速擴展隨機樹(RRT)(PathPlanning/RRT/rrt.py):基于采樣的算法,通過隨機生成節點構建樹狀結構連接起點與目標。適用于復雜高維空間或狹窄通道環境,克服柵格方法的局限性
  • Frenet最優軌跡(FOT)(PathPlanning/FrenetOptimalTrajectory/frenet_optimal_trajectory.py):常用于自動駕駛的高級算法。在"Frenet坐標系"(與參考路徑如道路中線對齊)中生成多項式軌跡,通過優化速度、舒適度及避障等代價選擇最優路徑

這些算法展示了路徑規劃技術的多樣性,但均以實現安全高效移動為核心目標。


小結

本章深入探討了路徑規劃算法的關鍵作用。作為機器人的"智能導航系統",該算法通過結合柵格地圖信息與啟發式搜索,在避開障礙物的同時優化路徑成本。

我們以A*算法為例,解析了節點擴展代價計算碰撞檢測的核心機制,并簡介了DWA、RRT和Frenet等高級算法

搜索節點作為多數規劃算法的核心組件,將在下一章詳細剖析其結構與應用邏輯。

下一章:路徑規劃搜索節點

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/95274.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/95274.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/95274.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

解決 HTTP 請求 RequestBody 只能被讀取一次的問題

簡介 HTTP 請求 RequestBody 只能被讀取一次&#xff1a;HttpServletRequest 的輸入流 (InputStream) 在被讀取后會被關閉&#xff0c;導致后續無法再次讀取。本文將介紹如何通過 請求包裝類 (RequestWrapper) 來解決這個問題。問題背景 當我們需要在以下場景中多次讀取 Reques…

(LeetCode 面試經典 150 題) 226. 翻轉二叉樹 (深度優先搜索dfs )

題目&#xff1a;226. 翻轉二叉樹 思路:深度優先搜索dfs&#xff0c;時間復雜度0(n)。 C版本&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr)…

2025牛客暑期多校訓練營3(FDJAEHB)

題目鏈接&#xff1a;牛客競賽_ACM/NOI/CSP/CCPC/ICPC算法編程高難度練習賽_牛客競賽OJ F Flower 思路 可知當n<a時無論怎么操作她都會離開 n%(ab&#xff09;是指進行完若干輪之后剩下的不足ab個&#xff0c;如果是>a的話那么最后一輪必然不在a中&#xff0c;否則就…

【KO】 Android基礎

以下是對這些 Android 相關問題的解答: 1. Activity 與 Fragment 之間常見的幾種通信方式 接口回調:Fragment 定義接口,Activity 實現該接口,Fragment 通過接口實例調用方法傳遞數據 。 使用 Bundle:Fragment 可通過 setArguments(Bundle) 傳數據給自身,Activity 可在創…

Gradle構建工具教程:由來與發展史(版本演進與未來優勢)

一、Gradle簡介Gradle是一個基于Apache Ant和Apache Maven概念的項目自動化構建開源工具&#xff0c;使用基于Groovy的領域特定語言&#xff08;DSL&#xff09;聲明項目設置。相較于傳統XML配置&#xff0c;這種DSL使構建腳本更簡潔易讀。Gradle支持Java、Groovy、Kotlin、Sca…

@Rancher簡介部署使用 - Docker Compose

Rancher 安裝和使用介紹 - Docker Compose 文章目錄Rancher 安裝和使用介紹 - Docker Compose1. Rancher 簡介1.1 什么是 Rancher1.2 Rancher 核心功能1.3 Rancher 架構2. 安裝前準備2.1 系統要求2.2 環境準備3. 使用 Docker Compose 安裝 Rancher3.1 創建 Docker Compose 文件…

程序員接私活的一些平臺和建議,千萬要注意,別掉坑里!

關于程序員接私活&#xff0c;社會各界說法不一&#xff0c;如果你確實急用錢&#xff0c;價格又合適&#xff0c;那就去做。 不過&#xff0c;私活也沒有那么好做&#xff0c;一般私活的性價比遠比上班拿工資的低。但是作為一個額外的收益渠道&#xff0c;一部分生活窘迫的程序…

多輪問答與指代消解

目錄引言一、LangChain是怎么實現的多輪問答1、記憶模塊&#xff08;Memory&#xff09;管理對話歷史?2、對話鏈&#xff08;Conversational Chain&#xff09;架構?3、智能體&#xff08;Agent&#xff09;決策機制?4、上下文感知的Prompt工程?5、RAG&#xff08;檢索增強…

文件IO、文件IO與標準IO的區別

一、文件IO --->fd&#xff08;文件描述符&#xff09;打開文件open讀、寫文件read/write關閉文件close#include <sys/types.h>#include <sys/stat.h>#include<fcntl.h>文件描述符&#xff1a;操作系統中已打開文件的標識符。小的、非負的整形數據范圍&am…

【模型剪枝2】不同剪枝方法實現對 yolov5n 剪枝測試及對比

目錄 一、背景 二、剪枝 1. Network Slimming 1.0 代碼準備 1.1 稀疏化訓練 1.2 剪枝 1.3 微調 1.4 測試總結 2. Torch Pruning&#xff08;TP&#xff09; 2.1 MagnitudePruner 2.1.1 剪枝 2.1.2 retrain 2.1.3 測試總結 2.2 SlimmingPruner 2.2.1 定義重要性評…

AI入門學習--AI模型評測

一、AI模型評測目標傳統質量主要關注功能、性能、安全、兼容性等。 AI模型評測在此基礎上,引入了全新的、更復雜的評估維度: 1.性能/準確性:這是基礎,在一系列復雜的評測基準上評價個性能指標。 2.安全性:模型是否可能被用于惡意目的?是否會生成有害、違法或有毒的內容?是否容…

nt!MmCreatePeb函數分析之peb中OSMajorVersion的由來

第一部分&#xff1a;NTSTATUS MmCreatePeb (IN PEPROCESS TargetProcess,IN PINITIAL_PEB InitialPeb,OUT PPEB *Base) {PPEB PebBase;PebBase->OSMajorVersion NtMajorVersion;PebBase->OSMinorVersion NtMinorVersion;PebBase->OSBuildNumber (USHORT)(NtBuildN…

Unity TimeLine使用教程

1.概述 Timeline 是一個基于時間軸的序列化編輯工具&#xff0c;主要用于控制游戲或動畫中的 過場動畫&#xff08;Cutscenes&#xff09;、劇情事件、角色動畫混合、音頻控制 等。它類似于視頻編輯軟件&#xff08;如 Adobe Premiere&#xff09;的時間線&#xff0c;但專門針…

數據分析基本內容(第二十節課內容總結)

1.pd.read_csv(一個文件.csv)&#xff1a;從本地文件加載數據&#xff0c;返回一個 DataFrame 對象&#xff0c;這是 pandas 中用于存儲表格數據的主要數據結構2.df.head()&#xff1a;查看數據的前五行&#xff0c;幫助快速了解數據的基本結構和內容3.df.info()&#xff1a;查…

2025年最新原創多目標算法:多目標酶作用優化算法(MOEAO)求解MaF1-MaF15及工程應用---盤式制動器設計,提供完整MATLAB代碼

一、酶作用優化算法 酶作用優化&#xff08;Enzyme Action Optimizer, EAO&#xff09;算法是一種2025年提出的新型仿生優化算法&#xff0c;靈感源于生物系統中酶的催化機制&#xff0c;發表于JCR 2區期刊《The Journal of Supercomputing》。其核心思想是模擬酶與底物的特異性…

用 COLMAP GUI 在 Windows 下一步步完成 相機位姿估計(SfM) 和 稀疏點云重建的詳細步驟:

使用 COLMAP GUI 進行 SfM 和稀疏點云重建的步驟1. 打開 COLMAP GUI運行 colmap.bat&#xff0c;會彈出圖形界面。2. 新建項目&#xff08;或打開已有項目&#xff09;點擊菜單欄的 File > New Project&#xff0c;選擇一個空文件夾作為項目目錄&#xff08;建議新建一個空目…

天線設計 介質材料PEC和FR4有什么區別嗎

在電磁仿真&#xff08;包括 CST 中&#xff09;&#xff0c;PEC 和 FR4 是兩種完全不同的材料類型&#xff0c;主要區別如下&#xff1a;材料性質&#xff1a;PEC&#xff08;Perfect Electric Conductor&#xff0c;理想電導體&#xff09;&#xff1a;是一種理論上的理想材料…

mysql鎖+索引

mysql鎖按鎖的粒度分類表級鎖&#xff08;Table - level locks&#xff09;特點&#xff1a;對整張表進行鎖定&#xff0c;實現簡單&#xff0c;加鎖和釋放鎖的速度快&#xff0c;但并發度較低。當一個事務對表加表級鎖后&#xff0c;其他事務對該表的讀寫操作都可能被阻塞。應…

計算機視覺CS231n學習(7)

可視化和理解 這里主要是對CNN中間的層的結果可視化濾波器可視化 直接可視化網絡各層的濾波器權重&#xff0c;高層濾波器的可視化結果趣味性較低&#xff0c;而底層濾波器通常對應邊緣、紋理等基礎視覺特征 &#xff08;“高層濾波器” 通常指的是網絡中靠后的卷積層所包含的濾…

OpenBMC中工廠模式的簡明工作流程解析

本文將以最簡單直接的方式&#xff0c;從零開始講解OpenBMC中工廠模式的完整工作流程&#xff0c;包括從設計到使用的全生命周期。 1. 工廠模式最簡示例 我們先從一個最基礎的工廠模式實現開始&#xff1a; // 產品接口 class GpioPin { public:virtual void setValue(bool val…