File size: 2,033 Bytes
604e535
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
from __future__ import annotations

import numpy as np

from driftwm.sim.env import SurfaceBoatEnv
from driftwm.sim.flow import UniformFlow


def test_noflow_drag_reduces_speed() -> None:
    env = SurfaceBoatEnv(boat="twin", flow_type="noflow", boundary="bounce", randomize_params=False, seed=1)
    env.reset(random_velocity=False)
    env.state[:6] = np.array([5.0, 5.0, 0.2, 0.8, -0.25, 0.0], dtype=np.float32)
    initial = np.linalg.norm(env.state[3:5])
    speeds = []
    for _ in range(120):
        env.step(np.zeros(env.action_dim, dtype=np.float32))
        speeds.append(np.linalg.norm(env.state[3:5]))
    assert speeds[-1] < 0.45 * initial
    assert np.mean(np.diff(speeds) <= 1e-4) > 0.9


def test_uniform_flow_zero_action_converges_to_flow_velocity() -> None:
    flow_vec = np.array([0.22, -0.08], dtype=np.float32)
    flow = UniformFlow(flow_vec, flow_id=7)
    env = SurfaceBoatEnv(
        boat="twin",
        flow_type="uniform",
        boundary="bounce",
        randomize_params=False,
        seed=2,
        workspace=(0.0, 40.0, 0.0, 40.0),
    )
    env.reset(flow=flow, random_velocity=False)
    env.state[:6] = np.array([20.0, 20.0, 0.0, 0.0, 0.0, 0.0], dtype=np.float32)
    for _ in range(500):
        env.step(np.zeros(env.action_dim, dtype=np.float32))
    assert np.linalg.norm(env.state[3:5] - flow_vec) < 0.08


def test_twin_thruster_torque_signs_are_opposite() -> None:
    env_l = SurfaceBoatEnv(boat="twin", flow_type="noflow", boundary="bounce", randomize_params=False, seed=3)
    env_r = SurfaceBoatEnv(boat="twin", flow_type="noflow", boundary="bounce", randomize_params=False, seed=4)
    env_l.reset(random_velocity=False)
    env_r.reset(random_velocity=False)
    env_l.state[:6] = np.array([5.0, 5.0, 0.0, 0.0, 0.0, 0.0], dtype=np.float32)
    env_r.state[:6] = env_l.state[:6].copy()
    for _ in range(25):
        env_l.step(np.array([1.0, 0.0], dtype=np.float32))
        env_r.step(np.array([0.0, 1.0], dtype=np.float32))
    assert env_l.state[5] * env_r.state[5] < 0.0