路径规划#

IR-SIM 内置了基于栅格和基于采样的路径规划器,用于在占据地图上计算无碰撞路径。规划器以编程方式使用:你从世界构建地图,规划一条从机器人当前状态到目标的路径,并(可选)让机器人用 dash 行为或你自己的控制器去跟随它。

概述#

每个规划器都遵循相同的四步流程:

  1. 构建地图 —— env.get_map(resolution=...) 返回规划器搜索所用的占据栅格(resolution 是规划单元的尺寸,单位为米)。

  2. 创建规划器 —— 从 irsim.lib.path_planners 实例化一个规划器。

  3. 规划 —— planner.planning(start, goal) 返回一条轨迹([x, y] 点的列表),若找不到路径则返回 None

  4. 绘制 / 跟随 —— env.draw_trajectory(trajectory) 叠加显示路径;将其传给控制器即可跟随。

起点和目标来自场景:env.get_robot_state()env.get_robot_info().goal

支持的算法#

规划器

irsim.lib.path_planners 导入

类型

适用场景

A*

AStarPlanner

栅格,8 邻域

需要快速、最优的栅格路径

JPS

JPSPlanner

栅格(优化的 A*)

与 A* 路径相同,在开阔栅格上更快

RRT

RRT

采样

非栅格 / Shapely 障碍物;可行(非最优)路径

RRT*

RRTStar

采样

通过重连得到更短的优化路径

Informed RRT*

InformedRRTStar

采样

得到首个解后更快收敛到最优

PRM

PRMPlanner

采样路图

在同一张静态地图上多次查询

栅格规划器(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.costlen(planner.node_list) 给出路径代价和树的规模。

可运行示例#

usage/20path_planning 下的脚本在共享的 path_planning.yaml 上运行每个规划器:

脚本

规划器

path_planning_astar.py

A*

path_planning_jps.py

跳点搜索(Jump Point Search)

path_planning_rrt.py

RRT

path_planning_rrt_star.py

RRT*

path_planning_informed_rrt_star.py

Informed RRT*

path_planning_prm.py

PRM

完整的规划器 API 见 API 参考 中的 irsim.lib.path_planners 部分。