from typing import Dict import tyro from decoupled_wbc.control.envs.g1.sim.simulator_factory import SimulatorFactory, init_channel from decoupled_wbc.control.main.teleop.configs.configs import SimLoopConfig from decoupled_wbc.control.robot_model.instantiation.g1 import ( instantiate_g1_robot_model, ) from decoupled_wbc.control.robot_model.robot_model import RobotModel ArgsConfig = SimLoopConfig class SimWrapper: def __init__(self, robot_model: RobotModel, env_name: str, config: Dict[str, any], **kwargs): self.robot_model = robot_model self.config = config init_channel(config=self.config) # Create simulator using factory self.sim = SimulatorFactory.create_simulator( config=self.config, env_name=env_name, **kwargs, ) def main(config: ArgsConfig): wbc_config = config.load_wbc_yaml() # NOTE: we will override the interface to local if it is not specified wbc_config["ENV_NAME"] = config.env_name if config.enable_image_publish: assert ( config.enable_offscreen ), "enable_offscreen must be True when enable_image_publish is True" robot_model = instantiate_g1_robot_model() sim_wrapper = SimWrapper( robot_model=robot_model, env_name=config.env_name, config=wbc_config, onscreen=wbc_config.get("ENABLE_ONSCREEN", True), offscreen=wbc_config.get("ENABLE_OFFSCREEN", False), ) # Start simulator as independent process SimulatorFactory.start_simulator( sim_wrapper.sim, as_thread=False, enable_image_publish=config.enable_image_publish, mp_start_method=config.mp_start_method, camera_port=config.camera_port, ) if __name__ == "__main__": config = tyro.cli(ArgsConfig) main(config)