多环境#
IR-SIM 支持同时创建和运行多个环境。每个环境维护各自独立的状态,包括世界参数、对象和仿真时间。适用场景包括:
并行仿真:同时运行多个场景
对比研究:比较不同算法或配置
训练:为强化学习运行多个实例
创建多个环境#
import irsim
# Create two separate environments
env1 = irsim.make("scenario_a.yaml")
env2 = irsim.make("scenario_b.yaml")
# Each environment has its own state
print(f"Env1 robots: {env1.robot_number}")
print(f"Env2 robots: {env2.robot_number}")
参数隔离#
每个环境拥有完全独立的参数实例:
import irsim
env1 = irsim.make("world1.yaml")
env2 = irsim.make("world2.yaml")
# World parameters are isolated
env1.world_param.control_mode = "keyboard"
print(f"Env1 control mode: {env1.world_param.control_mode}") # keyboard
print(f"Env2 control mode: {env2.world_param.control_mode}") # auto (unchanged)
# Simulation time is independent
for _ in range(10):
env1.step()
for _ in range(5):
env2.step()
print(f"Env1 time: {env1.time}") # 1.0 (10 steps * 0.1)
print(f"Env2 time: {env2.time}") # 0.5 (5 steps * 0.1)
运行多个环境#
import irsim
env1 = irsim.make("scenario_a.yaml", display=True)
env2 = irsim.make("scenario_b.yaml", display=True)
# Run both environments in the same loop
for i in range(500):
# Step both environments
env1.step()
env2.step()
# Render both (creates two windows)
env1.render(0.01)
env2.render(0.01)
# Check completion independently
if env1.done() and env2.done():
break
env1.end()
env2.end()
import irsim
# Create multiple headless environments for training (no figures or input devices)
num_envs = 4
envs = [
irsim.make(f"training_world.yaml", headless=True, seed=i) for i in range(num_envs)
]
# Run training loop
for episode in range(100):
# Reset all environments
for env in envs:
env.reset()
# Collect experiences from all environments
for step in range(1000):
actions = [get_action(env) for env in envs] # Your policy
for env, action in zip(envs, actions):
env.step(action)
# Check if any environment is done
if all(env.done() for env in envs):
break
# Clean up
for env in envs:
env.end()
参数隔离详情#
每个环境实例创建并绑定各自的参数对象:
world_param - 仿真状态与设置:
属性 |
类型 |
默认值 |
描述 |
|---|---|---|---|
|
|
|
当前仿真时间 |
|
|
|
控制模式( |
|
|
|
碰撞处理模式 |
|
|
|
时间步长(秒) |
|
|
|
仿真步数计数器 |
env_param - 环境对象与工具:
属性 |
类型 |
描述 |
|---|---|---|
|
|
环境中所有对象的列表 |
|
|
此环境的日志器实例 |
|
|
用于碰撞检测的空间索引 |
|
|
操作系统名称 |
|
|
为本环境的对象从 0 开始编号的计数器 |
|
|
所属环境的编号( |
|
|
设置了随机种子的环境( |
path_param - 文件路径管理:
属性 |
类型 |
描述 |
|---|---|---|
|
|
irsim 包目录路径 |
|
|
动画帧缓冲路径 |
|
|
保存动画的路径 |
|
|
保存图像的路径 |
每个环境中的对象引用各自环境的参数:
对象 id 同样按环境隔离:每个环境都从 0 开始为对象编号(机器人在前),通过 env.create_robot() / env.create_obstacle() 创建的对象从所属环境获取 id,因此即使同时存在多个环境,id 在每个环境内部也保持唯一。对象按身份(identity)比较,因此两个环境中的 robot_0 即使 id 相同也是不同的对象(在集合中也是不同成员)。env.id 按创建顺序为环境编号,需要跨环境跟踪对象的代码可以用 (env.id, obj.id) 作为键。
随机数遵循同样的规则。使用 seed= 创建(或通过 env.set_random_seed() 重新设置种子)的环境,其所有随机性 —— 场景采样、reset(random=True)、运动与传感器噪声、随机目标 —— 都来自该环境自己的生成器,因此结果不受其他环境的影响,也与各环境的步进顺序无关。未指定种子创建的环境与以前一样共用一个默认生成器;irsim.util.random.set_seed() 会重新设置当前正在使用的生成器的种子。
备注
使用 display=True 创建多个环境时,每个环境会打开各自的可视化窗口。对于训练或批量仿真,建议使用 headless=True:完全不创建图形,也不会改动进程的 Matplotlib 后端。