多环境#

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 - 仿真状态与设置:

属性

类型

默认值

描述

time

float

0.0

当前仿真时间

control_mode

str

"auto"

控制模式("auto""keyboard"

collision_mode

str

"stop"

碰撞处理模式

step_time

float

0.1

时间步长(秒)

count

int

0

仿真步数计数器

env_param - 环境对象与工具:

属性

类型

描述

objects

list[ObjectBase]

环境中所有对象的列表

logger

EnvLogger

此环境的日志器实例

GeometryTree

STRtree

用于碰撞检测的空间索引

platform_name

str

操作系统名称

id_iter

Iterator[int]

为本环境的对象从 0 开始编号的计数器

env_id

int

所属环境的编号(env.id),按创建顺序分配,在同一进程内不会重复使用

rng

np.random.Generator

设置了随机种子的环境(seed= / env.set_random_seed())使用的生成器;None 表示使用共享的默认生成器

path_param - 文件路径管理:

属性

类型

描述

root_path

str

irsim 包目录路径

ani_buffer_path

str

动画帧缓冲路径

ani_path

str

保存动画的路径

fig_path

str

保存图像的路径

每个环境中的对象引用各自环境的参数:

对象 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 后端。