1. PRM路径规划算法概述
PRM(概率路线图)算法是机器人运动规划中的经典方法,特别适合解决高维空间中的路径规划问题。我第一次接触这个算法是在研究生时期的机器人导航项目中,当时被它简单却有效的思路所吸引。
PRM的核心思想可以类比为在一个陌生城市中寻找路线:我们首先在地图上随机标记一些关键位置点(采样),然后在这些点之间建立可能的行走路线(连接),最后在这些路线网络中搜索从起点到终点的路径。这种方法的优势在于它将连续的路径规划问题转化为离散的图搜索问题,大大降低了计算复杂度。
在实际应用中,PRM算法通常分为两个阶段:
- 学习阶段:构建路线图
- 查询阶段:在路线图中搜索路径
这种两阶段的设计使得PRM特别适合需要多次查询的场景,因为路线图一旦构建完成,可以重复用于不同的起点和终点组合。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 基础PRM算法实现细节
2.1 采样策略实现
基础PRM采用均匀随机采样策略,这是最简单直接的采样方法。在Python实现中,我们可以这样优化采样函数:
python复制import random
import numpy as np
def sample_points(num_points, map_bounds, obstacles=None):
"""
在地图范围内生成随机采样点
:param num_points: 需要生成的点数
:param map_bounds: 地图边界 [(x_min, x_max), (y_min, y_max)]
:param obstacles: 障碍物列表,每个障碍物表示为(x,y,radius)
:return: 有效的采样点列表
"""
points = []
while len(points) < num_points:
x = random.uniform(map_bounds[0][0], map_bounds[0][1])
y = random.uniform(map_bounds[1][0], map_bounds[1][1])
# 检查是否在障碍物内
valid = True
if obstacles:
for (ox, oy, radius) in obstacles:
if (x-ox)**2 + (y-oy)**2 <= radius**2:
valid = False
break
if valid:
points.append((x, y))
return points
注意:在实际应用中,采样点的有效性检查(是否在障碍物内)是必不可少的。上面的代码展示了基本的障碍物检测逻辑,可以根据实际需求扩展更复杂的碰撞检测方法。
2.2 连接策略优化
基础PRM的连接策略通常基于距离阈值,但我们可以进行一些改进:
python复制def connect_points(points, max_distance, obstacles=None):
"""
连接采样点构建路线图
:param points: 采样点列表
:param max_distance: 最大连接距离
:param obstacles: 障碍物列表
:return: 图的邻接表表示
"""
graph = {i: [] for i in range(len(points))}
# 使用KDTree加速邻近点搜索
from scipy.spatial import KDTree
kdtree = KDTree(points)
for i, point in enumerate(points):
# 查找半径max_distance内的所有点
neighbors = kdtree.query_ball_point(point, max_distance)
for j in neighbors:
if j <= i: continue # 避免重复连接
# 检查连线是否与障碍物相交
if not line_intersects_obstacle(point, points[j], obstacles):
graph[i].append(j)
graph[j].append(i)
return graph
def line_intersects_obstacle(p1, p2, obstacles):
"""
检查线段是否与任何障碍物相交
"""
if not obstacles:
return False
for (ox, oy, radius) in obstacles:
# 线段到圆心的最短距离
a = np.array(p1)
b = np.array(p2)
c = np.array([ox, oy])
# 计算线段到圆心的距离
lin
