用途
从 USD 仓库场景生成 ROS 兼容的占据栅格地图,用于导航与感知训练。可服务于 Nav2、MobilityGen 与 A* 路径规划器。该技能提供两条路径:一是文档化的 isaacsim.asset.gen.omap 扩展(基于 PhysX collider,支持 GUI 与 Python),二是直接 USD 投影的兜底方案,适用于原型或无 collider 的场景。
前置条件
需要构建好的 Isaac Sim,并暴露 isaacsim.asset.gen.omap(或提供用于投影兜底的 USD stage)。
需要 $ISAAC_SIM_DIR 指向 _build/linux-x86_64/release;投影/导出路径需要 numpy、scipy、Pillow。
路径 1(基于 collider)要求 prim 启用 Collisions,且时间线处于播放状态。
可用脚本
scripts/generate_occupancy_map.py:统一入口,先尝试 collider 方案,失败则回退到 USD 投影。 scripts/usd_projection_pipeline.py:直接 USD 投影占据栅格流水线(仅路径 2)。
运行方式:在暴露技能执行辅助器的 agent 运行时中,使用 run_script("scripts/usd_projection_pipeline.py", args=["--help"]) 调用。在已构建的 Isaac Sim 目录中,可从 _build/*/release 用 ./python.sh(Linux)或 python.bat(Windows)运行同一文件,或在不需要模拟器时直接执行 shell 辅助脚本。
使用方式
自动兜底(推荐入口):使用 scripts/generate_occupancy_map.py。它先尝试基于 collider 的路径 1,在以下情况自动回退到 USD 投影(路径 2):isaacsim.asset.gen.omap 扩展无法导入(离线/无运行时);PhysX 重叠查询返回零占据单元(原型资产缺少 CollisionAPI);生成器抛出任何异常(缺少 stage、时间线未播放等)。
代码示例:
from generate_occupancy_map import generate_occupancy_map
grid = generate_occupancy_map("warehouse.usd", output_dir="./maps", resolution=0.1)
或命令行:
python generate_occupancy_map.py warehouse.usd --output_dir ./maps --resolution 0.1
路径 1(推荐):isaacsim.asset.gen.omap 扩展。该扩展使用物理碰撞几何体,因此希望被捕获的每个 prim 都必须启用 Collisions;起点位置不能是占据状态。GUI 流程:打开 stage;Tools > Robotics > Occupancy Map;设置 Origin(区域内自由点)、Lower/Upper Bound(限定映射范围)、Cell Size,可选切换 Use PhysX Collision Geometry;CALCULATE,然后 VISUALIZE IMAGE 预览;在可视化窗口中 Save Image(PNG)和 Save YAML(ROS 占据栅格参数文件)。
Python 方式(程序化,模拟播放中):
from isaacsim.asset.gen.omap.bindings import _omap import omni.physx import omni.usd
physx = omni.physx.acquire_physx_interface() stage_id = omni.usd.get_context().get_stage_id()
generator = _omap.Generator(physx, stage_id) generator.update_settings( cell_size=0.1, # meters per pixel z_min=0.1, # height to map at (m above origin) z_max=0.0, # 0 = use cell_size occupancy_threshold=0.5, ) generator.set_transform(origin=(0, 0, 0), lo_offset=(-10, -10, 0), hi_offset=(10, 10, 0)) generator.generate2d() buffer = generator.get_buffer() # raw occupancy data
需时间线播放以进行 PhysX 射线检测。无头运行可配合 app_utils.play(commit=True)。
路径 2(兜底):直接 USD 投影。适用于场景缺少 collider、需要从已创作几何体确定性投影、或使用占位立方体做原型时。在这些情况下更快且可复现,但不尊重物理碰撞近似。步骤:从 USD 提取障碍物(读取所有 prim,将 XY 足迹投影到 2D 栅格,按高度过滤以区分可通行地面标记与实体障碍;extract_obstacles_from_usd(...) 返回 uint8 栅格,1=自由,2=占据);应用机器人缓冲(使用 scipy.ndimage.binary_dilation,按机器人半径计算缓冲像素与圆形核);导出 ROS 格式(export_ros_map(grid, output_dir, resolution) 写出 map.png 灰度图与 map.yaml);生成彩色可视化(白色=自由、黑色=占据、粉色=缓冲)。
关键设计决策
标记为障碍物:货架、GSRC 模块、码头、桌子、打包站、输送机(虽有抬高但含支撑)、VLM、分拣设备、墙体、立柱。排除:地面、消防通道标记、AMR 路线覆盖层、人行通道标记、叉车通道标记、人(会移动)、AMR 机器人(会移动)、出口标识、楼梯(可通行)。
高度过滤:z_max < 0.05m 视为地面标记跳过(路线覆盖层在 z=0.02-0.04);z_min > 2.0m 跳过(机器人上方,架空输送机在 z=6+,HVAC 在 z=13+);0.05-2.0m 区间内的均视为障碍。
分辨率选择:粗略规划 0.5m/px(220×180m 对应 440×360);标准导航 0.1m/px(2200×1800);精细感知 0.05m/px(4400×3600)。
机器人缓冲尺寸:小型 AMR(如 MiR100)半径 0.3m,缓冲 0.4m;标准 AMR(如 MiR250)半径 0.5m,缓冲 0.6m;叉车半径 1.0m,缓冲 1.2m;人(用于通道规划)半径 0.3m,缓冲 0.5m。
Isaac Sim OccupancyMap 类:用于与 MobilityGen 路径规划集成。
from isaacsim.replicator.mobility_gen.impl.occupancy_map import OccupancyMap omap = OccupancyMap.from_ros_yaml("map.yaml") omap_buffered = omap.buffered_meters(0.5)
可用于 A* 规划器、出生点放置等
坐标约定:USD 世界 X=东、Y=北、Z=上(米);图像第 0 行=顶部=最大 Y(北),第 0 列=左侧=最小 X(西);ROS 原点为世界坐标下左下角像素的 [x, y, yaw]。world_to_pixel:world_x / resolution = col,(max_y - world_y) / resolution = row。
适用场景
Nav2 / MobilityGen / A* 路径规划设置;感知训练数据生成;AMR 车队路径规划验证;避障缓冲区域计算。
限制
路径 1 需要已创作的 PhysX collider;没有 CollisionAPI 的原型场景会回退到 USD 投影。输出是单一高度带的 2D 俯视栅格;多层或悬挑几何体无法表示。路径 2(投影)忽略物理碰撞近似,仅作为原型替代。
故障排查
_omap 导入失败:isaacsim.asset.gen.omap 未构建或离线;改用 generate_occupancy_map.py,其会回退到 USD 投影。零占据单元:prim 缺少 collider 或时间线未播放;启用 Collisions 并 play(commit=True),或使用路径 2。地图范围被裁剪/为空:origin 或 lower/upper bounds 设置有误;设置 bounds 覆盖设施,origin 必须是自由单元。
其它未提供信息
具体收费、价格、平台支持范围等资料暂未提供。