跳到主要内容

Robot PU 思考

课程:机器人思考(反馈回路)

"机器人思考"通常不是类似人类的思考。在机器人学中,它通常意味着:

  • 观察传感器
  • 计算调整量
  • 应用调整
  • 快速重复

这被称为反馈回路(闭环控制)。

在 Robot PU 中,行走和平衡是一个很好的例子。扩展程序的 moveBalance(...) 在行走时连续读取 IMU 并调整舵机目标。

1. 控制回路:开环 vs 闭环

A. 开环控制(无反馈)

开环意味着:

  • 你命令一个动作
  • 测量结果
  • 你假设机器人按预期运行

示例思路:

  • "将腿部舵机设置为这些角度,希望机器人稳定。"

优点:

  • 简单
  • 在完美硬件上可预测

缺点:

  • 对电池电压、摩擦力、负载、碰撞敏感
  • 当实际情况与假设不同时无法恢复

B. 闭环控制(反馈)

闭环意味着:

  • 命令一个动作
  • 测量发生了什么(传感器)
  • 计算误差
  • 修正命令

优点:

  • 对干扰鲁棒
  • 自纠正

缺点:

  • 更复杂
  • 需要良好的传感器数据和良好的调参

2. Robot PU 示例:moveBalance()(行走 + 平衡)

robotpu.ts 中,行走调用:

  • walk(sp, di)moveBalance(sp, di, ...)

moveBalance(...) 内部的高层思路:

  1. 观察: 读取 IMU 数据并估计身体倾斜
  2. 思考: 计算需要倾斜/偏移腿部和身体多少来保持平衡
  3. 行动: 将这些偏移作为"控制向量"应用到底层舵机目标

然后它调用底层步态引擎(wk.move(...))来推进运动状态。

3. 观察:balanceParam()(传感器 → 状态估计)

balanceParam() 读取加速度计:

  • input.acceleration(Dimension.X/Y/Z)

并计算与倾斜相关的内部信号(你将在代码中看到的示例):

  • bodyRollbodyPitch
  • 滤波版本 bodyRoll2bodyPitch2(随时间平滑)

这是一个小而重要的想法:滤波

  • 原始传感器有噪声
  • 滤波降低噪声,使控制输出不会抖动

4. 思考:将 IMU 倾斜转换为纠正偏移

moveBalance(...) 中,机器人使用估计的 roll/pitch 计算偏移:

  • 如果机器人向左倾斜 → 移动重心 / 舵机偏移以恢复
  • 如果机器人向右倾斜 → 做相反的操作

你将看到类似以下逻辑:

  • 钳制修正量(maxRollCtrl),防止过度纠正
  • 当倾斜较大时减速(安全 + 稳定性)

"思考"的输出是一组控制信号写入 pr.servoCtrl[...]

然后该控制向量与当前步态姿态目标结合。

5. 行动:应用控制并推进步态

行动步骤是:

  • 应用计算出的 servoCtrl 偏移
  • 调用 wk.move(...) 向当前姿态迈出一小步

这就是为什么运动动作被设计为反复调用:每次调用是反馈 + 运动更新的一次迭代。

6. 控制器类型(概念)

Robot PU 的平衡逻辑是启发式控制器的实际示例(手工设计的规则 + 钳制 + 平滑)。

其他常见控制器:

  • P 控制器:修正量与误差成正比
  • PD 控制器:比例 + 阻尼(使用误差变化率)
  • PID 控制器:比例 + 积分 + 微分

典型权衡:

  • P: 简单,但可能振荡
  • PD: 更稳定,更少超调
  • PID: 可以消除稳态误差,但调参可能棘手

7. 更高级的"思考"(非必须,但值得了解)

这些在更高级的机器人中很常见。这里作为未来方向提及(它们未在本教程代码中实现)

卡尔曼滤波器 / 互补滤波器

  • 更好的传感器融合(例如,加速度计 + 陀螺仪)和更好的状态估计

前馈控制

  • 从计划运动预测所需舵机输出

  • 与反馈结合以获得最佳结果

概率模型(贝叶斯 / 概率网络)

  • 显式表示不确定性(当传感器有噪声时有用)

强化学习

  • Q-learning / Q-tables:学习在每个状态下采取哪个动作

  • 现代变体使用神经网络(Deep Q Networks)

8. 实用 MakeCode 模式:观察 → 思考 → 行动

以下是你将在许多项目中重用的通用模式:

basic.forever(function () {
// Observation
const cm = robotPu.sonarDistanceCm()

// Thinking
let speed = 2
let turn = 0
if (cm > 0 && cm < 15) {
speed = -2
turn = 0.8
}

// Action
robotPu.walk(speed, turn)
})

"笨"机器人和"聪明"机器人之间的区别通常是思考步骤的质量。