华北五省机器人 TonyPi 的新思路:半成品交互式学习工具(魔改动作)

华北五省机器人 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 代理模型 (小样本友好)

关键改进

  1. 去掉 LLM 中间环节:直接让贝叶斯优化器生成动作组
  2. 概率模型处理小样本:用高斯过程建模不确定性
  3. 显式不确定性建模:指导探索策略,避免盲目搜索

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)?

  1. 小样本友好:不需要大量数据
  2. 不确定性建模 :输出 mean ± std,知道模型对预测的置信度
  3. 概率预测:输出完整分布而非点估计
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 当前局限

  1. 半成品:部分功能可能不稳定
  2. 单目标优化:主要针对直行优化
  3. 无仿真集成:仍需真机测试

8.2 未来方向

  • 保存/加载优化会话
  • 多目标优化 (Pareto)
  • 跨环境迁移学习
  • 主动学习策略优化
  • 批量测试支持
  • Web 可视化界面

九、总结

本文介绍了一种基于贝叶斯优化 + 人类在环的 TonyPi 动作组优化方案。通过:

  1. 概念空间降维:18 舵机 → 4 概念
  2. 高斯过程代理模型:小样本友好的不确定性建模
  3. 多种采集函数:平衡探索和利用
  4. 交互式 Shell:便捷的人类反馈接口

核心价值:在无仿真、小样本、人类主观反馈的约束下,实现快速收敛的动作组优化。


项目信息

品牌 : Gewis Lab (TJCU)
主打 : For TonyPi
仓库: https://gitcode.com/GewisLab/Robot-competition

⚠️ 警告: 本项目正在开发中,核心算法已实现,但部分功能可能不稳定。如有问题或建议,欢迎交流!


2026-04-20

相关推荐
圆弧YH2 小时前
python→ Film
学习
QYR-分析2 小时前
全地形轮足机器人行业发展分析:分类、格局与市场机遇
大数据·人工智能·机器人
三品吉他手会点灯2 小时前
C语言学习笔记 - 5.C概述 - C的应用领域
c语言·笔记·学习
小机学AI大模型2 小时前
别做“预制学习”:AI Agent 从 0 到上线的最短闭环
学习
HalvmånEver2 小时前
MySQL的数据类型(二)
linux·学习·mysql
Deepoch2 小时前
Deepoc 具身模型开发板在果蔬采摘机器人中的技术应用
人工智能·科技·机器人·具身模型·deepoc·采摘
深蓝海拓2 小时前
基于QtPy (PySide6) 的PLC-HMI工程项目(十一)框架的进一步完善:UI的自动周期更新以及下行数据的生成和处理
网络·笔记·python·学习·ui·plc
椰羊~王小美2 小时前
讲解“实时”是怎么实现的
学习
ok_hahaha2 小时前
AI从头开始-黑马LongGraph-简单学习
人工智能·学习·langchain·lang graph