Spaces:
Running
on
Zero
Running
on
Zero
| # Project EmbodiedGen | |
| # | |
| # Copyright (c) 2025 Horizon Robotics. All Rights Reserved. | |
| # | |
| # Licensed under the Apache License, Version 2.0 (the "License"); | |
| # you may not use this file except in compliance with the License. | |
| # You may obtain a copy of the License at | |
| # | |
| # http://www.apache.org/licenses/LICENSE-2.0 | |
| # | |
| # Unless required by applicable law or agreed to in writing, software | |
| # distributed under the License is distributed on an "AS IS" BASIS, | |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or | |
| # implied. See the License for the specific language governing | |
| # permissions and limitations under the License. | |
| import json | |
| import os | |
| from dataclasses import dataclass | |
| import tyro | |
| from embodied_gen.scripts.simulate_sapien import entrypoint as sim_cli | |
| from embodied_gen.utils.enum import LayoutInfo | |
| from embodied_gen.utils.geometry import bfs_placement, compose_mesh_scene | |
| from embodied_gen.utils.log import logger | |
| class LayoutPlacementConfig: | |
| layout_path: str | |
| output_dir: str | None = None | |
| seed: int | None = None | |
| max_attempts: int = 1000 | |
| output_iscene: bool = False | |
| insert_robot: bool = False | |
| def entrypoint(**kwargs): | |
| if kwargs is None or len(kwargs) == 0: | |
| args = tyro.cli(LayoutPlacementConfig) | |
| else: | |
| args = LayoutPlacementConfig(**kwargs) | |
| output_dir = ( | |
| args.output_dir | |
| if args.output_dir is not None | |
| else os.path.dirname(args.layout_path) | |
| ) | |
| os.makedirs(output_dir, exist_ok=True) | |
| out_scene_path = f"{output_dir}/Iscene.glb" | |
| out_layout_path = f"{output_dir}/layout.json" | |
| with open(args.layout_path, "r") as f: | |
| layout_info = LayoutInfo.from_dict(json.load(f)) | |
| layout_info = bfs_placement(layout_info, seed=args.seed) | |
| with open(out_layout_path, "w") as f: | |
| json.dump(layout_info.to_dict(), f, indent=4) | |
| if args.output_iscene: | |
| compose_mesh_scene(layout_info, out_scene_path) | |
| sim_cli( | |
| layout_path=out_layout_path, | |
| output_dir=output_dir, | |
| robot_name="franka" if args.insert_robot else None, | |
| ) | |
| logger.info(f"Layout placement completed in {output_dir}") | |
| if __name__ == "__main__": | |
| entrypoint() | |