🔌 Hello World — 跑通第一个仿真¶
目标:5 分钟内跑通一个最简仿真循环(无需 OrcaStudio,离线模式)。
前提¶
- 已安装 OrcaGym(能
from orca_gym.environment.euler.orca_gym_euler_env import OrcaGymEulerEnv) - 有一个简单的 MuJoCo XML 场景文件(本节使用内置示例)
完整代码¶
下面是一个可以直接运行的最简示例。把它保存为 hello_orcagym.py:
"""
hello_orcagym.py — OrcaGym 最简示例
功能:创建环境 → 随机动作驱动 200 步 → 关闭
前提:不需要 OrcaStudio(离线模式,skip_grpc_load=True)
"""
import numpy as np
from gymnasium import spaces
from orca_gym.environment.euler.orca_gym_euler_env import OrcaGymEulerEnv
class HelloEnv(OrcaGymEulerEnv):
"""最简环境:用随机动作驱动仿真,打印状态。"""
def __init__(self, model_xml_path, **kwargs):
super().__init__(
frame_skip=kwargs.pop("frame_skip", 5),
orcagym_addr=kwargs.pop("orcagym_addr", "localhost:50051"),
agent_names=kwargs.pop("agent_names", ["agent0"]),
time_step=kwargs.pop("time_step", 0.002),
model_xml_path=model_xml_path,
skip_grpc_load=True, # 离线模式,不需要 Studio
**kwargs,
)
# 动作空间 = Box
self.action_space = spaces.Box(
low=-1.0, high=1.0, shape=(self.model.nu,), dtype=np.float32
)
obs = self._get_obs()
self.observation_space = spaces.Box(
low=-np.inf, high=np.inf, shape=obs.shape, dtype=np.float32
)
def step(self, action):
action = np.asarray(action, dtype=np.float32).reshape(self.model.nu)
self.do_simulation(action, self.frame_skip)
obs = self._get_obs()
reward = 0.0
terminated = False
truncated = False
info = {"time": float(self.data.time)}
return obs, reward, terminated, truncated, info
def reset_model(self):
self.set_joint_qpos(self.init_qpos)
self.set_joint_qvel(self.init_qvel)
self.mj_forward()
self._sync_view()
return self._get_obs(), {}
def _get_obs(self) -> np.ndarray:
return self.data.qpos.copy().astype(np.float32)
# ============================================================
# 使用
# ============================================================
if __name__ == "__main__":
# 场景 XML 路径(请替换为你本地的场景文件)
SCENE_XML = "/path/to/your/scene.xml"
print("=" * 60)
print("Hello OrcaGym — 离线模式最简示例")
print("=" * 60)
# 1. 创建环境(离线模式,直接加载本地 XML)
env = HelloEnv(model_xml_path=SCENE_XML, frame_skip=5, time_step=0.002)
print(f"[1/4] 环境创建成功: nq={env.model.nq}, nv={env.model.nv}, nu={env.model.nu}")
# 2. 验证状态访问
print(f"[2/4] 状态访问: qpos.shape={env.data.qpos.shape}, time={env.data.time:.4f}")
# 3. reset
obs, info = env.reset()
print(f"[3/4] reset 成功: obs.shape={obs.shape}")
# 4. 步进循环(随机动作,200 步)
total_reward = 0.0
for step in range(200):
action = env.action_space.sample()
obs, reward, terminated, truncated, info = env.step(action)
total_reward += reward
if (step + 1) % 50 == 0:
print(f"[4/4] step {step + 1}/200: obs={obs}, reward={reward:.4f}")
print(f"[4/4] 步进完成: 总奖励={total_reward:.4f}")
env.close()
print("=" * 60)
print("Hello OrcaGym 完成!")
运行:
逐行解释¶
环境构造¶
class HelloEnv(OrcaGymEulerEnv):
def __init__(self, model_xml_path, **kwargs):
super().__init__(
frame_skip=5, # 每次 step() 推 5 个物理步
orcagym_addr="localhost:50051", # gRPC 地址(离线模式不需要)
agent_names=["agent0"], # agent 名称列表
time_step=0.002, # 每个物理步 0.002 秒
model_xml_path=model_xml_path, # 本地 MuJoCo XML 场景路径
skip_grpc_load=True, # True = 离线模式
)
关键参数:
- model_xml_path:本地 MuJoCo XML 场景文件的路径。离线模式下用此路径直接加载。
- skip_grpc_load=True:跳过 gRPC 连接,纯本地 MuJoCo 仿真。
- frame_skip=5:每次 step() 调用时物理引擎推 5 步。控制频率 = 1 / (time_step × frame_skip) = 100 Hz。
- time_step=0.002:每个物理步 0.002 秒。
需要实现的三个抽象方法¶
def step(self, action): # 执行一步仿真 → 返回 (obs, reward, terminated, truncated, info)
def reset_model(self): # 重置到初始状态 → 返回 (obs, info)
def _get_obs(self) -> dict | np.ndarray: # 收集观测数据
核心循环¶
| 变量 | 含义 | 类型 |
|---|---|---|
obs |
观测数据(由 _get_obs() 返回) |
np.ndarray 或 dict |
reward |
奖励 | float |
terminated |
任务是否完成/失败(如摔倒) | bool |
truncated |
是否超时截断(达到 max_episode_steps) | bool |
info |
额外调试信息 | dict |
离线 vs 在线模式¶
| 模式 | skip_grpc_load |
需要 Studio | 适用场景 |
|---|---|---|---|
| 离线(推荐入门) | True |
否 | 训练、快速测试、本地开发 |
| 在线 | False(默认) |
是 | 渲染可视化、人工观察、视频录制 |
常见问题¶
FileNotFoundError: model XML not found¶
原因:model_xml_path 指向的 XML 文件不存在。
解决:确认文件路径正确。你可以从 OrcaPlayground 获取示例场景文件。
ModuleNotFoundError: No module named 'orca_gym'¶
原因:OrcaGym 未安装。
解决:按照 安装指南 安装。
离线模式下 env.render() 不起作用?¶
离线模式下 render() 是 no-op(因为没连 Studio)。如需可视化,请使用在线模式(skip_grpc_load=False)并启动 OrcaStudio。
下一步¶
你已经跑通了最简仿真!接下来学习如何往场景里放东西:🎬 场景搭建。