microduck_rl/tests/test_descent_speed.py
Upstream Snapshot 47372443ff Import upstream snapshot d424a0c899f6b33cbd3daeb279913134349c0b63
Upstream: https://github.com/pollen-robotics/microduck_rl
Upstream-Commit: d424a0c899f6b33cbd3daeb279913134349c0b63
Upstream-Branch: develop
2026-08-28 15:41:56 +08:00

49 lines
1.2 KiB
Python

"""descent_speed_reward : récompense la vitesse d'avance vers le bas de la pente
(monde +x), plafonnée à `cap`, nulle si le robot recule/remonte, NaN-safe.
"""
import torch
from mjlab_microduck.tasks.mdp import descent_speed_reward
class _Data:
def __init__(self, vx):
self.root_link_lin_vel_w = torch.tensor(vx, dtype=torch.float32).reshape(-1, 1).repeat(1, 3)
# seule la colonne 0 (x) est lue ; on met vx en x
self.root_link_lin_vel_w[:, 0] = torch.tensor(vx, dtype=torch.float32)
class _Asset:
def __init__(self, data):
self.data = data
class _Env:
def __init__(self, vx):
self._a = _Asset(_Data(vx))
self.scene = self
def __getitem__(self, _k):
return self._a
def test_rewards_forward_speed_up_to_cap():
out = descent_speed_reward(_Env([0.5]), cap=0.8)
assert abs(float(out[0]) - 0.5) < 1e-6
def test_caps_high_speed():
out = descent_speed_reward(_Env([1.5]), cap=0.8)
assert abs(float(out[0]) - 0.8) < 1e-6
def test_zero_for_backward_or_uphill():
out = descent_speed_reward(_Env([-0.4]), cap=0.8)
assert float(out[0]) == 0.0
def test_nan_safe():
out = descent_speed_reward(_Env([float("nan")]), cap=0.8)
assert float(out[0]) == 0.0