feat(abs-target): 方案 B 初版——Y 改 16 步绝对目标角(/180),训练/评估/rollout/ckpt 适配;修复前缀噪声增广对绝对目标的标签污染(eps 直接加到绝对位置=18°);实测一步生成误差 31°、闭环 0%,此配方不成立

This commit is contained in:
cbb
2026-10-20 01:03:35 +08:00
parent fc17ae10d0
commit 217a70b484
5 changed files with 88 additions and 30 deletions
+11 -2
View File
@@ -43,6 +43,9 @@ class Samples:
sc = {float(m['act_scale']) for m in metas}
if len(sc) > 1: raise SystemExit(f'样本目录的 act_scale 不一致 {sorted(sc)}({dirs}):DAgger 样本须与主数据同一版打包')
self.act_scale = sc.pop(); self.data_ver = int(metas[0].get('data_ver', 1)) if metas else 1
ab = {bool(m.get('abs_target', False)) for m in metas}
if len(ab) > 1: raise SystemExit(f'样本目录的 abs_target 不一致 {sorted(ab)}({dirs}):绝对目标与增量标签不能混用')
self.abs_target = ab.pop() if ab else False
for d in dirs:
for fx in sorted(glob.glob(os.path.join(d, '*.X.npy'))):
b = fx[:-6]
@@ -87,8 +90,14 @@ class Samples:
km = (torch.arange(3, device=dev)[None] < pl[:, None]) & m[:, None] # [B,3] 前缀有效步
eps = rn(B, 3, 6) * ps * km[..., None].to(X.dtype) # STEP 为单位
X[:, PREFIX_SL] = X[:, PREFIX_SL] + eps.reshape(B, 18)
Y[:, :3] = Y[:, :3] + eps / self.act_scale # Y 以 act_scale·STEP 为单位
Y[torch.arange(B, device=dev), pl.clamp(max=Y.shape[1] - 1)] -= eps.sum(1) / self.act_scale
if self.abs_target:
# 2026-10-19(方案 B):标签是绝对目标角(/180)。前缀噪声会真实执行 → 前 r 步绝对目标
# 跟着累计偏移(eps 加进前缀特征时就是度),第 r 步扣回、之后回到原轨迹。
Y[:, :3] = Y[:, :3] + torch.cumsum(eps, 1) / 180.0
Y[torch.arange(B, device=dev), pl.clamp(max=Y.shape[1] - 1)] -= eps.sum(1) / 180.0
else:
Y[:, :3] = Y[:, :3] + eps / self.act_scale # Y 以 act_scale·STEP 为单位
Y[torch.arange(B, device=dev), pl.clamp(max=Y.shape[1] - 1)] -= eps.sum(1) / self.act_scale
Y.clamp_(-1, 1)
ds = float(cfg.get('aug_dq_sigma', 0.0))
if ds > 0: