import sys import os # 关键:确保当前目录在 sys.path 中,这样才能直接 from config 导入 sys.path.append(os.path.dirname(os.path.abspath(__file__))) import argparse from isaaclab.app import AppLauncher # 添加启动参数 parser = argparse.ArgumentParser(description="Train T1 robot with rl_games.") parser.add_argument("--num_envs", type=int, default=16384, help="Number of envs to run.") AppLauncher.add_app_launcher_args(parser) args_cli = parser.parse_args() # 启动仿真器 app_launcher = AppLauncher(args_cli) simulation_app = app_launcher.app import torch import gymnasium as gym from isaaclab_rl.rl_games import RlGamesVecEnvWrapper from rl_games.torch_runner import Runner import yaml from config.t1_env_cfg import T1EnvCfg from rl_games.common import env_configurations, vecenv gym.register( id="Isaac-T1-Walking-v0", entry_point="isaaclab.envs:ManagerBasedRLEnv", # Isaac Lab 统一的强化学习环境入口 kwargs={ "cfg": T1EnvCfg(), }, ) def main(): # 1. 创建环境 (保持不变) env = gym.make("Isaac-T1-Walking-v0", num_envs=args_cli.num_envs) # 2. 包装环境 (保持不变) wrapped_env = RlGamesVecEnvWrapper( env, rl_device=args_cli.device, clip_obs=5.0, clip_actions=100.0 ) vecenv.register('as_is', lambda config_name, num_actors, **kwargs: wrapped_env) # 注册环境配置 env_configurations.register('rlgym', { 'vecenv_type': 'as_is', 'env_creator': lambda **kwargs: wrapped_env }) # 3. 加载 PPO 配置 (保持不变) config_path = os.path.join(os.path.dirname(__file__), "config", "ppo_cfg.yaml") with open(config_path, "r") as f: rl_config = yaml.safe_load(f) # 设置日志路径 rl_game_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), ".")) log_dir = os.path.join(rl_game_dir, "logs") rl_config['params']['config']['train_dir'] = log_dir # 4. 启动训练 runner = Runner() # 此时 rl_config 只有文本和数字,没有复杂对象,deepcopy 会成功 runner.load(rl_config) # 在 run 时传入对象是安全的 runner.run({ "train": True, "play": False, "vec_env": wrapped_env }) simulation_app.close() # PYTHONPATH=. python rl_game/your_file_name/train.py if __name__ == "__main__": main()