Files
blackbird/pybot
qing 9179281420 fix(pybot×actpred): v3 审计 P2 清零——验收链 fixed_range + 导出断言 + overrun 节流
- v3-P2-1: _npu_test/_onnx_validate 按 normalize_mode 分支(fixed_range 免 stats,
  HailoPredictor 透传模式,torch 参考同口径反归一化)
- v3-P2-2: export_deploy/export_onnx 一致性 diff 超 1e-4 即 sys.exit(P2-f 闭环)
- v3-P2-3: run_loop overrun 告警节流(第1次+每100次),降 hz 建议仅 >10% 输出
- P2-a1: default_column_weights 扩展列(action_dim>18)默认 1.0
- P2-c: 补 predictor 异常清理路径测试(异常传播 + finally 落盘)
- P2-d/P2-e: Resize 口径与 resume scheduler T_max 语义文档化
- R2-4: _set.sh 安装后断言 CPU 版 torch,误装 CUDA 即拦截
测试: pybot 89 passed (+1)、actpred 148 passed/18 skipped
2026-08-14 23:01:56 +08:00
..

pybot

机器人 .mt 动作脚本解析器 —— bot4cj(仓颉版)的 Python 迁移版。

驱动大顺(Dashun)蜘蛛机器人(树莓派 aarch64,10 舵机 + 2 云台, PCA9685 PWM 控制器 + MPU6050 姿态传感器)。

迁移方案与审计修复映射见 docs/reports/bot4cj_python_migration_dev_doc.md。

特性

  • 零第三方依赖:纯标准库(fcntl / struct / threading / wave / argparse), 树莓派上 git pull 即部署,无构建步骤。 (picamera2 为可选依赖,仅 @Camera 摄像头块需要,树莓派 OS 预装,勿 pip 安装)
  • 与仓颉版逐语义对齐:FSM 解析器、占位符递归、Servo 校准算法、 PCA9685 寄存器序列均与 bot4cj 一致(Mock 总线 journal 可逐字节 diff)。
  • Python 插件替代 Lua:modules/<块名>.py 定义 build(ctx) / call(ctx) / destroy(ctx),消除 JSON 深拷贝 + 五层 FFI 桥接。
  • 审计修复:bot4cj 审计 15 项发现(S01S08 / Q01Q07)全部修复, 详见迁移文档 §5。

用法

cat scripts/std.mt | ./_run.sh              # 与 bot4cj 相同的管道用法
./_run.sh scripts/std.mt                    # 位置参数(增强)
./_run.sh --dry-run scripts/std.mt          # Mock 总线,动作序列到 stdout
./_run.sh --test roundtrip in.mt out.mt     # 解析↔序列化往返自检
./_run.sh --verbose scripts/std.mt          # DEBUG 日志(stderr)
./_run.sh --record data/ep scripts/std.mt   # 录制 actpred 格式 episode

--record 时若脚本含 @MPU6050_BIND 块,逐帧同步落盘 imu.npy (每传感器 8 槽 roll,pitch,ax,ay,az,gx,gy,gz;多个传感器(≤4)按块行顺序 拼接,shape (T, 8×N),与图像/动作按帧时刻天然对齐); 无 IMU 硬件则保持旧格式(仅 images + actions.npy)。

-i / -o 参数位保留(reserved),未来对接跨进程 FIFO。

实时预测闭环(--loop)

--loop CKPT 进入进程内闭环:采样 → actpred 推理 → 执行 → 回写历史。 脚本提供硬件配置与 @Action 表头(动作向量索引映射),不执行脚本动作行。

./_run.sh --loop ../actpred/checkpoints/best_inference.pt --hz 10 scripts/std.mt
./_run.sh --loop actpred_pretrain.hef --hz 20 --loop-steps 100 scripts/std.mt  # NPU 后端
  • checkpoint 后缀 .hef → Hailo NPU 后端,否则 → PyTorch 后端
  • hz 须 ≥ 推理 + 执行耗时(ONNX ~11ms / Hailo ~12ms,hz ≤ 50 安全)
  • @Action 表头列数须 ≤ action_dim(默认 18),闭环中跳过 spk.delay 阻塞
  • 帧源:闭环从 camera 守护线程队列取最近 F 帧(无阻塞),@Camera 的 framerate 建议 ≥ 2×hz 以保证帧新鲜度;capacity 应 ≥ F(帧窗长度)。 部署时若日志出现 loop overrun 告警,说明 hz 超过推理+执行能力,应降低 hz
  • 姿态回流(R2):脚本含 @MPU6050_BIND 且模型带 imu 输入 (predictor.imu_dim 非 None)时,每步读取 MPU6050 最新姿态随帧/历史 一同传给推理器(原始量纲,归一化在推理端完成);多个传感器(≤4)按 块行顺序拼接为 8×N 向量,再 pad/truncate 到 predictor.imu_dim; 模型无 imu 输入时不接入推理(若带 --record 仍会读取落盘 imu.npy)

目录

pybot/              # 包:parser / robot / hardvars / plugin / main
pybot/hd/           # 硬件层:i2c / spi / servo / kalman / mpu6050 / speaker / camera
modules/            # 硬件驱动插件:PCA9685 / SPI / ADS1115 / ADS1256
scripts -> ../bot4cj/scripts    # .mt 脚本与仓颉版共享
tests/              # pytest 单元测试(Mock 总线,无需硬件)

插件查找顺序:$PYBOT_MODULES_PATH(os.pathsep 分隔:Linux : / Windows ;)→ 包内置 modules/ → ./modules/。

开发

./_set.sh                       # venv + pytest 全量测试
venv/bin/python -m pytest tests/ -v

.mt 脚本格式

见 bot4cj/README.md 与 scripts/std.mt。 格式要点:@块名 开块、行 0 为表头、; 结行、# 注释、 - 占位符(非首行取上一行同列值;首行数值列解析为 0)、@ 收块。

新增块(无仓颉版对应):

@Camera
 name  width  height  framerate  capacity;
 cam0    1920     1080       30         4;
@

build 启动后台抓帧线程,维护容量为 capacity 的有界帧队列(满丢最旧帧); play 返回最新帧 (时间戳, frame)。