自定义环境¶
把一个新环境接入 plugrl-env-client,让 plugrl-run-env-client <env_id> 能发现并运行它。
快速开始¶
实现一个 env 类与一个 config dataclass,并注册它们。
import dataclasses
import numpy as np
from plugrl_env_client.envs.base_env import Action, BaseEnv, BaseEnvConfig, Observation
from plugrl_env_client.utils.registration import register_env, register_env_config
UID = "custom-v1"
@register_env_config(UID)
@dataclasses.dataclass
class CustomConfig(BaseEnvConfig):
...
@register_env(UID)
class CustomEnv(BaseEnv):
def __init__(
self,
config: CustomConfig,
num_envs: int = 1,
process_id: int | None = None,
total_processes: int | None = None,
):
super().__init__(
config=config,
num_envs=num_envs,
process_id=process_id,
total_processes=total_processes,
)
def prepare_obs(self, obs: np.ndarray) -> Observation:
return Observation(images={}, states={}, text="")
def reset(self, *, seed: int | None = None, options: dict | None = None) -> tuple[Observation | None, dict]:
...
def step(self, action: Action) -> tuple[Observation | None, float, bool, bool, dict]:
...
验证¶
注册后应该能看到子命令。
对着 dummy server 跑一个 episode。
plugrl-run-server dummy-policy default dummy default
plugrl-run-env-client custom-v1 --num-episodes 1
约定¶
- env 继承
BaseEnv - config 继承
BaseEnvConfig - 实现
reset与step - 在
prepare_obs中把原始输出转成Observation __init__接收config, num_envs, process_id, total_processes四个参数, 与BaseEnv.__init__以及内置的MuJoCoEnv一致。EnvSpec.make总会传num_envs,gym.make_vec会转发process_id与total_processes。本页 此前用的是worker_id与total_workers,这两个名字在plugrl-env-client里根本不存在,按那个签名写的类会因为多出来的num_envs直接抛TypeError。
注册¶
register_env_config注册 config dataclassregister_env注册 env 类register_env支持max_episode_steps等可选参数
常见问题¶
- CLI 找不到 env id:模块没有被 import。
- 多进程初始化冲突:可尝试
--runner.use-env-lock。