From 76afa37c6b369bd4a2bf471678b2d0e10daa0c8c Mon Sep 17 00:00:00 2001 From: qing <1776177662@qq.com> Date: Sun, 16 Aug 2026 16:17:55 +0000 Subject: [PATCH] =?UTF-8?q?fix(pybot):=20=E5=BD=95=E5=88=B6=20spk.F=20?= =?UTF-8?q?=E6=81=92=200=20=E6=94=B9=E4=B8=BA=E5=8A=A8=E6=80=81=E5=88=97?= =?UTF-8?q?=E6=9F=A5=E6=89=BE=E2=80=94=E2=80=94=E4=B8=8D=E4=BE=9D=E8=B5=96?= =?UTF-8?q?=E5=9B=BA=E5=AE=9A=E5=88=97=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原 recorder 按固定索引 SPK_F_COL=10 写 0,脚本列布局变化时会写错列; 改为 RobotStruct 录制前按设备名+参数名动态定位 frequency 列(无 Speaker 块返回 None 跳过),与模型固定输出契约一致,语义与 286e632 相同。 --- pybot/pybot/robot.py | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/pybot/pybot/robot.py b/pybot/pybot/robot.py index fba47b5..64d0e05 100644 --- a/pybot/pybot/robot.py +++ b/pybot/pybot/robot.py @@ -163,6 +163,7 @@ class RobotStruct: raise ValueError("no @Action matrix in script") columns = self._validate_action(action) # Q05: 执行前整表校验 delay_idx = self._find_delay_idx(columns) + freq_idx = self._find_freq_idx(columns) camera_var = None imu_vars = [] @@ -198,8 +199,8 @@ class RobotStruct: if recorder is not None: recorder.record( self._grab_frame(camera_var), - self._build_action_vec( - step_vals, recorder.action_dim), + self._record_vec(step_vals, recorder.action_dim, + freq_idx), imu_vec=self._read_imus(imu_vars)) self._execute_step(step_vals, columns) if self.dry_run: @@ -209,7 +210,7 @@ class RobotStruct: if recorder is not None: recorder.record( self._grab_frame(camera_var), - self._build_action_vec(vals, recorder.action_dim), + self._record_vec(vals, recorder.action_dim, freq_idx), imu_vec=self._read_imus(imu_vars)) self._execute_step(vals, columns) @@ -416,6 +417,22 @@ class RobotStruct: return j return None + def _find_freq_idx(self, columns): + """找到 spk.F(frequency)列索引;无 Speaker 返回 None""" + for j, (dev, param) in enumerate(columns): + if isinstance(self.M.get(dev), SpeakerVar) and \ + self._resolve_param(param) == "frequency": + return j + return None + + def _record_vec(self, vals, action_dim, freq_idx=None): + """构建录制动作向量;spk.F 列固定写 0(只影响声音不影响运动, + 与模型固定输出契约一致——音频元数据不进入学习数据)""" + vec = self._build_action_vec(vals, action_dim) + if freq_idx is not None: + vec[freq_idx] = 0.0 + return vec + def _build_step_vals(self, prev_vals, target_vals, columns, k, n): """为微步 k 构建插值后的值列表""" vals = []