Microduck Workshop
GitHub ↗

SELF-PACED WORKSHOP

拆解机械结构与控制周期

先把外壳、关节、执行器和传感器分开理解,再看它们如何组成一台可控制的机器人。

第 2 章 · 预计学习时长 20 分钟

从整体到组件

在 Isaac Sim 中,机器人模型不仅包含外观,还定义关节、碰撞几何和质量属性。先认识 Microduck 的机械结构,后续才能把关节名称、动作向量与仿真中的运动对应起来。Isaac Lab 会在此基础上组织观测、动作和训练任务。

Microduck 是一台小型双足机器人:双腿承担支撑与移动,颈部机构负责调整视线,机身则容纳计算、电源和连接部件。视觉网格用于呈现外观,关节与碰撞模型用于规定可发生的运动和接触,二者在仿真中承担不同职责。

Microduck
点击部件或名称,即可放大查看

左键拖动旋转,按住滚轮拖动平移,滚轮或双指缩放;移动滑块可展开结构。

将展开滑块移到中间,先找出左右腿和头颈部的舵机,再点击名称查看它们驱动的关节。继续展开,观察相机、主控板和电池的位置。最后返回总览,沿一条腿追踪关节之间的连接关系。

从机械结构到关节控制

本章要解决一个基础问题:策略输出的 14 个数字,怎样变成可见的机器人动作?先在模型中找到躯干、左右腿和头部,再沿“躯干 → 髋关节 → 膝关节 → 踝关节 → 脚”观察连接关系。这样,后面遇到关节顺序、坐标变换或脚部接触问题时,就能找到它们在实体结构中的对应位置。

左右滑动查看完整图示

从关节目标到脚的位置关节目标 q*:策略决定希望转到哪里;舵机与关节:实际角度 q 会随受力变化;连杆与脚:连杆关系决定脚的位置从关节目标到脚的位置关节目标 q*策略决定希望转到哪里舵机与关节实际角度 q 会随受力变化连杆与脚连杆关系决定脚的位置
目标角度与实际角度并不总是相同。惯性、接触和执行器响应都会影响最终运动。

关节角度决定连杆的相对姿态;沿一条机械链组合这些姿态,就能算出脚或相机相对于机身的位置。先理解这个关系,后面就能区分“头转了”和“身体转了”。

拓展:怎样沿机械链计算位置

描述一个零件的位置,还需要说明它相对于哪个坐标系。齐次变换矩阵统一表示旋转 R 和平移 t;沿机械链依次相乘,就能把脚坐标系中的点转换到躯干坐标系。这就是正向运动学:根据已知关节角度计算末端位置。

齐次变换与机械链
\[T=\begin{bmatrix}R&\mathbf t\\\mathbf 0^{\mathsf T}&1\end{bmatrix},\qquad {}^{B}T_F(q)= {}^{B}T_1(q_1)\,{}^{1}T_2(q_2)\cdots{}^{k}T_F(q_k)\]

上标 B 表示躯干坐标系,下标 F 表示脚坐标系;每一项变换都来自零件的装配位置和关节转角。把相机安装在头上时,也需要沿颈部和头部的机械链计算相机朝向,不能把头部转动误认为整个身体转动。

展开模型,分别找到膝关节舵机、电池和脚,说明它们在驱动、供电和支撑中的作用。再回到装配状态,沿一条腿解释支撑力如何传回躯干。

先分清零件、关节和自由度

一支笔以笔尖为支点时可以朝多个方向转动,而铰链通常只能绕一条固定轴旋转,机器人关节也受到类似约束。自由度表示描述允许运动所需的独立变量数量,零件数量则表示装配体包含多少实体,两者并不相等。因此,网页中展示 70 个组件,并不意味着策略需要输出 70 个动作。

区域活动关节主要作用
每条腿髋偏航、髋侧倾、髋俯仰、膝、踝,共 5 个控制支撑与脚的位置
颈部与头部颈俯仰、头俯仰、头偏航、头侧倾,共 4 个改变相机朝向与头部姿态
喙部实物有舵机;本课程策略不控制仅用于 3D 模型 展示,不计入 14 维策略动作

点击髋部舵机,观察输出轴及其附近的轴承。舵机驱动关节转动,轴承支撑旋转部件,支架连接相邻关节。对照模型,区分哪些零件随输出轴转动、哪些零件固定在上一级连杆上。

