路径规划#
IR-SIM 内置了基于栅格和基于采样的路径规划器,用于在占据地图上计算无碰撞路径。规划器以编程方式使用:你从世界构建地图,规划一条从机器人当前状态到目标的路径,并(可选)让机器人用 dash 行为或你自己的控制器去跟随它。
概述#
每个规划器都遵循相同的四步流程:
构建地图 ——
env.get_map(resolution=...)返回规划器搜索所用的占据栅格(resolution是规划单元的尺寸,单位为米)。创建规划器 —— 从
irsim.lib.path_planners实例化一个规划器。规划 ——
planner.planning(start, goal)返回一条轨迹([x, y]点的列表),若找不到路径则返回None。绘制 / 跟随 ——
env.draw_trajectory(trajectory)叠加显示路径;将其传给控制器即可跟随。
起点和目标来自场景:env.get_robot_state() 与 env.get_robot_info().goal。
支持的算法#
规划器 |
从 |
类型 |
适用场景 |
|---|---|---|---|
A* |
|
栅格,8 邻域 |
需要快速、最优的栅格路径 |
JPS |
|
栅格(优化的 A*) |
与 A* 路径相同,在开阔栅格上更快 |
RRT |
|
采样 |
非栅格 / Shapely 障碍物;可行(非最优)路径 |
RRT* |
|
采样 |
通过重连得到更短的优化路径 |
Informed RRT* |
|
采样 |
得到首个解后更快收敛到最优 |
PRM |
|
采样路图 |
在同一张静态地图上多次查询 |
栅格规划器(A*、JPS)和 PRM 在 obstacle_map 的栅格占据上搜索;RRT / RRT* / Informed RRT* 既可使用同一栅格,也可使用 Shapely 障碍物几何。
快速示例#
在 Perlin 噪声栅格上规划一条 A* 路径并绘制出来。传入 show_animation=True 即可实时观看搜索扩展过程。
import irsim
from irsim.lib.path_planners import AStarPlanner
env = irsim.make("path_planning.yaml", save_ani=False, full=False)
# 1. occupancy grid from the world's obstacle_map
env_map = env.get_map(resolution=0.2)
# 2. planner
planner = AStarPlanner(env_map)
# 3. plan from the robot's state to its goal
robot_state = env.get_robot_state()
goal_xy = env.get_robot_info().goal[:2, 0].tolist()
trajectory = planner.planning(robot_state, goal_xy, show_animation=True)
# 4. draw the path as a red line
if trajectory is not None:
env.draw_trajectory(trajectory, traj_type="r-")
env.end(5)
world:
height: 20
width: 30
step_time: 0.1
obstacle_map: # procedural occupancy grid, built at load time
name: perlin
resolution: 0.1
complexity: 0.08
fill: 0.15
fractal: 1
attenuation: 0.5
seed: 56
robot:
- kinematics: {name: 'diff'}
shape: {name: 'circle', radius: 0.2}
state: [2, 2, 0]
goal: [24, 16, 0]
behavior: {name: 'dash'}
把 AStarPlanner 换成任意其他规划器 —— 只有构造函数不同;planning() 和 draw_trajectory() 保持一致。
规划器构造函数#
第一个参数始终是地图;采样规划器还需要传入机器人(用于碰撞半径)和调参参数。
from irsim.lib.path_planners import (
AStarPlanner,
JPSPlanner,
RRT,
RRTStar,
InformedRRTStar,
PRMPlanner,
)
env_map = env.get_map(resolution=0.2) # 0.1 is typical for the RRT family
AStarPlanner(env_map)
JPSPlanner(env_map)
RRT(env_map, robot=env.robot, expand_dis=1.5, max_iter=5000)
RRTStar(env_map, robot=env.robot, expand_dis=1.5, max_iter=5000)
InformedRRTStar(env_map, robot=env.robot, expand_dis=1.5, max_iter=5000)
PRMPlanner(env_map, robot_radius=env.robot.radius, n_sample=500, n_knn=10)
planning(start, goal, show_animation=False) 返回 [x, y] 点的列表或 None。对于采样规划器,planner.end.cost 和 len(planner.node_list) 给出路径代价和树的规模。
可运行示例#
usage/20path_planning 下的脚本在共享的 path_planning.yaml 上运行每个规划器:
脚本 |
规划器 |
|---|---|
|
A* |
|
跳点搜索(Jump Point Search) |
|
RRT |
|
RRT* |
|
Informed RRT* |
|
PRM |
完整的规划器 API 见 API 参考 中的 irsim.lib.path_planners 部分。