From 27414bfae7379064b0a48ea9c5347b18172eca37 Mon Sep 17 00:00:00 2001 From: cbb <2625274797@qq.com> Date: Tue, 20 Oct 2026 22:28:10 +0800 Subject: [PATCH] =?UTF-8?q?fix+test:=20reverse=5Frate=20=E5=8F=A3=E5=BE=84?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=E6=8D=A2=E5=90=91(=E6=AD=A5,=E8=BD=B4)?= =?UTF-8?q?=E5=AF=B9/=E6=B4=BB=E5=8A=A8(=E6=AD=A5,=E8=BD=B4)=E5=AF=B9?= =?UTF-8?q?=EF=BC=8C=E4=B8=8E=E7=A6=BB=E7=BA=BF=E5=88=86=E8=A7=A3=E5=90=8C?= =?UTF-8?q?=E5=88=86=E6=AF=8D=EF=BC=9B=E6=AD=A3=E5=AF=B9=E7=85=A7=E6=94=B9?= =?UTF-8?q?=E6=88=90=E5=8F=AF=E6=89=8B=E7=AE=97=E7=9A=84=202/18?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ml/sim/closed_loop.py | 3 ++- tests/test_eval_cl.py | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/ml/sim/closed_loop.py b/ml/sim/closed_loop.py index 05830fd..3d75dc1 100644 --- a/ml/sim/closed_loop.py +++ b/ml/sim/closed_loop.py @@ -512,7 +512,8 @@ def rollout(model, kin, tasks, device, K=8, safety=False, seed=0, max_sec=None, per = {'done': done.cpu(), 'ok': ok.cpu(), 't_done': t_done.cpu(), 'limit': limit.cpu(), 'col': col.cpu(), 'travel': travel.cpu(), 'err': e_end.cpu(), 'side': side.cpu(), 'start_fail': start_fail.cpu(), 'brakes': brakes.cpu(), 'backoff': bo.cpu(), 'first_hit': first_hit.cpu(), 'dls_it': dls_it.cpu(), 'goal_ratio_2s': ratio2.cpu(), 'speed_ratio': vratio.cpu(), 'accel_ratio': aratio.cpu(), - 'reverse_rate': (rev / nact.clamp_min(1.0)).cpu()} + # 口径与离线分解一致:换向的 (步,轴) 对数 / 活动的 (步,轴) 对数 ∈ [0,1](除以 6 个轴) + 'reverse_rate': (rev / (6.0 * nact.clamp_min(1.0))).cpu()} if return_traj: per['traj'] = torch.stack(traj, 1).cpu() per['plans'] = {k: torch.tensor(v) if k in ('it', 'r') else torch.stack(v, 1).cpu() for k, v in plans.items()} diff --git a/tests/test_eval_cl.py b/tests/test_eval_cl.py index ddcef9b..09fcd86 100644 --- a/tests/test_eval_cl.py +++ b/tests/test_eval_cl.py @@ -820,8 +820,9 @@ class TravelPenaltySelectTest(unittest.TestCase): self.assertAlmostEqual(p0['traj'][0, 1, 0].item(), 0.9 * 1.2, places=5) p1 = self.run1(1.0) # 加惩罚:行程 10.8 vs 3.6 ⇒ 选匀速那条 self.assertAlmostEqual(p1['traj'][0, 1, 0].item(), 0.225 * 1.2, places=5) - # 换向率指标要有灵敏度:抖动轨迹必须报出高换向,匀速轨迹必须接近 0(正对照,不然等于没测) - self.assertGreater(float(p0['reverse_rate'][0]), 0.4) + # 换向率指标要有灵敏度,而且要能算出来:这里 3 个活动步 × 6 轴为分母,抖动条在第 0 轴翻了 2 次 ⇒ 2/18。 + # 口径 = 换向的(步,轴)对 / 活动的(步,轴)对;匀速条一条都不翻。 + self.assertAlmostEqual(float(p0['reverse_rate'][0]), 2.0 / 18.0, places=5) self.assertLess(float(p1['reverse_rate'][0]), 1e-6) def test_waste_penalty_also_separates_them(self):