软件如何让部件运动

  1. 1策略输出动作
  2. 2转换关节目标
  3. 3执行器产生力矩
  4. 4物理更新状态
  5. 5传感器提供新观测

策略不会直接把机器人移动到指定位置,而是输出一组动作,再由动作接口转换成关节目标。执行器根据目标状态与实际状态之间的差异产生力矩;机器人最终如何运动,还会受到接触、重力、惯量和摩擦的共同影响。

这里的控制循环频率为 50 Hz,物理步进频率为 200 Hz,因此每个策略动作会持续四个物理步。齿隙模型还会引入被动关节来描述传动间隙,但这些关节并不是额外的策略输出。

用坐标系描述运动

坐标系课程中的对应内容
世界坐标系场地、球门和机器人整体位置
身体坐标系前进、侧移、转向指令以及球相对身体的位置
相机坐标系图像射线与检测目标方向
关节局部坐标系一个关节的旋转轴与角度

检查理解

头部关节保持不动时,相机画面一定稳定吗?

查看解析

不一定。机身可能发生俯仰和横滚,颈部也会随之运动。判断画面是否稳定,应观察相机相对于世界坐标系的姿态,不能只看头部关节角度。

练习:沿一条受力路径找部件

先在装配状态下沿脚踝、小腿、膝部、大腿和髋部向上追踪。脚掌着地后,支撑力会沿这条路径传到机身。随后展开模型,点击关节附近的舵机,辨认相邻连杆的连接方式。

舵机内部不仅有电机,还包括减速齿轮、位置反馈和控制电路。收到目标角度后,舵机需要一定时间进行跟踪,并受到可用扭矩、速度、摩擦和齿隙的限制。因此,“策略输出一个角度”不等于“关节立即到达该角度”。本章说明这一差别,第三章则介绍策略如何适应它。

检查理解

在拆解图中把脚部拉得更远,会改变仿真的腿长吗?

查看解析

不会。网页中的拆解图只用于认识组件,仿真里的部件长度和关节连接仍由机器人描述文件定义。

先把“指令—动作—反馈”闭环跑通

第一章的实验使用 Isaac Lab 的 Microduck 任务加载固定行走策略,以 Newton 作为物理后端,并通过 Isaac Sim 窗口观察给定速度指令下的运动。Isaac Lab 3 把物理、渲染与可视化分开:Newton 可以在不启动 Kit 的轻量路径中运行,而交互实验入口为了显示场景显式要求 Isaac Sim 6。重点是接口与反馈:输入是否正确、动作是否按时更新、实际速度是否接近指令。

左右滑动查看完整图示

Isaac Lab、Newton 与 Isaac Sim 的职责Isaac Lab 定义机器人学习任务,Newton 在 GPU 上推进物理状态。需要图像或交互界面时,由 Isaac Sim 提供渲染和传感器能力。Newton 物理执行不必依赖 Kit。 任务接口、物理后端与渲染能力分工 动作 ⇄ 物理状态按需接入图像与界面 Isaac Lab任务 · 观测 · 奖励 · 并行环境 NewtonWarp / CUDA · 动力学与接触物理执行可不依赖 Kit Isaac SimOpenUSD · RTX · 相机与交互本课程可视化任务使用此路径
Isaac Lab 统一组织学习任务,Newton 负责物理推进;需要相机图像或交互界面时,再使用 Isaac Sim 的渲染与传感器能力。区分这些职责,有助于按训练和验证任务选择运行方式。

左右滑动查看完整图示

行走闭环观测 oₜ:姿态、关节状态、上一动作与指令;策略 π:61 维输入 → 14 维动作;Newton 仿真:执行动作,产生下一次观测行走闭环下一次观测 oₜ₊₁观测 oₜ姿态、关节状态、上一动作与指令策略 π61 维输入 → 14 维动作Newton 仿真执行动作产生下一次观测
速度指令决定“往哪里、以多快的速度走”;策略负责把它转为协调的关节动作。
位置控制接口
\[\mathbf a_t=\pi_\theta(\mathbf o_t),\qquad \mathbf q_t^{*}=\mathbf q_{\mathrm{default}}+s\mathbf a_t,\quad s=1\]

