Implementation:Haosulab ManiSkill FixtureStack
| Knowledge Sources | |
|---|---|
| Domains | Robotics, Simulation, Scene_Building |
| Last Updated | 2026-02-15 08:00 GMT |
Overview
Concrete tool for creating vertical stacks of kitchen fixtures (cabinets, drawers, panels) in RoboCasa environments, managing layered placement and configuration.
Description
The FixtureStack class encapsulates a vertical arrangement of stackable fixtures. It takes a configuration dictionary that specifies the stack size, the fixture types at each level, and the percentage of total height each level occupies.
Stackable fixture types (defined in STACKABLE dictionary): single_cabinet, hinge_cabinet, drawer, panel_cabinet, box.
Key features:
- Multi-level stacking -- Levels are created bottom-to-top, each assigned a percentage of the total height.
- Split levels -- A level can contain up to 2 fixtures placed side-by-side (each taking half the width).
- Base platform -- An optional base Box is created below the stack with configurable height and overhang.
- Style inheritance -- Fixture styles, textures, and configurations are loaded from the scene style system.
- Alignment -- Stacks can be positioned absolutely or aligned relative to other fixtures using the
align_toconfig key. - Group transforms -- Supports group rotation and positioning parameters for island and L-shaped layouts.
- Configuration validation --
_check_config_syntax()verifies all required keys are present and well-formed.
Each fixture in the stack is created via scene_utils.initialize_fixture() and registered in the scene fixtures and configs dictionaries.
Usage
Used by the RoboCasa scene builder when layout configurations specify stacked fixture arrangements, commonly for upper and lower cabinet assemblies.
Code Reference
Source Location
- Repository: Haosulab_ManiSkill
- File: mani_skill/utils/scene_builder/robocasa/fixtures/fixture_stack.py
Signature
STACKABLE = {
"single_cabinet": SingleCabinet,
"hinge_cabinet": HingeCabinet,
"drawer": Drawer,
"panel_cabinet": PanelCabinet,
"box": Box,
}
class FixtureStack:
def __init__(self, scene: ManiSkillScene, config, scene_fixtures, scene_configs,
scene_style, base_height=0.05, base_overhang=0.07,
default_texture=None, rng=None): ...
def _create_stack(self): ...
@staticmethod
def _check_config_syntax(config): ...
Import
from mani_skill.utils.scene_builder.robocasa.fixtures.fixture_stack import FixtureStack
I/O Contract
The config dictionary must contain:
| Key | Type | Description |
|---|---|---|
size |
list |
[width, depth, height] of the full stack
|
levels |
list |
Fixture type names per level (string or list of 2 strings) |
percentages |
list |
Height fraction for each level (must sum to approximately 1.0) |
name |
str |
Base name for all fixtures in the stack |
pos |
list (optional) |
Absolute position; if absent, uses align_to
|
align_to |
str (optional) |
Name of fixture to align relative to |
Usage Examples
config = {
"name": "upper_stack",
"size": [0.6, 0.35, 1.4],
"levels": ["hinge_cabinet", "drawer"],
"percentages": [0.7, 0.3],
"pos": [1.0, 0.5, 1.0],
}
stack = FixtureStack(
scene=scene,
config=config,
scene_fixtures=scene_fixtures,
scene_configs=scene_configs,
scene_style=scene_style,
)
# stack.fixtures contains all created fixture objects