xinjie.wang
update
1d3e2bd
# Floorplan Skill — API Reference
This document provides API details, configuration items, errors, and dependencies for reference beyond the usage instructions in [SKILL.md](SKILL.md).
## Contents
- [Floorplan Skill — API Reference](#floorplan-skill--api-reference)
- [Contents](#contents)
- [LLM Environment Configuration](#llm-environment-configuration)
- [FloorplanManager](#floorplanmanager)
- [Constructor](#constructor)
- [Methods](#methods)
- [Convenience Functions](#convenience-functions)
- [CLI Features](#cli-features)
- [Command Line Parameters](#command-line-parameters)
- [Configuration and Ignore Items](#configuration-and-ignore-items)
- [USD and Blender](#usd-and-blender)
- [Errors and Return Values](#errors-and-return-values)
- [Dependencies](#dependencies)
- [Usage Recommendations](#usage-recommendations)
---
## LLM Environment Configuration
Before using `resolve_instance_with_llm` or `FloorplanManager.resolve_on_instance`/`resolve_in_room` for semantic matching, configure the LLM API and ensure access to the interface.
```bash
# Use the project-provided env (Azure + proxy, etc.), if outputs/env.sh exists:
source outputs/env.sh
```
If access to the LLM interface is unavailable, prompt the user.
---
## FloorplanManager
### Constructor
```python
from embodied_gen.skills.spatial_computing.api import FloorplanManager
manager = FloorplanManager(
urdf_path="scene.urdf", # Required
usd_path=None, # Optional; USD write after insert if provided
mesh_sample_num=50000,
ignore_items=None, # Default ["ceiling", "light", "exterior"]
)
```
### Methods
| Method | Description |
|--------|-------------|
| `visualize(output_path)` | Generate floorplan and save as image |
| `insert_object(asset_path, instance_key, in_room=..., on_instance=..., place_strategy=..., n_max_attempt=2000, rotation_rpy=...)` | Place object, automatically write back to URDF/USD on success, return `[x,y,z]` or `None`. `on_instance` must be an exact instance name |
| `update_scene(urdf_output_path=..., usd_output_path=...)` | Manually write back currently placed instances; generally not needed (called inside `insert_object`). Use for custom output paths |
| `get_room_names()` | List of room names |
| `get_instance_names()` | List of instance names (excluding walls/floor) |
| `resolve_on_instance(on_instance, gpt_client=None)` | Resolve user description (e.g., "柜子", "书柜") to exact instance name; if already exact, return directly. With gpt_client, use LLM semantic matching, return `None` if no match |
| `resolve_in_room(in_room, gpt_client=None)` | Resolve user description to exact room name; if already exact, return directly. With gpt_client, use LLM semantic matching, return `None` if no match |
| `resolve_beside_instance(beside_instance, gpt_client=None)` | Resolve user description to exact instance name for beside placement; if already exact, return directly. With gpt_client, use LLM semantic matching, return `None` if no match |
| `get_occupied_area()` | Occupied area Shapely geometry |
| `get_floor_union()` | Floor area union geometry |
**Common `insert_object` parameters**: `in_room` to limit room; `on_instance` to place on top of an instance (exact instance name, can be resolved via `resolve_on_instance`); `beside_instance` to place beside an instance on the floor (exact instance name, can be resolved via `resolve_beside_instance`); `beside_distance` max distance in meters for beside placement (default 0.5); `place_strategy` is `"random"` (default) or `"top"`; `rotation_rpy` not required by default; `n_max_attempt` maximum placement attempts before failure. Note: `on_instance` and `beside_instance` are mutually exclusive.
---
## Convenience Functions
| Function | Description |
|----------|-------------|
| `visualize_floorplan(urdf_path, output_path, mesh_sample_num=50000, ignore_items=None)` | Generate floorplan only, do not write back to scene |
| `insert_object_to_scene(urdf_path, asset_path, instance_key, output_path, usd_path=None, in_room=None, on_instance=None, beside_instance=None, beside_distance=0.5, place_strategy="random", rotation_rpy=...)` | Create manager, place, automatically write back, generate floorplan; `on_instance` must be exact instance name; `beside_instance` places beside target on floor; returns placement center `[x,y,z]` or `None`. URDF output does not overwrite original file by default |
| `resolve_instance_with_llm(gpt_client, instance_names, user_spec, prompt_template=None)` | Use LLM to semantically match user description to one exact instance name in the scene; return `None` if no match, caller should prompt "does not exist, please re-enter". Depends on `embodied_gen.utils.gpt_clients.GPTclient` |
## CLI Features
### Command Line Parameters
| Parameter | Description |
|-----------|-------------|
| `--urdf_path` | Input URDF scene file path (required) |
| `--usd_path` | Optional USD scene file path, update USD simultaneously if specified |
| `--asset_path` | Placeholder object mesh file path (.obj) |
| `--instance_key` | Unique identifier for the new instance, default `inserted_object` |
| `--in_room` | Limit placement to specified room, supports semantic description (requires LLM environment) |
| `--on_instance` | Place on top of specified instance, supports semantic description (requires LLM environment) |
| `--beside_instance` | Place beside specified instance on the floor, supports semantic description (requires LLM environment) |
| `--beside_distance` | Max distance (meters) from target instance for beside placement, default 0.5 |
| `--place_strategy` | Placement strategy: `"random"` (default) or `"top"` (select highest surface) |
| `--rotation_rpy` | Initial rotation angle (roll, pitch, yaw radians) |
| `--output_path` | Floorplan output path |
| `--list_instances` | List instance names and room names in current scene, print and exit |
| `--max_placement_attempts` | Maximum placement attempts before failure, default 2000 |
### CLI Usage Examples
View scene instance names and room names:
```bash
python -m embodied_gen.skills.spatial_computing.cli.main \
--urdf_path .../scene.urdf --list_instances
```
Visualize floorplan only:
```bash
python -m embodied_gen.skills.spatial_computing.cli.main \
--urdf_path .../scene.urdf --output_path .../floorplan.png
```
Put lamp on bookshelf (supports semantic description):
```bash
source outputs/env.sh
python -m embodied_gen.skills.spatial_computing.cli.main \
--urdf_path .../scene.urdf --output_path .../floorplan.png \
--asset_path .../lamp.obj --instance_key lamp_on_bookcase \
--on_instance 书柜
```
Put table in a room:
```bash
python -m embodied_gen.skills.spatial_computing.cli.main \
--urdf_path .../scene.urdf --output_path .../floorplan.png \
--asset_path .../table.obj --instance_key table_1 \
--in_room living_room
```
Place object on table in living room (room + on object):
```bash
python -m embodied_gen.skills.spatial_computing.cli.main \
--urdf_path .../scene.urdf --output_path .../floorplan.png \
--asset_path .../apple.obj --instance_key apple_1 \
--in_room living_room --on_instance table --place_strategy top
```
Place chair beside table (on floor, collision-free):
```bash
source outputs/env.sh
python -m embodied_gen.skills.spatial_computing.cli.main \
--urdf_path .../scene.urdf --output_path .../floorplan.png \
--asset_path .../chair.obj --instance_key chair_beside_table \
--beside_instance 桌子
```
Place beside with room constraint and custom distance:
```bash
python -m embodied_gen.skills.spatial_computing.cli.main \
--urdf_path .../scene.urdf --output_path .../floorplan.png \
--asset_path .../chair.obj --instance_key chair_beside_table \
--in_room kitchen --beside_instance table --beside_distance 0.8
```
**URDF Output Note**: The updated URDF is written to `*_updated.urdf` by default (e.g., `scene.urdf``scene_updated.urdf`), and **will not overwrite** the original `scene.urdf` unless the user specifies a custom output path.
---
## Configuration and Ignore Items
| Parameter | Default | Description |
|-----------|---------|-------------|
| `mesh_sample_num` | 50000 | Number of mesh sampling points, larger values yield more precise floor plan polygons |
| `ignore_items` | `["ceiling", "light", "exterior"]` | Link name patterns to skip during URDF parsing |
---
## USD and Blender
- Writing USD converts `.obj` to `.usdc`, requiring **Blender (bpy)**. For USD writing in this project, use the **room-cli** environment (bpy installed).
- Without `usd_path`, only URDF is updated, no bpy needed.
- Assets in `.usd`/`.usdc`/`.usda` format are directly referenced; only `.obj` files are converted via bpy. If `*_collision.obj` exists in the same directory as the visual mesh, it will be written to URDF for collision.
---
## Errors and Return Values
**Exceptions**
- **ValueError**: Room or instance name does not exist; `update_scene()` called before `insert_object()` or after failed insertion; `instance_key` already exists.
**Return Values**
- `insert_object` / `insert_object_to_scene`: Returns `[x, y, z]` on success, `None` on failure (e.g., no valid placement after `n_max_attempt` attempts).
---
## Dependencies
| Type | Package | Description |
|------|---------|-------------|
| Core | trimesh, shapely, matplotlib, numpy | Parsing and visualization |
| USD Writing | pxr (e.g., `pip install usd-core`), bpy | Required only when using `usd_path`; bpy requires Blender |
| LLM Semantic Matching | openai, project gpt_config | `resolve_instance_with_llm` requires `GPTclient` instance (see `embodied_gen.utils.gpt_clients`) and corresponding API configuration |
| CLI | tyro | Required only for CLI entry point |
---
## Usage Recommendations
- **Upright objects**: Default orientation applies, no need to set `rotation_rpy`; for special orientations, pass `(roll, pitch, yaw)` radians, e.g., upright `(1.57, 0, 0)`.
- **Placing on furniture**: First use `resolve_instance_with_llm(gpt_client, get_instance_names(), user_input)` to get the exact instance name, then `insert_object(..., on_instance=resolved, place_strategy="top")`; if matching fails, prompt user to re-enter. For random ground placement, use `place_strategy="random"` (default).
- **Placing beside furniture**: Use `insert_object(..., beside_instance=resolved, beside_distance=0.5)` to place the new object on the floor beside the target instance, collision-free. Increase `beside_distance` if placement fails (e.g., when the area around the target is crowded).
- **Collision meshes**: If `*_collision.obj` exists in the same directory as the visual mesh, it will automatically be used for the collision node in URDF.