exp+fix: try3 反向档位(刹车+93%/到达-6.6pp)与 K16 构成试候选数的单调轴;reverse 指标补动步口径+可手算负对照

This commit is contained in:
cbb
2026-10-20 22:42:11 +08:00
parent c5fccf1e48
commit ea762a331f
5 changed files with 129 additions and 3 deletions
+27
View File
@@ -824,6 +824,9 @@ class TravelPenaltySelectTest(unittest.TestCase):
# 口径 = 换向的(步,轴)对 / 活动的(步,轴)对;匀速条一条都不翻。
self.assertAlmostEqual(float(p0['reverse_rate'][0]), 2.0 / 18.0, places=5)
self.assertLess(float(p1['reverse_rate'][0]), 1e-6)
# 这条夹具全程都在动(没有站住的步),所以"只算动过的步"的口径必须与旧口径相同、动步占比 = 1
self.assertAlmostEqual(float(p0['reverse_rate_moving'][0]), float(p0['reverse_rate'][0]), places=6)
self.assertAlmostEqual(float(p0['moving_share'][0]), 1.0, places=6)
def test_waste_penalty_also_separates_them(self):
"""换成"白费比例"(1 − 同轴净位移/累计行程)也必须能分开,且罚度按当前误差缩放:
@@ -862,5 +865,29 @@ class TravelPenaltySelectTest(unittest.TestCase):
torch.testing.assert_close(out[0]['traj'], out[1]['traj'], rtol=0, atol=0)
def test_standing_steps_dilute_the_all_step_version(self):
"""负对照(可手算):+0.9 → 站一拍 → −0.9。方向翻转发生在"停住"两侧,
全步口径给 1/(3×6)=1/18,只算动过的步给 1/(2×6)=1/12 ⇒ 证明"刹停越多显得越不抖"这个稀释效应是真的。"""
class SafeKin:
def clamp_box(self, q):
return q
def gaps(self, q, cap):
return {'gm': torch.full((len(q), 49), 1.0, device=q.device)}
seq = [[0.9, 0, 0, 0, 0, 0], [0.0, 0, 0, 0, 0, 0], [-0.9, 0, 0, 0, 0, 0]] + [[0, 0, 0, 0, 0, 0]] * 13
acts = torch.tensor([seq], dtype=torch.float32) # 只有 1 条候选
with patch('ml.sim.closed_loop.features', return_value=torch.zeros(1, 83)), \
patch('ml.sim.closed_loop.goal_err',
side_effect=lambda kin, q, T, R: (torch.full((q.shape[0],), 10.0), torch.zeros(q.shape[0]))):
_, per = rollout(self.StubModel(acts), SafeKin(), [{'q0': [0] * 6, 'T': [10, 0, 0]}], 'cpu',
K=1, safety=True, max_sec=0.06, return_traj=True, use_sub=False,
select='endpoint', replan='empty', commit_n=3, safety_partial=3)
self.assertAlmostEqual(float(per['traj'][0, 3, 0]), 0.0, places=5) # 1.08 → 停 → 回 0
self.assertAlmostEqual(float(per['reverse_rate'][0]), 1.0 / 18.0, places=5)
self.assertAlmostEqual(float(per['reverse_rate_moving'][0]), 1.0 / 12.0, places=5)
self.assertAlmostEqual(float(per['moving_share'][0]), 2.0 / 3.0, places=5)
if __name__ == '__main__':
unittest.main()