多智能体示例 multi_agent.py

使用 HoloOcean,您可以同时控制多个智能体。与其调用 .step()(该方法既向主智能体发送单个指令,又推进仿真进程),不如调用 .act().act() 仅向特定智能体发送指令,而不会推进仿真进程。

当所有智能体都接收到各自的动作指令后,您可以调用 .tick() 来推进仿真进程。

调用 .act() 之后,每次调用 .tick() 时,系统都会向该智能体发送相同的指令。若要更改指令,只需再次调用 .act() 即可。

tick 返回的状态信息也有所不同。

此时返回的状态是一个字典,其键为智能体名称,值为对应的传感器数据字典。

按 Tab 键可在不同智能体的视图之间切换。更多信息请参阅快捷键部分。

import holoocean
import numpy as np

cfg = {
    "name": "test_rgb_camera",
    "world": "SimpleUnderwater",
    "package_name": "Ocean",
    "main_agent": "auv0",
    "ticks_per_sec": 60,
    "agents": [
        {
            "agent_name": "auv0",
            "agent_type": "TorpedoAUV",
            "sensors": [
                {
                    "sensor_type": "IMUSensor"
                }
            ],
            "control_scheme": 0,
            "location": [0, 0, -5]
        },
        {
            "agent_name": "auv1",
            "agent_type": "HoveringAUV",
            "sensors": [
                {
                    "sensor_type": "DVLSensor"
                }
            ],
            "control_scheme": 0,
            "location": [0, 2, -5]
        }
    ]
}

env = holoocean.make(scenario_cfg=cfg)
env.reset()

env.act('auv0', np.array([0,0,0,0,75]))
env.act('auv1', np.array([0,0,0,0,20,20,20,20]))
for i in range(300):
    states = env.tick()

    # states is a dictionary
    imu = states["auv0"]["IMUSensor"]

    vel = states["auv1"]["DVLSensor"]