q* 是关节目标角度,qdefault 是默认站姿。这里动作缩放系数 s 为 1;动作既不是力矩指令,也不是把速度直接写入机器人位置。实际运动由执行器和物理引擎计算。即使输入输出维度相同,关节顺序、偏置或观测归一化不一致,也会导致动作错误。

策略:每 20 ms 输出一次动作(50 Hz)aₜ:关节目标物理:每 5 ms 推进一步(200 Hz)第 1 步0 ms第 2 步5 ms第 3 步10 ms第 4 步15 ms20 ms动作保持不变;位置、速度与接触力仍在逐步变化
一个策略周期包含四次物理更新。画面帧率与这两个更新频率不是同一概念:画面变慢不一定表示仿真时间步长发生变化。
Python · 核心代码节选完整代码 ↗
action = policy(
    env.observation_manager.compute(update_history=True)["policy"]
)
env.action_manager.process_action(action)
for tick in range(4):
    env.action_manager.apply_action()
    env.scene.write_data_to_sim()
    env.sim.step(render=not a.headless and tick == 3)
    env.scene.update(0.005)

这段节选对应图中的闭环:Isaac Lab 的观测管理器生成策略输入,动作管理器处理动作并驱动执行器,Newton 随后执行四个 5 ms 物理步。完整程序还会更新计数器并检查是否跌倒。下面的命令先保持约 2 秒站姿,再发送速度指令;不要把启动阶段的静止误判为策略无响应。

Terminal · Bash
python3 scripts/workshop.py walk \
  --model models/walk.onnx --velocity 0.25 0 0 \
  --seconds 12 --seed 202 \
  --output outputs/walk-control-01

运行结束后,同时查看画面和 report.json:是否达到设定时长,fell 是否为 false。再用 trajectory.json 比较稳定行走阶段的实际速度与指令速度。均方根误差可用于概括速度跟踪表现,但本章不设未经验证的统一及格阈值;先确认不跌倒,再比较不同方向和速度。

速度跟踪的一个统计量
\[\mathrm{RMSE}_v=\sqrt{\frac{1}{N}\sum_{t=1}^{N}\|\mathbf v_{xy,t}-\mathbf v_{xy,t}^{\mathrm{cmd}}\|_2^2}\]

本章只做推理,不更新模型参数,也不需要带标签的数据集。仿真中的观测、动作、接触状态和轨迹就是本次实验的数据。Newton 处理足地接触、执行器延迟与齿隙后,实际关节不一定立即到达策略给出的目标;这正是闭环观测不可省略的原因。后续训练会用 Isaac Lab 把相同交互扩展到多个 GPU 并行环境。

策略收到什么,又输出什么

第一章使用已经训练好的策略进行推理:它把当前观测映射为 14 个关节动作,运行过程中不会更新神经网络参数。需要特别区分的是,更改速度指令只是在测试同一个模型的响应,并非重新训练;更新策略参数需要训练或更换模型权重。

观测项(按接口顺序)维数帮助策略判断什么
角速度与身体坐标下的重力方向6身体正在怎样转动、倾斜
相对关节位置14当前姿态与默认姿态的差异
关节速度14各关节正在怎样运动
上一动作14上一次的控制输出,为策略提供时序信息
速度、头部与身体姿态指令3 + 4 + 6这一步希望机器人做什么
观测输入61⋮输入归一化隐藏层 1512⋮ELU隐藏层 2256⋮ELU隐藏层 3128⋮ELU动作输出14⋮关节动作全连接层 · 每 20 ms 推理一次 · 不输入相机图像
61 维观测按固定顺序拼接,归一化后经过三个隐藏层,得到 14 维动作。圆点数量为示意,层宽以数字为准。动作管理器再将动作转换为关节目标;相机图像不在这个行走策略的输入中。

这些数值合计构成 61 维输入。即使输入形状仍为 61,只要打乱关节顺序,语义就会被破坏,例如策略可能把膝关节状态误当成髋关节状态。实验入口会保持关节顺序、默认姿态和控制节拍一致。应先通过指令、时间预算和输出目录开展实验,理解接口后再修改底层观测。

现在已经知道策略如何读取状态、输出动作,以及舵机和物理仿真怎样执行这些动作。下一章从加载现成模型转向训练模型:用 Isaac Lab 让策略通过反复尝试学会行走。

参考资料