exp+fix: try3 反向档位(刹车+93%/到达-6.6pp)与 K16 构成试候选数的单调轴;reverse 指标补动步口径+可手算负对照
This commit is contained in:
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user