华北五省机器人 TonyPi 的新思路:半成品交互式学习工具
前言
⚠️ 声明:本项目为半成品,核心算法已实现,但部分功能可能不稳定。本文仅作思路分享,欢迎交流讨论。
仓库链接:https://gitcode.com/GewisLab/Robot-competition
一、背景问题
在华北五省机器人大赛中,TonyPi 双足机器人需要在硬地板上完成巡线任务。传统方法面临以下困境:
1.1 小样本困境
每次调整参数后,需要人类将动作组放入机器人测试,根据行走效果反馈(偏左/偏右/稳定)。通常只有 5-10 次反馈 就要收敛到可用的动作组。
1.2 无仿真环境
无法在电脑上批量自动化测试,必须真机测试。每次测试都是时间成本:
- 烧录动作组 → 运行 → 观察效果 → 记录反馈
1.3 高维动作空间
18 个舵机 × N 帧动作,参数空间巨大:
A = {a | a ∈ [200, 800]^(18×T)}
≈ 600^(18×T) # 搜索空间指数级增长
1.4 LLM 推理误差
之前我们尝试让 LLM 理解反馈后直接写代码生成动作组,但 LLM 生成的代码经常有 bug,需要额外调试。
二、解决方案:贝叶斯优化 + 人类在环
2.1 核心思路
传统流程:
人类反馈 → LLM 推理 → 写代码 → 生成 d6a → 测试 → 循环
↑ ↓
└────────────────────┘
(LLM 可能出错)
优化后流程:
人类反馈 → 贝叶斯优化 → 直接生成 d6a → 测试 → 循环
↑
└─ GP 代理模型 (小样本友好)
关键改进:
- 去掉 LLM 中间环节:直接让贝叶斯优化器生成动作组
- 概率模型处理小样本:用高斯过程建模不确定性
- 显式不确定性建模:指导探索策略,避免盲目搜索
2.2 为什么是贝叶斯优化?
| 特性 | 传统 RL | 贝叶斯优化 |
|---|---|---|
| 样本需求 | 数千~数百万 | 5-20 次 |
| 奖励信号 | 自动环境交互 | 人类主观反馈 |
| 不确定性 | 通常忽略 | 显式建模 |
| 仿真环境 | 通常需要 | 不需要 |
三、核心算法详解
3.1 概念空间降维
关键洞察:机器人的偏左/偏右主要由左右髋关节不对称性决定。
我们将 18 个舵机参数压缩为 4 个关键概念:
| 概念 | 说明 | 范围 |
|---|---|---|
bias_direction |
左右偏移方向 | -1.0 ~ +1.0 |
symmetry_score |
步态对称性 | 0.0 ~ 1.0 |
step_amplitude |
步幅大小 | 0.0 ~ 1.0 |
stability_score |
稳定性评分 | 0.0 ~ 1.0 |
python
class ActionEncoder:
def encode(self, d6a_data):
# 从 18×T 维 → 4 维概念空间
bias = calculate_hip_asymmetry(d6a_data) # 偏左/右
symmetry = calculate_gait_symmetry(d6a_data) # 对称性
amplitude = calculate_step_amplitude(d6a_data) # 步幅
stability = calculate_stability(d6a_data) # 稳定性
return [bias, symmetry, amplitude, stability]
3.2 高斯过程代理模型
为什么用高斯过程 (GP)?
- 小样本友好:不需要大量数据
- 不确定性建模 :输出
mean ± std,知道模型对预测的置信度 - 概率预测:输出完整分布而非点估计
python
class GaussianProcessModel:
def predict(self, concept_vector):
"""
返回: (mean, std)
- mean: 预测的奖励
- std: 预测的不确定性
"""
return reward_mean, reward_std
def update(self, concept_vector, actual_reward):
# 根据人类反馈更新模型
# 重新计算后验分布
pass
3.3 采集函数
采集函数决定下一步探索哪里,平衡探索和利用:
3.3.1 UCB (Upper Confidence Bound)
python
def ucb(mean, std, beta=2.0):
return mean + beta * std # 平衡探索/利用
mean高 → 可能好,探索利用std大 → 不确定性高,探索
3.3.2 Expected Improvement (EI)
优先选择能超过当前最佳的动作:
python
def ei(mean, std, best_reward):
improvement = best_reward - mean
z = improvement / (std + 1e-9)
return improvement * norm.cdf(z) + std * norm.pdf(z)
3.3.3 Thompson Sampling
从模型分布中随机采样:
python
def thompson_sampling(gp_model):
# 从 GP 后验分布中采样一个概念向量
return gp_model.sample_prior()
3.4 优化循环
┌──────────────────────────────────────────────────────────────┐
│ Bayesian Optimization Loop │
├──────────────────────────────────────────────────────────────┤
│ │
│ 1. [初始化] │
│ - 加载基准 d6a 文件 │
│ - 扫描现有 d6a 构建先验知识 │
│ - 初始化 GP 模型 │
│ │
│ 2. [生成候选] │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ For each candidate: │ │
│ │ score = acquisition(mean, std) │ │
│ │ Select top-2 candidates │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ 3. [人类反馈] │
│ - 测试候选 A 和候选 B │
│ - 人类选择: A 好 / B 好 / 差不多 │
│ - 转换为奖励信号 │
│ │
│ 4. [模型更新] │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ GP.update(candidate, reward) │ │
│ │ ↓ │ │
│ │ 重新计算后验分布 │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ 5. [收敛检测] │
│ - 不确定性 < 阈值 → 收敛 │
│ - 达到最大迭代 → 停止 │
│ - 连续改进 < 阈值 → 停止 │
│ │
└──────────────────────────────────────────────────────────────┘
四、人类反馈接口
支持多种反馈方式,灵活适应不同场景:
| 方式 | 说明 | 适用场景 |
|---|---|---|
| 绝对评分 | 1-5 分直接评价 | 快速评估 |
| AB 比较 | A vs B 选择 | 更精准的偏好学习 |
| 方向细粒度 | 偏左10 ~ 偏右10 | 详细的偏移描述 |
| 权重标记 | 标记重要/不重要 | 影响先验分布 |
方向反馈示例
请选择方向反馈 (0-20):
0: 偏左10(严重左偏)
1: 偏左9
...
10: 直行
...
19: 偏右9
20: 偏右10(严重右偏)
五、先验知识构建
从现有 d6a 文件自动学习偏移模式,减少冷启动问题:
python
class PriorBuilder:
def scan_directory(self, path):
# 1. 扫描所有 d6a 文件
# 2. 计算每个文件的 bias_estimate
# 3. 统计偏移分布
# 4. 构建先验分布
pass
def get_prior_statistics(self):
return {
'count': 31, # 样本数量
'bias_mean': 0.015, # 平均偏移
'bias_std': 0.156, # 偏移标准差
}
六、项目结构
tonypi_cli/
├── cli/
│ └── commands.py # CLI 命令
├── core/
│ ├── d6a_io.py # d6a 文件读写
│ └── encoder.py # 动作编码器/解码器
├── models/
│ ├── surrogate.py # 高斯过程代理模型
│ └── acquisition.py # 采集函数
├── optimizer/
│ ├── optimizer.py # 贝叶斯优化器
│ └── prior.py # 先验知识构建
├── feedback/
│ ├── interface.py # 人类反馈接口
│ └── types.py # 反馈数据结构
└── storage/
├── database.py # 实验数据库
└── config.py # 配置管理
七、使用方法
7.1 安装
bash
cd Robot-competition/tonypi_cli
pip install -e .
7.2 交互式 Shell
bash
python -m tonypi_cli.main shell
╭─────────────────────────────────────╮
│ TonyPi 交互式菜单 │
╰─────────────────────────────────────╯
[1] 评估动作组
[2] 对比动作组
[3] 提供方向反馈
[4] 标记权重
[5] 启动优化循环
[6] 查看当前状态
[7] 扫描d6a目录构建先验
[8] 导出最佳动作组
[q] 退出
7.3 典型工作流程
1. shell → 7 (扫描d6a目录,构建先验知识)
└─ 排除不相关的动作文件
2. shell → 5 (启动优化循环)
├─ 输入基准d6a文件
├─ 设置最大迭代次数
└─ 选择优化策略 (ei/ucb/thompson)
3. 优化过程中:
├─ 生成候选 A 和 B
├─ 测试两个动作
└─ 反馈: A好/B好/差不多
4. shell → 6 (查看当前状态)
5. shell → 8 (导出最佳动作组)
八、局限性与未来方向
8.1 当前局限
- 半成品:部分功能可能不稳定
- 单目标优化:主要针对直行优化
- 无仿真集成:仍需真机测试
8.2 未来方向
- 保存/加载优化会话
- 多目标优化 (Pareto)
- 跨环境迁移学习
- 主动学习策略优化
- 批量测试支持
- Web 可视化界面
九、总结
本文介绍了一种基于贝叶斯优化 + 人类在环的 TonyPi 动作组优化方案。通过:
- 概念空间降维:18 舵机 → 4 概念
- 高斯过程代理模型:小样本友好的不确定性建模
- 多种采集函数:平衡探索和利用
- 交互式 Shell:便捷的人类反馈接口
核心价值:在无仿真、小样本、人类主观反馈的约束下,实现快速收敛的动作组优化。
项目信息
品牌 : Gewis Lab (TJCU)
主打 : For TonyPi
仓库: https://gitcode.com/GewisLab/Robot-competition
⚠️ 警告: 本项目正在开发中,核心算法已实现,但部分功能可能不稳定。如有问题或建议,欢迎交流!
2026-04-20