Introduction

基于LBS的3D骨骼蒙皮动画的相关技术

Refereneces

  1. GAMES105
  2. https://www.cs.cmu.edu/~baraff/sigcourse/

P7

3D Computer Graphics

P10

3D Computer Animation

✅ 仿真,用于描述客观事物,它们的运动规律可以用精确的数来描述。GAMES103
✅ 动画,用于描述有主观意志的事物,使用统计的方式来对它们的行为建模(例如AI建模)。 GAMES105

P11

Why Do We Study Character Animation

  • A character typically has 20+ joints, or 50-100+ parameters
    • It is not super high-dimensional, so most animation can be created manually, by posing the character at keyframes
    • Labor-intensive, not for interactive applications

  • Character animation techniques
    • Understanding the mechanism behind motions and behaviors
    • Smart editing of animation/ Reuse animation / Generate new animation
    • “Compute-intensive”

✅ 计算机角色动画把原本劳动密集型的动画师工作变成计算密集型的工作。

P13

Character Animation Pipeline

P15

Where does a Motion Come From

根据是否使用物理,把角色动画分为两大类。

运动学 vs. 动力学对比

维度运动学方法 (Kinematic)动力学方法 (Dynamic)
核心思想直接控制关节姿态/速度通过力/力矩驱动角色
是否考虑质量
是否物理仿真
输出关节姿态/速度关节力矩/PD 控制目标
抗扰动能力
动作质量高(来自动捕/关键帧)取决于控制方法
计算成本
典型应用关键帧动画、Motion Matching、VR 化身物理仿真、Ragdoll、交互式控制

运动学方法:基于运动学直接更新角色状态,运动可以不符合物理规律。 ✅ 动力学方法:基于物理仿真,但实际会有简化,不能直接干预角色姿态。

P16

Keyframe-based/Kinematic Approaches

✅ 基于运动学直接更新角色状态,运动可以不符合物理规律。

P18

Physics-based/Dynamic Approaches

✅ 基于物理,但实际情况会有简化,不能直接干预角色姿态。

P19

Control Level

根据控制方式的高度,可以分为Low Level和Heigh Level

P20

low-level control

✅ 对每一帧每一个姿态进行精确控制每个细节。
✅ 优点:精确控制;缺点:低效。

P21

high-level control

✅ 控制高级目标。

Keyframe-based/Kinematic Approaches

P24

Disney’s 12 Principles of Animation

[http://the12principles.tumblr.com/]

✅ 在动画师总结的准则里隐藏了物理规则和艺术夸张

Keyframe Animation

✅ 这是一种非常low level的控制方法,可以保证所有细节,但非常慢

P26

Forward Kinematics

Given rotations of every joints
Compute position of end-effectors

P27

Inverse Kinematics

Given position of end-effectors
Compute rotations of every joints

P28

Interpolation

Motion Capture

动捕设备、视频动捕,把动捕角色应用到角色身上,需要经过重定向
动作捕捉和重放,不能产生新的数据

✅ 光学动捕、视频动捕、穿戴传感器动捕。

P34

Motion Retargeting

Given motions of a source character
Compute motions for target characters with

  • different skeleton sizes
  • different number of bones
  • different topologies
  • ……

P36

Motion Graphs / State Machines

✅ 把捕出来的动作进行分解和重组,生成新的动作。

P37

Motion Graphs

✅ 给一段任意的动作,寻找能够构建状态机切换的位。

P38

Motion Graphs的改进 - Interactively Controlled Boxing

[Heck and Gleicher 2007, Parametric Motion Graphs]

✅ 对Motion Graph的改进,比如一个节点中有很多动作,对这些动作进行插值,来实现精确控制。

P39

Motion Graphs的高级应用

Character Animation in Two-Player Adversarial Games
KEVIN WAMPLER,ERIK ANDERSEN, EVAN HERBST, YONGJOON LEE, and ZORAN POPOVIC Univoersity of Washington

Near-optimal Character Animation with Continuous Control
Adrien Treuille \(\quad\) Yongjoon Lee \(\quad\) Zoran Popovic
University of Washington

✅ Motion Graph+AI,实现高级控制
✅ 例如:AI使用Motion Graph,通过选择合适的边,进行执行,完成高级语义。

P42

Complex Motion Graphs

✅ 动作图非常复杂,容易出BUG.

P43

Motion Mathing

✅ 改进,Motion Graph的动作都是完整的片断,可以把动作再分细一点,切到每一帧。
✅ 不是完整地播放一段动作,而是每一帧结束后,通过最近邻搜索找到一个新的姿态,
✅ 满足:(1)接近控制目标(2)动作连续
✅ 关键:(1)定义距离函数(2)设计动作库

P45

Learning-based Approaches

https://caterpillarstudygroup.github.io/ImportantArticles/CharacterAnimation/HumanMotionGenerationSummary.html

✅ 对角色动作的内在规律去理解和建模,从数据学习统计规律。
✅ 生成模型:只需要采足够的动作去给模型就能生成新的动作。
✅ 不需要手工作切分、生成状态机

P49

Cross-Modal Motion Synthesis

  • Audio-driven animation
    • Music to dance
    • Co-speech gesture
    • ……
  • Natural language to animation
    • Descriptions to actions
    • Scripts to performance
    • ……
IDYearNameNoteTagsLink
2022Rhythmic Gesticulator✅ 语言和动作都有内存的统计规律,把两种统计模型之间建关系,实现跨模态生成。

总结

Physics-based/Dynamic Approaches

✅ 不直接生成姿态,而是控制量(例如力),通过物理仿真真正改变角色。


P59

Ragdoll Simulation

✅ 用于人死掉、失去意识、突发事件来不及响应的情况。

P63

物理仿真角色动画的应用

[DeepMotion: Virtual Reality Tracking]

[Ye et al. 2022: Neural3Points]

[Yang et al. 2022: Learning to Use Chopsticks]

✅ 抓住手指动作细节 P67

P68

物理角色的建模方法

✅ 构建完整的神经系统和肌肉系统。
✅ (1)神经肌肉机理不清楚。
✅ (2)自由度高,仿真效率低。
✅ 所以实际上会做简化,对关节力矩进行建模

✅ 用关节力矩仿真肌肉的力。

P70

Force & Torque

P71

Keyfrmae Control

Proportional-Derivative (PD) Control

✅ 根据当前状态与目标状态的差距,计算出当前状态运动到目标状态所需要的力矩。

P72

Tracking Controllers

✅ 比如要做一个动作,给出目标高度的轨迹,采用PD控制生成每个关节的力矩,大概能产生要做的动作

[Hodgins and Wooten 1995, Animating Human Athletics]

P76

Trajectory Crafting

NaturalMotion - Endorphin

✅ 关键帧→力→仿真

实际上这个方法很难用起来,因为调整仿真参数甚至比直接做关键帧更花时间。

P79

Spacetime/Trajectory Optimization

✅ 用优化方法实现,结合重定向

[Liu et al 2010. SAMCON]

[Wampler and Popović. 2009. Optimal gait and form for animal locomotion]

[Hamalainen et al. 2020, Visualizing Movement Control Optimization Landscapes]

✅ 这是高维非线性优化问题,非常准解。

P83

Abstract Models 简化模型

通过简化模型实现对一些动作的控制,但只能做简单动作

SIMBICON

✅ 用简化模型把想要的动作描述出来,来指导角色控制。
✅ 基于此实现稳定的多技能的控制策略。
✅ 控制简化、缺少细节,走路像机器人。
✅ 简化模型思路,可以实现对一些动作进行控制,且结果鲁棒,允许使用外力与角色交互。
✅ 缺点:只能走路,不能复杂动作。

P85

Inverted Pendulum Model

[Coros et al. 2010]

P87

Reinforcement Learning

P89

DRL-based Tracking Controllers

[Liu et al. 2016. ControlGraphs]

[Liu et al. 2018]

[Peng et al. 2018. DeepMimic]

✅ 利用DRL做复杂动作,但还只是动作复现。

P90

Multi-skill Characters

引入状态机,完成更复杂动作。

State Machines of Tracking Controllers

引入Motion Maching

[Liu et al. 2017: Learning to Schedule Control Fragments]

Hierarchical Controllers

在高级指令控制下,综合使用动作来完成功能

Generative Control Policies

运动生成模型控制生成模型

总结

✅ 回顾计算机角色动化领域最近30年主要研究方向。

P102

About This Course

  • What will not be covered

    • How to use Maya/Motion Builder/Houdini/Unity/Unreal Engine…
    • How to become an animator
  • What will be covered

    • Methods, theories, and techniques behind animation tools

      • Kinematics of characters
      • Physics-based simulation
      • Motion control
    • Ability to create an interactive character


本文出自CaterpillarStudyGroup,转载请注明出处。

https://caterpillarstudygroup.github.io/GAMES105_mdbook/

P2

Outline

  • Review of Linear Algebra

    • Vector and Matrix
    • Translation, Rotation, and Transformation
  • Representations of 3D rotation

    • Rotation matrices
    • Euler angles
    • Rotation vectors/Axis angles
    • Quaternions

✅ 这节课大部分内容会跳过,因为前面课程讲过好多遍了

P3

Review of Linear Algebra

Vectors and Matrices

a few slides were modified from GAMES-101 and GAMES-103

P24

✅ 两个单位向量的叉乘不一定是单位向量。
✅ 要得到方向,应先叉乘再单位化
✅ \(n=\frac{a\times b}{||a\times b||}\)(正确)、\(n=\frac{a}{||a||} \times \frac{b}{||b||}\)(错误)

P26

How to find the rotation between vectors?

问题描述

✅ 已知\(a,b\) , 求旋转。

求旋转轴

P27

Any vector in the bisecting plane can be the axis

$$ 𝒖 =\frac{𝒂 × 𝒃}{||𝒂 × 𝒃||} $$

求旋转角

P28

The minimum rotation:
$$ \theta = \mathrm{arg} \cos \frac{a\cdot b}{||a||||b||} $$

✅ \(u\) 为旋转轴,\( \theta \) 为旋转角。

P33

How to rotate a vectors?

问题描述

已知 \(a\) 和旋转 \((𝒖, \theta )\) 求终点 \(b\)

解题方法

\(a\) 移动到 \(b\) 看作是先移动 \(𝒗\) 再移动 \(t\),分别计算 \(𝒗\) 和 \(t\) 的方向和长度。

$$ 𝒗 \gets 𝒖 \times 𝒂 $$

$$ 𝒕 \gets 𝒖 \times 𝒗 = 𝒖 \times( 𝒖 \times 𝒂) $$

计算过程

P35

$$ 𝒗 = (\sin \theta) 𝒖 \times 𝒂 𝒕 =(1-\cos \theta ) 𝒖 \times( 𝒖 \times 𝒂) $$

Rodrigues' rotation formula

$$ 𝒃 = 𝒂 + (\sin \theta) 𝒖 × 𝒂 + (1-\cos \theta ) 𝒖 \times( 𝒖 \times 𝒂) $$

P53

Matrix

Matrix Form of Cross Product

$$ \begin{align*} c=a\times b= & \begin{bmatrix} a_yb_z-a_zb_y \\ a_zb_x-a_xb_z \\ a_xb_y-a_yb_x \end{bmatrix}\\ = & \begin{bmatrix} 0 & -a_z & a_y \\ a_z & 0 & -a_x \\ -a_y & a_x & 0 \end{bmatrix}\begin{bmatrix} b_x \\ b_y \\ b_z \end{bmatrix}=[a]_\times b \end{align*} $$

$$ [a]_\times +[a]^ \mathbf{T} _\times =0 \quad \quad \mathrm{skewsymmetric} $$

P56

$$ \begin{align*} a \times b = &[a] _ \times b \\ a \times (b \times c) = & [a] _ \times ( [b] _ \times c ) \\ = & [a] _ \times [b] _ \times c \\ a \times (a \times c) = & [a] ^2 _ \times b \\ (a \times b) \times c = & [a\times b] _ \times c \\ \end{align*} $$

✅ 最后一个公式注意一下,叉乘不满足结合律。

P57

How to rotate a vectors?

问题描述

已知 \(a\) 和旋转 \((𝒖, \theta )\) 求终点 \(b\)

把前面的结论转化为矩阵形式

$$ \begin{align*} b = & a+(\sin \theta )u \times a +(1-\cos \theta)u \times(u \times a) \\ b = & (I+(\sin \theta ))[u]_ \times + (1-(\cos \theta )[u]^2_ \times ) a \\ = & Ra \end{align*} $$

✅ 把前面的叉乘公式转化为点乘形式

结论

Rodrigues' rotation formula

$$ R = I+(\sin \theta )[u]_ \times + (1-\cos \theta )[u]^2_ \times $$

✅ \(R\) 是旋转 \((u, \theta )\) 对应的旋转矩阵。

P62

Determinant of a Matrix

定义

✅ 行列式的计算:红色相乘减蓝色相乘。

P63

公式

  • det \(I = 1\)
  • det \(AB = \text{ det } A ∗ \text{det } B\)
  • det \(A^T\) = det \(A\)
  • If \(A\) is invertible,det \(A^{−1}\) = \((\text{det } A)^{−1}\)
  • If \(U\) is orthogonal,\(\text{det } U = ± 1\)

P64

Cross Product as a Determinant

$$ \begin{align*} c=a\times b= & \begin{bmatrix} a_yb_z-a_zb_y \\ a_zb_x-a_xb_z \\ a_xb_y-a_yb_x \end{bmatrix}\\ = & \text{det } \begin{bmatrix} i & j & k \\ a_x & a_y & a_z \\ b_x & b_y & b_z \end{bmatrix} \end{align*} $$

✅ 用行列式运算规则来计算叉乘结果。

P66

Eigenvalues and Eigenvectors

For a matrix \(A\), if a nonzero vector \(x\) satisfies
$$ Ax=\lambda x $$

Then:
\(\lambda\): an eigenvalue of \(A\)
\(x\): an eigenvector of \(A\)

Especially, a \(3\times 3\) orthogonal matrix \(U\)
has at least one real eigenvalue: \(\lambda=\text{det } U = ±1\)

P67

Rigid Transformation

Translation, rotation, and coordinate transformation

✅ 刚体变换不能改变形状和大小,因此没有Scaling

P69

Scaling

P70

Translation

P72

Rotation

P73

Rotation Matrix

定义

  • Rotation matrix is orthogonal:

$$ R^{-1}=R^{T} \quad R^TR=RR^T=1 $$

  • Determinant of \(R\)
    $$ \text{det } R = + 1 $$
  • Rotation maintains length of vectors $$ ||Rx|| = ||x|| $$

✅ 公式2:\(R\) 不会改变左、右手系
✅ 公式3:\(R\) 是刚性变换,不改变大小

P75

Combination of Rotations

P76

Rotation around Coordinate Axes

$$ R_x(\alpha )=\begin{pmatrix} 1 & 0 & 0 \\ 0 & \cos\alpha & -\sin \alpha \\ 0 & \sin \alpha & \cos \alpha \end{pmatrix} $$

$$ R_y(\beta )=\begin{pmatrix} \cos \beta & 0 & \sin \beta \\ 0 & 1 & 0 \\ -\sin \beta & 0 & \cos \beta \end{pmatrix} $$

$$ R_z(\gamma )=\begin{pmatrix} \cos \gamma & -\sin \gamma & 0 \\ \sin \gamma & \cos \gamma & 0 \\ 0 & 0 & 1 \end{pmatrix} $$

✅ 沿着哪个轴转,那个轴上的坐标不会改变。
✅ 三个基本旋转可以组合出复杂旋转。

P79

Rotation Axis and Angle

Rotation matrix \(R\) has a real eigenvalue: +1
$$ Ru=u $$

In other words, \(R\) can be considered as a rotation around axis \(u\) by some angle \(\theta \)
How to find axis 𝒖 and angle \(\theta \)?

✅ 用 \(R\) 旋转时,向量 \(u\) 不会变化。
✅ 对于任意 \(R\),都存在这样一个 \(u\).
✅ \(u\) 是 \(R\) 的旋转轴。

P80

根据旋转矩阵求轴角

P81

✅ \({u}' \) 与 \({u} \) 共线,\({u}' \) 单位化得到 \({u} \).
✅ \(q\) 和 \(-q\) 两种表示方法会引入插值问题,需要注意。

P82

$$ u\gets {u}' =\begin{bmatrix} r_{32}-r_{23} \\ r_{13}-r_{31} \\ r_{21}-r_{12} \end{bmatrix} $$

$$ \text{When } R\ne R^T \Leftrightarrow \sin \theta \ne 0\Leftrightarrow \theta \ne 0^{\circ} \text{ or } 180^{\circ} $$

P83

基于罗德里格公式求轴角

✅ 从 \(R\) 的公式也能得出相同的结论
✅ \(u → {u}' → \)旋转角度

P85

旋转矩阵的意义

旋转

P86

旋转 + 平移

P87

Representations of 3D Rotation

 

P91

旋转矩阵

Parameterization of Rotation

旋转矩阵有9个参数,但实际上degrees of freedom (DoF) = 3

✅ det 只是把空间减少一半,没有降低自由度

P93

Interpolation

What is good interpolation?

  • result is valid at any time \(t\)
  • Constant speed is preferred
平移旋转
\(x_t=(1-t)x_0+tx_1\)
✅ 平移使用线性插值
✅ 旋转不适合线性插值。
合法✅ 对于任意 \(t\), \(x_t\) 一定是合法的。
速度可控✅ 运动的速度是常数,因此速度可控。

P99

结论

  • Easy to compose? \(\quad \quad \quad {\color{Red} \times } \)

✅ 9个参数没有直接的意义,且为了满足正交阵,参数之间是耦合的。

  • Easy to apply? \(\quad \quad \quad \quad {\color{Green} \surd }\)
  • Easy to interpolate? \(\quad \quad {\color{Red} \times } \)

P100

Euler angles

Basic rotations

$$ R_x(\alpha )=\begin{pmatrix} 1 & 0 & 0 \\ 0 & \cos\alpha & -\sin \alpha \\ 0 & \sin \alpha & \cos \alpha \end{pmatrix} $$

$$ R_y(\beta )=\begin{pmatrix} \cos \beta & 0 & \sin \beta \\ 0 & 1 & 0 \\ -\sin \beta & 0 & \cos \beta \end{pmatrix} $$

$$ R_z(\gamma )=\begin{pmatrix} \cos \gamma & -\sin \gamma & 0 \\ \sin \gamma & \cos \gamma & 0 \\ 0 & 0 & 1 \end{pmatrix} $$

combination of three basic rotations

Any rotation can be represented as a combination of three basic rotations

P102

Any combination of three basic rotations are allowed
- Excluding those rotate twice around the same axis
- XYZ, XZY, YZX, YXZ, ZYX, ZXY, XYX, XZX, YXY, YZY, ZXZ, ZYZ

P103

Conventions of Euler Angles

intrinsic rotations: axes attached to the object

$$ R_x(\alpha )R_y(\beta )R_z(\gamma ) $$

extrinsic rotations: axes fixed to the world

$$ R_z(\gamma )R_y(\beta )R_x(\alpha ) $$

✅ 使用欧拉角时应先明确所使用的 convetion 和顺序。
✅ 不同的商业软件可能有不同的内置参数。
✅ maya 和 unity 都是 extrinsic.
✅ maya 可选顺序,Unity 固定 Zxy

P104

Gimbal Lock

When two local axes are driven into a parallel configuration, one degree of freedom is “locked”

✅ 当其中两个轴共线时,会丢失一个自由度,此时表示不唯一(奇异点)

P105

结论

✅ 插值时需注意作用域为 \([-\pi , \pi ]\),否则容易出现翻转现象。

P107

Rotation Vectors / Axis Angles

✅ 粗体 \(\theta \):轴角表示法描述的旋转
✅ 细体 \(\theta \):以 \(u\) 为轴的旋转角度

✅ 应用时要先转为旋转矩阵,做旋转组合时也要借助旋转矩阵

P110

Interpolating Rotation Vectors / Axis Angles

线性插值

可以保证插值结果合法,但不能保证旋转速度恒定

P111

匀速插值

可以保证插值结果合法且匀速,但旋转较复杂

✅ 这个方法没听懂,可以实现允许插值。

P112

结论

  • Easy to compose? \(\quad \quad {\color{Green} \surd } \quad \quad \) But hard to manipulate
  • Easy to apply? \(\quad \quad \quad {\color{Red} \times } \quad \quad \) Need to convert to matrix
  • Easy to interpolate? \(\quad \quad {\color{Green} \surd } \quad \quad \) Linear interpolation works, but not perfect
  • No Gimbal lock \(\quad \quad {\color{Green} \surd } \quad \quad \) need to deal with singularities

P113

Quaternions

P116

定义

  • Extending complex numbers
    $$ q =a+bi +cj +dk \in \mathbb{H} ,a,b,c,d\in \mathbb{R} $$

  • \(i^2=j^2=k^2=ijk=-1\)

  • \(ij=k,ji=-k(^*\text{cross product})\)

  • \(jk=i,kj=-i\)

  • \(ki=j,ik=-j\)

$$ q=w+xi+yj+zk \quad \Rightarrow \quad q=\begin{bmatrix} w\\ x\\ y\\ z \end{bmatrix}=\begin{bmatrix} w\\ v \end{bmatrix} $$

$$ q =[w,v]^T \in \mathbb{H} ,w\in \mathbb{R},v\in \mathbb{R}^3 $$

$$ w =[w,0]^T : \text{ scalar quaternion } $$

$$ v =[0,v]^T : \text{ pure quaternion } $$

P117

Quaternion Arithmetic

$$ q =a+bi +cj +dk \in \mathbb{H} ,a,b,c,d\in \mathbb{R} $$

Conjugation: \(\quad \quad q^*=a-bi-cj-dk\)
\(
\)
Scalar product: \(\quad \quad tq=ta+tbi+tcj+tdk\)
\(
\)
Addition: \(\quad \quad q_1+q_2=(a_1+a_2)+(b_1+b_2)i+(c_1+c_2)j+(d_1+d_2)k\)
\(
\)
Dot product: \(\quad \quad q_1\cdot q_2=a_1a_2+b_1b_2+c_1c_2+d_1d_2\)
\(
\)
Norm: \(\quad \quad ||q||=\sqrt{a^2+b^2+c^2+d^2} =\sqrt{q\cdot q}\)

P118

Quaternion Multiplication

$$ q_1q_2=(a_1+b_1i+c_1j+d_1k)*(a_2+b_2i+c_2j+d_2k) $$

$$ q_1q_2=a_1a_2-b_1b_2-c_1c_2-d_1d_2 $$

$$ +(b_1a_2+a_1b_2-d_1c_2+c_1d_2)i
$$

$$ +(c_1a_2+d_1b_2+a_1c_2-b_1d_2)j
$$

$$ +(d_1a_2-c_1b_2+b_1c_2+a_1d_2)k $$

note:

  • \(i^2=j^2=k^2=ijk=-1\)
  • \(ij=k,ji=-k (^* \text{cross product})\)
  • \(jk=i,kj=-i\)
  • \(ki=j,ik=-j\)

✅ \(q_1 \cdot q_2\) 和 \(q_1q_2\) 是两种不同的运算。

P120

Conjugation: \(\quad \quad q^*=[w,-v]^T\)
\(
\)
Scalar product: \(\quad \quad tq=[tw,tv]^T\)
\(
\)
Addition: \(\quad \quad q_1+q_2=[w_1+w_2,v_1+v_2]^T\)
\(
\)
Dot product: \(\quad \quad q_1\cdot q_2=w_1w_2+v_1 \cdot v_2\)
\(
\)
Norm: \(\quad \quad ||q||=\sqrt{w_1w_2+v_1 \cdot v_2} =\sqrt{q\cdot q}\)

P122

$$ q_1q_2=\begin{bmatrix} w_1\\ v_1 \end{bmatrix}\begin{bmatrix} w_2 \\ v_2 \end{bmatrix}=\begin{bmatrix} w_1w_2-v_1\cdot v_2\\ w_1v_2+w_2v_1+v_1\times v_2 \end{bmatrix} $$

Non-Commutativity:

$$ q_1q_2\ne q_2q_1 $$

Associativity:

$$ q_1q_2q_3=(q_1q_2)q_3=q_1(q_2q_3) $$

P123

Conjugation:

$$ (q_1q_2)^\ast=q^\ast_2q^\ast_1 $$

Norm:

$$ ||q||^2 = q^ \ast q =qq^\ast $$

Reciprocal:

$$ \begin{matrix} qq^{-1}=1 & \Rightarrow & q^{-1}=\frac{q^*}{||q||^2}\\ q^{-1}q=1 & & \end{matrix} $$

P124

Unit Quaternions

$$ \begin{matrix} q=\begin{bmatrix} w\\ v \end{bmatrix} &||q||=1 \end{matrix} $$

For any non-zero quaternion \(\tilde{q} \):

$$ q=\frac{\tilde{q}}{||\tilde{q}||} $$

Reciprocal:

$$ \begin{matrix} q^{-1}=q^\ast =\begin{bmatrix} w\\ -v \end{bmatrix} &\Leftrightarrow & R^{-1}=R^T \end{matrix} $$

P125

2D3D
unit complex numberunit quaternion
✅ 所有单位四元数构成 4D 空间上的单位球核。
\(z = \cos \theta + i\sin \theta\)\(q = \begin{bmatrix} w\\v\end{bmatrix}= [\cos \frac{\theta}{2} , u\sin \frac{\theta}{2}] \quad \mid\mid u \mid\mid = 1\)

same information as axis angles \((u,\theta)\) But in a different form

P127

轴角表示 -> 四元数表示

Any 3D rotation \((v,\theta)\) can be represented as a unit quaternion

$$ \begin{matrix} \text{Angle}: & \theta =2 \text{ arg } \cos w\\ \text{ Axis}: & u=\frac{v}{||v||} \end{matrix} $$

P128

Rotation a Vector Using Unit Quaternions

已经向量p和单位四元数q,求p经过q旋转后的向量。

$$ \begin{matrix} \text{Unit quaternion}: & q=\begin{bmatrix} w\\ v \end{bmatrix}=[\cos \frac{\theta }{2} ,u\sin \frac{\theta }{2}]\\ \text{ 3D vector}:p & \text{ Rotation result }: {p}' \end{matrix} $$

Then the rotation can be applied by quaternion multiplication:

✅ 纯方向 \(p\) 可用四元数表示为 \([0 \quad p ]\)
✅ \({p}' = R (q) \cdot p\)

P129

$$ \begin{bmatrix} 0 \\ {p}' \end{bmatrix}=q\begin{bmatrix} 0\\ p \end{bmatrix}q^\ast =(-q)\begin{bmatrix} 0\\ p \end{bmatrix}(-q)^\ast $$

\(\mathbf{q}\) and \(−\mathbf{q}\) represent the same rotation

P131

Combination of Rotations

证明过程跳过,结论:

$$ \begin{matrix} \text{Combined rotation}: & q=q_2q_1 \end{matrix} $$

P133

Quaternion Interpolation

A unit hypersphere in 4D space

✅ 单位四元数表现出来是 4D 空间中的球核,\(q_1q_2\) 是球核上的两个点,希望沿球面轨迹插值。

P135

Linear Interpolation

$$ q_t=(1-t)q_0+tq_1 $$

\(q_t\) is not a unit quaternion

P136

Linear Interpolation + Projection

$$ \begin{matrix} \tilde{q}_t=(1-t)q_0+tq_1 & q_t=\frac{\tilde{q}_t }{||\tilde{q}_t||} \end{matrix} $$

$$ \begin{matrix} q_t \text{ is a unit quaternion}\\ \text{Rotational speed is not constant} \end{matrix} $$

✅ 当 \(u_0=-u_1\) 时,可能得到某个 \(\tilde{q} _t = 0\),无法单位化
✅ 解决方法:根据 \(u_0=-u_0\),先找到 \(u_0\) 和 \(u_1\) 在数值上最接近的四元数表示。

P137

SLERP: Spherical Linear Interpolation

思考

$$ q_t=a(t)q_0+b(t)q_1 $$

如何设计a和b,让插值结果速度恒定?

$$ r=a(t)p+b(t)q $$

计算

Consider the angle \(\theta\) between \(p,q\):

$$ \cos \theta =p\cdot q $$

We have:

$$ \begin{matrix} p \cdot r=a(t)p\cdot p+b(t)q\cdot p\\ \Rightarrow \cos t \theta =a(t)+b(t)\cos \theta \end{matrix} $$

similarly:

$$ \begin{matrix} q \cdot r=a(t)q\cdot p+b(t)\\ \Rightarrow \cos (1- t) \theta =a(t)\cos\theta +b(t)
\end{matrix} $$

结论

then we have:

$$ a(t)=\frac{\sin [(1-t)\theta ]}{\sin \theta } ,b(t)=\frac{\sin t \theta }{\sin \theta } $$

P139

$$ q_t=\frac{\sin [(1-t)\theta ]}{\sin \theta }q_0+\frac{\sin t \theta }{\sin \theta }q_1 $$

$$ \cos \theta=q_0\cdot q_1 $$

P140

结论

Rotations can be represented by unit quaternions

Representation is not unique

\(q, −q\) represent the same rotation

  • Easy to compose? \(\quad \quad {\color{Green} \surd }\quad \quad \) Need normalization, hard to manipulate,
  • Easy to apply? \(\quad \quad \quad {\color{Green} \surd }\quad \quad \) Quaternion multiplication
  • Easy to interpolate? \(\quad {\color{Green} \surd }\quad \quad \) SLERP, need to deal with singularities
  • No Gimbal lock \(\quad \quad \quad {\color{Green} \surd }\quad \quad \)

本文出自CaterpillarStudyGroup,转载请注明出处。

https://caterpillarstudygroup.github.io/GAMES105_mdbook/

角色位移控制 (Locomotion Control) 技术洞察

更新时间: 2026-03-30

范围: 2010-2025 年角色位移 (locomotion) 控制技术分析


一、概述

角色位移控制是计算机图形学、机器人学和游戏开发的核心问题,目标是生成自然、稳定、可控的角色运动(如行走、跑步、跳跃等)。

1.1 为什么 Locomotion 是一个难题?

  1. 高维状态空间: 人形角色通常有 30+ 自由度
  2. 强非线性动力学: 接触力、摩擦力、碰撞使系统高度非线性
  3. 多模态行为: 行走、跑步、跳跃等不同步态需要不同控制策略
  4. 实时性要求: 游戏/VR 应用需要 60+ FPS
  5. 鲁棒性要求: 需要抵抗外部扰动、适应地形变化

1.2 技术分类:运动学 vs 动力学

维度运动学方法 (Kinematics)动力学方法 (Dynamics)
核心目标生成视觉上合理的动作生成物理可行的动作
输出关节姿态/速度关节力矩/PD 控制目标
是否物理仿真
典型应用动画生成、VR 化身游戏、机器人仿真
优势速度快、质量高物理交互、抗扰动
局限无法处理物理交互训练成本高、实现复杂

二、基于运动学的方法 (Kinematics-based Methods)

核心特征:直接从数据学习动作生成,不经过物理仿真,输出为关节姿态。

2.1 技术流派总览

运动学方法经过十余年发展,形成了四大主要流派

flowchart TB
    subgraph Phase["流派一:相位系 (Phase-based)"]
        direction TB
        PFNN["PFNN (2017)"] --> LP["Local Phases (2020)"]
        LP --> SM["Style Modelling (2020)"]
        LP --> PM["Phase Manifolds (2023)"]
    end

    subgraph Trans["流派二:RTN (Transition Generation)"]
        direction TB
        RTN["RTN (2018)"]
    end

    subgraph MM["流派三:Motion Matching 系"]
        direction TB
        MM0["Motion Matching (2019)"] --> LMM["Learned MM (2020)"]
        LMM --> MOCHA["MOCHA (2023)"]
    end

    subgraph Diff["流派四:扩散模型系"]
        direction TB
        AMDM["A-MDM (2024)"] --> CAMDM["CAMDM (2024)"]
        CAMDM --> AAMDM["AAMDM (2024)"]
        AAMDM --> DART["DART (2025)"]
    end

    style Phase fill:#e1f5fe
    style Trans fill:#fff3e0
    style MM fill:#f0f0f0
    style Diff fill:#e8f5e9

关键洞察:Local Phases (2020) 是相位系的核心分支点 —— 一支朝风格转换方向发展(Style Modelling),另一支朝相位流形插值方向发展(Phase Manifolds)。

流派核心思想优势局限
相位系相位解耦动作状态 / 相位流形插值流畅无 artifacts / 自然过渡相位定义需领域知识
RTN (Transition Generation)RNN 连接两个状态无需标注、固定内存过渡长度固定
Motion Matching 系数据搜索/预测工业验证质量高内存/训练成本
扩散模型系概率扩散生成高质量多样性推理速度挑战

2.2 流派一:相位系 (Phase-based Methods)

核心思想:引入相位变量 $\phi \in [0, 2\pi)$ 作为动作周期的隐式表示,用相位解耦不同动作状态或在相位空间进行插值。

演进路径

flowchart LR
    subgraph Phase["相位表示分支"]
        PFNN --> FS["Few-shot Styles"]
        FS --> LP["Local Phases"]
        LP --> SM["Style Modelling"]
    end

    subgraph Manifold["相位流形分支"]
        LP --> PM["Phase Manifolds"]
    end

两大分支

从演进路径可以看出,Local Phases (2020) 是核心分支点,衍生出两个方向:

分支演进路径核心目标典型应用
相位表示分支PFNN → Local Phases → Style Modelling用相位解耦不同动作状态VR 化身、风格化动画
相位流形分支Local Phases → Phase Manifolds在相位空间进行插值过渡生成、动作补间

统一框架

演进阶段代表论文核心贡献典型应用
全局相位PFNN (2017)相位函数化权重,避免 artifacts复杂地形 locomotion
少样本风格Few-shot Styles (2018)残差适配器 + CP 分解风格迁移
局部相位Local Phases (2020)每个身体部位独立相位多接触交互
风格调制Style Modelling (2020)特征变换 + 局部相位实时风格切换
相位流形Phase Manifolds (2023)相位流形插值与过渡生成动作补间

两大分支

从演进路径可以看出,Local Phases (2020) 是核心分支点,衍生出两个方向:

分支演进路径核心目标典型应用
相位表示分支PFNN → Local Phases → Style Modelling用相位解耦不同动作状态VR 化身、风格化动画
相位流形分支Local Phases → Phase Manifolds在相位空间进行插值过渡生成、动作补间

代表论文

  • PFNN (2017): 相位函数化权重
  • Few-shot Locomotion Styles (2018): 残差适配器 + CP 分解,少样本风格学习
  • Local Motion Phases (2020): 局部相位表示
  • Style Modelling (2020): 特征变换 + 局部相位
  • Phase Manifolds (2023): 相位流形插值
  • RTN (2018): 循环转移网络,transition 生成

注意:MOCHA (2023) 虽然使用了 AdaIN 进行风格转换(继承自 Style Modelling),但其核心是 Neural Context Matcher 进行上下文匹配,不属于相位系,而是属于Motion Matching 系(见 2.4 节)。

注意:POMP (2023) 虽然使用相位表示,但其核心是物理一致运动生成,输出关节力矩并使用物理仿真器,属于动力学方法(见 3.8.3 节)。


2.2.1 PFNN: Phase-Functioned Neural Networks (SIGGRAPH 2017)

论文: 113.md

核心创新: 将相位从「网络输入特征」升级为「网络权重的参数化变量」

架构:

flowchart LR
    Input["输入:状态 + 控制 + 相位φ"] --> PhaseFunc["相位函数Θ(φ)"]
    PhaseFunc --> Weights["生成网络权重"]
    Weights --> Expert1["专家 1"]
    Weights --> Expert2["专家 2"]
    Weights --> Expert3["专家 3"]
    Expert1 & Expert2 & Expert3 --> Mix["混合输出"]
    Mix --> Output["输出:姿态/速度/触地"]

关键洞察:

  • 相位作为权重参数,避免不同相位动作混合导致的 artifacts
  • 使用 Cubic Catmull-Rom Spline 插值专家权重
  • 地形数据增强:从平地 mocap 生成崎岖地形训练数据

优点:

  • 相位解耦,避免 artifacts
  • 仅 10MB 模型大小
  • 实时 60 FPS

缺点:

  • 仍需手工标注相位和步态标签
  • 泛化能力有限,仅支持训练过的步态

2.2.2 Few-shot Locomotion Styles (EG 2018)

论文: 214.md

核心创新: 首个少样本风格学习框架,几秒视频即可学会新走路风格

背景: PFNN 需要大量数据训练每种新风格,但动画师通常只有几秒参考视频。

方法框架:

flowchart TB
    subgraph Stage1["第一阶段:预训练"]
        data1["8 种风格大量数据"]
        pfnn["PFNN 主干网络"]
        adapter["残差适配器"]
        agnostic["风格无关参数 β_ag"]
        specific["风格相关参数 β_s (8 套)"]
    end

    subgraph Stage2["第二阶段:少样本学习"]
        data2["新风格几秒视频"]
        freeze["冻结主干网络"]
        learn["只学习新残差适配器"]
        cp["CP 分解降维"]
    end

    data1 --> pfnn
    pfnn --> agnostic
    pfnn --> adapter
    adapter --> specific

    data2 --> learn
    freeze --> learn
    learn --> cp

    style Stage1 fill:#e1f5fe
    style Stage2 fill:#fff3e0

关键技术:

技术作用效果
残差适配器分离风格无关/相关参数只需学习少量新参数
CP 分解3D 张量分解为三个矩阵参数从 4MB 降至 0.13MB (30 倍压缩)
可变 Dropout根据数据量调整正则化防止少样本过拟合

CP 分解公式:

$$ X_k = A D(k) B^T $$

  • $A, B$: 与相位无关的矩形矩阵
  • $D(k)$: 与相位相关的对角矩阵

训练数据:

  • 预训练:8 种风格 × 23104 帧(愤怒、孩子气、沮丧、中性、老人、骄傲、性感、大摇大摆)
  • 少样本:50 种新风格,每种仅 1-5 秒视频

性能:

  • 推理时间:0.0011 秒/帧(约 900 FPS)
  • 存储:每风格仅需 0.13MB

优点:

  • 几秒视频即可学会新风格
  • 支持实时生成
  • 参数效率高,内存占用低

缺点:

  • 仅支持 Homogeneous 迁移(走→走,不能走→跑)
  • 无法处理非周期性动作
  • 生成动作略平滑,丢失高频细节

与 PFNN 的继承关系:

  • PFNN: 每风格单独训练,需要大量数据
  • Few-shot: 添加残差适配器,风格无关参数共享

2.2.3 Local Motion Phases (SIGGRAPH 2020)

论文: 216.md

核心创新: 每个身体部位学习独立相位,支持多接触交互

背景: PFNN 的全局相位假设所有部位同步运动,无法处理多接触动作(如手扶墙、脚踩台阶)。

全局相位 vs 局部相位:

全局相位局部相位
单一相位值每个身体部位独立相位
适用于周期性 locomotion适用于多接触交互
相位手动标注无监督学习相位

局部相位表示:

$$ \phi = {\phi_{left_foot}, \phi_{right_foot}, \phi_{left_hand}, \phi_{right_hand}, ...} $$

与 PFNN 的继承关系:

  • PFNN: 全局相位,需手动标注
  • Local Phases: 局部相位,无监督学习
  • 共同点:相位作为解耦变量

优点:

  • 支持多接触交互
  • 相位自动学习
  • 异步运动建模

缺点:

  • 相位数量固定
  • 新接触类型需要训练

2.2.4 Style Modelling: 特征变换与局部相位 (SIGGRAPH 2020)

论文: 211.md

核心创新: Feature-Wise Transformations + Local Motion Phases

架构:

flowchart LR
    motion["输入动作 x"] --> Enc["动作编码器"]
    style["风格代码 z"] --> StyleEnc["风格编码器"]
    Enc --> FWT["Feature-Wise Transformation"]
    StyleEnc --> FWT
    FWT --> Dec["动作解码器"]
    Dec --> out["风格化动作 y"]

AdaIN 公式:

$$ \text{AdaIN}(x, z) = \sigma(z) \cdot \frac{x - \mu(x)}{\sigma(x)} + \mu(z) $$

Local Motion Phases vs 全局相位:

全局相位局部相位
单一相位值每个身体部位独立相位
适用于周期性动作适用于非同步动作
难以处理复杂动作灵活处理多接触动作

与 PFNN 的继承关系:

  • PFNN: 全局相位,适用于 locomotion
  • Style Modelling: 局部相位,适用于更复杂动作
  • 继承:相位作为解耦变量的思想

优点:

  • 实时 60+ FPS
  • 支持多种风格平滑过渡
  • 少样本风格学习

缺点:

  • 仅适用于 locomotion
  • 极端风格可能失真

2.2.5 Phase Manifolds: 相位流形插值 (2023)

论文: 212.md

核心创新: 使用 Periodic Autoencoder 学习相位变量,在相位流形空间进行插值生成过渡动作

注意: 虽然本论文与 Style Modelling (211) 同样使用局部相位表示,但其核心是相位流形插值用于 transition 生成,与 POMP (112) 的物理一致运动生成不同,本论文属于运动学相位系

架构:

flowchart TB
    start["起始帧 s"] --> PAE["Periodic<br/>Autoencoder"]
    target["目标帧 t"] --> PAE
    duration["过渡时长 T"] --> Interp["相位流形插值"]
    PAE --> PhaseS["起始相位φ_s"]
    PAE --> PhaseT["目标相位φ_t"]
    PhaseS --> Interp
    PhaseT --> Interp
    Interp --> MoE["Mixture of Experts"]
    MoE --> Motion["过渡动作序列"]

相位流形约束:

  • 相位在单位圆上:$\phi \in [0, 2\pi)$
  • 周期性:$\phi(t) = \phi(t + T)$
  • 流形插值:$\phi_t = \text{slerp}(\phi_s, \phi_t, t)$(球面线性插值)

与 Style Modelling 的关系:

  • 共同点: 都使用局部相位表示解耦身体部位
  • 差异: Style Modelling 用于风格转换,Phase Manifolds 用于过渡生成

与 POMP 的差异:

  • Phase Manifolds (212): 运动学过渡生成,输出关节位置
  • POMP (112): 物理一致运动生成,输出关节力矩 + 物理仿真

优点:

  • 生成自然流畅的过渡
  • 支持用户约束(end effector 位置)
  • 多样化过渡生成

缺点:

  • 依赖训练数据
  • 长过渡质量下降
  • 无法处理物理交互

2.3 流派二:RTN: Recurrent Transition Networks (SIGGRAPH 2018)

论文: 210.md

核心创新: 首个专门为 transition 生成设计的未来感知(future-aware)深度循环网络

背景: 在大型游戏中,动画图(Animation Graph)需要大量 transition 动画。传统方法的问题:

  • 手工制作 transition 非常耗时:动画师需要手动制作大量的过渡动画
  • 内存占用大:Motion Graph 方法需要将动画数据和图结构加载到内存中
  • 扩展性差:随着数据集增大,内存需求线性增长
  • 需要标注:很多方法需要 gait、phase、contact 等标签

方法框架:

flowchart TB
    past["过去上下文<br/>10 帧"] --> Enc["Frame Encoder"]
    target["目标姿态<br/>归一化"] --> TargetEnc["Target Encoder"]
    offset["全局偏移<br/>目标 - 当前"] --> OffsetEnc["Offset Encoder"]

    Enc --> LSTM["改进的 LSTM<br/>512 单元"]
    TargetEnc --> LSTM
    OffsetEnc --> LSTM

    LSTM --> Dec["Frame Decoder"]
    Dec --> out["下一帧预测"]

    style Enc fill:#e1f5fe
    style LSTM fill:#fff3e0
    style Dec fill:#e8f5e9

核心架构:

组件架构作用
Frame Encoder2 层 MLP, 512 单元编码当前帧 + 地形(可选)
Target Encoder2 层 MLP, 128 单元编码目标姿态(整序列恒定)
Offset Encoder2 层 MLP, 128 单元编码目标与当前的差异
Recurrent Generator改进 LSTM, 512 单元添加未来上下文条件化权重
Frame Decoder2 层 MLP输出下一帧

改进的 LSTM:

$$i_t = \alpha(W^{(i)}h^E_t + U^{(i)}h^R_{t-1} + C^{(i)}h^{F,O}t + b^{(i)})$$ $$o_t = \alpha(W^{(o)}h^E_t + U^{(o)}h^R{t-1} + C^{(o)}h^{F,O}t + b^{(o)})$$ $$f_t = \alpha(W^{(f)}h^E_t + U^{(f)}h^R{t-1} + C^{(f)}h^{F,O}_t + b^{(f)})$$ $$\hat{c}t = W^{(c)}h^E_t + W^{(c)}h^R{t-1} + C^{(c)}h^{F,O}t + b^{(c)}$$ $$c_t = f_t \odot c{t-1} + i_t \odot \tau(\hat{c}_t)$$ $$h^R_t = o_t \odot \tau(c_t)$$

关键设计:

  • 添加了 $C^{(\cdot)}$ 权重用于未来上下文条件化
  • Hidden State 初始化器:学习逆函数 $H(x_{past_first}) \to (h_0, c_0)$
  • 地形感知:通过局部高度图(13×13 网格)实现崎岖地形导航

数据表示:

  • 根节点相对位置:$\tilde{x}t = [v_t, j^t_1, ..., j^t{K-1}]^T$
  • 根节点速度:$v_t = r_t - r_{t-1}$
  • 标准化:$x_t = (\tilde{x}_t - \mu_x) / \sigma_x$

训练细节:

  • Transition 长度:30 帧(1 秒)
  • Past context:10 帧
  • Future context:2 帧(目标姿态)
  • 总窗口长度:50 帧
  • 损失函数:$\mathcal{L} = \frac{1}{P} \sum_{t=1}^{P} ||x_{t+1} - \hat{x}_{t+1}||^2$
  • 无需任何 gait、phase、contact 或 action 标签

优点:

  • 自动生成高质量 transition,无需手工制作
  • 固定大小的网络,内存占用恒定
  • 无需任何标注即可训练
  • 质量媲美 Mocap ground truth

缺点:

  • Transition 长度固定,需要预设
  • 自回归生成,推理速度取决于长度
  • 无法处理复杂障碍物

与 PFNN 的对比:

  • PFNN:相位条件化,生成连续 locomotion
  • RTN:transition 专用,连接两个状态
  • PFNN 需要相位标注,RTN 无需标注

应用场景:

  1. Animation Graph 的 transition 节点:替代手工制作的过渡动画
  2. 动画超分辨率:从 1fps 压缩动画恢复
  3. 地形导航:崎岖地形上的长 transition

2.4 流派三:Motion Matching 系

核心思想:从动作数据库搜索/预测最匹配当前状态的帧。

演进路径

flowchart LR
    MM["Motion Matching (2019)<br/>工业标准"] --> LMM["Learned Motion Matching (2020)<br/>神经网络替代"]
    LMM --> MOCHA["MOCHA (2023)<br/>角色化扩展"]

Motion Matching 核心流程

  1. 提取当前帧特征(姿势、速度、轨迹)
  2. 在数据库中搜索最近邻
  3. 返回对应帧并推进索引

Learned Motion Matching 创新:用三个神经网络替代数据库搜索,固定内存占用。

MOCHA 扩展:在 Learned Motion Matching 基础上,增加 Neural Context Matcher 实现角色风格转换和体型适配。


2.4.1 Learned Motion Matching (SIGGRAPH 2020)

论文: 208.md

核心创新: 用三个神经网络替代 Motion Matching 的数据库搜索

背景: Motion Matching 是游戏工业标准,但需要存储海量动画数据库,内存占用随数据量线性增长。

三网络功能:

网络输入输出替代功能
Decompressor特征向量 x + 潜变量 z姿态 yAnimation Database 查找
Projector查询特征向量最近邻索引 k*最近邻搜索
Stepper当前索引 k*下一帧索引数据库索引推进

优点:

  • 保留 Motion Matching 的质量和可控性
  • 固定内存占用(网络权重),不随数据量增长
  • 已应用于多个 AAA 游戏

缺点:

  • 训练时间比原始 Motion Matching 长
  • 网络预测 vs 精确搜索有轻微质量损失

2.4.2 MOCHA: Real-Time Motion Characterization (SIGGRAPH Asia 2023)

论文: 209.md

核心创新: 首个实时角色表征框架,同时转换动作风格和身体比例

背景: 将中性动作转换为特定角色风格(如僵尸、公主、小丑),同时适配不同体型。

架构:

flowchart TB
    src["Source Motion<br/>中性动作"] --> BodyEnc["Bodypart Encoder<br/>6 身体部位"]
    BodyEnc --> SrcFeat["Source Feature"]
    SrcFeat --> NCM["Neural Context Matcher<br/>C-VAE + 自回归"]
    NCM --> CharFeat["Character Feature"]
    CharFeat --> Charz["Characterizer<br/>Transformer+AdaIN"]
    SrcFeat --> Charz
    Charz --> OutFeat["Translated Feature"]
    OutFeat --> Output["Characterized Motion"]

AdaIN 公式:

$$ \text{AdaIN}(z_{src}, z_{cha}) = \sigma(z_{cha}) \cdot \frac{z_{src} - \mu(z_{src})}{\sigma(z_{src})} + \mu(z_{cha}) $$

NCM Prior:

$$ p(s_i | z_{i-1}^{cha}, f(z_i^{src})) = \mathcal{N}(\mu, \sigma) $$

与 Style Modelling 的继承关系:

  • Style Modelling: AdaIN 用于风格转换
  • MOCHA: AdaIN + Transformer,同时处理风格 + 体型

优点:

  • 实时 60 FPS
  • 同时处理风格转换 + 身体比例适配
  • 支持稀疏输入(VR tracker)

缺点:

  • 训练数据中的角色有限,新角色需重新训练
  • 极端风格可能失真

2.5 流派四:扩散模型系 (Diffusion-based Methods)

核心挑战:标准扩散模型需要 1000 步去噪,无法满足实时性要求(60 FPS)。

演进路径

flowchart TB
    DM["标准扩散模型<br/>1000 步去噪"] --> AMDM["A-MDM (2024)<br/>自回归 +50 步"]
    DM --> CAMDM["CAMDM (2024)<br/>8 步 + 风格转换"]
    DM --> AAMDM["AAMDM (2024)<br/>5 步 DD-GAN+ADM"]
    AMDM --> DART["DART (2025)<br/>Latent Space Control"]

    subgraph 加速演进
    AMDM -.->|50 步 | CAMDM
    CAMDM -.->|8 步 | AAMDM
    AAMDM -.->|5 步 | DART
    end

加速策略对比

方法去噪步数加速策略实时性
A-MDM50 步自回归设计30+ FPS
CAMDM8 步条件化 + 引导采样60+ FPS
AAMDM5 步DD-GAN+ADM 级联60+ FPS
DART~20 步Latent 空间扩散60+ FPS

2.5.1 A-MDM: Auto-regressive Motion Diffusion Model (SIGGRAPH 2024)

论文: 206.md

核心创新: 将扩散模型从 space-time 重新设计为 auto-regressive

自回归公式:

$$ p(x_{1:T}) = \prod_{t=1}^{T} p(x_t | x_{1:t-1}) $$

架构: 简单 3 层 MLP,50 步去噪

控制套件:

  • Task-oriented sampling
  • Motion in-painting
  • Keyframe in-betweening
  • Hierarchical reinforcement learning

与 CAMDM 的差异:

  • A-MDM: 强调控制套件,MLP 架构
  • CAMDM: 强调风格转换,Transformer 架构

2.5.2 CAMDM: Conditional Autoregressive Motion Diffusion Model (SIGGRAPH 2024)

论文: 207.md

核心创新: 8 步去噪实现实时高质量多样角色动画

关键技术:

技术作用
分离条件 Tokenization每个控制条件独立 token,避免特征主导
Classifier-free guidance on history在历史动作上应用 guidance,实现风格转换
启发式轨迹扩展回收上次预测轨迹,避免抖动

条件输入:

  • 风格/步态
  • 移动速度
  • 朝向方向
  • 未来轨迹

优点:

  • 8 步去噪 ≈ 几毫秒,60+ FPS
  • 支持多风格平滑转换
  • 无需微调实现风格转换

缺点:

  • 8 步去噪仍有优化空间
  • 依赖 mocap 数据

2.5.3 AAMDM: Accelerated Auto-regressive Motion Diffusion Model (CVPR 2024)

论文: 204.md

核心创新: 5 步去噪 (3 DD-GAN + 2 ADM)

架构:

Autoencoder: 338D pose → 64D latent
      ↓
Generation Module: DD-GANs (3 步)
      ↓
Polishing Module: ADM (2 步)
      ↓
输出:高质量动作

总去噪步数: $T_{AA} = T_{GAN} + T_{ADM} = 3 + 2 = 5$

与 CAMDM 的差异:

  • CAMDM: 8 步,强调风格转换
  • AAMDM: 5 步,强调加速

2.5.4 DARTControl: Diffusion-based Autoregressive Motion Model (ICLR 2025)

论文: 205.md

核心创新: Motion Primitive 表示 + Latent Space Control

Motion Primitive:

  • H=2 帧历史(与前一 primitive 重叠)
  • F=8 帧未来

Latent Space Control 方法:

  1. 优化方法: latent noise optimization
  2. 学习方法: MDP + RL (PPO)

优势: 10x 加速 vs FlowMDM

与 A-MDM 的差异:

  • A-MDM: 原始空间扩散
  • DART: Latent 空间扩散,更高效

2.6 运动学方法总结

四大流派核心思想对比

流派代表方法核心贡献典型应用
相位系PFNN → Few-shot Styles → Local Phases → Style Modelling → Phase Manifolds相位作为权重参数/条件输入,避免 artifactsVR 化身、风格化动画、过渡生成
RTN (Transition Generation)RTN (2018)RNN 连接两个状态动画图 transition、超分辨率
Motion Matching 系MM → Learned MM → MOCHA数据搜索/预测生成动作 + 角色化游戏 NPC、在线游戏、角色设计
扩散模型系A-MDM → CAMDM → AAMDM → DART概率扩散模型生成电影动画、多样性生成

流派选择指南

flowchart TD
    Q1["需要什么类型的控制?"] --> |风格转换 | A1["MOCHA / CAMDM / Style Modelling"]
    Q1 --> |稀疏输入 VR | A2["PFNN / MOCHA"]
    Q1 --> |高质量多样性 | A3["CAMDM / DART"]
    Q1 --> |低内存占用 | A4["Learned Motion Matching"]
    Q1 --> |transition 生成 | A5["RTN / Phase Manifolds"]
    Q1 --> |少样本学习 | A6["Few-shot Styles"]

运动学方法详细对比

方法架构去噪步数FPS风格转换空间控制物理感知
PFNN混合专家N/A60+
Few-shot Styles (214)残差适配器+CP 分解N/A60+✓ (少样本)
Local Motion Phases相位条件化N/A60+
Style ModellingFWT+ 相位N/A60+
Phase ManifoldsMoE+PAEN/A30+
RTNLSTMN/A60+
Learned MM三网络N/A60+
MOCHATransformerN/A60+
A-MDMMLP5030+
CAMDMTransformer860+
AAMDMDD-GAN+ADM560+
DARTLatent Diffusion~2060+

2.7 常见问题解答 (FAQ)

Q1: 相位系的发展脉络是什么?

相位系是一个统一的方法论,其核心思想是引入相位变量 $\phi \in [0, 2\pi)$ 作为动作的解耦表示,通过相位来参数化网络权重或作为条件输入,避免不同动作状态的混合导致 artifacts。

统一演进框架

阶段代表论文核心创新相位角色
全局相位PFNN (2017)相位函数化网络权重权重参数化变量
少样本风格Few-shot Styles (2018)残差适配器 + CP 分解风格条件
局部相位Local Phases (2020)每个身体部位独立相位多接触解耦
风格调制Style Modelling (2020)特征变换 + 局部相位风格注入条件
相位流形Phase Manifolds (2023)周期自编码学习相位流形流形空间坐标

关键洞察

  • Local Phases (2020) 是核心分支点,同时影响了 Style Modelling(风格转换)和 Phase Manifolds(过渡生成)两个方向
  • 相位系内部的区别仅在于相位的使用方式(全局 vs 局部、解耦 vs 流形插值),但核心思想统一

注意:POMP (2023) 虽然使用相位表示,但其核心是物理一致运动生成,输出关节力矩并使用物理仿真器,属于动力学方法(见 3.8.3 节)。

Q2: MOCHA 属于哪个流派?

MOCHA 属于 Motion Matching 系,而不是相位系。理由如下:

维度相位系MOCHA
核心机制相位作为权重参数或输入特征Neural Context Matcher 上下文匹配
相位使用显式相位变量 $\phi$无显式相位,用上下文特征条件化
继承关系PFNN → Local Phases → Style ModellingMotion Matching → Learned MM → MOCHA

MOCHA 的核心贡献

  1. Neural Context Matcher: 用 C-VAE + 自回归生成替代数据库搜索
  2. Characterizer: 用 AdaIN + Cross-Attention 实现风格转换和体型适配

注意:MOCHA 虽然使用了 AdaIN(继承自 Style Modelling),但这只是风格注入的工具,其核心架构是基于上下文匹配的,因此属于 Motion Matching 系。

Q3: RTN 属于什么系?

RTN 不属于任何主要流派,它是一个专用场景方法

维度RTN三大流派
目标场景Transition 生成连续 locomotion
相位需求无需相位需要相位或类似机制
标注需求无需任何标注通常需要相位/步态标注
网络结构改进 LSTM多样化(混合专家、Transformer、扩散)

RTN 的定位

  • RTN 是一个特殊的存在,专门处理游戏动画图中的transition 生成问题
  • 它不属于相位系(无需相位)、不属于 Motion Matching 系(不用搜索)、不属于扩散模型系(2018 年工作)
  • 在流派选择指南中,RTN 作为"transition 生成"的专用方案被推荐

三、基于动力学的方法 (Dynamics-based Methods)

核心特征: 输出为关节力矩或 PD 控制目标,需要物理仿真器执行。

3.1 技术演进时间线

timeline
    title 动力学方法发展时间线
    2010 : Feature-Based : 高层物理特征
    2017 : DeepLoco : 分层 RL+ 环境感知
    2018 : DeepMimic : RL+ 模仿
    2018 : Mode-Adaptive : 四足统一控制
    2019 : DReCon : MM+RL
    2021 : AMP : 对抗运动先验
    2022 : ASE : 预训练技能库
    2023 : ControlVAE : 状态条件先验
    2023 : Perpetual : 实时虚拟化身
    2023 : UniRep : 统一表示 + 蒸馏
    2024 : PDP/DiffuseLoco : 扩散策略
    2024 : MaskedMimic : 掩码运动补全
    2025 : PARC : 迭代数据扩增
    2025 : UniPhys : 统一规划 + 控制

3.2 核心思想继承关系

动力学方法经过十余年发展,形成了四条主要演进主线

flowchart TB
    subgraph RL["RL lineage"]
        FB["Feature-Based"] --> DL["DeepLoco"]
        DL --> DM["DeepMimic"]
        DM --> AMP["AMP"]
        AMP --> ASE["ASE"]
    end

    subgraph Hybrid["Hybrid lineage"]
        DL --> DReCon["DReCon<br/>MM+RL"]
        DM --> DReCon
        DReCon --> PDP["PDP<br/>RL 专家蒸馏"]
    end

    subgraph Pretrain["Pretraining lineage"]
        ASE --> CVAE["ControlVAE"]
        ASE --> UniRep["Universal Representation"]
    end

    subgraph Diffusion["Diffusion lineage"]
        PDP --> DiffuseLoco["DiffuseLoco"]
        ASE --> MaskedMimic["MaskedMimic"]
        MaskedMimic --> UniPhys["UniPhys"]
        DReCon --> PARC["PARC<br/>迭代扩增"]
    end

四条演进主线详解

主线演进路径核心问题解决方案
RL LineageDeepLoco → DeepMimic → AMP → ASE如何从数据学习控制策略?分层 RL → RL 模仿 → 对抗学习 → 预训练技能库
Hybrid LineageDeepLoco → DReCon → PDP如何统一多技能控制?分层架构 → 动态参考选择 → 多专家蒸馏
Pretraining LineageASE → ControlVAE → UniRep如何提高样本效率?对抗预训练 → 状态条件先验 → Prior+ 蒸馏 +RL 范式
Diffusion LineagePDP → DiffuseLoco / ASE → MaskedMimic → UniPhys / DReCon → PARC2024 年扩散模型如何应用?扩散策略 / 掩码补全 / 迭代扩增

关键洞察

  • DeepLoco (2017) 是分层 RL 的开创者,首次实现环境感知(32×32 高度图)+ 双控制器架构(HLC 规划 + LLC 执行)
  • DeepMimic (2018) 是深度学习时代的起点,首次证明 RL+ 模仿可以学习高质量动态动作(后空翻、旋转)
  • AMP (2021) 解决数据标注问题,从需要精确跟踪 → 无标注对抗学习
  • ASE (2022) 解决技能复用问题,预训练的技能库可以微调至下游任务
  • DReCon (2019) 开创混合控制范式,生成器 (MM) + 跟踪器 (RL) 的架构被 PDP/PARC 继承
  • 2024 年趋势:扩散模型成为主流(DiffuseLoco、MaskedMimic、UniPhys、PARC)

3.3 主线一:RL 模仿学习 (RL Lineage)

演进路径: Feature-Based Control (2010) → DeepLoco (2017) → DeepMimic (2018) → AMP (2021) → ASE (2022)


3.3.1 Feature-Based Control (SIGGRAPH 2010)

论文: 200.md

核心思想: 用高层物理特征设计控制器

方法框架:

flowchart LR
    Define["定义特征"] --> Obj["设计目标函数"]
    Obj --> Priority["优先级优化"]
    Priority --> Solve["求解关节力矩τ"]

关键公式:

  • Setpoint 目标:$E(x) = ||\ddot{y}_d - \ddot{y}||^2$
  • 角动量目标:$E_{AM}(x) = ||\dot{L}_d - \dot{L}||^2$
  • 优先级优化:$h_i = \min_x E_i(x)$ s.t. $E_k(x) = h_k, \forall k < i$

优点: 可解释、无需数据 缺点: 实现复杂、动态性差


3.3.2 DeepLoco (SIGGRAPH 2017)

论文: 218.md

核心创新: 分层深度强化学习 + 环境感知

方法框架:

flowchart TB
    Terrain["32×32 地形图"] --> HLC["高层控制器 HLC<br/>2Hz 规划步法"]
    HLC -->|"p̂₀, p̂₁, θ̂_root"| LLC["低层控制器 LLC<br/>30Hz 执行动作"]
    LLC --> PD["PD 控制器"]
    PD --> Sim["物理仿真"]

分层架构:

控制器频率输入输出
HLC2Hz地形图 + 任务目标步法计划 (p̂₀, p̂₁, θ̂_root)
LLC30Hz状态 + 步法计划关节 PD 目标

关键技术:

  • 双线性相位变换: 将相位φ分 4 区间,强制不同阶段用不同子网络
  • 参考动作引导: 不精确跟踪,只模仿风格
  • 迁移学习: 同一 LLC 可复用多个 HLC 任务

优点: 环境感知、多任务支持、组件可复用 缺点: 训练时间长 (LLC 2 天+HLC 7 天)、采样效率低


3.3.3 DeepMimic (SIGGRAPH 2018)

论文: 201.md

核心创新: 深度 RL + 模仿学习

方法框架:

flowchart LR
    Mocap["参考动作 mocap"] --> Reward["定义奖励 r^I+r^G"]
    Reward --> PPO["PPO 训练π(a|s)"]
    PPO --> PD["PD 控制器执行"]
    PD --> Sim["物理仿真"]

模仿奖励:

$$ r^I_t = w_p r^p_t + w_v r^v_t + w_e r^e_t + w_c r^c_t $$

训练技巧:

  • RSI (Reference State Initialization): 从参考动作随机状态开始
  • ET (Early Termination): 跌倒立即终止
  • 相位条件化: $\phi_t = (t \mod T_{cycle}) / T_{cycle}$

优点: 动作质量高、可学习动态动作 缺点: 每技能单独训练、样本效率低


3.4 主线二:混合控制 (Hybrid Lineage)

演进路径: DReCon (2019) → PDP (2024) → PARC (2025)

核心思想: 生成器(选择/生成参考轨迹)+ RL 跟踪器(保证物理稳定性)。


3.4.1 DReCon (SIGGRAPH Asia 2019)

论文: 190.md

核心架构:

flowchart LR
    MM["Motion Matching"] --> RL["RL 规划"]
    RL --> PD["PD 执行"]
    PD --> Sim["物理仿真"]
    Sim --> MM

创新点:

  • 用 Motion Matching 替代 mocap 参考轨迹
  • RL 输出 PD 目标而非直接力矩
  • 支持实时响应

与 DeepMimic 的差异:

  • DeepMimic: 跟踪单一 mocap 片段
  • DReCon: 用 Motion Matching 选择参考轨迹

3.3.3 AMP: Adversarial Motion Priors (SIGGRAPH 2021)

论文: 198.md

核心创新: 用对抗学习从无标注数据学习

方法框架:

flowchart LR
    Data["无标注 mocap"] --> D["判别器 D(s,s')"]
    D --> Policy["策略π"]
    Policy --> Adv["对抗奖励-log(1-D)"]
    Adv --> Policy

对抗奖励:

$$ r_{adv} = -\log(1 - D(s_t, s_{t+1})) $$

AMP 的核心优势:

  1. 无需精确跟踪参考动作
  2. 能够从多样化数据集学习
  3. 自动学习技能组合

局限性:

  • 训练不稳定(对抗博弈)
  • GAN+RL 训练难度大

3.3.4 ASE: Adversarial Skill Embeddings (SIGGRAPH 2022)

论文: 199.md

核心创新: 预训练通用技能库 + 下游微调

两阶段训练:

flowchart TB
    subgraph PreTrain["阶段 1: 预训练"]
        Data["无标注数据集"] --> LowPolicy["低级策略π(a|s,z)"]
        Data --> Discriminator["对抗 + 互信息"]
    end

    subgraph TaskTrain["阶段 2: 任务训练"]
        Goal["任务目标 g"] --> HighPolicy["高级策略ω(z|s,g)"]
        LowPolicyFixed["低级策略 (固定)"] --> Output["输出动作 a"]
        HighPolicy --> LowPolicyFixed
    end

    PreTrain --> TaskTrain

预训练目标:

$$ \max_{\pi} -D_{JS}(d_{\pi} || d_M) + \beta I(s, s'; z | \pi) $$

与 AMP 的差异:

  • AMP: 每任务从头训练
  • ASE: 预训练可复用,技能库学习

优点: 技能可复用、支持插值和组合 缺点: 需要大规模并行模拟(Isaac Gym)


3.5 特殊应用:四足动物控制 (Mode-Adaptive)

论文: 213.md

核心创新: 单个神经网络处理多种四足动物步态

架构:

flowchart TB
    state["角色状态"] --> ModeEst["Mode 估计"]
    cmd["用户命令"] --> ModeEst
    terrain["地形信息"] --> ModeEst
    ModeEst --> Adaptive["Adaptive 权重"]
    state --> Control["控制器"]
    cmd --> Control
    Adaptive --> Control
    Control --> Action["关节目标"]

优点:

  • 流畅的步态切换
  • 适应不同地形
  • 自然运动质量

缺点:

  • 仅适用于四足动物
  • 需要 mocap 数据

3.6 主线三:预训练与统一表示 (Pretraining Lineage)

演进路径: ControlVAE (2023) → UniRep (2023) → MaskedMimic (2024) → UniPhys (2025)


3.6.1 ControlVAE (TOG 2023)

论文: 202.md

核心创新: 状态条件先验 + 世界模型

与 ASE 对比: | 维度 | ASE | ControlVAE | |------|-----|------------| | 先验类型 | 球面均匀分布 | 状态条件高斯 | | 学习方式 | 对抗 + 互信息 | 世界模型 + ELBO | | 技能表示 | 离散技能库 | 连续潜在空间 |


3.6.2 UniRep: Universal Humanoid Motion Representations (2023)

论文: 191.md

核心创新: 建立 Prior + Distillation + RL 的标准范式,用 CVAE 学习动作先验,再蒸馏进物理稳定的 Decoder

三阶段训练:

flowchart TB
    Mocap["MoCap 数据"] --> CVAE["CVAE 训练"]
    CVAE --> Prior["动作先验 z"]

    TO["轨迹优化器"] --> Stable["物理稳定轨迹"]
    Stable --> Distill["蒸馏到 Decoder"]

    Prior --> RL["高层 RL"]
    Distill --> RL

核心困境解决:

  • MoCap 生成模型:动作自然但物理不稳定
  • 纯轨迹优化:物理稳定但动作单调

方案: 用蒸馏将物理稳定性灌进网络,保留 z 的多样性

优点:

  • 定型并普及了 Prior + Distillation + RL 的标准流水线
  • 动作自然性与物理稳定性兼顾

缺点:

  • 能力上限受限于轨迹优化器的求解能力
  • 仅覆盖简单 Locomotion(走、跑、转向等)

3.7 特殊应用:实时虚拟化身 (Perpetual)

论文: 196.md

核心创新: 实时虚拟化身控制系统

系统架构:

flowchart LR
    Input["视频/动捕/控制信号"] --> MotionGen["运动生成"]
    MotionGen --> Track["物理跟踪控制器"]
    Track --> Output["物理稳定全身控制"]
    Output --> Disturb["扰动恢复"]
    Disturb --> Track

特点:

  • Meta 出品,面向 VR/AR 应用
  • 实时优先,支持多种输入源
  • 物理感知保证可行性

定位: 实时系统应用,不属于上述演进主线


3.8 主线四:扩散策略 (Diffusion Lineage)

演进路径: DiffuseLoco (2024)

核心思想: 使用扩散模型学习物理一致的控制策略。


3.8.1 DiffuseLoco (2024)

论文: 195.md

方法框架:

flowchart LR
    Data["离线 mocap"] --> Diff["扩散模型π(a|s,goal)"]
    Diff --> Distill["蒸馏 RL 策略"]
    Distill --> Control["实时控制"]

优点: 离线训练、无需在线 RL


3.8.2 POMP: Physics-consistent Motion Prior (CVPR 2024)

论文: 112.md

核心创新: 基于相流形的物理一致运动先验,将动力学模块置于训练循环外

注意: POMP 虽然使用相位表示(类似相位系),但其核心是物理一致的运动生成,输出关节力矩并使用物理仿真器,因此属于动力学方法而非运动学相位系。

架构:

flowchart TB
    subgraph Input["输入"]
        state["角色状态 + 地形 + 轨迹"]
    end

    subgraph Kinematic["运动学模块"]
        MoE["OrthoMoE Encoder"]
        Diff["Diffusion Decoder"]
    end

    subgraph Dynamic["动力学模块"]
        IK["逆动力学 PD 控制"]
        FK["前向动力仿真"]
    end

    subgraph Phase["相位编码模块"]
        PAE["Periodic Autoencoder"]
        Align["语义对齐"]
    end

    Input --> MoE
    MoE --> Diff
    Diff --> IK
    IK --> FK
    FK --> Align
    Align --> PAE
    PAE --> MoE

    style Kinematic fill:#e1f5fe
    style Dynamic fill:#fff3e0
    style Phase fill:#e8f5e9

三模块协作:

  1. 运动学模块: 基于扩散的运动先验生成初始姿态
  2. 动力学模块: 物理仿真确保物理合理性(接触力、碰撞)
  3. 相位编码模块: 将仿真姿态投影回运动先验的相流形

关键洞察:

  • 直接反馈仿真结果会导致误差累积
  • 相流形中的语义对齐解决领域鸿沟问题
  • 动力学模块在训练循环外,计算高效

优点:

  • 物理一致的运动生成
  • 实时响应物理扰动
  • 计算高效(动力学模块在训练循环外)

缺点:

  • 依赖地形和冲量数据提取
  • 复杂交互质量受限

3.8.3 PDP: Physics-Based Character Animation via Diffusion Policy (2024)

论文: 192.md

核心: RL 专家蒸馏 + 扩散策略

两阶段训练:

  1. 训练多个单任务 RL 专家
  2. 离线行为克隆蒸馏到单一 Diffusion Policy

与 DReCon 的继承关系:

  • DReCon: Motion Matching + RL
  • PDP: RL 专家 + Diffusion Policy

3.8.4 MaskedMimic (SIGGRAPH Asia 2024)

论文: 183.md

核心创新: 掩码运动补全统一多模态控制

CVAE 架构:

  • 输入:多模态控制信号(掩码关键帧、对象、文本等)
  • 输出:物理一致的 PD 控制目标

特点:

  • 无需奖励工程
  • 支持无缝任务切换
  • 实时响应能力

与 UniPhys 的对比:

  • MaskedMimic: 掩码补全范式
  • UniPhys: Diffusion Forcing 范式

3.8.5 PARC (SIGGRAPH 2025)

论文: 189.md

核心创新: 基于物理仿真的迭代数据扩增框架

迭代循环:

flowchart TB
    Gen["Motion Generator<br/>扩散模型"] --> Synth["合成新地形轨迹"]
    Synth --> Track["Motion Tracker<br/>RL 物理修正"]
    Track --> Filter["质量筛选"]
    Filter --> Dataset["数据集扩增"]
    Dataset --> Gen

四项关键机制防止性能退化:

  1. 固定采样比例: 保留原始 mocap 作为监督锚点
  2. 物理约束修正: RL 控制器修正为物理可信运动
  3. 质量筛选: 仅保留成功样本
  4. 小步迭代: 微调策略,防止分布漂移

应用场景: 敏捷地形穿越(如跑酷)

与 DReCon 的继承关系:

  • DReCon: Motion Matching + RL 跟踪
  • PARC: 扩散生成 + RL 跟踪 + 迭代扩增

3.8.6 UniPhys (2025)

论文: UniPhys: Unified Planner and Controller with Diffusion (2025)

核心创新: 统一规划器 + 控制器,Diffusion Forcing 范式

方法框架:

flowchart LR
    Mocap["mocap 数据"] --> Preprocess["PD 控制预处理"]
    Preprocess --> GT["物理合理 GT<br/>动作略僵硬"]
    GT --> Train["训练 Diffusion 模型"]
    MultiModal["多模态输入<br/>文本/轨迹/目标"] --> Infer["引导采样推理"]
    Train --> Infer
    Infer --> Output["物理合理运动"]

与 MaskedMimic 对比: | 维度 | MaskedMimic | UniPhys | |------|-------------|---------| | 训练范式 | 掩码补全 | Diffusion Forcing | | PD 目标来源 | mocap+ 跟踪 | mocap+PD 预处理 | | 长序列处理 | 较短序列 | 噪声历史去噪 |

优点:

  • 无需强化学习和蒸馏
  • 训练简单,单模型推理
  • 物理合理但动作略僵硬

3.9 动力学方法对比

方法训练范式样本效率动作质量抗扰动实时性
Feature-Based无需训练N/A
DeepLoco分层 RL
DeepMimicRL+ 模仿极高
Mode-Adaptive模仿学习
DReConRL+MM
AMP对抗学习极高
ASE预训练 + 微调极高
ControlVAE世界模型
Perpetual实时跟踪
UniRepPrior+ 蒸馏 +RL
DiffuseLoco离线蒸馏极高
PDPRL 专家蒸馏极高
MaskedMimic掩码补全极高
PARC迭代扩增极高⚠️
UniPhys直接训练⚠️

四、运动学 vs 动力学:技术选型指南

4.1 核心差异

维度运动学方法动力学方法
输出关节姿态/速度关节力矩/PD 控制目标
物理仿真
真实感来源数据驱动物理约束 + 数据
抗扰动能力
环境交互有限
训练成本低 - 中中 - 高
实现难度

4.2 思想演进总结

运动学方法演进主线

  1. 相位表示线 (PFNN → Style Modelling → MOCHA → Phase Manifolds)

    • 核心思想:用相位解耦不同动作状态
    • 演进:全局相位 → 局部相位 → 相位流形插值
  2. Motion Matching 线 (MM → Learned MM → MOCHA)

    • 核心思想:用数据搜索生成动作
    • 演进:数据库搜索 → 神经网络预测 → 角色化扩展
  3. 扩散模型线 (A-MDM → CAMDM → AAMDM → DART)

    • 核心思想:扩散模型高质量生成
    • 演进:1000 步 → 50 步 → 8 步 → 5 步,同时支持实时控制

动力学方法演进主线

  1. RL 模仿线 (DeepMimic → AMP → ASE)

    • 核心思想:从 mocap 数据学习控制策略
    • 演进:单技能跟踪 → 对抗先验 → 预训练技能库
  2. 混合控制线 (DReCon → PDP → PARC)

    • 核心思想:生成器 + RL 跟踪
    • 演进:Motion Matching → RL 专家 → 扩散模型 + 迭代扩增
  3. 统一表示线 (ControlVAE → UniRep → MaskedMimic → UniPhys)

    • 核心思想:统一潜在空间表示
    • 演进:状态条件先验 → Prior+ 蒸馏 → 掩码补全 → Diffusion Forcing

4.3 应用场景推荐

应用场景推荐方法理由
游戏 NPCDeepMimic / ASE / Learned MM实时、质量高、抗扰动
电影动画CAMDM / DART / MOCHA多样性、风格控制、无需物理
VR 化身PFNN / CAMDM / MOCHA / Perpetual低延迟、稀疏输入支持
机器人仿真Feature-Based + RL / ASE安全、可解释、物理正确
在线游戏Learned Motion Matching低内存、服务器友好
角色设计MOCHA / Style Modelling风格转换、体型适配
四足动物Mode-Adaptive统一多步态控制
敏捷地形PARC / RTN (地形版)复杂地形穿越
多任务控制MaskedMimic / UniPhys统一框架处理多模态输入

4.4 方法选择决策树

flowchart TD
    Q1["需要物理仿真/抗扰动?"] --> |否 | A1["运动学方法"]
    Q1 --> |是 | A2["动力学方法"]

    A1 --> Q2["需要风格转换?"]
    Q2 --> |是 | A3["MOCHA / Style Modelling / CAMDM"]
    Q2 --> |否 | A4["PFNN / Learned MM / AAMDM"]

    A2 --> Q3["有无标注数据?"]
    Q3 --> |无 | A5["AMP / ASE"]
    Q3 --> |有 | A6["DeepMimic / DiffuseLoco"]

    A6 --> Q4["需要多模态控制?"]
    Q4 --> |是 | A7["MaskedMimic / UniPhys"]
    Q4 --> |否 | A8["PDP / DiffuseLoco"]

    A2 --> Q5["需要敏捷地形穿越?"]
    Q5 --> |是 | A9["PARC"]

五、开放性问题与未来趋势

5.1 技术挑战

  1. 实时性与质量权衡

    • 扩散模型推理速度仍是瓶颈
    • 方向:一致性模型、蒸馏、更少去噪步数
  2. 长时序规划

    • 当前方法多为短时域反应式
    • 方向:分层控制、世界模型、Diffusion Forcing
  3. 多角色泛化

    • 技能绑定特定形态
    • 方向:形态无关表示、零样本迁移
  4. 与语言模型结合

    • 自然语言指令驱动
    • 方向:LLM + 运动生成联合训练
  5. 在线适应

    • 适应新环境、新扰动
    • 方向:Test-Time Training、元学习、迭代扩增(如 PARC)

5.2 未来趋势

  1. 运动学 + 动力学融合

    • 运动学方法生成参考轨迹
    • 动力学方法保证物理可行性
    • 代表工作:UniPhys、PARC
  2. 世界模型 + 扩散

    • 学习可微物理引擎
    • 在 latent space 规划
  3. 多模态大模型

    • 视觉 + 语言 + 运动联合训练
    • 具身智能 (Embodied AI)
  4. 自动技能发现

    • 无监督发现技能层级
    • 类似 LLM 的 emergent abilities
  5. 数据高效学习

    • 少样本风格学习
    • 迭代数据扩增(PARC 范式)

六、关键论文索引

运动学方法

论文年份链接核心贡献
PFNN2017113相位函数化权重
Few-shot Locomotion Styles2018214残差适配器 +CP 分解,少样本风格学习
Local Motion Phases2020216局部相位表示
RTN2018210循环转移网络
Style Modelling2020211特征变换 + 局部相位
Learned Motion Matching2020208神经网络替代数据库
MOCHA2023209上下文匹配角色化
Phase Manifolds2023212相位流形中间帧
POMP2023112物理一致运动先验
A-MDM2024206自回归扩散模型
CAMDM20242078 步去噪 + 风格转换
AAMDM20242045 步 DD-GAN+ADM
DARTControl2025205潜在空间控制

动力学方法

论文年份链接核心贡献
Feature-Based Control2010200高层物理特征控制
DeepMimic2018201RL+ 模仿学习
Mode-Adaptive2018213四足动物统一控制
DReCon2019190Motion Matching+RL
AMP2021198对抗运动先验
ASE2022199预训练技能嵌入
ControlVAE2023202状态条件先验
Perpetual2023196实时虚拟化身
UniRep2023191统一表示 + 蒸馏
DiffuseLoco2024195扩散策略
PDP2024192RL 专家蒸馏
MaskedMimic2024183掩码运动补全
PARC2025189迭代数据扩增
UniPhys2025184统一规划 + 控制

七、总结

角色位移控制领域呈现双轨并行、多线演进的发展态势:

运动学方法沿四大主线演进:

  1. 相位系:PFNN 的相位函数化权重 (2017) → Few-shot Styles 的残差适配器 +CP 分解 (2018) → Local Motion Phases 的局部相位 (2020) → Style Modelling 的特征变换 (2020) → Phase Manifolds 的相位流形插值 (2023)
  2. RTN (Transition Generation): 循环转移网络 (2018),专用 transition 生成
  3. Motion Matching 系:工业界标准 Motion Matching → Learned Motion Matching 的神经网络替代 → MOCHA 的上下文匹配角色化
  4. 扩散模型系:A-MDM 的自回归设计 → CAMDM 的 8 步去噪 + 风格转换 → AAMDM 的 5 步加速 → DART 的潜在空间控制

动力学方法沿三条主线演进:

  1. RL 模仿线:DeepMimic 的 RL+ 模仿 → AMP 的对抗先验 → ASE 的预训练技能库
  2. 混合控制线:DReCon 的 Motion Matching+RL → PDP 的 RL 专家蒸馏 → PARC 的扩散生成 + 迭代扩增
  3. 统一表示线:ControlVAE 的状态条件先验 → UniRep 的 Prior+ 蒸馏范式 → MaskedMimic 的掩码补全 → UniPhys 的 Diffusion Forcing

融合趋势:2024-2025 年的工作开始探索运动学 + 动力学的融合:

  • UniPhys 用 PD 预处理保证物理合理性
  • PARC 用迭代扩增结合生成与物理修正
  • Perpetual 实现实时物理跟踪

这将是未来的重要方向。


参考文献: 详见各论文笔记文件

本文出自CaterpillarStudyGroup,转载请注明出处。

P3

Outline

  • Character Kinematics

    • Skeleton and forward Kinematics
  • Inverse Kinematics

    • IK as a optimization problem
    • Optimization approaches
      • Cyclic Coordinate Descent (CCD)
      • Jacobian and gradient descent method
      • Jacobian inverse method

P4

Character Kinematics

the study of the motion of bodies without reference to mass or force

P8

joint, bone, skeleton


✅ 关注关节的位置和旋转

P13

Kinematics of a Chain

问题描述

要使手臂摆成指定的动作,每个关节在各自坐标系下的旋转是多少?

求\(Q_0, Q_1, Q_2, Q_3, Q_4\)

P14

初始pose

$$ Q_0=Q_1=Q_2=Q_3=Q_4=I $$

✅ 这一个定义了5个关节的手臂。在每个关节上绑上一个坐标系。

P15

旋转关节4

把关节4旋转R4以后

✅ \(Q\):在世界坐标系下的朝向
✅ \(R\):在局部坐标系下的旋转

$$ \begin{matrix} Q_0=I\quad\\
Q_1=I\quad\\
Q_2=I\quad\\
Q_3=I\quad\\
Q_4={\color{Red}{R_4}} \end{matrix} $$

P16

旋转关节3

把关节3旋转R3以后,Q3和Q4会同时受到影响

$$ \begin{matrix} Q_0=I\quad\quad\\
Q_1=I\quad\quad\\
Q_2=I\quad\quad\\
Q_3={\color{Red}{R_3}}\quad\\
Q_4={\color{Red}{R_3}}R_4 \end{matrix} $$

P17

依次旋转关节2, 1, 0

$$ \begin{matrix} Q_0={\color{Red}{R_0}}\quad \quad\quad\quad \\ Q_1={\color{Red}{R_0}}R_1 \quad\quad\quad \\ Q_3={\color{Red}{R_0}}R_1R_2R_3\quad \\ Q_4={\color{Red}{R_0}}R_1R_2R_3R_4 \end{matrix} $$

P20

简化公式,用递推的形式描述

P21

From rotation(local) to orientation(global)

$$ Q_i = Q_{i-1}R_i $$

From orientation(global) to rotation(local)

$$ R_i = Q^T_{i-1}Q_i $$

✅ 这些 \(Q\) 都是全局旋转,\(R\) 是局部旋转。

Kinematics with position

P23

初始状态

✅ \( 𝒍 \):子关节位置在父坐标系下的坐标。

P31

positon with pose

✅ \(p\) 是全局位置,\( 𝒍 \) 是局部偏移。

P37

Forward Kinematics of a Chain: Summary

position

Given the rotations of all joints \(R_i\), find the coordinates of \(x_0\) in the global frame \(x\):

✅ \(x_0\) 是 \(R_4\) 坐标系下的点,求它在某个父坐标系下的位置。
✅ \(p\):关节在全局坐标系下的位置
✅ 第1步:根据 \(R_i\) 和 \( 𝒍 _i\) 求出 \(Q_i\) 和 \(P_i\)
✅ 第2步:\(E\) 可以是任意父结点,公式都适用

P38

✅ 是上一页的另一种写法,不需提前算出中间变量。

P39

rotation

Given the rotations of all joints \(R_i\), find the coordinates of \(x_0\) relative to the local frame of \(Q_k\):

✅ 已知全局坐标系下的坐标,求 \(Q_k\) 下的坐标。

P40

✅ 对应上一页的另一种写法

P41

Kinematics of a Character

骨骼的参数化表示

✅ 把角色建模成多条关节链。

P43

✅ 以不同关节为 root,同样旋转会得到不同效果。

P45

Types of Joints

P50

knee, elbow
\({\color{Red}{1 \text{DoF}}}\)
\(\theta_{\min }\le \theta\le \theta_{\max } \)
hinge joint
revolute joint
hip, shoulder
\({\color{Red}{3 \text{DoF}}}\)
\(\theta_{\min }\preceq \theta \preceq \theta_{\max } \)
ball-and-socket joint
手腕。其实手腕不能自转。
2 Dof

✅ 关节的自由度最多为3,因为不能自主移动。Hips 除外。 ✅ 自由度:一个物理系统,需要多少参数可以唯一准确地描述它的状态。
✅ 6 DOF=3 平移 + 3 旋转。

姿态的参数化表示 Pose Parameters

P55

$$ (t_0,R_0,R_1,R_2\dots \dots ) $$

$$ \text{root } \mid \text{ internal joints} $$

joints are typically in the order that every joint precedes its offspring

for \(i\) in joint_list:

$$ \begin{align*} p_i= & i^,\text{ s parent joint} \\ Q_i=& Q_{pi}R_i \\ x_i= & x_{pi} + Q_{pi}l_i \end{align*} $$

✅ 一个动作的参数化表示:
✅ 全局位置+root 朝向+各关节旋转
✅ 通常要求,关节顺序为父在前子在后,这样只须遍历一遍就能完成 FK.

❓ Q2: how should we allow stretchable bones?
✅ 答:增加参数,3 Dof 增加为 6 Dof.

P58

Example: motion data in a file

BVH files

  • HIERARCHY: defining T-pose of the character
  • MOTION: root position and Euler angles of each joints

See: https://research.cs.wisc.edu/graphics/Courses/cs-838-1999/Jeff/BVH.html

P59

Inverse Kinematics

🔎 A. Aristidou, J. Lasenby, Y. Chrysanthou, and A. Shamir. 2018.
Inverse Kinematics Techniques in Computer Graphics: A Survey.
Computer Graphics Forum

P61

Forward and Inverse Problems

For a system that can be described by a set of parameters \(\theta \), and a property 𝒙 of the system given by

$$ x=f(\theta ) $$

Forward problem:

  • Given \(\theta \), we need to compute \(x \)

  • Easy to compute since \(f\) is known, the result is unique

  • DoF of \( \theta \) is often much larger than that of \(x \). We cannot easily tune \(\theta \) to achieve a specific value of \(x\).

Inverse problem:

  • Given \(x \), we need to find a set of valid parameters \(\theta \) such that\(x=f(\theta) \)

  • Often need to solve a difficult nonlinear equation, which can have multiple solutions

  • \(x\) is typically meaningful and can be set in intuitive ways

P62

Inverse Kinematics问题描述

Given the position of the end-effector \(x\), Compute the joint rotations \(R_i\)

P64

✅ 大部分情况下IK问题是多解问题

P68

two-joint IK

Step 1: Rotate joint 1 such that

$$ ||l_{ox}||=||l_{02}|| $$

✅ 使用余弦公式

Step 2: Rotate joint 0 such that

$$ l_{ox}=l_{02} $$

✅ 叉乘得到旋轴,点乘得到旋转角。

Step 3: Rotate joint 0 around \(l_{ox}\) if necessary

Multi Joint IK

P72

机械臂场景,关节有多个,指定末端结点的位置和朝向

$$ x=f(\theta ) \\ Q=Q(\theta ) $$

✅ 控制末端点的朝向比较简单,但控制末端点的位置比较难,因此重点考虑如何控制末端点的位置

P74

IK as an Optimization Problem

P75

Find \(\theta \) to optimize

$$ \min_{\theta } \frac{1}{2} ||f(\theta )-\tilde{x} ||^2_2 $$

✅ 用迭代的方法,从当前 motion 出发,优化出目标 motion.

P88

CCDIK

Cyclic Coordinate Descent (CCD)

Update parameters along each axis of the coordinate system

Iterate cyclically through all axes

P90

Cyclic Coordinate Descent (CCD) IK

✅ 叉乘得到旋转轴,点乘得到旋转角度。

Rotate joint 3 such that \(𝒍_{34}\) points towards \(\tilde{x}\)
Rotate joint 2 such that \(𝒍_{24}\) points towards \(\tilde{x}\)
Rotate joint 1 such that \(𝒍_{14}\) points towards \(\tilde{x}\)
Rotate joint 0 such that \(𝒍_{14}\) points towards \(\tilde{x}\)
Rotate joint 3 such that \({l}'_{34}\) points towards \(\tilde{x}\)
……

Iteratively rotation each joint to make the end-effector align with vector between the joint and the target

Easy to implement, very fast

The “first” joint moves more than the others May take many iterations to converge Result can be sensitive to the initial solution

✅ 一个动作序列做 CCD,可能结果不稳定,有跳变。
✅ 前面例子是 3210 的调整顺序,也可以是 0123 的顺序。
✅ 先移到的关节调整幅度会大一点,所以一般从末端开始。

P105

Gradient Descent

CCD下降没有考虑目标函数的性质,考虑目标函数的性质可以得出下降更快的方法。

✅ 关于梯度下降法跳过。

针对目标函数

$$ \min_{\theta } \frac{1}{2} ||f(\theta )-\tilde{x} ||^2_2 $$

其梯度为:

$$ \begin{align*} \nabla_\theta F(\theta ^i)= & (\frac{\partial f}{\partial \theta }(\theta ^i))^T(f(\theta ^i)-\tilde{x})\\ = & J^T \Delta
\end{align*} $$

✅ \(J\) 是 Jacobia矩阵, \( \Delta \) 是位置差

P106

因为更新函数为:

$$ \theta ^{i+1}=\theta ^i-\alpha J^T\Delta $$

$$ J= \frac{\partial f}{\partial \theta }=(\frac{\partial f}{\partial \theta_0 }\frac{\partial f}{\partial \theta_1 }\dots \frac{\partial f}{\partial \theta_n } ) $$

J是一个3*N的矩阵,N代表关节数。

怎么计算J?
方法一:使用machine learning framework的autograd功能
方法二:有限差分
方法三:Geometric Approach

P114

Geometric Approach

问题描述

Assuming all joints are hinge joint
求关节 1 旋转轴 \(a_1\),对 \(x\) 位移的影响

计算过程

$$ {x}' -x=(\sin \delta \theta _i)a_i\times r_i+(1-\cos \delta \theta _i)a_i\times(a_i\times r_i) $$

$$ \frac{ \partial f }{\partial \theta _ i} = \lim _ {\delta \theta _ i \to 0} \frac{{x}'-x }{\delta \theta _ i}= a _ i\times r _i $$

P117

更通用的场景- ball joints

❓ How to deal with ball joints?
A ball joint parameterized as Euler angles:

$$ 𝑅_𝑖 = 𝑅_{𝑖𝑥}𝑅_{𝑖𝑦}𝑅_{𝑖𝑧} $$

can be considered as a compound joint with three hinge joints

✅ 一个ball joint可以看作是3个hint joint。因此占J矩阵的3列。

也可以写成这种形式:

$$ \frac{ \partial f }{\partial \theta _ {i\ast } } = a _ {i\ast } \times r _ i $$

f对某一个欧拉角的导数,等于这个欧拉角的轴叉乘上末端点到关节点的距离。

需要注意的是,这个的旋转轴a是在世界坐标系下的表示,因此要有一个坐标系的转换。

$$ \begin{align*} 𝒂_{𝑖𝑥} & =𝑄_{𝑖−1}𝒆_𝑥 \\ 𝒂_{𝑖𝑦}& = 𝑄_{𝑖−1}𝑅_{𝑖𝑥}𝒆_𝑦\\ 𝒂_{𝑖𝑧} &= 𝑄_{𝑖−1}𝑅_{𝑖𝑥}𝑅_{𝑖𝑦}𝒆_𝑧 \end{align*} $$

❓ 问:Can we parameterize a ball joint using axis-angle \(\theta u\) and compute Jacobian as

$$ \begin{matrix} \frac{\partial f}{\partial \theta _i} =\theta u\times r_i & ??? \end{matrix} $$

✅ 答:不可以。Jacobian for axis-angle representation has a rather complicated formulation…

P121

Jacobian Transpose / Gradient Descent

First-order approach, convergence can be slow Need to re-compute Jacobian at each iteration

✅ 怎么求 \(J\),这里讲了 3 种方法:(1)backward 框架(2)差分(3)几何计算。实际上直接用 1 可以解决,不需要自己去算,因此跳过。
✅ 特点:(1)迭代次数比 CCD 少(2)计算量比 CCD 大。

P122

✅ 数值插值算法见 GAMES102.

P124

Quadratic Programming 二次规划问题

✅ 这几页介绍二次函数求极值的问题。

$$ \min_{\theta } F(\theta )=\frac{1}{2} \theta ^TA\theta +b^T\theta $$

where \(A\) is positive definite:

$$ A=A^T,\theta ^TA\theta \ge 0 \text{ for any } \theta $$

P126

公式直接求解

$$ \begin{matrix} \text{Gradient}: \nabla_\theta F(\theta )=A\theta +b \\ \text{Optimality condition}: \nabla_\theta F(\theta ^\ast )=0\\ {\color{Blue} \Downarrow } \\ \theta ^\ast =-A^{-1}b \end{matrix} $$

✅ 二次函数的极值点可以直接从公式求出来

P127

Gauss-Newton Method

✅ IK问题也可以转化为二次函数求极值的问题

$$ F(\theta )=\frac{1}{2} ||f(\theta )-\tilde{x} ||^2_2 $$

Consider the first-order approximation of \(f(\theta)\) at \(\theta^0\)

✅ 把 \(f(\theta )\) 在 \(\theta ^{\circ} \) 处一阶泰勒展开。

$$ \begin{align*} f(\theta)\approx & f(\theta^0) + \frac{\partial f}{\partial \theta} (\theta^0)(\theta-\theta^0) \\ = & f(\theta^0)+J(\theta-\theta^0) \end{align*} $$

P128

✅ 把它代入目标函数。

\begin{align*} f(\theta)\approx & \frac{1}{2}||f(\theta^0)+J(\theta -\theta ^0)-\tilde{x}||^2_2 \\ = &\frac{1}{2} (\theta -\theta ^0)^TJ^TJ(\theta -\theta ^0)\\ & +(\theta -\theta ^0)^TJ^T(f(\theta ^0)-\tilde{x})+c \end{align*}

P129

first-order optimality condition

✅ 令 \((\nabla F (\theta ))^T=0\)

$$ \begin{matrix} f(\theta)\approx \frac{1}{2}||f(\theta^0)+J(\theta -\theta ^0)-\tilde{x}||^2_2 \\ \Downarrow \\ (\nabla F (\theta ))^T=J^TJ(\theta-\theta^0)+J^T(f(\theta^0)-\tilde{x} )=0 \end{matrix} $$

P133
$$ J^TJ(\theta-\theta^0)=-J^T\Delta $$

if \(J^TJ\) 不可逆

✅ \(J\) 的维度是 \(3\times N\),因此 \(J^TJ\) 不可逆。

\(J^TJ\) is \({\color{Red} {\text{NOT}}}\) invertible, but \(JJ^T\) can be invertible

P134
因此做以下转化:

✅ \(\Delta\) 是当前和目标的末端点位置之差。

P135

$$ J(\theta-\theta^0)=\tilde{x} -f(\theta^0) $$

P137

$$ \begin{align*} \theta = & \theta ^0-J^+\Delta \\ = & \theta ^0-J^T(JJ^T)^{-1}\Delta \end{align*} $$

\(J^+\)表示J的(Moore-Penrose) Pseudoinverse

P138

if \(J^TJ\) 可逆

$$ J^TJ(\theta-\theta^0)=-J^T\Delta $$

If \(J^TJ\) is invertible, we have

$$ \theta = \theta^0 - (J^TJ)^{-1}J^T\Delta $$

but when can \(J^TJ\) be invertible?

P141

✅ 答:改变IK的约束条件(例如增加中间关节的位置要求)和自由度(例如限制关节的自由度),可改变 \(J\) 的形状为方阵或高瘦阵,此时 \(J^TJ\) 可逆,则换一种方式求逆。

P143

对比

✅ 左:欠约束,右:过约束。
✅ 由于这个方法的本质是把高度非线性的函数做了线性化,所以只是在当前位置附近才有效,远了误差就会非常大。因此增加learning rate。

P145

Usually faster than gradient descent/Jacobian transpose method.

Any problem? \(JJ^T/J^TJ\) can be (near) singular!

✅ 快一点是因为 \(J^+\) 是近似的 \(J\),计算量较小,问题是可能得到一个错很远的 \(J^+\),导致结果不稳定。

P147

Damped Jacobian Inverse Method

✅ 上一页的问题是伪逆\(J^+\) 引入的不稳定。
✅ 解决方法:引 \(\lambda\) 阻尼项

$$ J^\ast =J^T(JJ^T+\lambda I)^{-1} $$

$$ J^\ast =(J^TJ+\lambda I)^{-1}J^T $$

P148
Also called Levenberg-Marquardt algorithm

✅ 引 \(\lambda\) 阻尼顶后,两种方式的计算结果相同。
✅ 当 \(\lambda\) 很大时,此方法等价于梯度下降法。

P149

\(\lambda\) 的几何意义

✅ 相当于正则项 ✅ 进一步地,分别给每个关节移动权重。
✅ 权重越大,移动越小。

P152

Character 全身IK

✅ 全身 IK,不同链条上都有目标点。
✅ 可以同时优化所有链,或选一个或选一些。
✅ IK 要更新哪关节也可以自由设定。

P156

总结

✅ IK问题可以使用优化方法,不同优化方法对应不同 IK 方法,例如:
CCD → CCDIK
梯度下降法 → Jacobian transpose
Gaussian → Jacobian Inverse
✅ IK问题可以使用启发式方法,例如FABRIK Andreas Aristidou and Joan Lasenby. 2011.
🔎 FABRIK: A fast, iterative solver for the Inverse Kinematics problem.
Graphical Models

P158

✅ Slerp 结合 Sbline.
✅ 50 fps → 60 fps:先插值,再采样
✅ 惯性插值:UE 基于 SPD 求约束来做 IK
✅ 参考 Darel Holden 博客


本文出自CaterpillarStudyGroup,转载请注明出处。

https://caterpillarstudygroup.github.io/GAMES105_mdbook/

P3

Outline

  • Character Kinematics (cont.)

    • Motion Retargeting
    • Full-body IK
  • Keyframe Animation

    • Interpolation and splines

P4

Recap: Character Kinematics

P15

Reference Pose

{ \(𝑅_𝑖 = 𝐼\) }
The pose with zero / identity rotation Bind pose / Reference pose

❗ reference pose不一定是Tpose。

P16

T-Pose? A-Pose?

✅ 常见的reference pose一般为Apose或者Tpose。
✅ 对于骨骼动画来讲,\(A\) 或 \(T\) 都一样。
✅ 对于骼骼绑定与蒙皮来讲,更倾向于\(A\)。因为 \(A\) 的肩膀是自然状态。

P19

特殊的reference pose


✅ 这个动作跟建模师建模时的动作镜像操作有关。

P23

不同reference pose会引入的问题

✅ 相同的姿态参数放在不同的参考姿态下呈现出的姿态不同。 ✅ 解决方法:Retargeting

P29

Retargeting between reference poses

✅ 让不同参考姿态的角色做出同样的动作,根据 \(R_A\) 求 \(R_B\).
✅ 重定向还有其它问题,例如关节长度、穿模。

P33

Retargeting for a single object

问题分析

公式推导

✅ 把 B 先转到 A 的姿态,再做指定动作。

P45

问题分析

✅ 两个关节的场景

公式推导

P49

结论

P51

P52

Retargeting between reference poses

问题分析

P53

结论

P101

Keyframe Animation and Interpolation

✅ Keyframe Animation跳过

P106

Interpolation

  • Given a set of data pairs \(D=\){\((x_i,y_i)\mid i=0,\dots ,N\)} find a function \(f(x)\) such that

P107

常见的差值方法有Linear Interpolation、Polynomial Interpolation等。详见GAMES102。

P114

Smoothness

Interpolation of Rotations

P154

P157
SLERP for Quaternions

$$ q_t=\frac{\sin[(1-t)\theta ]}{\sin \theta } q_0 + \frac{\sin t \theta }{\sin \theta }q_1 $$

$$ \cos \theta = q_0 \cdot q_1 $$

Constant rotational speed, but only “linear” interpolation

P158

🔎 Animating rotation with quaternion curves.
Ken Shoemake. 1985
SIGGRAPH Computer Graphics,


本文出自CaterpillarStudyGroup,转载请注明出处。

https://caterpillarstudygroup.github.io/GAMES105_mdbook/

P2

Outline

  • Motion Capture

    • History and modern mocap systems
  • Motion Synthesis

    • Motion retargeting
    • Motion transition
    • Motion graph

P3

Motion Capture

How to get motion data?

✅ 动画师制作,光学动捕、视觉动捕,外骨骼动捕,惯性传感器,动作估计。

P29

Motion Synthesis

How to use motion data?

P31

P32

Motion Retargeting

Retargeting要解决的问题

  • Retarget a motion to drive a character with
    • Different number of bones
    • Different bone names
    • Different reference pose
    • Different bone ratios
    • Different skeletal structure
    • ……

P34

A possible retargeting pipeline

  • Map bone names
  • Scale translations
  • Copy or retarget joint rotations to fix reference pose
  • Postprocessing with IK
    • Foot-skating
    • Self penetration
  • ……

P38

Motion Transition

✅ 有一段走路数据和跑步数据,如何实现人由走到跑的过程。

方法一

✅(1)找到两个 motion 中相似的一帧。
✅(2)两帧在时间上对齐
✅(3)放到这一帧时动作切换。

✅ 缺点:会有明显间断。

方法二

✅ 改进:考虑前后帧,并做插值。

P46

$$ p(t)=(1-\phi (t))p_0(i)+\phi (t)p_1(i) $$

✅ 不一定非要线性插值,定义 \(\phi (t)\),或其它混合策略
✅ 可能存在的问题:(1)突然转向(2)滑步
✅ 当走和跑分别是朝不同方法时会出现以上问题。
✅ 解决方法:插值之前动作对齐

P55

“Facing Frame”

定义坐标系

每个角色有自己的角色坐标系,定义为:
A special coordinate system that moves horizontally with the character with one axis pointing to the “facing direction” of the character

✅ 原点:Hip 在地面上的投影
✅ 坐标轴:参考姿态下 \(y\) up \(z\) forward.且旋转和平移都受到限制。

$$ \begin{align*} R & = \theta e_y \\ t & = (t_x,0,t_z) \end{align*} $$

✅ 也可以为不同的的场景定义不同的 \(R\) ,例如上下半身的 \(y\) 轴旋转方向不同。

  • Possible definitions of \(R\)
    • \(R\) is the y-rotation that aligns the z-axis of the global frame to the heading direction
    • \(R\) is the y-rotation that aligns x-axis of the global frame to the average direction of the vectors between shoulders and hips
    • Decomposition root rotation as \(R_0=R_yR_{xz}\)

P58

动作分解

✅ 把 \(R\) 分解为 \(R_y\) 和 \(R_{xz}\),求 \(R_y\)
✅ \({R}' \) 能够把 local y-axis 转到 global y-axis 的矩阵。

P62

动作合成

  • How to compute this transformation?

✅ 两个坐标系的转换。

P68

Path Fitting

👆 让角色跟着轨迹移动。

P69

Motion Composition

Computationally generating motions according to
- User control
- Objects in the same environment
- Movements of other characters
- ……

P70

Motion Graphs


👆 动作图的本质是状态机。

P72

Segment Motion Data

✅ 一段动捕数据,如何做分割,如何确定哪些点可以连到一起。
✅ Distance 可以有多种定义方式。
✅ 根据图确定分段与连接。

P73

建立动作转移关系

  • Distance map
    • Each pixel represents the difference between a pair of poses
    • Local minima are potential transition point

🔎 Motion graphs Lucas Kovar, Michael Gleicher, and Frédéric Pighin. 2002.
ACM Trans. Graph. 21, 3 (July 2002),

P74

Motion Synthesis

  • State-machines
    • Nodes represent motion clips
    • Edges represent potential transitions
    • Transitions are triggered when necessary
      • User input
      • Clip end
    • Check immediate connections for the next clip
      • May need deeper search

P75

Interactive Animation Pipeline

✅ 优点:根据路线从动作库中选择最合适的动作,而不是直接使用路线,因此减少滑步。
✅ 缺点:(1) 动作多时动作复杂。
(2) 一个片断播完再切动作,响应较慢。
(3) 需要提前规划好动捕动作。
✅ 如果数据集里没有想要的姿态,可以结合 IK.

P78

Motion Matching?

  • Clip → Pose
  • Short clip → “Raw” and long motion data

✅ 切换粒度更细:1帧 or 0.1 s.
✅ 灵活性提升,可控性欠缺。


本文出自CaterpillarStudyGroup,转载请注明出处。

https://caterpillarstudygroup.github.io/GAMES105_mdbook/

P1

✅ 基于数据:对现有数据进行连接重组。
✅ 基于学习:对数据处理,放入模型,再生成数据。

P2

Outline

  • Recap: interactive character animation
    • Motion Graphs
    • Motion Matching
  • Statistical Models of Human Motion
    • Principal Component Analysis
    • Gaussian Models

P3

Recap: Interactive Animation

How to make a character respond to user command?

P9

Motion Graphs

✅ 检测到用户输入后:

  1. 把当前片段播完(响应慢)
  2. 所有下一片断与当前状态进行坐标系对齐
  3. 根据当前状态和预期轨迹,选择下一个片断
  4. 播放对齐后的下一片断

✅ 可以结合路径规划算,实现一些智能角色。Motion Graph 只是一个底层数据结构。

P14

Motion Fields

Motion Graphs / State MachinesMotion Fields / Motion Matching

✅ Motion Matching 是将 Motion Fields 简化以后加一些比较好的工程实践。

P17

构建 Motion Fields

✅ 每条链路代表一个动作,灰圈代表动作里的一帧,整体构成一个很大的 Field.

P20

在Motion Fields中选择pose

✅ 每一帧有一些最近邻,它们来自不同动作,有不同的状态。
✅ 绿色代表向右,挑出对应帧。做混合。

P23

对pose的混合

✅ 根据用户输入设置不同权重,会得到不同结果
✅ 优点:(1) 自由控制(2)支持外力,可结果物理仿真(3)不需要使首尾帧相似的预处理。
✅ 缺点:需要设计一些规则来计算最近邻的混合。
✅ 解决方法:强化学习

P24

Pipeline

✅ 根据用户输入设计邻局的权重,这一步难以工业化。
✅ 论文使用强化学习来解决,这样增加了训练的难度。

P31

Motion Matching

P32

✅ 简化一:只找一个最近邻,不需要 blend. 然后用平滑解决跳变问题。

P34

距离衡量函数

We need a distance function / metric to define the nearest neighbor

$$ \text{next-pose } = \min_{i \in\text{ Dataset}} ||x_{\text{curr}}-x_i|| $$

$$ x: \text{feature vector} $$

✅ Motion Matching 中距离函数的设计很重要,很大程度上影响算法的效果。
✅ 这个距离定义可以是特征相关的。

A possible set of feature vectors:

  • root linear/angular velocity
  • position of end effectors w.r.t. root joint
  • linear/angular velocity of end effectors w.r.t. root joint
  • future heading position/orientation (e.g. in 0.5s, 1.0s, 1.5s, etc.)
  • foot contacts
  • ……

P36

动作平滑

We need a smooth motion

搜索效率

We need a good performance

  • An efficient data structure for searching,例如 e.g. KD-tree

数据集

A efficient dataset,例如“Dance card”

✅ 保证所使用的动作集能够覆盖到目标。
✅ 优点:(1) 实现简单 (2) 控制灵活 (3) 可结合物理仿真。
✅ 缺点:(1) 不能解决滑步

P39

Statistical Models of Human Motion

✅ 根据已有数据,对“动作自然”建模。
✅ 或找到一个模型,告诉我们什么是自然姿态。

P43
因为由于以下原因, “自然的动作”实际上是够成高维的动作参数空间的流形曲面。

  • Coordinated arm/leg movement
  • Musculoskeletal structure
  • Laws of physics
  • ……

P45

Principal Component Analysis (PCA)

  • A technique for
    • finding out the correlations among dimensions
    • dimensionality reduction

✅ PCA 细节跳过。目的:降维,抓住主要特征。

P65

a pose \(x\) with smaller \(\sum _k\frac{((x-\bar{x})\cdot u_k)^2 }{\sigma ^2_k}\) is more likely to be a good pose

✅ 可作为动作生成的先验,告诉我一个动作是否合理。
✅ \(M_k\) 和 \(\sigma_k\) 分别是 \(k\) 维上的均值和方差。

P66

Character IK with a Motion Prior

正则化先验

$$ F(\theta )=\frac{1}{2} \sum_{i}^{} ||f_i(\theta )-\tilde{x} _i||^2_2+\frac{\lambda }{2}||\theta ||^2_2 $$

$$ \theta=(t_0,R_0,R_1,R_2\dots \dots ) $$

✅ 正则项代表主观先验: \(\theta \) 小更有可能是合理动作。

P68

PCA先验

$$ F(\theta )=\frac{1}{2} \sum_{i}^{} ||f_i(\theta )-\tilde{x} _i||^2_2 $$

$$ +\frac{w }{2}\sum_{k}^{}(\frac{(\theta -\bar{\theta })\cdot u_k }{\sigma _k} )^2 $$

✅ 把 P65 方法应用到 IK 来判断动作好坏的实例。
✅ 改进为基于统计的先验。

P71

Data Distribution

\(p(x)\) : probability that \(x\) is a natural pose

✅ 假设存在这样一个分布,但不知道分布的具体形式,要估计这样的分布
✅(1)从分布中采样,例如:动捕
✅(2)通过各种模型把分布估计出来,即从数据中估计出模型参数。

P75

Gaussian Distribution

✅ 假设分布就是高斯分布

通过Maximum Likelihood Estimators (MLE,最大似然估计)得到:

$$ \begin{align*} \bar{x} &= \frac{1}{N} \sum_{i}^{} x_i \\ \Sigma & =\frac{1}{N} X^TX \end{align*} $$

P76

PCA 可以看作一种高斯分布。

$$ \sum =X^TX=U\begin{bmatrix} \sigma ^2_1 & & & \\ & \sigma ^2_2 & & \\ & & \ddots & \\ & & &\sigma ^2_N \end{bmatrix}U^T $$

$$ x-\bar{x} =\sum_{k=1}^{n} w_ku_k $$

✅ PCA 分解可以看作是坐标转换或变量代换。

P77

P78

Character IK with a Motion Prior

$$ F(\theta )=\frac{1}{2} \sum_{i} ||f_i(\theta )-\tilde{x} _i||^2_2+\frac{w}{2}\sum_k(\frac{(\theta -\bar{\theta })\cdot u_k }{\sigma _k} )^2 $$

P79

$$ F(\theta )=\frac{1}{2} \sum_{i}^{} ||f_i(\theta )-\tilde{x} _i||^2_2-w \log \prod_k e^{-\frac{1}{2}(\frac{(\theta -\bar{\theta })\cdot u_k }{\sigma _k} )^2 } $$

P80

$$ F(\theta )=\frac{1}{2} \sum_{i}^{} ||f_i(\theta )-\tilde{x} _i||^2_2-w \log p(\theta )
$$

$$ \theta=(t_0,R_0,R_1,R_2\dots \dots ) $$

✅ 第一项:符合目标。第二项:动作合理。

P81

Motion Synthesis with a Motion Prior

Given a motion prior \(p(x)\) learned from a set of data points \(D \)= {\(x_i\)}, Synthesize a motion \(x\) that minimize the objective

$$ f(x)=f(x)-w \log p(x ) $$

Note: \(x\) can represent a pose \(\theta\)
\(\quad\quad\) or a motion clip → a sequence of poses {\( \theta t\)}
\(\quad\quad\) or any features of a motion → e.g. \(w_k\) in PCA

✅ \(x\) 可以不局限于 \(\theta \)、而是任何一个可以描述 motion 的量。
✅ \(f(x)\) 代表目标,目标也不局限于 IK,也可以是Keyframes、User control、Environment constraints等
✅ 但“认为动作符合高斯分布”仍然是一个非常受限约束,难以用于复杂的动作

P83

相关工作

见https://caterpillarstudygroup.github.io/ImportantArticles/index.html

✅ 使用高斯混合模型,用于动作编辑。
✅ \(x\) 不局限于单帧动作,也可以是一个序列。
Min et al. 2009✅ 视频动捕是欠约束问题,但可以通过分布过滤掉不合理的结果。
✅ 缺点:实现麻烦,很多超参。
[Starke et al 2020, Local Motion Phases for Learning Multi-Contact Character Movements]
[Henter et al. 2020, MoGlow: Probabilistic and Controllable Motion Synthesis Using Normalising Flows]
✅ 利用 RL 等方法,在 lalent code 上生成轨迹,再把轨迹转到动作空间。
[Lee et al 2019, Interactive Character Animation by Learning Multi-Objective Control]
[Holden et al 2020, Learned Motion Matching]
✅ 用 DL 代替复杂的模型,来估计动作先验。

本文出自CaterpillarStudyGroup,转载请注明出处。

https://caterpillarstudygroup.github.io/GAMES105_mdbook/

P2

Outline

  • Learning-based Character Animation (cont.)
    • Motion Models
    • Autoregressive models: PFNN
    • Generative models

P4

Learning Motion Models

问题的数学建模

\(p(x)\): probability that 𝒙 is a natural motion

由于 \(p(x)\) 无法由计算得出,所以从数据去学。数据即 a set of example motions {\(x_i\)}∼ \(p(x)\)

P5

数学模型1

✅ 一个pose可以用每个关节的位置表示,也可以用每个关节的旋转表示。如果用位置约束,最后需要通过IK变成旋转的约束。如果用旋转约束,就难以做到需要约束位置的效果。
✅ P(X)判断整个序列所有pose的联合分布是否合理。

P7

数学模型2

$$ p(X\mid z)=p(x_1,\dots ,x_T\mid z) $$

$$ \begin{align*} 𝑧: & \text{ control parameters} \\ & \text{ latent variables} \\ & …… \end{align*} $$

✅ 对动作序列的要求,除了动作合理,还要符合用户期待,用户要求可以是显式的,例如往左走;也可以是隐式的,例如以老人的风格走。\(z\) 代表用户条件。
✅ P(X|z)判断在条件z下整个序列所有pose的联合分布是否合理。

P8

$$ (x_1,\dots ,x_T)=f(z) $$

$$ \begin{align*} 𝑧: & \text{ control parameters} \\ & \text{ latent variables} \\ & …… \end{align*} $$

✅ 如果概率分布是正确的,基于这个分布采样能得到一个合理的动作,且满足前提条件。

P14

数学模型3

$$ p(X\mid z)=p(x_1,\dots ,x_T\mid z) $$

$$ =p(x_1)\prod_{t}^{} p(x_t\mid x_{t-1},\dots ,x_1;z) $$

\(^\ast \) The chain rule of conditional probabilities:

$$ \begin{align*} p(x_1,x_2,x_3) & = p(x_2,x_3 \mid x_1)p(x_1) \\ & = p(x_3 \mid x_2, x_1)p( x_2 \mid x_1)p(x_1) \end{align*} $$

✅ 序列合理 = 已知序列中的前 \(t-1\) 帧时第 \(t\) 帧应当合理。

P15
采样过程为:

$$ x_t=f(x_{t-1},x_{t-2},\dots x_1;z) $$

P17

数学模型4

✅ 假设动作具有Markov 性(无记忆性)

$$ x_t=f(x_{t-1};z) $$

Markov Property

✅ \(x_t\) 只受 \(x_{t-1}\) 影响,与 \(t-1\) 之前的动作无关。

P18

Two Perspectives on a Motion Sequence

数学模型3数学模型4
✅ 无交互无实时通常用前者✅ 游戏里面通常用后者
✅ 左:直接生成所有动作。✅ 右:一帧一帧地生成。
✅ 右无法考虑未来,不能根据将要发生的事情调整当前的动作。(自回归)

P25

数学模型

$$ x_t=f(x_{t-1}) $$

✅ 由于只和上一帧相关,二元组 \((x_{t-1},x_t)\) 构成了一个数据,希望从里面学到一些信息。
✅ Neural Network 相关部分跳过。
✅ 当前先不考虑 \(z\)
✅ 可以把它当作优化问题来解。

P40

Ambiguity Issue

$$ x_t=f(x_{t-1}) $$

✅ 但是 \(x_t\) 和 \(x_{t-1}\) 的关系是有歧义性的,最后学到一个平均的 \(x_t\).
✅ 因为\(x_{t-1}\)与\(x_t\)不是一对一的mapping关系。

P41

Hidden Variables

$$ x_t=f(x_{t-1};z) $$

✅ 需要加入一个额外的变量,可以来自用户输入或先验信息。关键是怎么找到 \(z\),使学习比较有效。

IDYearNameNoteTagsLink
1132017Phasefunctioned neural networks for character controlPFNNlink

P55

相关工作

*SIGGRAPH 2018
✅ 论文一:除角色姿态,还考虑脚的速度。
*SIGGRAPH 2020
✅ 论文二:把两个脚拆开,并考虑手,分别定义相位函数。
*SIGGRAPH 2022
✅ 论文三:从数据中自动学到相位函数的组合。

P57

Generative Models

✅ 不学两帧关系,而是直接学概率密度函数。
✅ 难点:(1) 真实 PDF 可能非常复杂 (2) 从一个 PDF 中采样也很难。
✅ PDF 的作用是判断动作是不是真的。

P60

常见套路

Generative Models✅ 一般生成式模型是这样的形式:从一个简单的 PDF,通过 \(f(z)\),映射到 \(p(x)\).
✅ 关键是 \(f(z)\) 要学好。
Variational Autoencoders✅ VAE:已知一些真实数据采样,用 Encoder 编码到简单分布上的点,再用Decoder 变回原分布上的点。
✅ control VAE 是 VAE+控制+物理仿真
Generative Adversarial Network✅ GAN:无 Encoder,增加一个判别器。
✅ ASE、AMP 是 GAN 的控制版本。
✅ RL 不结合物理难以 work,因为难以定义 reward.
Normalizing Flows✅ 标准化流:类似 VAE,使用一个可逆函数。
Diffusion Models✅ 扩散模型:多次编码与解码。
✅ 一个动作序列相当于隐空间里的一条轨迹。

P62

相关工作

见https://caterpillarstudygroup.github.io/ImportantArticles/index.html

[Tevet et al. 2022, arXiv, MDM: Human Motion Diffusion Model]

本文出自CaterpillarStudyGroup,转载请注明出处。

https://caterpillarstudygroup.github.io/GAMES105_mdbook/

P2

Outline

  • Skinning

    • Linear Blend Skinning (LBS)
    • Dual Quaternion Skinning (DQS)
    • Blendshapes
  • Examples:

    • The SMPL model
    • Facial Animation

🔎 SIGGRAPH 经典的蒙皮课程。
Many images are from: https://skinning.org/
Alec Jacobson, Zhigang Deng, Ladislav Kavan, and J. P. Lewis. 2014.
Skinning: real-time shape deformation.
In ACM SIGGRAPH 2014 Courses (SIGGRAPH '14)

P7

Skinning Deformation

绑定与蒙皮概念

✅ Rigging:创建脸部控制器或身体骨骼。黄色为在 Mesh 顶点内放置的骨骼。
✅ Sinning:让控制器带动皮肤运动。或让 Mesh 顶点跟着骨骼运动。

P12

Skinning Deformation

计算方式一

✅ 骨骼运动的旋转和平移分别为 \(R\) 和 \(t\),关节的位置和朝向则变成了 \({Q}'\) 和 \({o}'\).
✅ 求 \(x\) 的新位置 \({x}'\). 本质上就是坐标系变换:世界坐标系 → \({o}\) 坐标系 → \({o}'\) 坐标系 → 世界坐标系

P13

计算方式二

✅ \(r\) 为 \(x\) 在骨骼坐标的表达,用 \(r\) 计算更简洁。

P16

Bind Pose

✅ 当骨骼参考姿态与 Mesh 参考姿态不一致时,需要先旋转骨骼到 Mesh 姿态。

P20

Skinning Deformation - 2 joints

$$ r_2=Q^T_2(x-o_2) \quad \quad r_1=Q^T_1(x-o_1) $$

✅ 多骨骼场景,\(x\) 在关节 \(O_1\) 和 \(O_2\) 下分别 \(r_1\) 和 \(r_2\) 两种表达。

P23

✅ 得到的旋转后表达分别为 \({x}'_1\) 和 \({x}'_2\),通过权重对它们结合。

P29

✅ 同时考虑所有 Mesh 顶点和所有关节。

P31

Linear Blend Skinning (LBS)

$$ {x}'_ i= \sum_ {j=1} ^ {m} w _ {ij}({Q}'_ jr_{ij}+{o}'_j) $$

  • Used widely in industry
  • Efficient and GPU-friendly
    • Games like it

✅ Bind Pose:让骨骼与 Mesh 对齐,为 Bind Pose.
✅ Bind Pose 情况下 Motion 不一定为零。

P33

Automatic Skinning?

Pinocchio [Baran et al., 2007]

P37

Linear Blend Skinning (LBS)

✅ 公式第一项对 \(R_j\) 所加权,所得到的很有可能不再是旋转矩阵。

存在的问题: Candy-Wrapper Artifact

P40

Advanced Skinning Methods

  • Multi-linear Skinning (we will not cover this)

    • Multi-weight enveloping [Wang and Phillips 2002]
    • Animation Space [Merry et al. 2006]
    • ……
  • Nonlinear Skinning

    • Dual-quaternion Skinning (DQS)

✅ DQ:对偶四元数。

P41

Non-linear Skinning

quaternions and SLERP

Can we use quaternions and SLERP?

P42

✅ 不行。原因:第一项与第二项必须要配合好,否则会乱掉。

P43

从公式角度来解释不行的原因

$$ {x}' _ i = ( \sum _ {j=1}^{m} w _ {ij} R _ j) x _ i+ \sum _ {j=1}^{m}w _ {ij}t_ j $$

$$ R \in SO(3) $$

$$ T_j=\begin{bmatrix} R_j & t_j\\ 0 &1 \end{bmatrix} \in SE(3) $$

✅ \(T_j\) 构成一个刚性变换群。

P46

Interpolation in 𝑆𝑂(3)

✅ 线性插值和 SLERP 插值 SO(3) 上。

P49

Interpolation in 𝑆𝐸(3)

✅ SE(3)上的线性插值,插值到一个退化的点。

P51

Intrinsic Blending

P52

Dual-Quaternion Skinning (DQS)

  • Approximation of intrinsic averages in SE(3)

Ladislav Kavan, Steven Collins, Jiri Zara, Carol O‘Sullivan. Geometric Skinning with
Approximate Dual Quaternion Blending, ACM Transaction on Graphics, 27(4), 2008.

✅ 把旋转 + 平移的刚性变换表达为对偶四元数。

P54

Dual Numbers

P55

Dual Quaternion

  • Dual quaternion

$$ \hat{q} =q_0 + \varepsilon q_\varepsilon $$

$$ \text{where } \varepsilon^2=0 $$

A good note of dual-quaternion:
https://faculty.sites.iastate.edu/jia/files/inline-files/dual-quaternion.pdf

P56

Dual Quaternion

  • Scalar Multiplication

$$ s\hat{q}=sq_r+sq_\varepsilon\varepsilon $$

  • Addition

$$ \hat{q} _ 1 + \hat{q} _2=q _ {r1}+ q _ {r2} + \varepsilon (q _ {\varepsilon 1} + q _ {\varepsilon 2}) $$

  • Multiplication

$$ \hat{q} _ 1 \hat{q} _ 2 = q _ {r1} q _ {r2} + \varepsilon (q _ {r1} q _ {\varepsilon 2} + q _ {r2} q _ {\varepsilon 1}) $$

P57

Dual Quaternion

  • Dual quaternion

$$ \hat{q}=q_0+\varepsilon q_\varepsilon $$

  • Conjugation

$$ \mathrm{I}:\hat{q}^* =q ^ * _ 0+\varepsilon q ^ * _ \varepsilon $$

$$ \mathrm{II}:\hat{q}^ {\circ} =q _ 0 - \varepsilon q _ \varepsilon $$

$$ \mathrm{III}: \hat{q} ^ \star = q ^ * _ 0 - \varepsilon q ^ *_ \varepsilon $$

$$ \quad \quad \quad \quad = ({\hat{q} ^ *}) ^ {\circ} = (\hat{q} ^ {\circ}) ^ * $$

$$ (\hat{q} _1\hat{q}_2)^\times =\hat{q} _1 ^\times \hat{q}_2^\times $$

  • Norm

$$ ||\hat{q}||=\sqrt{\hat{q}^*\hat{q}} =||q_0||+\frac{\varepsilon (q_0\cdot q_\varepsilon) }{||q_0||} $$

P58

Dual Quaternion

  • Unit dual quaternion: \(||\hat{q}||=1\), which requires:

$$ ||q_0||=1 $$

$$ q_0 \cdot q_\varepsilon=0 $$

P59

Dual Quaternion ⇔ Rigid Transformation

  • Like quaternion, any rigid transformation \(T \in SE(3)\) can be converted into a unit dual quaternion

$$ Tx=Rx+t $$

$$ T=[R\mid t]\to \hat{q} =q_0+\varepsilon q_\varepsilon $$

$$ \begin{matrix} q_0=r \quad & \text{ quaternion of } R \quad \quad\quad\quad\\ q_\varepsilon =\frac{1}{2} tr & \text{ pure quaternion } t = (0,t) \end{matrix} $$

✅ 把一个刚性变换表示为对偶四元数。

P60

Dual Quaternion ⇔ Rigid Transformation

  • Transform a vector \(v\) using unit dual quaternion

$$ {\hat{v} }' =\hat{q} \hat{v} \hat{q} ^\star $$

where

$$ \begin{align*} \hat{v} & = 1+\varepsilon (0,v) \\ & =(1,0,0,0)+\varepsilon (0,v_x,v_y,v_z) \end{align*} $$

$$ \quad $$

$$ \mathrm{III}: \hat{q} ^ \star = q ^ * _ 0 - \varepsilon q ^ *_ \varepsilon $$

$$ \quad \quad \quad \quad = ({\hat{q} ^ *}) ^ {\circ} = (\hat{q} ^ {\circ}) ^ * $$

P61

Dual Quaternion ⇔ Rigid Transformation

  • Like quaternion, any rigid transformation \(T \in SE(3)\) can be converted into a unit dual quaternion

$$ T=[R\mid t]\to \hat{q} =q_0+\varepsilon q_\varepsilon $$

$$ \begin{matrix} q_0=r \quad \\ q_\varepsilon =\frac{1}{2} tr \end{matrix} $$

\(\hat{q}\) and \(-\hat{q}\) represent the same transformation \(\hat{Q}\) is a double cover of \(SE(3)\)

P62

Double Cover Visualized

P63

Interpolating Dual-Quaternion

P64

Dual-Quaternion Linear Blending (DLB)

P65

Dual-Quaternion Skinning (DQS)

P66

Budging Artifact of DQS

✅ 越往右蒙皮权重越光滑。
✅ DQBS 也有比较严重的 artifacts.

P67

How to Correct LBS?

✅ LBS 的天然缺陷

P69

How to Correct LBS?

P74

Scattered Data Interpolation

P76

Scattered Data Interpolation

  • Linear
    • Least squares
  • Splines
  • Inverse distance weighting
  • Gaussian process
  • Radial Basis Function
  • ……

P81

Radial Basis Function (RBF) Interpolation

$$ y=\sum_{i=1}^{k} w_i\varphi (||x-x_i||) $$

P83

Radial Basis Function (RBF) Interpolation

$$ y=\sum_{i=1}^{k} w_i\varphi (||x-x_i||) $$

How to compute \(w_i\) ? We need \(f(x_i)=y_i\)

$$ \begin{bmatrix}
R_{1,1} & R_{1,2} & \cdots & R_{1,K} \\
R_{2,1} & R_{2,2} & & \vdots \\
\vdots & & \ddots & \vdots \\
R_{K,1} & \cdots & \cdots & R_{K,K}
\end{bmatrix} \begin{bmatrix} w_1\\ w_2 \\ \vdots\\ w_K \end{bmatrix}=\begin{bmatrix} y_1\\ y_2 \\ \vdots\\ y_K \end{bmatrix} $$

$$ R_{i,j}=\varphi (||x_i-x_j||) $$

P84

Radial Basis Function (RBF)

$$ y=\sum_{i=1}^{k} w_i\varphi (||x-x_i||) $$

  • Gaussian:

$$ \varphi (r)=e^{-(r/c)^2} $$

  • Inverse multiquadric:

$$ \varphi (r)=\frac{1}{\sqrt{r^2+c^2} } $$

  • Thin plate spline:

$$
\varphi (r)=r^2 \log r $$

  • Polyharmonic splines:

$$ \varphi (r)=\begin{cases} r^k,k=2n+1\\ \\
r^k \log r,k=2n \end{cases} $$

P85

Pose Space Deformation

$$ {x}' =\sum_{j=1}^{m} w_iT_j (x+\delta (x,\theta )) $$

  • \({x}'= SKIN(PSD(x))\)
  • 𝑃𝑆𝐷 is implemented as RBF interpolation
  • Example shapes can be created manually
    • Or by 3D scanning real people → the SMPL model

J. P. Lewis, Matt Cordner, and Nickson Fong. 2000. Pose space deformation: a unified approach to shape

interpolation and skeleton-driven deformation. In Proceedings of the 27th annual conference on Computer

graphics and interactive techniques (SIGGRAPH ’00), ACM Press/Addison-Wesley Publishing Co., USA, 165–172.

P86

Pose Space Deformation

P87

Issues

  • Per-shape or per-vertex interpolation
    • Should we interpolate a shape as a whole?
  • Local or global interpolation?
    • Should a vertex be affected by all joints?
  • Interpolation algorithm?
    • Is RBF the only choice?

SIGGRAPH Course 2014 — Skinning: Real-time Shape Deformation

P88

Example-based Skinning (EBS) vs. Skeleton Subspace Deformation (SSD)

\(^\ast \)EBS: PSD
\(\quad\)

  • Good: Easy to control
  • Good: Good quality
  • Good: Pose-dependent details (e.g. bulging muscle and extruding veins)

\(\quad\)

  • Bad: Creating examples can be cumbersome
  • Bad: Extra storage for examples
  • Bad: Interpolation needs careful tuning

\(\quad\)

\(^\ast \)SSD: LBS, DQS, etc.
\(\quad\)

  • Good: Easy to implement
  • Good: Fast and GPU friendly

\(\quad\)

  • Bad: Various artifacts
  • Bad: Skinning weights needs careful tuning
  • Bad: Hard to create pose-dependent details

P89

Example: SMPL Model

  • A widely adopted human model in ML/CV
  • Learned on real scan data
  • Combines SSD and EBS techniques

P92

Recall: Principal Component Analysis (PCA)

  • Given a dataset {\(x_i\)}, \(x_i \in \mathbb{R} ^N\), then PCA gives

$$ x_i=\bar{x}+\sum_{k=1}^{n} w_{i,k}u_k $$

  • \(u_k\) is the \(k\)-th principal component
    • A direction in \( \mathbb{R} ^N\) along which the rojection of {\(x_i\)} has the \(k\)-th maximal variance
  • \(w_{i,k}=(x_i-\bar{x})\cdot u_k\) is the score of \(x_i\) on \(u_k\)

P93

Recall: Principal Component Analysis (PCA)

• Given a dataset {\(x_i\)}, \(x_i \in \mathbb{R} ^N\), the PCA can be computed by apply eigen decomposition on the covariance matrix

$$ \sum =X^TX=U\begin{bmatrix} \sigma ^2_1 & & & \\ & \sigma ^2_2 & & \\ & & \ddots & \\ & & \sigma ^2_N \end{bmatrix}U^T $$

  • \(X=[x_0-\bar{x}, x_1-\bar{x},\dots ,x_N-\bar{x}]^T\)

  • \(\sigma _i\ge \sigma _j\ge 0\) when \(i< j\), corresponds to the Explained Variance

  • \(U=[u_1,u_2,\dots,u_N]\)

P94

PCA over Body Shapes

P95

SMPL Model: Body Shape

P96

SMPL Model: Pose Blend Shapes

P97

SMPL Model: Deformation

$$ T(\beta ,\theta )=\bar{T} + \sum _ {m=1}^{|\beta |} \beta _ m S_ n + \sum _ {n=1}^{|\theta |}\theta _np_n $$

$$ x=SKIN(T(\beta ,\theta ),\theta ,w) $$

$$ SKIN:\text{LBS, DQS, etc}\dots $$

[SMPL: A Skinned Multi-Person Linear Model]

P99

Facial Animation

P101

Facial Animation

✅ \(B_j\) 与 ID 无关,能做出差不多的效果。
✅ 要更精细的效果,可以定义与 ID 相关的 \(B_j\).

P102

Facial Blendshapes

P103

A Typical Set of Blendshapes (ARKit)

P104

Blendshapes vs. Example-based Skinning

✅ 几种不同的表情基混合方式。
✅ 第二种,直接在几个脸之间做混合,适用于数据少的情况。

P105

Morphable Face Models


Egger et al. 2020. 3D Morphable Face Models - Past, Present, and Future. ACM Trans. Graph. 39, 5 (June 2020), 157:1-157:38.

✅ 第一项:平均脸。第二项:PCA. 第三项:表情基。
✅ \(B_i^{ID}\) 通常由 PCA 得到。
✅ 基于脸部肌肉的物理仿真。

P107

How to Animate a Face?

P110

Face Tracking

✅ 用一个视频人脸驱动 3D 人脸。
✅ 人脸 \(\overset{①}{\rightarrow} \) 特征点 \(\overset{②}{\rightarrow} \) 表情参数
✅ 1、提取 \(\quad\) 2、IK.


本文出自CaterpillarStudyGroup,转载请注明出处。

https://caterpillarstudygroup.github.io/GAMES105_mdbook/

基于动力学的角色驱动方法概览

本章定位:理解如何通过力/力矩驱动角色,生成符合物理规律的动画。

💡 运动学 vs 动力学 的详细对比参见 Introduction


本章知识框架

mindmap
基于动力学的角色驱动
   角色动力学
      仿真
      动力学基础
      关节约束
      接触
   PD 控制
      PD 控制
      PID 控制
      欠驱动问题
   轨迹优化
      优化方法
      数值计算方法
      强化学习方法
   角色控制
      传统方法
      数值方法
      强化学习

物理方法的难点: ✅ (1) 仿真:在计算机中模拟出真实世界的运行方式。 ✅ (2) 控制:生成角色的动作,来做出响应。 ✅ 角色物理动画通常不关心仿真怎么实现。 ✅ 但也可以把仿真当成白盒,用模型的方法来实现。


动力学方法的四个核心模块

理解动力学方法的四个核心模块:

┌─────────────────────────────────────────────────────────────┐
│  仿真器 (Simulation)                                        │
│  输入:力/力矩 → 输出:新状态                                │
│  核心:Mv̇ + C = f + Jᵀλ                                    │
├─────────────────────────────────────────────────────────────┤
│  底层执行 (PD Control)                                      │
│  输入:目标状态 → 输出:关节力矩 τ                            │
│  核心:τ = k_p(q* - q) + k_d(q̇* - q̇)                       │
├─────────────────────────────────────────────────────────────┤
│  中层策略 (Trajectory/Policy Generation)                    │
│  输入:任务指令 → 输出:目标轨迹/策略                         │
│  ① 轨迹优化:有参考轨迹 (CMA-ES/SAMCON)                     │
│  ② 角色控制:无参考轨迹 (ZMP/IPM/SIMBICON)                  │
│  ③ 强化学习:DeepMimic/AMP/ASE                              │
├─────────────────────────────────────────────────────────────┤
│  高层规划 (Task Planning)                                   │
│  输入:用户意图 → 输出:任务序列                              │
│  方法:有限状态机、行为树                                    │
└─────────────────────────────────────────────────────────────┘

四个模块的关系

高层规划 → 任务指令
    ↓
中层策略 → 目标轨迹 q*, q̇*  (轨迹优化/角色控制/RL)
    ↓
底层执行 → 关节力矩 τ
    ↓
仿真器 → 新状态

本章子章节

模块文件内容
仿真基础Simulation/物理仿真器的工作原理
约束Simulation/JointConstraint.md关节约束、接触约束
执行控制PDControl/PD 控制原理与应用
轨迹优化Tracking/有参考轨迹的生成方法
角色控制CharacterControl/无参考轨迹的行走控制

P4

Physics-based Simulation

本章定位:理解物理仿真器如何将力/力矩转换为关节旋转


一、物理仿真概述

1.1 本章要解决的问题

输入

  • 当前状态:位置 \(x\)、旋转 \(R\)、速度 \(v\)、角速度 \(\omega\)
  • 外力/力矩:重力、风力、关节力矩(由控制器生成)
  • 约束条件:关节约束、接触约束

输出

  • 下一帧状态:新位置 \(x'\)、新旋转 \(R'\)、新速度 \(v'\)、新角速度 \(\omega'\)

核心问题

给定关节力矩,角色为什么会这样动?


1.2 仿真器与控制器的关系

flowchart LR
    subgraph "控制器"
        C[输入:目标状态/轨迹<br/>输出:关节力矩 τ]
    end

    subgraph "仿真器"
        S[输入:关节力矩 τ<br/>输出:新状态 x', R', v', ω']
    end

    控制器 -- 关节力矩 τ --> 仿真器
    仿真器 -- 新状态<br/>x, R, v, ω --> 控制器
模块输入输出核心问题
控制器目标状态/轨迹关节力矩 τ如何生成力矩让角色达到目标?
仿真器关节力矩 τ新状态给定力矩,角色会如何运动?

分工说明

  • 控制器是「逆向问题」:从目标反推力矩
  • 仿真器是「前向问题」:从力矩推算运动

1.3 仿真 Pipeline

根据考虑的约束复杂度,仿真 Pipeline 分为三种:

flowchart TD
    A[当前状态<br/>x, R, v, ω]
    B[计算外力<br/>重力、风力、关节力矩τ]
    C{约束类型?}

    subgraph "Pipeline 1:无约束"
        D1[求解约束力<br/>无约束力]
    end

    subgraph "Pipeline 2:关节约束"
        D2[求解约束力 Jᵀλ<br/>关节约束方程]
    end

    subgraph "Pipeline 3:关节 + 接触"
        D3[接触检测]
        E3[求解约束力<br/>Jᵀλ + 接触力 + 摩擦力]
        D3 --> E3
    end

    A --> B
    B --> C

    C -->|无关节约束 | D1
    C -->|有关节约束 | D2
    C -->|有关节约束 + 接触 | D3

    D1 --> E[积分更新状态<br/>x' = x + v·dt<br/>R', v', ω']
    D2 --> E
    E3 --> E

Pipeline 1:不考虑关节约束

  • 每个刚体独立运动
  • 适用于自由物体(如抛射物)
  • 不适用于角色(角色有关节连接)

Pipeline 2:考虑关节约束

  • 关节约束防止刚体分离
  • 需求解约束力 \(J^T\lambda\)
  • 适用于 Ragdoll、无主动控制的角色

Pipeline 3:考虑关节约束 + 接触摩擦

  • 接触约束防止穿透地面
  • 摩擦力防止滑动
  • 适用于站立、行走的角色

📚 深入学习


角色的分段刚体表示与仿真

本章定位:理解如何将角色建模为分段多刚体系统,这是物理仿真的基础。


一、刚体动力学基础

回顾 GAMES103 内容

刚体动力学的核心公式已在 GAMES103 中详细讲解,本节只做简要回顾。

刚体运动方程

$$ \begin{bmatrix} mI_3 & 0\\ 0 & I \end{bmatrix}\begin{bmatrix} \dot{v} \\ \dot{\omega } \end{bmatrix}+\begin{bmatrix} 0\\ \omega \times I\omega \end{bmatrix}=\begin{bmatrix} f \\ \tau \end{bmatrix} $$

符号含义
\(m\)质量
\(I\)转动惯量张量
\(x, v\)位置、线速度
\(R, \omega\)旋转、角速度
\(f, \tau\)外力、外力矩

深入学习


二、角色的物理仿真表示

从角色模型到仿真模型

在物理仿真中,角色不能直接使用渲染用的 Mesh,而是需要简化为分段多刚体系统

仿真角色的组成

Rigid bodies(刚体):

  • \(m_i, I_i\) - 质量和转动惯量
  • \(x_i, R_i\) - 位置和旋转
  • Geometries - 碰撞几何体(仿真中使用简单几何体代替 Mesh)

Joints(关节):

  • Position - 关节位置
  • Type - 关节类型(Hinge、Universal、Ball 等,决定约束方程)
  • Bodies - 连接的刚体

✅ 关节的数量比刚体的数量少 1

碰撞几何体的选择

身体部位常用几何体原因
头部球体形状接近、计算简单
躯干胶囊体/盒体近似 torso 形状
手臂/腿胶囊体细长形状
手/脚盒体便于接触检测

✅ 使用简单几何体可以大幅提高碰撞检测和约束求解的效率。

在物理引擎中定义角色

在物理引擎中创建一个刚体需要提供:

Masses:     m, I           // 质量和转动惯量
Kinematics: x, v, R, ω    // 运动学状态
Geometry:   Box/Sphere/Capsule/Mesh  // 碰撞几何体
            Collision detection      // 碰撞检测
            Compute m, I             // 计算质量属性

三、分段多刚体动力学

从单刚体到多刚体

单刚体: $$ M\dot{v} + C(x,v) = f $$

其中 \(M\) 和 \(C\) 是分块对角矩阵,每个刚体独立。

✅ 两个刚体如果独立,可以以矩阵的方式扩展。
✅ 分段多刚体在公式上没有本质区别,只是矩阵更大。

对于 \(n\) 个刚体的系统:

  • \(M\) 是 \(6n \times 6n\) 的分块对角矩阵
  • \(C(x,v)\) 是 \(6n\) 维向量

多刚体系统的扩展

关于约束力的说明:当刚体通过关节连接时,需要添加约束力 \(J^T\lambda\)。这部分内容在后续章节详细讲解。


与后续章节的关系

本节内容后续应用
刚体动力学基础理解单个身体的运动
角色仿真表示碰撞检测、接触求解
分段多刚体公式所有仿真章节的基础

约束求解专题(本节不涉及):


小结

角色物理仿真的建模流程

角色 Mesh → 简化为刚体 → 添加关节 → 定义碰撞几何体 → 分段多刚体系统

核心公式(无约束情况): $$ M\dot{v} + C(x,v) = f $$

含义
\(M\dot{v} + C(x,v)\)惯性力(质量 + 科氏力/离心力)
\(f\)外力(重力、风力、关节力矩)

✅ 本节只介绍分段多刚体的表示方法。当刚体通过关节连接时,需要添加约束力 \(J^T\lambda\),详见后续章节。


本文出自 CaterpillarStudyGroup,转载请注明出处。 https://caterpillarstudygroup.github.io/GAMES105_mdbook/

Constraints 简化问题分析

💡 为什么先学小球? 接下来要介绍关节约束的求解。在讲解角色的关节约束之前,先用小球的简单例子来理解约束求解的核心思想。 小球约束与关节约束的数学形式完全相同,只是场景更简单、更容易理解。


问题描述

✅ 假设有一约束:小球必须按轨道行进。

小球速度分析

✅ 根据已知条件,可以进行以下分析:由于每一时刻都满足,对时间求导,导数为零。

其中第一项为 \(g(x)\) 的雅克比矩阵,记作 \(J\) 或 \([\nabla g]^{T}\), 第二项为 \(x\) 的速度。 因此得到约束为:如果要求小球按照轨道运行,其速度必须满足以下公式。

小球的约束力分析

✅ 为了让小球满足约束,需给小球一个约束力。

\(^\ast \) Constraint is passive No energy gain or loss!!!

$$ f_c\cdot v=0 $$

✅ 约束力不应产生能量,即力与运动方向垂直。

✅ \(J\) 本是一个矩阵,但在这个场景中 \(C\) 是常数,所以 \(J\) 是向量。 ✅ 结合是一页的结论可知:\(f_c\) 与 \(J\) 同方向,但大小未知。\(\lambda \)代表一个未知的 scale。 ✅ \(f_c\) 大小以当前状态和外力情况计算而得。

小球的整体受力分析

✅ 对小球做受力分析,受到外力 \(f\) 和约束力 \(f_c\). ✅ 假设 \(M,x,v.f\) 已知,求 \(f_c\) ,使得小球沿轨迹移动。

$$ \begin{align*} M\dot{v} & =f+J^T\lambda \\ Jv&=0 \end{align*} $$

✅ 公式 1:\(f=am\).公式 2:前面推导得出。把两个公式离散化。 ✅ 假设当前时刻已满足 \(J_n v_n = 0\),所以只约束下一时刻。

$$ \begin{align*} M\frac{v_{n+1}-v_n}{h} & =f+J^T\lambda \\ Jv_{n+1}&=0 \end{align*} $$

✅ 得出未知数为\(\lambda\)和\(v_{n+1}\)的联立方程组,求解方程组。 ✅ 因为公式 2 只约束了速度没有约束位置。离散化后对原公式只是近似,会有误差,导到小球远离曲线。 ✅ 解方程组不难,但存在小球偏离轨道的问题。

✅ 当物体偏离轨道,要把它拉回来。因此公式 2 改为:

$$ Jv_{n+1}=\alpha \frac{C-g(x_n)}{h} $$

等式右边的非零项称为 Correction of numerical errors。 𝛼: error reduction parameter (ERP)

方程组求解

✅ 把校正项简写为 \(b\). \( n \) 时刻发现的误差由 \( n+1 \) 时刻来校正。 ✅ 为了防止矩阵不可逆,增加 \(\beta I\).(常见技巧) ✅ 解 \(\lambda\) 需要先求逆。


附录:公式推导过程

目标:求解拉格朗日乘子 \(\lambda\)

已知方程组(带误差校正):

$$ \begin{cases} \displaystyle M\frac{v_{n+1}-v_n}{h} = f + J^T\lambda \\ Jv_{n+1} = b \end{cases} $$

其中 \(b = \alpha\frac{C-g(x_n)}{h}\) 是误差校正项。


步骤 1:从运动方程解出 \(v_{n+1}\)

$$ M\frac{v_{n+1}-v_n}{h} = f + J^T\lambda $$

$$ v_{n+1}-v_n = h M^{-1}(f + J^T\lambda) $$

$$ v_{n+1} = v_n + h M^{-1}f + h M^{-1}J^T\lambda $$

令 \(v^* = v_n + h M^{-1}f\)(不含约束力的预测速度

则: $$ v_{n+1} = v^* + h M^{-1}J^T\lambda $$


步骤 2:代入约束方程

约束方程: $$ Jv_{n+1} = b $$

代入 \(v_{n+1}\): $$ J(v^* + h M^{-1}J^T\lambda) = b $$

展开: $$ Jv^* + h J M^{-1}J^T\lambda = b $$


步骤 3:解出 \(\lambda\)

$$ h J M^{-1}J^T\lambda = b - Jv^* $$

$$ \lambda = (h J M^{-1}J^T)^{-1}(b - Jv^*) $$


步骤 4:防止矩阵不可逆

\(J M^{-1}J^T\) 可能不可逆(例如约束冗余时),添加正则化项 \(\beta I\):

$$ \lambda = (J M^{-1}J^T + \beta I)^{-1}(b - Jv^*) $$


最终公式

$$ \boxed{\lambda = (J M^{-1}J^T + \beta I)^{-1}(b - Jv^*)} $$

符号含义
\(v^* = v_n + h M^{-1}f\)无约束时的预测速度
\(b = \alpha\frac{C-g(x_n)}{h}\)误差校正项(ERP)
\(\beta I\)防止矩阵不可逆的正则化项

✅ 核心思想:把约束求解转化为求解拉格朗日乘子 \(\lambda\) 的线性方程组


从小球到关节约束

小球例子的约束求解公式可以直接应用到关节约束。

概念小球例子关节约束
约束对象小球位置两个刚体的连接点
约束方程\(g(x) = 0\)(小球在轨道上)\(x_1 + R_1r_1 = x_2 + R_2r_2\)(连接点重合)
速度级约束\(Jv = 0\)\(v_1 + \omega_1 \times r_1 = v_2 + \omega_2 \times r_2\)
雅克比 J向量(\(1 \times 6\))矩阵(\(3 \times 12\))
约束力\(J^T\lambda\)(轨道支持力)\(J^T\lambda\)(关节力)
物理意义防止小球脱离轨道防止刚体分离

关节约束的约束方程推导

✅ 关节约束:两个刚体在关节处的位置必须相同。

位置级约束: $$ x_1 + R_1 r_1 = x_2 + R_2 r_2 $$

速度级约束(对时间求导): $$ v_1 + \omega_1 \times r_1 = v_2 + \omega_2 \times r_2 $$

矩阵形式: $$ \begin{bmatrix} I_3 & -[r_1]\times & -I_3 & [r_2]\times \end{bmatrix} \begin{bmatrix} v_1 \\ \omega_1 \\ v_2 \\ \omega_2 \end{bmatrix} = 0 $$

简化为: $$ Jv = 0 $$

数学形式完全相同:\(M\dot{v} + C = f + J^T\lambda\),\(Jv = b\) 只是 \(J\) 的具体形式不同(小球是向量,关节是矩阵)。

深入学习JointConstraint.md - 关节约束详细推导(各种关节的 \(J\) 矩阵构造与统一求解框架)

关节约束

💡 前置知识:关于角色的分段刚体表示,见 RigidBodyRepresentation.md


关节类型与约束方程

关节类型约束自由度位置约束角速度约束
Ball Joint(球铰)3 个平移
Hinge Joint(铰链)3 个平移 + 2 个旋转
Universal Joint(万向节)3 个平移 + 1 个旋转
Fixed Joint(固定)3 个平移 + 3 个旋转

Ball Joint(球铰)

✅ Ball Joint 只约束位置,允许三个方向的自由旋转。

约束方程

位置级约束: $$ x_1 + R_1 r_1 = x_2 + R_2 r_2 $$

速度级约束(对时间求导): $$ v_1 + \omega_1 \times r_1 = v_2 + \omega_2 \times r_2 $$

矩阵形式: $$ J = \begin{bmatrix} I_3 & -[r_1]\times & -I_3 & [r_2]\times \end{bmatrix} $$

$$ \begin{bmatrix} I_3 & -[r_1]\times & -I_3 & [r_2]\times \end{bmatrix} \begin{bmatrix} v_1 \\ \omega_1 \\ v_2 \\ \omega_2 \end{bmatrix} = 0 $$

简化为: $$ Jv = 0 $$

其中 \(J\) 是 \(3 \times 12\) 矩阵。


Hinge Joint(铰链)

✅ Hinge Joint 约束位置 + 2 个旋转自由度,只允许绕铰链轴旋转。

约束方程

位置级约束(同 Ball Joint): $$ x_1 + R_1 r_1 = x_2 + R_2 r_2 $$

角速度约束(额外约束): $$ \omega_1 \cdot a_1 = \omega_2 \cdot a_2 $$

其中 \(a_1, a_2\) 是两个刚体上的铰链轴方向向量。

矩阵形式: $$ Jv = \begin{bmatrix} J_{\text{pos}} \\ J_{\text{ang}} \end{bmatrix} v = 0 $$

其中:

  • \(J_{\text{pos}}\) 是 \(3 \times 12\) 的位置约束矩阵(同 Ball Joint): $$ J_{\text{pos}} = \begin{bmatrix} I_3 & -[r_1]\times & -I_3 & [r_2]\times \end{bmatrix} $$
  • \(J_{\text{ang}}\) 是 \(2 \times 12\) 的角速度约束矩阵,约束两个刚体在垂直于铰链轴方向上的角速度分量相等: $$ J_{\text{ang}} = \begin{bmatrix} 0_3 & a_{1\perp 1}^T & 0_3 & -a_{2\perp 1}^T \\ 0_3 & a_{1\perp 2}^T & 0_3 & -a_{2\perp 2}^T \end{bmatrix} $$ 其中 \(a_{\perp 1}, a_{\perp 2}\) 是两个垂直于铰链轴的方向。

完整 $J$ 矩阵是 \(5 \times 12\): $$ J = \begin{bmatrix} I_3 & -[r_1]\times & -I_3 & [r_2]\times \\ 0_3 & a_{1\perp 1}^T & 0_3 & -a_{2\perp 1}^T \\ 0_3 & a_{1\perp 2}^T & 0_3 & -a_{2\perp 2}^T \end{bmatrix} $$


Universal Joint(万向节)

✅ Universal Joint 约束位置 + 1 个旋转自由度,允许两个旋转自由度。

约束方程

位置级约束(同 Ball Joint): $$ x_1 + R_1 r_1 = x_2 + R_2 r_2 $$

角速度约束(额外约束): $$ \omega_1 \cdot a_1 = \omega_2 \cdot a_2 $$ $$ \omega_1 \cdot b_1 = \omega_2 \cdot b_2 $$

其中 \(a, b\) 是两个相互垂直的轴向,分别位于两个刚体上。

矩阵形式: $$ Jv = \begin{bmatrix} J_{\text{pos}} \\ J_{\text{ang}} \end{bmatrix} v = 0 $$

其中:

  • \(J_{\text{pos}}\) 是 \(3 \times 12\) 的位置约束矩阵(同 Ball Joint)
  • \(J_{\text{ang}}\) 是 \(1 \times 12\) 的角速度约束矩阵,约束两个刚体在万向节轴向上的角速度分量相等: $$ J_{\text{ang}} = \begin{bmatrix} 0_3 & a_1^T & 0_3 & -a_2^T \end{bmatrix} $$

完整 $J$ 矩阵是 \(4 \times 12\): $$ J = \begin{bmatrix} I_3 & -[r_1]\times & -I_3 & [r_2]\times \\ 0_3 & a_1^T & 0_3 & -a_2^T \end{bmatrix} $$


Fixed Joint(固定)

✅ Fixed Joint 完全固定两个刚体,不允许任何相对运动。

约束方程

位置级约束(同 Ball Joint): $$ x_1 + R_1 r_1 = x_2 + R_2 r_2 $$

角速度约束(全部约束): $$ \omega_1 = \omega_2 $$

矩阵形式: $$ Jv = \begin{bmatrix} J_{\text{pos}} \\ J_{\text{ang}} \end{bmatrix} v = 0 $$

其中:

  • \(J_{\text{pos}}\) 是 \(3 \times 12\) 的位置约束矩阵(同 Ball Joint)
  • \(J_{\text{ang}}\) 是 \(3 \times 12\) 的角速度约束矩阵,约束两个刚体的角速度完全相同: $$ J_{\text{ang}} = \begin{bmatrix} 0_3 & I_3 & 0_3 & -I_3 \end{bmatrix} $$

完整 $J$ 矩阵是 \(6 \times 12\): $$ J = \begin{bmatrix} I_3 & -[r_1]\times & -I_3 & [r_2]\times \\ 0_3 & I_3 & 0_3 & -I_3 \end{bmatrix} $$


运动方程 + 约束方程

无论哪种关节,都可以统一写成:

$$ \begin{align*} M\dot{v} + C(x,v) &= f + J^T\lambda \\ Jv &= 0 \end{align*} $$

符号含义
\(M\)\(6n \times 6n\) 质量矩阵
\(C(x,v)\)科氏力 + 离心力
\(f\)外力(重力、风力、关节力矩)
\(J\)约束雅克比矩阵(\(m \times 6n\))
\(\lambda\)拉格朗日乘子(约束力大小)

✅ 联立方程组可以解出约束力 \(\lambda\) 和下一时刻的速度。

约束求解的详细推导:见 Constraints.md(小球例子)


统一约束求解框架

核心洞察:不同约束的求解公式完全一样,唯一的区别是雅克比矩阵 \(J\) 的构造。

不同关节的 \(J\) 矩阵对比

关节类型\(J\) 的行数说明
Ball Joint3 行仅位置约束
Hinge Joint5 行3 行位置约束 + 2 行角速度约束
Universal Joint4 行3 行位置约束 + 1 行角速度约束
Fixed Joint6 行3 行位置约束 + 3 行角速度约束

统一求解流程

无论哪种关节,都遵循相同的求解步骤:

  1. 计算预测速度:\(v^* = v_n + h M^{-1}f\)
  2. 构建约束雅可比 \(J\)(根据关节类型)
  3. 求解拉格朗日乘子: $$ \lambda = (J M^{-1}J^T + \beta I)^{-1}(b - Jv^*) $$
  4. 计算约束力:\(f_c = J^T\lambda\)
  5. 更新速度:\(v_{n+1} = v^* + h M^{-1}J^T\lambda\)

物理引擎实现的关键

  • 为每种关节类型实现一个 \(J\) 矩阵构造函数
  • 把所有约束的 \(J\) 行堆叠起来形成总约束矩阵
  • 代入统一公式求解 \(\lambda\)

多约束同时处理:当系统有多个约束时(如多个关节 + 接触),只需将每个约束的 \(J\) 矩阵按行堆叠,公式形式不变,只是矩阵维度更大。


多个刚体与多个约束

✅ 分段多刚体系统:公式形式相同,只是矩阵维度更大。

对于 \(n\) 个刚体、\(m\) 个约束的系统:

  • \(M\) 是 \(6n \times 6n\) 的分块对角矩阵
  • \(J\) 是 \(m \times 6n\) 的矩阵(每个约束贡献若干行)

关节力矩

关节力矩的详细介绍:见 JointTorques.md

✅ 关节力矩是主动控制力矩,用于驱动角色运动。在运动方程中: $$ M\dot{v} + C(x,v) = f_{\text{ext}} + f_{\text{joint}} + J^T\lambda $$ 其中 \(f_{\text{joint}}\) 是关节力矩(主动),\(J^T\lambda\) 是约束力(被动)。


本文出自 CaterpillarStudyGroup,转载请注明出处。 https://caterpillarstudygroup.github.io/GAMES105_mdbook/

关节力矩(Joint Torques)

🛈 前置知识:关于关节约束的数学形式,见 JointConstraint.md


:::info 核心要点

  1. 关节力矩是主动控制输入,用于驱动角色运动
  2. 施加方式:在一个刚体上加 $\tau$,另一个加 $-\tau$
  3. 与外力不同:关节力矩只产生旋转,不产生平移

:::


什么是关节力矩

关节力矩(Joint Torques) 是角色控制中的核心概念。它是在关节上施加的主动控制力矩,用于驱动角色运动。

物理意义

✔ 关节力矩可以看作是一个刚体对另一个刚体在关节处施加的成对的力

关键性质

  1. 合力为零(牛顿第三定律): $$ \sum_{i} f_i = 0 $$

  2. 合力矩不为零:每个力作用点不同,会对质心产生力矩

  3. 力矩与关节位置无关:只与力的分布有关


为什么不能只用外力,而需要关节力矩?

💡 常见问题:既然外力 $f$ 也能产生力矩($\tau = r \times f$),为什么还需要专门的关节力矩 $\tau$?直接在外力 $f$ 中施加力,然后求解方程组不就可以了吗?

这是一个非常深刻的问题。答案是:外力 $f$ 和关节力矩 $\tau$ 作用在不同的方向上,效果完全不同

1. 外力的效果:平动 + 转动

在刚体上某点施加外力 $f$(作用点距离质心为 $r$):

$$ \text{线加速度:} \quad a = \frac{f}{m} $$

$$ \text{角加速度:} \quad \tau = r \times f $$

外力同时产生

  • ✅ 线加速度(质心平动)
  • ✅ 角加速度(绕质心旋转)

2. 关节力矩的效果:纯转动

关节力矩 $\tau$ 直接作用在关节自由度上:

$$ \text{角加速度:} \quad \alpha = I^{-1}\tau $$

关节力矩只产生

  • ❌ 无线加速度
  • ✅ 只有角加速度(绕关节旋转)

3. 问题 1:外力无法产生"纯旋转"

场景:想让前臂绕手肘旋转(比如弯曲手臂)

用外力 $f$

     施加力 f
        ↓
    ┌────┐
    │前臂│
    └────┘
       ↖
      手肘
  • 力 $f$ 作用在前臂上 → 前臂既旋转又平移
  • 但手肘关节有约束力 $J^T\lambda$ → 防止平移
  • 结果:约束力会抵消大部分外力

问题:大部分外力被约束力"浪费"了,效率极低。

用关节力矩 $\tau$

        τ
    ┌────┐
    │前臂│
    └────┘
       ↖
      手肘
  • 力矩 $\tau$ 直接作用在手肘关节
  • 只产生旋转,不产生平移
  • 约束力不需要抵消任何东西

优势:能量直接用于旋转,效率高。


4. 问题 2:生物力学的真实性

肌肉如何工作

肌肉附着在骨骼上,收缩时:

     肌肉收缩
    ↙      ↘
━━━┻━━━━━━━━┻━━━
  骨骼 1    骨骼 2
     ↖    ↗
      关节
  • 肌肉拉力是内力(成对出现,合力为零)
  • 但产生力矩(因为作用点不同)
  • 效果:关节旋转,但身体质心不受直接影响

用外力模拟肌肉的缺陷

如果用力 $f$ 模拟肌肉:

  • 需要在两个刚体上分别施加 $f$ 和 $-f$
  • 必须保证作用点精确,否则会产生不期望的平移
  • 计算复杂,且不符合生物力学

用关节力矩的优势

关节力矩直接抽象了肌肉的作用:

  • 自动满足合力为零($\tau$ 和 $-\tau$)
  • 直接驱动关节旋转
  • 符合生物力学直觉

5. 问题 3:约束力与关节力矩作用方向正交

约束力只在约束方向上有力

$$ Jv = 0 \quad \Rightarrow \quad f_c = J^T\lambda $$

约束力 $J^T\lambda$ 只在被约束的方向上有分量。

关节力矩在允许的自由度上作用

关节类型约束的自由度允许的自由度关节力矩作用在
球铰3 平移3 旋转3 个旋转方向
铰链3 平移 + 2 旋转1 旋转1 个旋转轴

关键:关节力矩作用在允许运动的方向上,约束力作用在被约束的方向上。两者正交,互不干涉。


6. 问题 4:数学上可行,但物理上低效

如果只用力,能解出方程吗?

数学上:可以

$$ M\dot{v} + C = f + J^T\lambda $$

给定 $f$,求解 $\lambda$ 和 $\dot{v}$,数学上完全可行。

物理上:效率低且不自然

问题原因
能量浪费大部分外力被约束力抵消
控制复杂需要精确设计力的作用点和方向
不真实不符合肌肉驱动的生物力学
数值不稳定约束力可能变得非常大

7. 直观类比:推门 vs. 扭门把手

方式效果
推门板(外力 $f$)门会平移 + 旋转,铰链承受很大力
扭门把手(力矩 $\tau$)门纯旋转,铰链受力小

关节力矩就像"门把手",直接作用在旋转自由度上。


8. 总结:外力 vs. 关节力矩

外力 $f$关节力矩 $\tau$
效果平动 + 转动纯转动
效率低(被约束力抵消)高(直接驱动)
真实性不符合肌肉机制符合生物力学
控制难度复杂简单直接
用途重力、风力、接触力肌肉驱动、电机控制

结论:外力 $f$ 和关节力矩 $\tau$ 不等价。外力会产生不期望的平移,需要约束力抵消;关节力矩直接驱动旋转,更符合控制和生物力学的需求。


关节力矩的数学推导

从力到力矩的转化

考虑两个刚体通过关节连接,在关节处施加一对大小相等、方向相反的力 $f_i$。

对刚体 1 的力矩: $$ \tau_1 = \sum_{i} (r_1 + r_i) \times f_i = r_1 \times \sum_{i} f_i + \sum_{i} r_i \times f_i $$

由于 $\sum_{i} f_i = 0$,得: $$ \tau_1 = \sum_{i} r_i \times f_i $$

对刚体 2 的力矩: $$ \tau_2 = -\sum_{i} r_i \times f_i = -\tau_1 $$

结论:在关节上施加力矩 $\tau$ 等价于:

  • 在一个刚体上施加 $\tau$
  • 在另一个刚体上施加 $-\tau$


在运动方程中施加关节力矩

两刚体系统

对于两个刚体通过关节连接的系统,运动方程为:

$$ M\begin{bmatrix} \dot{v}_1 \\ \dot{\omega}_1 \\ \dot{v}_2 \\ \dot{\omega}_2 \end{bmatrix} + \begin{bmatrix} 0 \\ \omega_1 \times I_1 \omega_1 \\ 0 \\ \omega_2 \times I_2 \omega_2 \end{bmatrix} = \begin{bmatrix} 0 \\ \tau \\ 0 \\ -\tau \end{bmatrix} + J^T\lambda $$

$$ Jv = 0 $$

含义
$\begin{bmatrix} 0 & \tau & 0 & -\tau \end{bmatrix}^T$关节力矩(主动控制)
$J^T\lambda$约束力(被动约束)

惯例:通常在子刚体上加 $\tau$,在父刚体上加 $-\tau$。


关节力矩 vs. 约束力

理解关节力矩与约束力的区别是理解角色仿真的关键:

特性关节力矩 $\tau$约束力 $J^T\lambda$
来源肌肉收缩、电机驱动关节连接、接触
方向沿关节轴向由约束条件决定
计算由控制器生成(如 PD 控制)由约束求解器计算
作用主动驱动运动被动维持约束
能量可以做功(消耗能量)不做功(理想约束)

关节力矩在控制中的位置

1. 驱动角色运动

关节力矩是角色运动的直接驱动力

  • 行走时腿部关节的力矩
  • 抓取时手臂关节的力矩
  • 转身时躯干关节的力矩

2. 与肌肉的关系

在生物力学中,关节力矩对应肌肉收缩产生的力矩:

  • 伸肌群收缩 → 伸展关节
  • 屈肌群收缩 → 弯曲关节

3. 在控制中的位置

$$ \text{控制器} \xrightarrow{\text{生成}} \tau \xrightarrow{\text{仿真}} \text{运动} $$

  • PD 控制:根据期望角度和当前角度计算 $\tau$
  • 轨迹优化:优化 $\tau$ 序列以实现目标运动
  • 强化学习:学习策略网络输出 $\tau$

多刚体系统的关节力矩

对于 $n$ 个刚体、$m$ 个关节的系统:

$$ M\dot{v} + C(x,v) = f_{\text{ext}} + f_{\text{joint}} + J^T\lambda $$

其中 $f_{\text{joint}}$ 是所有关节力矩的堆叠向量。

关键点:每个关节力矩 $\tau_i$ 只影响其连接的两个刚体,一个加 $\tau_i$,另一个加 $-\tau_i$。


下一步:如何计算关节力矩?

本章介绍了关节力矩是什么,但还有一个关键问题:给定目标状态,如何计算需要的关节力矩 $\tau$?

这将在 Proportional-Derivative Control 中详细讲解。

核心思想(PD 控制): $$ \tau = k_p (\theta_{\text{des}} - \theta_{\text{curr}}) + k_d (\dot{\theta}{\text{des}} - \dot{\theta}{\text{curr}}) $$

章节与关节力矩的关系
Proportional-Derivative Control如何计算关节力矩 $\tau$
Controlling CharactersPD 控制在角色上的应用
Static Balance平衡时的关节力矩计算
Tracking优化关节力矩序列跟踪参考运动
Learning学习策略输出关节力矩

小结

关节力矩的核心要点

  1. 物理本质:成对的内力矩,合力为零,合力矩不为零
  2. 施加方式:在一个刚体上加 $\tau$,另一个加 $-\tau$
  3. 控制作用:主动驱动角色运动的输入
  4. 与约束力的区别:$\tau$ 是主动的,$J^T\lambda$ 是被动的
  5. 与外力的区别:关节力矩只产生旋转,外力产生平动 + 旋转

运动方程的统一形式: $$ M\dot{v} + C(x,v) = f_{\text{ext}} + f_{\text{joint}} + J^T\lambda $$

$$ Jv = 0 $$


本文出自 CaterpillarStudyGroup,转载请注明出处。 https://caterpillarstudygroup.github.io/GAMES105_mdbook/

运动方程中的力与力矩

本章定位:澄清物理仿真运动方程中 力矩 的来源与含义。


一、力与力矩的作用效果

施加力/力矩会得到的效果

力加在质心上,只会导致平移,不会导致旋转。
✂ 在物体边缘施加力,等价于在质心施加力,并施加一个导致旋转的力矩。
✂ 在质心上施加一个力矩,等价于施加一对大小相同方向相反的力。在质心处的合力为零,不会产生位移,只会产生旋转。
✂ 力矩只是数学上的概念。

怎么对角色产生效果

✂ 想让角色做指定动作,不能直接修改其状态,而是控制力影响状态。

✂ 为了驱动角色,可以单独对每个刚体施加力或力矩。
✂ 也可以在关节上施加力矩。

✂ 回顾前面公式,力和力矩都是施加在刚体上的,如何施加在关节上?


二、运动方程回顾

对于有 \(n\) 个刚体、\(m\) 个关节的角色系统,运动方程为:

$$ M\dot{v} + C(x,v) = f_{\text{ext}} + f_{\text{joint}} + J^T\lambda $$

$$ Jv = 0 $$

方程中有三个力/力矩项,它们的来源和含义完全不同:

名称来源是否主动
\(f_{\text{ext}}\)外力外部环境被动
\(f_{\text{joint}}\)关节力矩控制器主动
\(J^T\lambda\)约束力约束求解器被动

三、外力 (f_{\text{ext}})

定义

外力 是来自角色外部的力,包括:

外力类型说明计算公式
重力地球引力\(f_g = m \cdot g\)
风力环境气流经验模型
接触力地面/物体的支撑力由接触模型计算
摩擦力接触面的切向阻力\(f_t = -\mu f_n \frac{v_{\parallel}}{|v_{\parallel}|}\)

外力的效果

外力作用在刚体上,会同时产生两种效果:

     外力 f
       ↓
   ┌───────┐
   │ 刚体  │ ← 质心
   └───────┘
       ↑
      r (作用点距离质心)

平移效果(无论作用在哪里): $$ a = \frac{f_{\text{ext}}}{m} $$

旋转效果(仅当不经过质心时): $$ \tau_{\text{ext}} = r \times f_{\text{ext}} $$

关键:外力产生的力矩 \(\tau_{\text{ext}}\) 已经包含在 \(f_{\text{ext}}\) 中,不需要单独列一项。

重要性质

性质说明
被动性外力不由控制器决定,由物理环境决定
无控制器时仍存在Ragdoll 只受外力,也会运动
力矩在 \(f_{\text{ext}}\) 中外力不经过质心产生的力矩,算在 \(f_{\text{ext}}\) 里

四、关节力矩 (f_{\text{joint}})

定义

关节力矩 是控制器生成的主动控制输入,用于驱动角色运动:

$$ f_{\text{joint}} = \begin{bmatrix} 0 & \tau_1 & 0 & -\tau_1 & \cdots \end{bmatrix}^T $$

来源

来源说明
肌肉收缩生物角色的肌肉产生力矩
电机驱动机器人关节的电机产生力矩
控制器输出PD 控制、强化学习策略等

施加方式

关节力矩 \(\tau\) 作用在关节连接的两个刚体上:

        τ (子刚体)
    ┌────┐
    │前臂│  ← 子刚体
    └────┘
       ↖
      手肘关节
    ┌────┐
    │上臂│  ← 父刚体
    └────┘
       -τ (父刚体)

规则

  • 子刚体上加 \(\tau\)
  • 父刚体上加 \(-\tau\)
  • 合力为零:\(\tau + (-\tau) = 0\)(满足牛顿第三定律)

关节力矩的效果

关节力矩只产生纯旋转,不产生平移:

$$ \alpha = I^{-1}\tau $$

与外力的区别:外力同时产生平动和转动,关节力矩只产生转动。

重要性质

性质说明
主动性由控制器主动生成
无控制器时为零Ragdoll 的 \(f_{\text{joint}} = 0\)
不在 \(f_{\text{ext}}\) 中关节力矩是独立项
外力不产生关节力矩即使外力不经过质心,产生的力矩也在 \(f_{\text{ext}}\) 中,不在 \(f_{\text{joint}}\) 中

五、两种力矩的对比

外力产生的力矩 vs. 关节力矩

维度外力产生的力矩 \(\tau_{\text{ext}}\)关节力矩 \(\tau_{\text{joint}}\)
来源外力不经过质心控制器生成
在方程中的位置\(f_{\text{ext}}\) 中(通过 \(r \times f\) 计算)\(f_{\text{joint}}\) 中
是否需要控制器否(Ragdoll 也有)是(无控制器则为 0)
物理本质被动力矩主动控制输入
例子重力让手臂自然下垂主动抬手

直观类比

场景力矩来源在方程中的位置
风吹门风力不经过质心\(f_{\text{ext}}\)
你推门手施加的力矩\(f_{\text{joint}}\)

六、无控制器时的情况(Ragdoll)

运动方程

当没有控制器时:

$$ f_{\text{joint}} = 0 $$

方程简化为:

$$ M\dot{v} + C(x,v) = f_{\text{ext}} + J^T\lambda $$


为什么 Ragdoll 的关节会旋转?

即使 \(f_{\text{joint}} = 0\),Ragdoll 仍然会运动,原因是:

  1. 外力(重力)作用在每个刚体上
  2. 外力不经过质心时产生力矩(在 \(f_{\text{ext}}\) 中)
  3. 关节约束限制刚体不分离,但允许绕关节旋转
  4. 结果:刚体绕关节被动旋转

被动旋转 vs. 主动旋转

旋转类型来源方程中的项例子
被动旋转外力产生的力矩\(f_{\text{ext}}\)Ragdoll 倒下、手臂自然摆动
主动旋转关节力矩\(f_{\text{joint}}\)主动抬手、走路摆臂

七、总结

关键要点

  1. \(f_{\text{ext}}\)(外力)

    • 来自外部环境(重力、风力、接触力)
    • 包含外力产生的力矩(\(r \times f\))
    • 无控制器时仍然存在
  2. \(f_{\text{joint}}\)(关节力矩)

    • 来自控制器(肌肉、电机)
    • 只包含控制器主动生成的力矩
    • 不包含外力产生的力矩
    • 无控制器时为零
  3. 外力产生的力矩永远在 \(f_{\text{ext}}\) 中,与 \(f_{\text{joint}}\) 无关。

一张表理解

$$ \begin{array}{c|c|c} \text{项} & \text{包含什么} & \text{无控制器时} \ \hline f_{\text{ext}} & \text{外力 + 外力产生的力矩} & \text{仍然存在} \ f_{\text{joint}} & \text{仅控制器生成的关节力矩} & 0 \ J^T\lambda & \text{约束力求解结果} & \text{仍存在(维持约束)} \ \end{array} $$


本文出自 CaterpillarStudyGroup,转载请注明出处。 https://caterpillarstudygroup.github.io/GAMES105_mdbook/


八、前向动力学与后向动力学

Forward Dynamics vs. Inverse Dynamics

✂ 运动方程,本质上是建立力与加速度之间的联系。 ✂ 前向与后向,是一个运动方程的两种用法。 ✂ 仿真器为前向部分,控制器为逆向部分。


前向动力学(Forward Dynamics)

已知:力/力矩 \(f, \tau\)

求解:加速度 \(\dot{v}\)

$$ \dot{v} = M^{-1}(f_{\text{ext}} + f_{\text{joint}} + J^T\lambda - C(x,v)) $$

用途

  • 物理仿真器
  • 给定控制输入,预测角色会如何运动

后向动力学(Inverse Dynamics)

已知:加速度 \(\dot{v}\)(期望的运动)

求解:力/力矩 \(f, \tau\)

$$ f_{\text{joint}} = M\dot{v} + C(x,v) - f_{\text{ext}} - J^T\lambda $$

用途

  • 控制器设计
  • 给定目标运动,计算需要的关节力矩

对比

前向动力学后向动力学
已知力/力矩加速度(期望运动)
求解加速度力/力矩
用途仿真器控制器
问题类型正向问题逆向问题

关键:前向和后向是同一个运动方程的两种用法,只是已知量和求解量不同。

Contacts

✔ 如何处理与地面的接触,让人站在地面上。

✔ 要解决的问题:

  1. 地面接触检测:检测哪些点/面与地面接触
  2. 接触力施加:如何对碰撞点施加力,使物体不陷入地面

💡 与 GAMES103 的分工

  • GAMES103 - 碰撞检测与响应:详细介绍碰撞检测算法(Broad Phase、Narrow Phase、GJK、CCD)和穿透解除方法(内点法、Impact Zone)
  • GAMES105 - 接触约束求解:focus 在如何将接触建模为约束,并与关节约束统一求解

深入学习


方法一:Penalty-based Contact Model(基于惩罚的接触模型)

基本思想

弹簧 - 阻尼模型近似接触力:当物体穿透地面时,产生一个与穿透深度成正比的斥力。

$$ f_n = -k_p d - k_d v_{c,\perp} $$

参数含义
$d$穿透深度($d > 0$ 时公式生效)
$k_p$弹簧刚度(越大越不容易穿透)
$k_d$阻尼系数(防止反弹)
$v_{c,\perp}$接触点法向速度

✔ 效果:会有一些陷入,但不会陷入太多 ❐ 支持力竟然不是 $-mg$,而是由弹簧模型决定


考虑摩擦力

动摩擦力模型: $$ f_t = -\mu f_n \frac{v_{c,\parallel}}{||v_{c,\parallel}||} $$

参数含义
$\mu$摩擦系数
$f_n$法向支持力
$v_{c,\parallel}$接触点切向速度

✔ 一般不模拟静摩擦力


存在的问题

问题原因后果
$k_p$ 必须很大否则脚陷地明显需要非常小的时间步长
$k_d$ 必须非常大否则地面像蹦床数值不稳定
时间步长必须小高增益导致刚度大仿真效率低

💡 与 GAMES103 内点法的关系

GAMES103 中介绍的**内点法(Interior Point Methods)**使用了类似的惩罚思想,但用能量场定义斥力:

$$ E(\mathbf{x}) = -\rho \log ||\mathbf{x}_{ij}|| $$

$$ \mathbf{f} = -\nabla E = \rho \frac{\mathbf{x}{ij}}{||\mathbf{x}{ij}||^2} $$

两种方法本质相同:距离越近,斥力越大。GAMES105 使用简化的弹簧模型,更易于理解。


方法二:Contact as a Constraint(接触作为约束)

✔ 另一种方法,把接触建模为数学约束,与关节约束统一求解。

接触点状态分析

接触点 $x_c$ 的位置表示: $$ x_c = x + r_c $$

接触点 $x_c$ 的速度表示: $$ v_c = v + \omega \times r_c = J_c \begin{bmatrix} v \\ \omega \end{bmatrix} $$

接触点法向速度: $$ v_{c,\perp} = J_{c,\perp} \begin{bmatrix} v \\ \omega \end{bmatrix} $$


接触点约束分析

约束 1:点在竖直方向的速度必须 $\geq 0$,即只能向上移动(不能向下穿透)。

约束 2:力的大小 $\lambda > 0$,只能推,不能拉。$\lambda$ 是力与速度的大小比例系数。

约束 3:力和速度只能有一个不为零,否则会做功(互补条件)。

$$ v_c \perp \lambda = 0 $$


线性互补问题(LCP)

✔ 合在一起称为线性互补方程,是碰撞建模的标准方式。

这类问题被称为:(Mixed) Linear Complementary Problem (LCP)

解 LCP 的方法有:

  • Lemke's algorithm – a simplex algorithm
  • Projected Gauss-Seidel
  • 其他数值优化方法

❐ 这个方程比较难解,计算成本高于 Penalty 方法


考虑摩擦力的约束问题

How to deal the friction?

🔍 推荐阅读:Fast contact force computation for nonpenetrating rigid bodies. David Baraff. SIGGRAPH '94

✔ 该论文提出了快速实现静摩擦约束的建模方法。


两种方法对比

特性Penalty-basedConstraint-based (LCP)
原理弹簧 - 阻尼模型近似数学约束精确建模
穿透允许少量穿透无穿透
求解直接计算力需要专门求解器
计算成本
数值稳定性需要小步长较稳定
与关节约束统一✅ 是
适用场景实时应用、游戏精确仿真、研究

在运动方程中的位置

对于有接触的角色系统,运动方程为:

$$ M\dot{v} + C(x,v) = f_{\text{ext}} + f_{\text{joint}} + J_{\text{contact}}^T \lambda_{\text{contact}} $$

$$ J_{\text{contact}} v \geq 0, \quad \lambda_{\text{contact}} \geq 0, \quad (J_{\text{contact}} v) \perp \lambda_{\text{contact}} $$

关键:接触约束与关节约束形式统一,可以同时求解!


本文出自 CaterpillarStudyGroup,转载请注明出处。 https://caterpillarstudygroup.github.io/GAMES105_mdbook/

仿真流程总结

本章定位:串联整个物理仿真章节,展示完整的仿真 Pipeline。

💡 前置知识:关于角色的分段刚体表示,见 RigidBodyRepresentation.md


完整仿真 Pipeline

✅ 角色仿真的完整流程:

  1. 计算当前状态 - 位置、速度、约束信息
  2. 计算外力 - 重力、风力、关节力矩(由控制器生成)
  3. 检测约束 - 关节约束、接触约束
  4. 求解约束力 - 解出 \(\lambda\),计算 \(J^T\lambda\)
  5. 积分更新状态 - 更新位置、速度

仿真方程

分段多刚体系统(详见 RigidBodyRepresentation.md):

$$ M\dot{v} + C(x,v) = f + J^T\lambda $$

含义对应章节
\(M\dot{v} + C(x,v)\)惯性力RigidBodyRepresentation.md
\(f\)外力重力、风力、关节力矩
\(J^T\lambda\)约束力Constraints.md / JointConstraint.md / Contacts.md

仿真流程详解

步骤 1:计算外力

✅ 外力包括:

  • 重力:\(mg\)
  • 风力等其他外力
  • 关节力矩:由控制器(如 PD 控制)生成

步骤 2:约束求解

关节约束(详见 JointConstraint.md):

  • 防止刚体分离
  • 求解 \(J^T\lambda\)

接触约束(详见 Contacts.md):

  • 防止穿透地面
  • 摩擦力防止滑动

步骤 3:积分更新

✅ 把人简化为分段刚体。整体过程为:

  • (1) 黄:计算当前状态
  • (2) 绿:计算约束,求解,解出下一时刻的速度
  • (3) 蓝:更新下一时刻的量(积分)

本章小结

章节内容
Simulation.md仿真器概述、力与力矩、前向/后向动力学
RigidBodyRepresentation.md角色的分段刚体表示
Constraints.md约束求解原理(小球例子)
JointConstraint.md关节约束与关节力矩
Contacts.md接触模型
本文完整仿真流程总结

核心公式: $$ M\dot{v} + C(x,v) = f + J^T\lambda $$


本文出自 CaterpillarStudyGroup,转载请注明出处。 https://caterpillarstudygroup.github.io/GAMES105_mdbook/

PD 控制

本章定位:理解如何设计和应用 PD 控制器,将目标状态转换为关节力矩


在控制系统中的位置

flowchart TD
    subgraph "高层:任务规划"
        A["做什么动作?<br/>有限状态机、行为树"]
    end

    subgraph "中层:轨迹生成/策略学习"
        B["如何生成目标动作?<br/>轨迹优化、DeepMimic、AMP"]
    end

    subgraph "底层:执行控制 (本章)"
        C["如何计算关节力矩?<br/>PD 控制"]
    end

    subgraph "仿真器"
        D["物理仿真<br/>Mv̇ + C = f + Jᵀλ"]
    end

    A -->|动作指令 | B
    B -->|目标状态 q*, q̇* | C
    C -->|关节力矩 τ | D
    D -->|当前状态 q, q̇ | C
    D -->|新状态 | A
层次功能典型方法
高层任务规划:决定做什么动作有限状态机、行为树
中层轨迹生成:输出目标状态 \(q^, \dot{q}^\)轨迹优化、DeepMimic、AMP
底层执行控制:计算关节力矩 \(\tau\)PD 控制

PD 控制的输入输出

  • 输入:目标状态 \(q^, \dot{q}^\) + 当前状态 \(q, \dot{q}\)
  • 输出:关节力矩 \(\tau\) → 送入仿真器

与仿真器的关系

模块输入输出核心问题
控制器目标状态/轨迹 + 当前状态关节力矩 τ如何生成力矩让角色达到目标?
仿真器关节力矩 τ + 外力新状态给定力矩,角色会如何运动?

分工说明

  • 控制器是「逆向问题」:从目标反推力矩
  • 仿真器是「前向问题」:从力矩推算运动

✅ 详细讲解见 角色物理仿真基础


本章内容导航

文件内容
关节力矩什么是关节力矩
- 物理定义与数学推导
- 为什么需要关节力矩(vs. 外力)
- 在运动方程中的位置
Proportional-Derivative ControlPD 控制理论基础
- 简化例子:物体上下移动
- P 控制、PD 控制、PID 控制
- Stable PD(隐式欧拉)
Controlling CharactersPD 在角色上的应用
- 参数调优(\(k_p\)、\(k_d\))
- 欠驱动问题与净外力
- 稳态误差问题
Static Balance静态平衡专题
- 支撑面与质心
- PD 控制策略
- Jacobian Transpose Control

本章重点问题

  1. PD 参数如何调优?

    • \(k_p\) 太小:无法达到目标
    • \(k_p\) 太大:角色僵硬
    • \(k_d\) 太小:振荡
    • \(k_d\) 太大:响应慢
  2. 欠驱动系统如何处理?

    • 人形角色是欠驱动系统(无法直接控制质心位置)
    • 解决方案:净外力(root force/torque)
  3. 稳态误差如何解决?

    • PD 控制需要误差才能产生力
    • 解决方案:增大 \(k_p\) 或使用前馈补偿
  4. 如何保证数值稳定性?

    • 高增益需要小时间步长
    • 解决方案:隐式欧拉(Stable PD)

补充概念

Fully-Actuated vs. Underactuated

在上一节中,\(f\) 与 \(V\) 的自由度可能是不同的。\(f\) 是关节数\( × 3\),\(V\) 是刚体数\( × 3\)。

If #actuators ≥ #dofs, the system is fully-actuatedIf #actuators < #dofs, the system is underactuated
For any \([x,v,\dot{v} ]\), there exists an \(f\) that produces the motionFor many \([x,v,\dot{v} ]\) , there is no such \(f\) that produces the motion
✅ 可以精确控制机械臂到达目标状态。✅ 不借助外力情况,人无法控制 Hips 的状态(位置)。

✅ #actuators:\(f \) 和 \(\tau \) 的自由度。 ✅ #dofs:角色状态的自由度。 ✅ 避免让角色掉入无法控制的状态。

深入学习欠驱动系统问题 - 详细讲解人形角色为什么是欠驱动系统以及解决方案。


Feedforward vs. Feedback

驱动角色运动的控制器是通过优化目标函数产生的。

Feedforward controlFeedback control
\(f,\tau =\pi (t)\)\(f,\tau =\pi (s_t,t)\)
Apply predefined control signals without considering the current state of the systemAdjust control signals based on the current state of the system
Assuming unchanging system.Certain perturbations are expected.
Perturbations may lead to unpredicted results
✅ 如果角色受到挠动而偏离了原计划,无法修正回来。
The feedback signal will be used to improves the performance at the next state.

深入学习DeepMimic | AMP | ASE

P55

Proportional-Derivative Control

这是一种常用的控制器。

✅ 有反馈,但还是算是前向控制,因为反馈的部分和想控制的部分不完全一致。

这一页先用一个简化问题来分析PD控制

问题描述

Compute force \(f\) to move the object to the target height

✅ 例子:物体只能沿竿上下移动,且受到重力。
✅ 控制目的:设计控制器,使物体在控制力的作用下达到目标高度。

使用比例控制

实际上:会产生上下振荡,不会停在目标位置。

P56

比例控制+Damping

✅ 改进:如果物体已有同方向速度,则力加得小一点。

P57

比例微分控制

✅ 第一项:比例控制;第二项:微分控制

P59

✅ 存在的问题:为了抵抗重力,一定会存在这样的误差。

P60

Increase stiffness \(k_p\) reduces the steady-state error, but can make the system too stiff and numerically unstable

✅ 增加 \(k_p\) 可以减小误差,但会让人看起来很僵硬。

P61

比例积分微分控制 Proportional-Integral-Derivative controller


✅ 解决误差方法:积分项。
✅ 但角色动画通常不用积分项。
✅ 积分项跟历史相关,会带来实现的麻烦和控制的不稳定。

Stable PD Control

✅ PD control 的过程类似于一个弹簧系统。
✅ 因此利用弹簧系统中的半隐式欧拉来提升 PD 的稳定性。

显式欧拉的PD控制的稳定性分析

✅ \(h\) 为时间步长。
✅ (1) 假设 \(m=1\) (2) 代入 \(f\) 到方程组 (3) 方程组写成矩阵形式,得:

P11

$$ \begin{bmatrix} v_{n+1}\\ x_{n+1} \end{bmatrix}=\begin{bmatrix} 1-k_dh & -k_ph\\ h(1-k_dh) & 1-k_ph^2 \end{bmatrix}\begin{bmatrix} v_n \\ x_n \end{bmatrix} $$

P14
提取常数方程A,得:

$$ A=\begin{bmatrix} 1-k_dh & -k_ph\\ h(1-k_dh) & 1-k_ph^2 \end{bmatrix} $$

\(\lambda _1,\lambda _2 \in \mathbb{C} \) are eigenvalues of \(A\)

✅ 基于中间变是 \(z_n\) 推导的过程跳过。
✅ 根据矩阵特征值的性质可直接得出结论。

if \(|\lambda _1|> 1\)

The system is unstable!

Condition of stability: \(|\lambda _i|\le 1 \text{ for all } \lambda _i\)

✅ 如果 \(k_p\) 和 \(k_d\) 变大,就必须以一个较小的时间步长进行仿真。

P22

隐式欧拉的PD控制

✅ 解决方法:半隐式欧拉 → 隐式欧拉,即用下一时刻的力计算下一时刻的速度。

  • 半隐式欧拉

$$ \begin{align*} v_{n+1} & = v_n+h(-k_px_n-k_dv_n) \\ v_{n+1} & = x_n+hv_{n+1} \end{align*} $$

$$ \Downarrow $$

  • 隐式欧拉

$$ \begin{align*} v_{n+1} & = v_n+h(-k_px_n-k_dv_{n+1}) \\ x_{n+1} & = x_n+hv_{n+1} \end{align*} $$

✅ 实际上,计算 \(f_{n+1}\) 只使用 \(V_{n+1}\) , 不使用 \(x_{n+1}\) , 因为 \(x_{n+1}\) 会引入非常复杂的计算。
✅ 由于 \(v_{n+1}\) 未知,需通过解方程组来求解。

P23
得到的方程组为:

$$ \begin{bmatrix} v_{n+1} \\ x_{n+1} \end{bmatrix}=\frac{1}{1+hk_d} \begin{bmatrix} 1 & -k_ph\\ h & 1+k_dh-k_ph^2 \end{bmatrix}\begin{bmatrix} v_n\\ x_n \end{bmatrix} $$

✅ \(v_{n}\) 换成 \(v_{n+1}\) ,很大承度上提高了稳定性。


本文出自CaterpillarStudyGroup,转载请注明出处。

https://caterpillarstudygroup.github.io/GAMES105_mdbook/

P3

PD Control for Characters

✅ 前面是 PD 的例子,这里是 PD 在物理仿真角色上的应用,计算在每个关节上施加多少力矩。

控制系统层次:PD 控制属于底层执行控制,输入是目标关节位置 $q^$ 和速度 $\dot{q}^$,输出是关节力矩 $\tau$。

中层策略:轨迹优化或 DeepMimic/AMP/ASE 等学习方法输出 PD 的目标 $q^*$。

深入学习: DeepMimic | AMP | ASE


✅ 通常目标的速度 \(\dot{\bar{q}} = 0\).

因此:

P63

PD Control for Characters 的参数和效果

✅ \(K_p\) 太小:可能无法达到目标状态。 ✅ \(K_p\) 太大:人体很僵硬。 ✅ \(k_d\) 太小:动作有明显振荡。 ✅ \(k_d\) 太大,要花更多时间到达目标资态。

  • Determining gain and damping coefficients can be difficult…

    • A typical setting \(k_p\) = 200, \(k_d\) = 20 for a 50kg character
    • Light body requires smaller gains
    • Dynamic motions need larger gains
  • High-gain/high-damping control can be unstable, so small times is necessary

    • \(h\) = 0.5~1ms is often used, or 1000~2000Hz
    • \(h\) = 1/120s~1/60s, or 120Hz/60Hz with Stable PD
    • Higher gain/damping requires smaller time step

P66

P72

欠驱动系统问题

详细说明:参见 欠驱动系统问题

由于是欠驱动系统,Tracking Mocap with Joint Torques 会遇到问题,因为:

  • \(\tau _j\): joint torques
  • Apply \(\tau _j\) to "child" body
  • Apply \(-\tau _j\) to "parent" body
  • All forces/torques sum up to zero

✅ 合力为零,无法控制整体的位置和朝向。 ✅ 解决方法:增加净外力(Root Force/Torque),详见 欠驱动系统问题


稳态误差问题

PD control computes torques based on errors

Steady state error

This arm never reaches the target angle under gravity

在角色上的表现就是 Motion falls behind the reference

P7

问题原因

✅ 前面两个问题的根本原因是相同的,因为需要有误差才能计算 force,有了 force 才能控制。

High-gain \((k_p)\) control is more precise but less stable…

解决方法

✅ 增大 \(k_p\)能缓解以上问题,但大的 \(k_p\) 会带来肢体僵硬和计算不稳定。

P25

相关工作

🔎

$$ \tau _{\mathrm{int} }=-K_p(q^n+\dot{q}^n \Delta t-\bar{q} ^{n+1})-K_d(\dot{q} ^n+\ddot{q} ^n \Delta t) $$

P71

feedforward?feedback

Is PD control a feedforward control? a feedback control?

✅ 是反馈控制,因为计算 \(\tau \) 时使用了当前状态 \(q\). ✅ 是前馈控制,因为在 PD 系统里,状态是位置不是 \(q\).


本文出自 CaterpillarStudyGroup,转载请注明出处。

https://caterpillarstudygroup.github.io/GAMES105_mdbook/

欠驱动系统问题(Underactuated System)

本章定位:理解人形角色为什么是欠驱动系统,以及 PD 控制如何处理这个问题。


一、什么是欠驱动系统

定义

Fully-Actuated(完全驱动)执行器数量 \(\geq\) 自由度数量
Underactuated(欠驱动)执行器数量 \(<\) 自由度数量

数学表述

$$ f, \tau \text{ 的自由度} < V \text{ 的自由度} $$

其中:

  • \(f, \tau\):可主动控制的力/力矩
  • \(V\):角色状态的自由度

二、人形角色为什么是欠驱动系统

自由度分析

对于一个人形角色:

自由度类型数量是否可直接控制
根节点位置(Hips)3 平移 + 3 旋转 = 6不可直接控制
关节旋转约 30+✅ 可通过 \(\tau\) 控制

关键问题

无法直接控制质心位置

     关节力矩 τ
        ↓
    只能控制关节旋转
        ↓
    无法直接控制 Hips 位置
        ↓
    需要借助外力(地面反作用力)

三、欠驱动带来的控制挑战

问题 1:无法直接控制质心

场景:想让角色向前走

❌ 错误思路:
   直接控制 Hips 向前移动 → 做不到!

✅ 正确思路:
   1. 用关节力矩 \\(\tau\\) 驱动腿部关节
   2. 脚对地面施加力
   3. 地面反作用力推动质心向前

问题 2:PD 控制的局限性

PD 控制公式:

$$ \tau = k_p (\theta_{\text{des}} - \theta_{\text{curr}}) + k_d (\dot{\theta}{\text{des}} - \dot{\theta}{\text{curr}}) $$

局限性

  • PD 控制只能控制关节角度
  • 无法直接控制质心位置
  • 质心运动是关节运动的间接结果

四、与完全驱动系统的对比

完全驱动系统(如机械臂)

     基座固定
        ↓
   所有关节都可控
        ↓
   可直接控制末端执行器位置
特性机械臂(完全驱动)人形角色(欠驱动)
基座固定自由浮动
可控自由度所有关节仅关节旋转
质心控制间接间接(需外力)

欠驱动 vs. 完全驱动

If #actuators \(\geq\) #dofs, the system is fully-actuatedIf #actuators \(<\) #dofs, the system is underactuated
For any \([x,v,\dot{v}]\) , there exists an \(f\) that produces the motionFor many \([x,v,\dot{v}]\) , there is no such \(f\) that produces the motion
✅ 可以精确控制机械臂到达目标位置。✅ 不借助外力情况,人无法控制 Hips 的位置。

✅ #actuators:\(f\) 和 \(\tau\) 的自由度。 ✅ #dofs:角色状态的自由度。


五、解决方案

方案 1:净外力(Root Force/Torque)

核心思想:在根节点(Hips)上施加虚拟的力和力矩。

$$ \tau_{\text{root}} = k_p (x_{\text{des}} - x_{\text{curr}}) + k_d (\dot{x}{\text{des}} - \dot{x}{\text{curr}}) $$

说明

  • 虚拟力,不真实存在
  • 用于计算期望的地面反作用力
  • 在优化框架中常用

方案 2:动量控制(Momentum Control)

核心思想:通过控制动量来间接控制质心。

$$ \frac{d}{dt}(m \dot{x}{\text{com}}) = \sum f{\text{ext}} $$

说明

  • 质心动量变化率 = 外力之和
  • 通过控制地面反作用力来控制质心

方案 3:分层控制(Hierarchical Control)

核心思想:高层规划质心轨迹,低层用 PD 控制关节。

高层控制器
    输入:任务目标
    输出:质心轨迹、步法计划
    ↓
低层控制器(PD)
    输入:质心轨迹、当前状态
    输出:关节力矩 \\(\tau\\)

六、实际应用中的处理

DeepLoco 的分层架构

flowchart TB
    Terrain["32×32 地形图"] --> HLC["高层控制器 HLC<br/>2Hz 规划步法"]
    HLC -->|"p̂₀, p̂₁, θ̂_root"| LLC["低层控制器 LLC<br/>30Hz 执行动作"]
    LLC --> PD["PD 控制器"]
    PD --> Sim["物理仿真"]
控制器频率处理的问题
HLC2Hz规划步法(解决欠驱动问题)
LLC30Hz关节 PD 控制

DeepMimic 的相位条件化

$$ \phi_t = (t \mod T_{\text{cycle}}) / T_{\text{cycle}} $$

核心思想:用相位变量隐式编码质心运动规律。


七、欠驱动系统的控制难点总结

难点原因后果
质心不可控无直接执行器需要借助外力
平衡问题支撑面有限容易摔倒
接触切换步态变化动力学突变
冗余自由度多关节协同控制复杂度高

八、与稳态误差问题的关系

欠驱动系统问题和稳态误差问题是 PD 控制在角色动画中的两大核心挑战

问题本质解决方案
欠驱动系统无法直接控制所有自由度净外力、动量控制、分层控制
稳态误差需要误差才能产生力矩增大 \(k_p\)、前馈补偿

关系

  • 欠驱动问题是结构性问题(系统本身特性)
  • 稳态误差问题是控制器设计问题(PD 控制局限)

九、关键要点总结

  1. 人形角色是欠驱动系统:无法直接控制质心位置
  2. PD 控制只能控制关节:质心运动是间接结果
  3. 需要借助外力:地面反作用力是控制质心的关键
  4. 分层控制是主流方案:高层规划质心,低层控制关节
  5. 与稳态误差问题并列:是 PD 控制在角色控制中的两大挑战

📚 深入学习


本文出自 CaterpillarStudyGroup,转载请注明出处。 https://caterpillarstudygroup.github.io/GAMES105_mdbook/

P62

Static Balance

定义

What is balance?

✅ Static Balance:在不发生移动的情况下,通过简单的控制策略,保证角色不摔倒。
✅ 平衡:质心在支撑面内。

P64

✅ 人的质心:每一段的质心的加权平均。
✅ 人的支撑面:两脚之内。

P66

A simple strategy: PD Control

A simple strategy to maintain balance:

根据条件计算力矩

  • Keep projected CoM close to the center of support polygon while tracking a standing pose

  • Use PD control to compute feedback torque

✅ 力矩 1:让角色保持某个姿势。
✅ 力矩 2:让质心与目标质心位置接近。力矩额外加在脚裸关节或髋关节上。
✅ 在某些关节上增加一些额外的力矩。

P68

施加力矩

  • Apply the feedback torque at ankles (ankle strategy) or hips (hip strategy)

P69

Jacobian Transpose Control

✅ 实现 static balance,除了 PD 控制还有其它方法。

计算要施加的力

Can we use joint torques \(\tau _i\) to mimic the effect of a force \(f\) applied at \(x\)

  • Note that the desired force \(f\) is not actually applied
  • Also called “virtual force”

✅ 通过施加 \(\tau _1 ,\tau _2,\tau _3\) 来达到给 \(x\) 施加 \(f\) 的效果!

P73

把力转化为力矩

Make \(f\) and \(\tau _i\) done the same power

$$ P=f^T\dot{x}=\tau ^T\dot{\theta } $$

✅ 从做功的角度。力矩所做的功(功率)与虚力要做的功(功率)相同。功率 = \(fv\)

Forward kinematics \(x=g(\dot{\theta } )\Rightarrow \dot{x}=J \dot{\theta } \)

✅ \(g(* )\) 是一个FK函数。其中:
$$ J=\frac{\partial g}{\partial \theta } $$
✅ 把 \( \dot{x } \) 代入上面公式得

$$ f^T J\dot{\theta } = \tau ^T\dot{\theta } $$

$$ \Downarrow $$

P76

$$ \tau =J^Tf $$

✅ 把 \( \tau\) 分解为每一个关节每一个旋转的 \( \tau\).通过 Jacobian 矩阵的含义推出:

$$ \Downarrow $$

$$ \tau _i=(x-p_i)\times f $$

P77

用于Static Balance

A simple strategy to maintain balance:

  • Keep projected CoM close to the center of support polygon while tracking a standing pose

  • Use PD control to compute feedback virtual force

✅ P66 中在 Hips 上加力矩的方式只能进行简单的控制。
✅ 可以通过虚力实现相似的效果。用 \(PD\) 控制计算出力,再通过关节力矩实现这个力。

$$ f=k_p(\bar{c} -c)-k_d\dot{c} $$

✅ \(c\) 不一定是投影距离,还可以描述高度距离,实现站起蹲下的效果。

P78

  • Assuming \(f\) is applied to the CoM, compute necessary joint torques using Jacobian transpose control to achieve it

✅ 但也不是真的加力,而是通过前面讲的 Jacobian transpose control 方法转为特定关节的力矩。

  • Usually using the joints in the legs

✅ 最后达到在Hips上加力的效果
✅ 但这种方式能施加的力非常弱,只能实现比较微弱的平衡

P79

A fancier strategy:

  • Mocap tracking as an objective function
  • Controlling both the CoM position/momentum and the angular momentum
  • Solve a one-step optimization problem to compute joint torques

🔎

轨迹优化

本章定位:理解如何通过优化方法生成物理可行的目标轨迹,供 PD 控制器跟踪。


在控制系统中的位置

flowchart TD
    subgraph "高层:任务规划"
        A["做什么动作?<br/>有限状态机、行为树"]
    end

    subgraph "中层:轨迹生成/策略学习 (本章)"
        B["如何生成目标动作?<br/>轨迹优化、DeepMimic、AMP"]
    end

    subgraph "底层:执行控制"
        C["如何计算关节力矩?<br/>PD 控制"]
    end

    subgraph "仿真器"
        D["物理仿真<br/>Mv̇ + C = f + Jᵀλ"]
    end

    A -->|动作指令 | B
    B -->|目标状态 q*, q̇* | C
    C -->|关节力矩 τ | D
    D -->|当前状态 q, q̇ | C

轨迹优化的输入输出

  • 输入:参考动作(如动捕数据)+ 当前状态
  • 输出:修正后的目标轨迹 \(q^, \dot{q}^\) → 送入 PD 控制器

与 PD 控制的关系

  • 轨迹优化输出"修正后的目标轨迹" \(q^*\)
  • PD 控制跟踪这个目标轨迹

与 RL 方法的关系

方法输出优点缺点
轨迹优化单一轨迹精确无法泛化、计算量大
RL (DeepMimic)策略可泛化、实时训练慢

为什么需要轨迹优化

直接用 PD 控制跟踪动捕数据会有很大问题:

问题原因表现
稳态误差PD 控制需要误差才能产生力矩动作滞后于参考轨迹
相位漂移运动轨迹与原轨迹之间存在相位差动作节奏不匹配
欠驱动问题人形角色缺少对根节点的直接控制质心位置无法直接控制

深入学习欠驱动系统问题 - 详细讲解欠驱动系统的挑战和解决方案。

轨迹优化的作用

  • 在 mocap 基础上添加修正量,使其物理可行
  • 引入轨迹优化之后,控制本质上变成了设计 target state

P30

轨迹优化的问题描述

🔎 [Witkin and Kass 1988 – Spacetime constraints]

✅ 轨迹优化的问题描述:

Find the trajectories:

$$ \begin{align*} \text{Simulation trajectory } & : S_0,S_1,\dots ,S_T \\ \text{Control trajectory } & : a_0,a_1,\dots ,a_{T-1} \end{align*} $$

✅ \(S\):每一个时刻,角色的状态,包括位置、速度、朝向等。
✅ \(a\):目标轨迹。
✅ 优化出 \(S\) 和 \(a\),根据 \(S\) 和 \(a\) 得到关节力矩,关节力矩再控制角色。

that minimize the objective function

$$ \min_{(S_t,a_t)} f(S_T)+\sum_{t=0}^{T-1} f(S_t,a_t) $$

✅ 目标函数第一项:关于轨迹结束时刻的状态。
✅ 第二项:关于每一时刻的状态。

and satisfy the constraints:

$$ \begin{align*} M\dot{v}+C(x,v) & =f+J^T\lambda & \text{Equations of motion} \\ g(x,v) & \ge 0 & \text{constraints } \quad \quad\quad \end{align*} $$

✅ 约束第一项:运动学方程。
✅ 第二项:根据场景特殊定义的约束。

P33

简化问题分析

✅ 仍以方块移动到目标高度为例。

问题描述

Compute a target trajectory \(\tilde{x} (t)\) such that the simulated trajectory \(x(t)\) is a sine curve.

目标函数

$$ \min_ {(x_n,v_n,\tilde {x} _n)} \sum _ {n=0}^{N} (\sin (t_n)-x_n)^2+\sum _ {n=0}^{N} \tilde {x}^2_n $$

✅ 目标函数:目标项+正则项

约束

$$ \begin{align*} s.t. \quad & v _ {n+1}= v_ n+h (k _ p( \tilde {x} _n-x_n)-k _ dv_n) \\ & v _ {n+1} = x _ n + hv _ {n+1} \end{align*} $$

✅ 约束:半隐式积分的运动方程

P34

Hard constraints:
Soft constraints:

✅ 以两种方式体现约束:
✅(1)Hard:必须满足,难解,不稳定。
✅(2)Soft:尽可能满足,易求解。

P35

参数简化

Collocation methods:

Assume the optimization variables {\(x_n, v_n, \tilde{x}_n\)} are values of a set of parametric curves

  • typically polynomials or splines

Optimize the parameters of the curves \(\theta\) instead

  • with smaller number of variables than the original problem

✅ 要优化的参数量太大,难以优化。
✅ 解决方法:假设参数符合特定的曲线,只学习曲线的参数,再生成完整的参数。

P37

优化方法

How to solve this optimization problem?
Gradient-based approaches:

  • Gradient descent
  • Newton’s methods
  • Quasi-Newton methods
  • ……

P39

Trajectory Optimization for Tracking Control

find a target trajectory

✅ 把动捕结果当成初始解,然后以优化的方式找到合理轨迹。

P40

Problem with Gradient-Based Methods

  • The optimization problem is usually highly nonlinear, gradients are unreliable
  • The system is a black box with unknow dynamics, gradients are not available

解决方法: Derivative-Free Optimization

  • Iterative methods

    • Goal: find the variables 𝒙 that optimize \(f(x)\)
    • Determining an initial guess of \(x\)
    • Repeat:
      • Propose a set of candidate variables {\(x_i\)} according to \(x\)
      • Evaluate the objective function \(f_i=f(x_i)\)
      • Update the estimation for \(x\)
  • Examples:

    • Bayesian optimization, Evolution strategies (e.g. CMA-ES), Stochastic optimization, Sequential Monte Carlo methods, ……

✅ 启发式方法或随机采样方法,不需要梯度。
✅ 缺点:慢、不精确。

P43

CMA-ES

  • Covariance matrix adaptation evolution strategy (CMA-ES)
    • A widely adopted derivative-free method in character animation

Goal: find the variables 𝒙 that optimize \(f(x)\)

  • Initialize Gaussian distribution \(x\sim \mathcal{N} (\mu ,\Sigma )\)
  • Repeat:
    • sample candidate variables {\(x_i\)} \( \sim \mathcal{N} (\mu ,\Sigma )\)
    • Evaluate the objective function \(f_i=f(x_i)\)
      • Involve simulation and generate simulation trajectories
    • Sort {\(f_i\)} and keep the top \(N\) elite samples
    • Update \(\mu ,\Sigma \) according to the elite samples

✅ 优点:稳定,无梯度,可用于黑盒系统。

P44

🔎 [Wampler and Popović 2009 - Optimal Gait and Form for Animal Locomotion]

P45

✅ [Al Borno et al. 2013 - Trajectory Optimization for Full-Body Movements with Complex Contacts]

✅ 只优化目标轨迹,不优化仿真轨迹。因为仿真轨迹可以通仿真得到。

P46

SAMCON

✅ CMA-ES 的缺点:
(1)每次都从头到尾做仿真,计算量大。
(2)如果仿真轨迹长,则难收敛。
✅ 改进方法:每次采样,只考虑下面一帧。

🔎 SAmpling-based Motion CONtrol [Liu et al. 2010, 2015]
- Motion Clip → Open-loop control trajectory
- A sequential Monte-Carlo method

✅ 把轨迹分割开,每次优化一小段。
✅ 在目标轨迹上增加偏移,跟踪偏移之后的轨迹。
✅ 偏移量未知,因此以高斯分布对偏移量采样。
✅ 高斯分布可由其它分布代替。
✅ 对每个偏移量做一次仿真,生成新的状态,保留其中与当目标接近的 N 个。
✅ 从上一步 N 个中随机选择出发点,以及随机的偏移量,再做仿真与筛选。
✅ 最终找到一组最接近的。
✅ 原理:只选一个容易掉入局部最优,因此保留多个。
✅ 蒙特卡罗+动态规划

✅ 优点:穿膜问题也能被修正掉,可还原动捕数据,可根据环境影响而自动调整。

P54

Feedforward & Feedback Control

Feedforward Control

✅ 前馈控制,要求每一步的起始状态都是在获取轨迹过程中能得到的状态。
✅ 如果对起始状态加一点挠动,状态会偏离很远。

P56

Feedback Control

✅ 解决方法:引入反馈策略。根据当前偏差,自动计算出更正,把更正叠加到控制轨迹上。

P2

Outline

  • Optimal Control

  • Model-based Approaches vs. Model-free Approaches

  • Sampling-based Optimization

  • Reinforcement Learning

  • Conclusion

P3

Recap

feedforwardfeedback

✅ 开环控制:只考虑初始状态。
✅ 前馈控制:考虑初始状态和干挠。
✅ 前馈控制优化的是轨迹。
✅ 反馈控制优化的是控制策略,控制策略是一个函数,根据当前状态优化轨迹。

P9

✅ Feedback 类似构造一个场,把任何状态推到目标状态。

P10

开环控制

问题描述

$$ \begin{matrix} \min_{x} f(x)\\ 𝑠.𝑡. g(x)=0 \end{matrix} $$

P12

把硬约束转化为软约束

$$ \min_{x} f(x)+ wg(x) $$

\(^\ast \) The solution \(x^\ast\) may not satisfy the constraint

P16

Lagrange Multiplier - 把约束条件转化为优化

✅ 拉格朗日乘子法。

✅ 通过观察可知,极值点位于\({f}'(x)\) 与 \(g\) 的切线垂直,即 \({f}' (x)\) 与 \({g}' (x)\) 平行。(充分非必要条件。)

因此:

Lagrange function

$$ L(x,\lambda )=f(x)+\lambda ^Tg(x) $$

✅ 把约束条件转化为优化。

P18

Lagrange Multiplier

✅ 这是一个优化问题,通过梯度下降找到极值点。

P20

Solving Trajectory Optimization Problem

定义带约束的优化问题

Find a control sequence {\(a_t\)} that generates a state sequence {\(s_t\)} start from \(s_o\) minimizes

$$ \min h (s_r)+\sum _{t=0}^{T-1} h(s_t,a_t) $$

✅ 因为把时间离散化,此处用求和不用积分。

subject to

$$ \begin{matrix} f(s_t,a_t)-s_{t+1}=0\\ \text{ for } 0 \le t < T \end{matrix} $$

✅ 运动学方程,作为约束

转化为优化问题

The Lagrange function

$$ L(s,a,\lambda ) = h(s _ T)+ \sum _ {t=0} ^ {T-1} h(s _t,a _t) + \lambda _ {t+1}^T(f(s _t,a _t) - s _ {t+1}) $$

P27

求解拉格朗日方程

✅ 拉格朗日方程,对每个变量求导,并令导数为零。因此得到右边方程组。
✅ 右边方程组进一步整理,得到左边。
✅ \(\lambda \) 类似于逆向仿真。
✅ 公式 3:通过转为优化问题求 \(a\).

P30

Pontryagin’s Maximum Principle for discrete systems

✅ 方程组整理得到左边,称为 PMP 条件。是开环控制最优的必要条件。

P32

Optimal Control

Open-loop Control:
given a start state \(s_0\), compute sequence of actions {\(a_t\)} to reach the goal

Shooting method directly applies PMP. However, it does not scale well to complicated problems such as motion control…
\(
\)
Need to be combined with collocation method, multiple shooting, etc. for those problems.
\(
\)
Or use derivative-free approaches.

✅ 对于复杂函数,表现比较差,还需要借助其它方法。

闭环控制

P34

Dynamic Programming

希望找到一条最短路径到达另一个点,对这个问题用不同的方式建模,会得到不同的方法:

动态规划问题Find a path {\(s_t\)} that minimizes\(J(s_0)=\sum _ {t=0}^{ } h(s_t,s_{t+1})\)
轨迹问题Find a sequence of action {\(a_t\)} that minimizes\(J(s_0)=\sum _ {t=0}^{ } h(s_t,a_t)\)
subject to
\( s_{t+1}=f(s_t,a_t)\)
控制策略问题Find a policy \( a_t=\pi (s_t,t)\)或 \( a_t=\pi (s_t)\)that minimizes\(J(s_0)=\sum _ {t=0}^{ } h(s_t,a_t)\)
subject to
\(s_{t+1}=f(s_t,a_t)\)

P39

Bellman’s Principle of Optimality

✅ 针对控制策略问题,什么样的策略是最优策略?

An optimal policy has the property that whatever the initial state and initial decision are, the remaining decisions must constitute an optimal policy with regard to the state resulting from the first decision.

\(^\ast \) The problem is said to have optimal substructure

P40

Value Function

Value of a state \(V(s)\) :

  • the minimal total cost for finishing the task starting from \(s\)
  • the total cost for finishing the task starting from \(s\) using the optimal policy

✅ Value Funcron,计算从某个结点到 gool 的最小代价。
✅ 后面动态规划原理跳过。

P49

The Bellman Equation

Mathematically, an optimal value function \(V(s)\) can be defined recursively as:

$$ V(s)=\min_{a} (h(s,a)+V(f(s,a))) $$

✅ h代表s状态下执行一步a的代价。f代表以s状态下执行一步a之后的状态。

If we know this value function, the optimal policy can be computed as

$$ \pi (s)=\arg \min_{a} (h(s,a)+V(f(s,a))) $$

✅ pi代表一种策略,根据当前状态s找到最优的下一步a。
✅ This arg max can be easily computed for discrete control problems.
But there are not always closed-forms solution for continuous control problems.

or

$$ \begin{matrix} \pi (s)=\arg \min_{a} Q(s,a)\\ \text{where} \quad \quad Q(s,a)=h(s,a)+V(f(s,a)) \end{matrix} $$

Q-function称为State-action value function
Learning \(V(s)\) and/or \(Q(s,a)\) is the core of optimal control / reinforcement learning methods

✅ 强化学习最主要的目的是学习 \(V\) 函数和 \(Q\) 函数,如果 \(a\) 是有限状态,遍历即可。但在角色动画里,\(a\) 是连续状态。


本文出自CaterpillarStudyGroup,转载请注明出处。

https://caterpillarstudygroup.github.io/GAMES105_mdbook/

P52

Linear Quadratic Regulator (LQR)

  • LQR is a special class of optimal control problems with
    • Linear dynamic function
    • Quadratic objective function

✅ LQR 是控制领域一类经典问题,它对原控制问题做了一些特定的约束。因为简化了问题,可以得到有特定公式的 \(Q\) 和 \(V\).

P53

A very simple example

问题描述

Compute a target trajectory \(\tilde{x}(t)\) such that the simulated trajectory \(x(t)\) is a sine curve.

✅ 目标函数是关于优化对象 \(x_n\) 的二次函数。

$$ \min _{(x_n,v_n,\tilde{x} _n)} \sum _{n=0}^{N} (\sin (t_n)-x_n)^2+\sum _{n=0}^{N}\tilde{x}^2_n $$

✅ 运动学方程中的 \(x_{n+1}\)、\(v_{n+1}\) 与上一帧状态 \(x_n\)、\(v_n\) 是线性关系。

$$ \begin{align*} s.t. \quad \quad v _ {n+1} & = v _ n + h(k _p ( \tilde{x} _ n - x _ n) - k _ dv _ n ) \\ v _ {x+1} & = x _ n + hv _ {n+1} \end{align*} $$

✅ 这是一个典型的 LQR 问题。

P54
objective function

$$ \min s^T_TQ_Ts_T+\sum_{t=0}^{T} s^T_tQ_ts_t+a^T_tR_ta_t $$

subject to dynamic function

$$ s_{t+1}=A_ts_t+B_ta_t \quad \quad \text{for } 0\le t <T $$

P58

推导一步

✅ 由于存在optimal substructure,每次只需要考虑下一个状态的最优解。
✅ 每一个状态基于下一个状态来计算,不断往下迭代,直到最后一个状态。
✅ 最后一个状态的V的计算与a无关。
✅ 计算完最后一个,再计算倒数第二个,依次往前推。

P60
公式整理得:

P61

✅ 结论:最优策略与当前状态的关系是矩阵K的关系。\(K\) 是线性反馈系数。

P62
当a取最小值时,求出V:

✅ \(V(S_{T-1})\)和\(V(S_{T})\)的形式基本一致,只是P的表示不同。

P63

推导每一步

P64

Solution

  • LQR is a special class of optimal control problems with
    • Linear dynamic function
    • Quadratic objective function
  • Solution of LQR is a linear feedback policy

P65

更复杂的情况

  • How to deal with
    • Nonlinear dynamic function?
    • Non-quadratic objective function?

✅ 人体运动涉及到角度旋转,因此是非线性的。


本文出自CaterpillarStudyGroup,转载请注明出处。

https://caterpillarstudygroup.github.io/GAMES105_mdbook/

✅ 人体运动涉及到角度旋转,因此是非线性的。

P68

Nonlinear problems

✅ 方法:把问题近似为线性问题。

Approximate cost function as a quadratic function:

✅ 目标函数:泰勒展开,保留二次。

$$ h(s_t,a_t)\approx h(\bar{s}_t ,\bar{a}_t)+\nabla h(\bar{s}_t ,\bar{a}_t)\begin{bmatrix} s_t-\bar{s} _t\\ a_t-\bar{a} _t \end{bmatrix} + \frac{1}{2} \begin{bmatrix} s_t-\bar{s} _t\\ a_t-\bar{a} _t \end{bmatrix}^T\nabla^2h(\bar{s}_t ,\bar{a}_t)\begin{bmatrix} s_t-\bar{s} _t\\ a_t-\bar{a} _t \end{bmatrix} $$

Approximate dynamic function as a linear function:

✅ 转移函数:泰勒展开,保留一次或二次。

$$ f(s_t,a_t)\approx f(\bar{s}_t ,\bar{a}_t)+\nabla f(\bar{s}_t ,\bar{a}_t)\begin{bmatrix} s_t-\bar{s} _t\\ a_t-\bar{a} _t \end{bmatrix} $$

展开为一次项,对应解决算法:iLQR(iterative LQR)

Or a quadratic function:

$$ f(s_t,a_t)\approx \ast \ast \ast \frac{1}{2} \begin{bmatrix} s_t-\bar{s} _t\\ a_t-\bar{a} _t \end{bmatrix}^T\nabla^2f(\bar{s}_t ,\bar{a}_t)\begin{bmatrix} s_t-\bar{s} _t\\ a_t-\bar{a} _t \end{bmatrix} $$

展开为二次项,对应解决算法:DDP(Differential Dynamic Programming)

P69

相关应用

🔎 [Muico et al 2011 - Composite Control of Physically Simulated Characters]

✅ 选择合适的 \(Q\) 和 \(R\),需要一些工程上的技巧。
✅ 为了求解方程,需要显式地建模运动学方程。

P70

Model-based Method vs. Model-free Method

✅ Model Based 方法,要求 dynamic function 是已知的,但是实际上这个函数可能是(1)未知的(2)不精确的。(3)性质很差,梯度不能带来有用的信息。
✅ 因此Model Based 方法对于复杂问题难以应用,但对于简单问题非常高效。

What if the dynamic function \(f(s,a)\) is not know?

✅ \(f\) 未知只是把 \(f\) 当成一个黑盒子,仍需要根据 \(S_t\) 得到 \(S_{t+1}\) .

What if the dynamic function \(f(s,a)\) is not accurate?

✅ 不准确来源于(1)测量误差(2)问题简化

What if the system has noise?

What if the system is highly nonlinear?


本文出自CaterpillarStudyGroup,转载请注明出处。

https://caterpillarstudygroup.github.io/GAMES105_mdbook/

P72

Sampling-based Policy Optimization

✅ 基于采样的方法。

  • Iterative methods
    Goal: find the optimal policy \(\pi (s;\theta )\) that minimize the objective \(J(\theta )=\sum_{t=0}^{}h(s_t,a_t) \)

    • Initialize policy parmeters \(\pi (x;\theta )\)
    • Repeat:
      • Propose a set of candidate parameters {\(\theta _i \)} according to \(\theta \)
      • Simulate the agent under the control of each \( \pi ( \theta _i)\)
      • Evaluate the objective function \( J (\theta_i )\) on the simulated state-action sequences
      • Update the estimation of \(\theta \) based on {\( J (\theta_i )\)}
  • Example: CMA-ES 把 \( \theta\) 建模为高斯分布,每次更新高斯分布的均值和方差。

P73

Example: Locomotion Controller with Linear Policy

🔎 [Liu et al. 2012 – Terrain Runner]

P74

Stage 1a: Open-loop Policy

Find open-loop control using SAMCON

✅ 使用开环轨迹优化得到开环控制轨迹。

P76

Stage 1b: Linear Feedback Policy

✅ 使用反馈控制更新控制信号。由于假设了线性关系,根据偏离 offset 可直接得到调整 offset.

P78

Stage 1b: Reduced-order Closed-loop Policy

✅ 把 \(M\) 分解为两个矩阵,\(M_{AXB} = M_{AXC}\cdot M_{CXB}\) 如果 \(C\) 比较小,可以明显减少矩阵的参数量。
✅ 好处:(1) 减少参数,减化优化过程。(2) 抹掉状态里不需要的信息。

P79

一些工程上的 trick

Manually-selected States: s

  • Running: 12 dimensions

✅ (1)根结点旋转(2)质心位置(3)质心速度(4)支撑脚位置

P80

Manually-selected Controls: a

  • for all skills: 9 dimensions

✅ 仅对少数关节加反馈。

P81

Optimization

$$ \delta a=M\delta s+\hat{a} $$

  • Optimize \(M\)
    • CMA, Covariance Matrix Adaption ([Hansen 2006])
    • For the running task:
      • #optimization variables: \(12 ^\ast 9 = 108 / (12^\ast 3+3 ^\ast 9) = 63\)
    • 12 minutes on 24 cores

本文出自CaterpillarStudyGroup,转载请注明出处。

https://caterpillarstudygroup.github.io/GAMES105_mdbook/

P85

Optimal Control \(\Leftrightarrow \) Reinforcement Learning

• RL shares roughly the same overall goal with Optimal Control

$$ \max \sum_{t=0}^{} r (s_t,a_t) $$

✅ 相同点:目标函数相同,是每一时刻的代价函数之和。

• But RL typically does not assume perfect knowledge of system

✅ 最优控制要求有精确的运动方程,而 RL 不需要。

  • RL can still take advantage of a system model → model-based RL
    • The model can be learned from data
      $$ s_{t+1}=f(s_t,a_t;\theta ) $$

✅ RL 通过不断与世界交互进行采样。

P87

Markov Decision Process (MDP)

State\(\quad s_t \quad \quad \)
Action\(\quad a_t\)
Policy\(\quad \quad a_t\sim \pi (\cdot \mid s_t)\)
Transition probability\(\quad \quad s_{t+1}\sim p (\cdot \mid s_t,a_t)\)
Reward\(\quad \quad r_t=r (s_t,a_t)\)
Return\(R = \sum _{t}^{} \gamma ^t r (s_t,a_t)\)

✅ 真实场景中轨迹无限长,会导到 \(R\) 无限大。
✅ 因此会使用小于 1 的 \(r,t\) 越大则对结果的影响越小。

P88

跟踪问题(轨迹优化问题)变成MDP问题

用 RL 实现跟踪控制的效果

Trajectory

$$ \begin{matrix} \tau =& s_0 & a_0 & s_1 & a_1 & s_2&\dots \end{matrix} $$

Reward

P90

MDP问题的数学描述

✅ Markov 性质:当前状态已知的情况下,下一时刻状态只与当前状态相关,而不与之前任一时刻状态相关。

MDP is a discrete-time stochastic control process.
It provides a mathematical framework for modeling decision making in situations
where outcomes are partly random and partly under the control of a decision maker.

A MDP problem:

\(\mathcal{M}\) = {\(S,A,p,r\)}
\(S\): state space
\(A\): action space
p:状态转移概率,即运动学方程。
r:代价函数。

P91

Solve for a policy \(\pi (a\mid s)\) that optimize the expected return

✅ 假设 \(\pi \) 函数和 \(p\) 函数都是有噪音的,即得到的结果不是确定值,而是以一定概率得到某个结果(期望值)。这是与最优控制问题的区别。

$$ J=E[R]=E_{\tau \sim \pi }[\sum_{t}^{} \gamma ^tr(s_t,a_t)] $$

✅ 求解一个policy \(\pi \) 使期望最优,而不是直接找最优解。

Overall all trajectories \(\tau \) = { \(s_0, a_0 , s_1 , a_1 , \dots \)} induced by \(\pi \)

P93

Bellman Equations

In optimal control:

✅ 在最优控制问题中,\(\pi \) 是一个特定的策略,特指最优策略。\(V\) 也是特指在最优策略下的 value。

In RL control:

✅ 在RL控制问题中,不存在最优策略下,\(\pi \)是一个策略分布中的某一个策略,而不是最优策略。 \(V\) 是指某个策略 \(\pi \)下的 value function。

P94

How to Solve MDP

Value-based Methods

  • Learning the value function/Q-function using the Bellman equations
  • Evaluation the policy as

$$ \pi (s) = \arg \min_{a} Q(s,a) $$

  • Typically used for discrete problems
  • Example: Value iteration, Q-l a ning, DQN, …

P95

🔎 DQN [Mnih et al. 2015, Human-level control through deep reinforcement learning]

DQN 方法要求控制空间必须是离散的。但状态空间可以是离散的。

P96

相关工作

🔎 [Liu et al. 2017: Learning to Schedule Control Fragments ]

✅ DQN 方法要求控制空间必须是离散的,但状态空间可以是连续的。
✅ 因此可用于高阶的控制。

P97

Policy Gradient approach

  • Learning the value function/Q-function using the Bellman equations

  • Compute approximate policy gradient according to value functions using Monte-Carlo method

  • Update the policy using policy gradient

  • Suitable for continuous problems

  • Exa pl : REINFORCE, TRPO, PPO, …

✅ policy gradient 是 Value function 对状态参数的求导。但这个没法算,所以用统计的方法得到近似。
✅ 特点是显示定义 Policy 函数。对连续问题更有效。

P98

相关工作

[Liu et al. 2016. ControlGraphs][Liu et al. 2018][Peng et al. 2018. DeepMimic]

P100

Generative Control Policies

✅ 使用RL learning,加上一点点轨迹优化的控制,就可以实现非常复杂的动作。

🔎 [Yao et al. Control VAE]


本文出自CaterpillarStudyGroup,转载请注明出处。

https://caterpillarstudygroup.github.io/GAMES105_mdbook/

P101

What’s Next?

Digital Cerebellum

Large Pretrained Model for Motion Control

P102

Cross-modality Generation

  • \(\Leftrightarrow\) LLM \(\Leftrightarrow\) Text/Audio \(\Leftrightarrow\) Motion/Control \(\Leftrightarrow\) Image/Video \(\Leftrightarrow\)
  • Digital Actor?

本文出自CaterpillarStudyGroup,转载请注明出处。

https://caterpillarstudygroup.github.io/GAMES105_mdbook/

角色控制技术

本章定位:理解如何不依赖参考轨迹,基于简化模型和反馈规则实现稳定的双足行走。


在控制系统中的位置

flowchart LR
    subgraph "中层:策略生成"
        C["Tracking.md<br/>轨迹优化(有参考)"]
        D["Character Control<br/>简化模型控制(无参考)"]
    end

    subgraph "底层:执行控制"
        B[PDControl.md<br/>PD 控制]
    end

    subgraph "仿真"
        A[Simulation/Simulation.md<br/>物理仿真基础]
    end

    E["动捕数据"] -.->|参考 | C
    F["用户指令<br/>速度/方向"] -.->|目标 | D

    C -->|"目标轨迹"| B
    D -->|"目标轨迹/反馈"| B
    B -->|"关节力矩 τ"| A
    A -->|"当前状态"| B

与前面章节的关系

三层控制的关系

层次章节输入输出特点
底层PD 控制目标状态 + 当前状态关节力矩 τ需要调参、有稳态误差
中层①轨迹优化参考轨迹(动捕)修正后的目标轨迹精确跟踪、无法泛化
中层②角色控制用户指令(速度/方向)目标轨迹/反馈无参考、可泛化、只能走路

轨迹优化 vs 角色控制

维度轨迹优化 (Tracking)角色控制 (Character Control)
参考轨迹需要(动捕数据)不需要
方法优化方法(CMA-ES、SAMCON)简化模型(ZMP、IPM、SIMBICON)
输出完整的关节目标轨迹简单的反馈规则/步态参数
动作质量高(来自动捕)低(像机器人)
泛化能力差(只能做学过的动作)中(可以走不同速度/方向)
应用场景动作复现实时行走控制

为什么需要这一章

问题:如果没有动捕数据,如何让角色走路?

答案:用简化模型抽象出平衡的本质规律,通过反馈控制实现稳定行走。

两种思路对比

轨迹优化的思路

动捕数据 → 优化修正 → 跟踪轨迹 → PD 执行
  • 优点:动作质量高(来自动捕)
  • 缺点:依赖数据、无法泛化

角色控制的思路

用户指令(速度/方向) → 简化模型 → 生成步态 → PD 执行
  • 优点:无需参考数据、可实时响应、可泛化到不同速度/方向
  • 缺点:动作质量低(像机器人)、只能做简单动作(走路)

简化模型方法

方法简化什么控制什么
ZMP上半身简化为质点控制 ZMP 在支撑多边形内
IPM(倒立摆)身体简化为杆 + 小车控制落脚点使杆不倒
SIMBICON步态简化为周期模式加质心反馈修正步态

本章内容导航

文件内容
Learning to Walk行走基础
- 行走的阶段分析
- 静态平衡 vs 动态平衡
Zero-Moment Point (ZMP)ZMP 理论与简化模型
- ZMP 的定义与物理意义
- 倒立摆模型 (IPM)
- 步态规划
SIMBICON经典行走控制方法
- 基础步态生成
- 质心反馈控制
- 参数调优

本章重点问题

  1. 什么是 ZMP?如何用 ZMP 判断平衡?

    • ZMP 是地面反作用力的合力作用点
    • 当 ZMP 在支撑多边形内时,角色保持平衡
  2. 如何用简化模型规划步态?

    • 倒立摆模型:身体简化为杆,脚简化为小车
    • 控制落脚点使杆不倒
  3. SIMBICON 如何实现稳定行走?

    • 基础步态(周期模式)+ 质心反馈
    • 根据质心位置调整落脚点

后续发展

角色控制是无参考轨迹行走控制的入门方法,后续发展:

方法与角色控制的关系
DeepMimic/AMP用强化学习替代手工设计的简化模型
Motion Matching用数据驱动替代简化模型,但属于运动学方法

深入学习DeepMimic | AMP | SIMBICON

P2

Outline

  • Walking and Dynamic Balance

  • Simplified Models

    • ZMP (Zero-Moment Point)
    • Inverted Pendulum
    • SIMBICON

✅ 不能直接控制角色位置,而是通过与地面的力和反作用力。

P3

Walking

🔎 Gait disorders in adults and the elderly.
phases of a walking gait cycle
Pirker and Katzenschlager 2017.

P4

Walking VS Running

WalkingRunning

Walking: move without loss of contact, or flight phases

P7

Walking的几个阶段

✅ 以上过程假设角色处于 static 状态。没有考虑到移动过程中的脚的动量。因此只能勉强保持角色稳定。要以非常慢的速度相前移动。


本文出自CaterpillarStudyGroup,转载请注明出处。

https://caterpillarstudygroup.github.io/GAMES105_mdbook/

P11

Zero-Moment Point (ZMP)

✅ 通过ZMP的控制实现比较稳定的走路。

全身受力分析与问题简化

✅ 角色受到重力和GRF力。
✅ GRF = 支持力(向上)+ 动摩擦力(有速度时才有)
✅ 简化:上半身受到的所有的力,都体现在 ankle 关节上。
✅ 通过对 ankle 施加力/力矩来实现全身移动。

P12

$$ M\dot{v} +C(x,v)=f+f_J $$

✅ 在满足这个公式的前提下,一个部分动了另一个部分就会跟着动。因此可以把问题简化,只分析ankle。

P15

脚上受力分析

✅ 仅分析脚上的力,\(f_{\text{ankle}}\) 为 ankle 上的力转化到脚上的力。

✅ 地面对脚的力不是施加到某一个点上,但可以根据公式换算成施加到某一点的力。

P17

Assuming the ground is flat and level
so \(p_i\) - \(p\) is always in the horizontal plane

✅ 把 \(\tau _{GRF} \) 分解为与地面垂直部分和与地面平行部分(力矩的方向是指它的旋转轴的方向。),其中垂直的部分为:

水平的部分为:

Can we find \(p\) such that \(\tau _{GRF}^{xz}=0\) ?

P21

Zero-Moment Point (ZMP)

当\(p\) 为 center pressure时:

$$ \begin{align*} f_{GRF} & =\sum _{i}^{} f_i \\ \tau _{GRF} & =\tau _{GRF}^y=\sum _{i}^{}(p_i-p)\times f_i^{xz} \end{align*} $$

The position of \(p\) is not known, but we assume 以上公式成立。

ZMP条件下支撑脚的受力分析

假设: 支撑脚 should not move in a stance phase,且支撑脚与地面完成接触
则:在所有力作用下处于静平衡状态。

Static Equilibrium:

静态平衡满足:所有合力为0

$$ f_{\text{ankle}} + f_{\text{GRF}} + mg = 0
$$

静态平衡满足:任选一个参考点,所有合力(力矩)相对于参考点的动量为0,否则会旋转。

The moment around a reference point \(o\):

$$ (u-o) \times f_{\text{ankle}} + (p-o) \times f_{\text{GRF}} + (x-o)\times mg + \tau _{GRF}^{y} + \tau _{\text{ankle}} = 0 $$

✅ \(o\) 是一个参考点,可以在任意位置
✅ U:ankle 位置。
✅ X:质心位置 ✅ P:位置未知,高度为 0.

同样只关心水平方向:

Horizontal components (moment projected onto \(xz\) plane):

$$ ((u-o) \times f_{\text{ankle}})^{xz} +( (p-o) \times f_{\text{GRF}} ) ^{xz}+ (x-o)\times mg + \tau _{\text{ankle}}^{xz} = 0 $$

✅ 总力矩为 0,否则人会旋转。

P28

求解 Zero-Moment Point (ZMP)

We can solve this equation to find \(p\)

\(p\) is called Zero-Moment Point (ZMP) because it makes

$$ \tau _{GRF}^{xz}=0 $$

and the horizontal moment

$$ ((u-o) \times f_{\text{ankle}})^{xz} +( (p-o) \times f_{\text{GRF}} ) ^{xz}+ (x-o)\times mg + \tau _{\text{ankle}}^{xz} = 0 $$

Only when 𝑝 is within the support polygon!

✅ \(p\) 满足(1)水平力矩为0. (2)人整体上平衡。
✅ \(u,O,X\) 都是已知,\(p\) 的高度为 0,只有 \(P_xP_y\) 未知且该公式分别在 \(X\) 和 \(Z\) 上成立,实际上是两个方程。
✅ 两个未知量和两个方程,可以解出 \(p\)。

P33

如果解出公式得到的\(p\) is outside the support polygon,那么:
\(p\) could NOT be the center of pressure, because all the GRFs are applied within the polygon, so that

$$ \tau _{GRF}^{xz}\ne 0 $$

✅ 如果求出 \(p\) 在 polygon外 则不能平衡,因为不是 center pressure.

如果选择polygon上的real center of pressure\({p}' \) ,那么:

$$ ((u-o) \times f_{\text{ankle}})^{xz} +( ({p}'-o) \times f_{\text{GRF}} ) ^{xz}+ (x-o)\times mg + \tau _{\text{ankle}}^{xz} \ne 0 $$

✅ \({p}' \ne p\),\({p}'\) 处水平方向的合外力不为零,脚会翻转人会摔倒。

Simplified Models

P35

关于ZMP的思考

The existence of ZMP is an indication of dynamic balance We can achieve balanced walking by controlling ZMP But how?

P36

Simplified Models的基本套路

  • Simplify humanoid / biped robot into an abstract model
    • Often consists of a CoM and a massless mechanism
    • Need to map the state of the robot to the abstract model

✅ 因此,把最影响平衡的量拿出来,建立简化模型。
✅ 实际上更加复杂,对上半身任何一个部位的干挠,都会影响到脚上的力。

  • Plan the control and movement of the model

    • Optimization
    • Dynamic programming
    • Optimal control
    • MPC
  • Track the planned motion of the abstract model

    • Inverse Kinematics
    • Inverse Dynamics

P37

Example: ZMP-Guided Control

🔎

✅ 把机器人简化为桌子和小车,通过控制小车m的运动来控制 ZMP。使 ZMP 满足预定义轨迹。

✅ 预定义轨迹的轨迹是指保持在pologon里面。通过优化得到 \(m\) 的运动。
✅ 然后通过IK和PD control控制脚的运动。

✅ ASIMO机器人局限性:(1) 脚必须与地面平行。 (2) 脚必须弯曲。 (3) 整体移动速度慢。

P40

Inverted Pendulum Model (IPM)

Walking == Falling + Step Planning

✅ 人的特点是重心偏离再拉回来,这样比始终保持平更省。

P42

IPM问题

✅ IPM: 倒立摆模型,控制小车使杆不掉下去。

Step Plan with IPM

🔎

P45

  • Map CoM of the character and the stance foot as IPM
  • Plan the position of the next foot step so that the mass point rests at the top of the pendulum
  • Create foot trajectory based on the step plan
  • Compute target poses using IK

✅ 脚到重心是一个倒立摆。
✅ 由于失去平衡,质心有一个向前的速度,通过到一个合适的落脚点,使质心到达脚的正上方刚好到达速度稳定。
✅ 算出脚的目标位置后,插值,IK,PD 控制。

P46

✅ 动能转势能,能量守恒.算出高度。
❗ 注意:杆的长度是不确定的,因为腿会弯曲。

P47

✅ 方法优点:可以适用于不同角色,不同动作,不同环境交互。


本文出自CaterpillarStudyGroup,转载请注明出处。

https://caterpillarstudygroup.github.io/GAMES105_mdbook/

P48

SIMBICON

🔎 SIMBICON (SIMple BIped Locomotion CONtrol) Yin et al. 2007

✅ 经典工作,第一个实现了鲁棒的步态控制。
✅ 原理:跟踪控制器上加一个反馈

P49

Step 1

  • Step 1: develop a cyclical base motion
    • PD controllers track target angles
    • FSM (Finite State Machine) or mocap

✅ 本质上是一个跟踪控制器,用状态机来实现的跟踪控制器

✅ 有四个状态,通过跟踪在4个状态之间切换,也可以用动捕数据来代替

P50

Step 2

  • Step 2:
    • control torso and swing-hip wrt world frame

✅ 控制目标:上半身保持竖直。
✅ 控制方法:
通过保持上半身竖直,计算出\(\tau _{\text{torso}} \)。
通过使B跟踪目标动作,计算出\(\tau _{B} \)。
通过 \(\tau _{\text{torso}} \) 和 \(\tau _{B} \) 控制 \(\tau _{A} \).

P51

Step 3

  • Step 3: COM feedback

✅ 估计下一个脚步的位置d,使质心处于可控范围内。
✅ \(d\) 与 \(D\) 有关,但关系复杂,在此处做了简化。

P52

✅ 简化问题:\(d\) 和 \(v\) 与 \(\theta _d\) 的速度是线性关系。速度会转化为 PD 目标的修正。
✅ 线性的系数为手调。

P53

SIMBICON

P54

Outline

  • How to generalize to other motion?


本文出自CaterpillarStudyGroup,转载请注明出处。

https://caterpillarstudygroup.github.io/GAMES105_mdbook/

混合方法

本章定位:理解如何在动力学方法中引入运动学数据,实现高质量且符合物理的角色动画。


运动学 vs 动力学:优缺点对比

运动学方法

优点

  • 动作质量高:来自动捕数据,真实自然
  • 计算效率高:无需物理仿真,实时性好
  • 易于控制:直接输出姿态,可控性强

缺点

  • 不符合物理:穿模、滑步、浮空
  • 抗扰动能力差:受外力后无法恢复
  • 无法与环境交互:不能适应地形变化

动力学方法

优点

  • 符合物理:无穿模、滑步
  • 抗扰动能力强:受外力后可恢复平衡
  • 可与环境交互:适应地形、物体交互

缺点

  • 动作质量低:像机器人、僵硬
  • 计算成本高:需要物理仿真、优化/训练
  • 调参困难:需要大量手工调整

为什么要结合?

核心思想:取长补短

┌─────────────────────┐     ┌─────────────────────┐
│   运动学方法        │     │   动力学方法        │
│                     │     │                     │
│  ✓ 动作质量高       │     │  ✓ 物理真实         │
│  ✓ 计算效率高       │     │  ✓ 抗扰动强         │
│  ✓ 易于控制         │     │  ✓ 可交互           │
│                     │     │                     │
│  ✗ 不符合物理       │     │  ✗ 动作质量低       │
│  ✗ 抗扰动差         │     │  ✗ 计算成本高       │
│  ✗ 无法交互         │     │  ✗ 调参困难         │
└─────────────────────┘     └─────────────────────┘
            ↓                           ↓
            └──────────┬────────────────┘
                       │
                       ↓
            ┌─────────────────────┐
            │    混合方法         │
            │                     │
            │  ✓ 动作质量高       │
            │  ✓ 物理真实         │
            │  ✓ 抗扰动强         │
            │                     │
            │  ✗ 系统复杂         │
            │  ✗ 训练成本高       │
            └─────────────────────┘

混合方法的本质

┌─────────────────────────────────────────────────────────┐
│  混合方法 = 动力学方法 + 运动学数据                      │
│                                                         │
│  动力学方法提供:物理仿真、抗扰动能力                    │
│  运动学数据提供:高质量动作参考、风格先验                │
└─────────────────────────────────────────────────────────┘

与前面章节的关系

运动学方法 ──→ 提供数据/先验 ──┐
                              ├──→ 混合方法
动力学方法 ──→ 提供仿真/执行 ──┘

常见的结合套路

套路 1:先运动学,后动力学(串联)

运动学生成初值 → 动力学优化 → 输出

代表:DReCon(Motion Matching + 轨迹优化)

流程

  1. Motion Matching 从数据库中找到最匹配的 pose 作为初值
  2. 轨迹优化在初值基础上做物理适配
  3. PD 控制执行

优点:动作质量高,物理真实 缺点:系统复杂,需要维护数据库


套路 2:运动学指导动力学生成(并行)

运动学数据 → 学习先验 ──┐
                        ├──→ 动力学方法生成
动力学方法 ─────────────┘

代表:AMP(对抗式运动先验)

流程

  1. 用动捕数据训练判别器(学习风格先验)
  2. RL 策略生成动作,判别器判断"像不像"
  3. 策略不断优化,生成既符合物理又像动捕风格的动作

优点:推理时无需参考数据,可泛化 缺点:训练成本高,需要大量采样


套路 3:运动学作为跟踪目标(强耦合)

运动学轨迹 → 目标 → 动力学跟踪

代表:DeepMimic

流程

  1. 动捕轨迹作为参考目标
  2. RL 学习如何跟踪参考轨迹
  3. 跟踪策略输出关节力矩,通过仿真器执行

优点:动作质量高,抗扰动 缺点:推理时仍需参考轨迹,泛化能力有限


套路 4:端到端学习(隐式结合)

状态输入 → 神经网络 → 力矩/姿态输出
           (训练时用了运动学数据)

代表:UniPhys、CAMDM(Diffusion 模型)

流程

  1. 用动捕数据(状态 - 动作对)训练模型
  2. 模型直接输出力矩或姿态
  3. 端到端,无需手动设计接口

优点:系统简单,推理快 缺点:需要大量训练数据,可解释性差


与前面章节的关系

四种套路的对比

套路代表方法运动学数据形式动力学方法依赖程度
串联DReCon动作数据库轨迹优化
并行AMP风格先验RL 生成
强耦合DeepMimic完整轨迹RL 跟踪
端到端UniPhys状态 - 动作对Diffusion 策略

深入学习DeepMimic | AMP | DReCon | UniPhys


与前面章节的关系

章节与混合方法的关系
轨迹优化混合方法可以借用轨迹优化进行物理适配
角色控制混合方法可以看作"有数据引导的角色控制"
PD 控制混合方法的输出通常通过 PD 控制执行

本章重点问题

  1. 如何设计运动学数据与动力学方法的接口?

    • DeepMimic:参考轨迹作为 reward
    • AMP:动捕数据训练判别器
    • DReCon:数据库提供初值
  2. 如何平衡数据依赖与泛化能力?

    • 强依赖:动作质量高,但泛化差
    • 弱依赖:泛化好,但训练难
  3. 如何处理训练与推理的差异?

    • 训练时:可以用动捕数据
    • 推理时:根据方法不同,依赖程度不同

深入学习ReadPapers - Physics-based Character Control

Locomotion

任务:实时控制虚拟角色进行高效、真实、可控且自适应的行走、奔跑、跳跃等基础位移运动。

mindmap
    Locomotion
        多
            更多的动作类型
                适配不同地形(平地、楼梯、斜坡)
                适配不同角色
                    二足/四足
                    不同体型
                不同的动作
                不同的风格
            更多的应用场景
                路径引导
                风格控制
                动作类型切换
                动作插帧
                实时运动输入(如动捕、VR 追踪数据)
        快
            满足交互式场景的帧率要求
            快速地数据准备
        好
            动作具有物理真实感
                运动轨迹、肢体姿态、步态节奏符合生物力学规律
                无穿模、僵硬、浮空等失真现象
            动作具有生物真实感
                还原人类 / 生物自然运动特征
            符合用户控制
                支持用户高层指令(速度、方向、动作风格、启停)的精准响应
                实现细粒度运动调节
            稳定性
                具备外力扰动下的稳定性
        省
            计算开销低
            更少的数据
            更少的人工参与
            更少的预处理
                在适配不同泛化性问题时,无需重新设计运动逻辑

直接使用“下一帧参考动画”作为角色动作数据的方法称为基于运动学的方法。 由力/力矩产生的“下一帧动画”作为角色动作数据的方法称为基于动力学的方法

mindmap
Locomotion
    基于运动学
        数据库匹配
            状态机
            动作匹配
        监督学习
            基于相位
            不基于相位
        生成模型
            基于当前帧的生成 + <br>结合控制目标的策略
            diffusion
    基于动力学
         目标优化
         策略优化

基于运动学的方法:直接控制每个关节的动画数据,不考虑其物理合理性,其效果上限受制于数据。

基于动力学的方法:不直接提供动画数据,而是提供关节受力,让每个关节在力的作用下运动。

说明:

  • 轨迹跟踪:下一帧参考动画 → 下一帧动画
  • 轨迹优化:下一帧参考动画 → PD控制目标

实际的动力学算出过程,不一定会显式地出现每个步骤,可能是几个步骤统一到一个步骤中的。

基于匹配的方法

graph TD
    A[当前帧 frame] --> B{是否匹配?}
    B -- N --> C[下一帧 frame]
    B -- Y --> D[提取特征]
    D --> E[当前特征]
    F[获取数据] --> D
    G["(5) 角色状态"] --> D
    D --> H[最近邻搜索]
    H --> I[当前帧 frame]
    J[控制目标] --> H
    H --> K["(3) 下一帧动作"]
    L["(6) 角色的动作数据集"] --> M[提取特征]
    M --> N[特征集]
IDYearTitle特点
--Motion Field-
--Motion GraphBaseline,以 clip 为单位
(1) 只在一个 clip 结束时重新匹配
(2) 寻找最像的 clip,并用插值衔接
--Motion Matching以 frame 为单位
(1) 每帧或几帧重新匹配,响应更快
(2) 寻找最近匹配的帧,并用 blend 衔接
-2020Learned Motion Matching基于数据集,把 (1)(2)(3) 替换成了网络模块,消除了在线搜索时对数据库的依赖
P47(风格迁移)让 (5) 和 (6) 分别是不同的角色,并增加将运动内容与运动风格解耦的模块。在运动空间进行最近邻匹配,在匹配空间中融入目标风格,实现在线风格迁移的效果。

Motion Graph / Motion Matching / Motion Field

flowchart LR
A([当前帧frame]) --> B("是否重新匹配(1)")
    B -->|"N"|C([当前帧frame])
    C --> D["(3)取下一帧动作"]
    D --> E([下一帧frame])
    E --> A
    F --> G(["(5)角色状态"])
    H([控制目标])
    G --> I["(4)提取特征"]
    H --> I
    I --> N([当前特征])
    N -->J["(2)最近邻搜索"]
    J -->C
    B --> F["(5)取数据"]
    K(["(6)角色的动作数据集"])
    K --> L["(4)<br>提取特征"]
    L --> M(["特征集"])
    M --> J
    K --> D
IDYearTitle特点
Motion Field
Motion GraphBaseline,以clip为单位
(1) 只在一个clip结束时重新匹配自己
(2) 寻找最适配的clip,并用拖帧衔接。
Motion Matching以frame为单位
(1) 每帧或几帧重新匹配,响应更快
(2) 寻找最匹配的帧,并用blend 做衔接。
-2020Learned Motion Matching基于数据集,把 (1)(2)(3)(4) 替换成了网络模块,消除了在线推理时对数据库的依赖。
2092023.10.16MOCHA: Real-Time Motion Characterization via Context Matching让 (5) 和 (6) 分别是不同的角色,并增加将运动内容与运动风格解耦的模块。
在运动空间进行最近邻匹配,在匹配结果中融入目标风格,实现在线风格迁移的效果。

通过检索、拼接、插值实现运动生成,是工业界长期主流方案。

优势:

  1. 实现简单:基于准备好的数据库,即可以与角色进行实时控制
  2. 可控性高

缺点:

  1. 依赖特定角色的海量数据
  2. 最近邻搜索成本高
  3. 内存占用大
  4. 对不同地形泛化性差
  5. 随着数据集规模增大,扩展性较差

基于监督学习的方法

非相位方法

IDYearName解决了什么痛点主要贡献是什么TagsLink
2018.10.4Recurrent Transition Networks for Character Locomotion传统方法(如运动图、高斯过程模型)存在泛化性差、仅适配单一动作类型、运行时计算成本高等问题。
基于深度学习的“从当前状态到目标状态的定向过渡生成”处于研究空白
1. 改进型 LSTM:传统 LSTM 仅依赖历史状态,RTN 在门控计算中加入未来上下文特征(目标 + 偏移),使生成过程始终朝向目标状态,避免无约束漂移;
2. 隐藏状态初始化:摒弃 “零向量初始化” 或 “全局共享初始状态”,通过 MLP 学习输入首帧与最优初始隐藏状态的映射,让 LSTM 从初始阶段就捕捉运动特征,提升生成质量;
3. ResNet 风格解码器:输出当前帧与下一帧的偏移量,而非直接输出姿态,减少生成帧与输入上下文的间隙,提升过渡流畅性。
link

基于相位的方法

flowchart LR
    C([NN2])-->A
    D([NN3]) -->A
    E([NN4]) -->A
    B([NN1]) -->A[专家混合]
    A-->F([混合专家模型])
    F-->G[模型推理]
    H(["控制目标<br>(轨迹、标签)"])-->G
    J([当前状态])-->G
    G -->K([相位变化量])-->P([相位])-->O([当前相位])
    G -->L([触地信息])-->R[IK]-->N
    G -->Q([未来轨迹])-->N
    G -->M([下一帧状态])-->N([动作输出])-->J 
    O -->A

优势:

  1. 能对用户输入做出稳定实时的响应。

局限性:

  1. 依赖精心的设计
  2. 用高度可变的运动数据进行训练,会产生平均化的结果。
  3. 难以泛化到数据以外的动作。
IDYearName解决了什么痛点主要贡献是什么TagsLink
2122023.8.24Motion In-Betweening with Phase Manifolds首次将周期自编码学习的相位流形引入角色补间动画1. 将复杂的人体运动分解到频域,用相位 + 振幅编码运动的周期性和时序规律。
2. 相位提取:DeepPhase.
3. 双向控制:角色坐标系 + 目标坐标系。
4. 用户控制:轨迹控制、动作类型控制。
多:超长动作插帧
快:实时动作插帧
好:可进行路径、风格控制
PDF
2112022.1.12Real-Time Style Modelling of Human Locomotion via Feature-Wise Transformations and Local Motion Phases将相位方法引入到风格迁移任务中。1. 发布了 100 style 数据集
2. 扩展相位提取方式,对于非接触运动也能提取相位:对同一类数据使用 PCA 提取主成分,取第一主成分的系数。若存在周期性,用 sin 函数拟合系数。
3. 注入风格:输入风格 clip,输出 alpha 和 beta,用于调制主网络的隐藏层。训练时,先训练主网络,再接入 FiLM,并 finetune FiLM。推断时,不需要 FiLM,使用预置风格的 alpha 和 beta,也可以用插值得到 alpha 和 beta。
多:具有风格迁移能力。动作泛化到非接触的周期动作。
快:实时的风格切换。
好:连续的风格参数,风格切换无跳变。
PDF
2112020.7.8Local Motion Phases for Learning Multi-Contact Character Movements1. PFNN 只用于周期性动作; PFNN 需要手动标注相位1. 非周期动作=各个局部周期动作的叠加,因此给几个重要的关节独立的相位。
2. 自动提取相位的方法:定义接触为 1,再用 sin 函数拟合。
3. 一个权重估计网络,输入 n 个相位,输出 m 个权重参数。
4. 用户的控制信号过于稀疏,导致生成结果平均化。因此训练生成模型 GAN,根据稀疏控制信号生成细节控制信号。
多:泛化到非周期动作。
好:引入生成模型,避免动作趋于平均化。
省:无须人工标注。
PDF
2142018.10.1Few-shot Learning of Homogeneous Human Locomotion Styles小样本的学习策略1. 数据准备:(1) 大量基本风格数据(2)少量特定风格数据
2. 模型准备:用 PFNN 实现通用模块,用 residual adapter 来实现 style 模块
3. 训练策略:数据(1)用于通用模块与 style 模块的解耦,数据 (2) 用于 finetune style 模块
4. 参数策略:将 adapter 矩阵分解为 X=ADB^T,进一步减少参数量。
多:泛化到不同风格。
快:少量样本即可迁移,训练快。
好:无过拟合,泛化性好。
少:省训练数据,少内存。
PDF
2132018.6.30Mode-Adaptive Neural Networks for Quadruped Motion Control传统数据驱动方法(运动图、运动匹配):需存储完整动作数据库,依赖手动分割、标注,搜索过程复杂,实时性差;CNN 存在输入输出映射模糊问题,RNN 长期预测易收敛到平均姿态(漂浮),PFNN 虽解决模糊问题,但依赖手动相位标注,无法适配非循环运动。本文提出模式自适应神经网络(MANN),专为四足动物运动控制设计,核心通过"门控网络 + 运动预测网络"的双模块架构,从大规模非结构化动作捕捉(MOCAP)数据中自主学习运动模式,无需手动标注相位或步态标签;门控网络基于脚部关节速度、目标速度等特征动态加权多个专家网络输出,运动预测网络生成平滑连贯的下一帧运动,支持怠速、移动、跳跃、坐姿等多种循环与非循环运动,同时允许用户通过速度、方向、动作变量交互控制。PPT
1132017.7.20Phase-functioned neural networks for character control1. Motion Matching 需要存储大量数据
2. 自回归方法存在误差积累
3. CNN方法不能实时
4. 物理方法不可控
5. 不能支持复杂地形
1. 混合专家模型,首次将运动相位从「网络输入特征」升级为「网络权重的全局参数化变量」2. 将平地动捕数据与复杂地形耦合,让模型学会了根据地形自动调整动作。
Baseline
PFNN
多:支持不同地形的泛化性
快:0.8ms/帧
好:1. 混合专家模型,解决相位混合引入的artifacts 2. IK后处理解决脚本问题
省:引入NN,不需要存储原始数据
link

基于生成的方法

生成 + 控制

(1) 无控制自回归生成模型

flowchart LR
 A([数据集])-->|"预训练"|C[先验模型]
 B([当前状态])--> C-->D([下一帧状态])

(2) 引入控制策略

flowchart LR
 A([控制目标])-->B([策略])--> D[先验模型]--> E([下一帧状态])
 C([当前状态])--> D
flowchart LR
 A([当前状态])-->B[先验模型]
 B--> C([生成1])--> F
 B--> D([生成2])--> F
 B--> E([⋮])--> F
 B--> G([生成n])--> F
 F([选出下一帧])
IDYearTitle特点
1362021.3.26Character Controllers Using Motion VAEs在给定足够丰富的运动捕捉片段集合的情况下,如何实现有目的性且逼真的人体运动
2062024.8.16Interactive Character Control with Auto-Regressive Motion Diffusion Models (A-MDM)A-MDM
136 中的 VAE 替换成了 MLP diffusion
并使用分层强化学习进行控制。

条件生成

flowchart LR
 A([当前状态])--> C
 B([控制目标])--> C
 C([条件])--> F[Diffusion]--> G([latent code]) --> H[Decoder]--> I([下一帧状态])
 D([噪声])--> F
 E([t])-->F
  1. 难以在各种控制信号间进行泛化。
  2. 难以泛化到数据以外的动作。
  3. 支持多模态条件信号和任意损失引导。
  4. 能够实现更长期的目标和复杂任务。
IDYearName解决了什么痛点主要贡献是什么TagsLink
1872025.5.30MotionPersona: Characteristics-aware Locomotion Control首个生成式角色控制器。实时交互 + 角色个性化1. 输入:文本描述->CLIP->emb,SMPL beta,历史状态,未来轨迹,示例版本 (Optimal)
2. 模型:DiT 结构,每次 45 帧,单帧>60fps
3. 动作衔接:在噪声空间对生成的前 5 帧与最后一帧做平滑
4. 推理时基于对小样本对编码层和输出层微调(DreamBooth)
5. 数据集
多:个性化
快:实时推理
省:极少的定制化数据及微调时间
PDF
2052025.5.13DARTControl: A Diffusion-based Autoregressive Motion Model for Real-time Text-driven Motion Control自然语言的角色控制,条件为自然语言。
为了支持轨迹控制,额外引入控制方式,类似上文“生成 + 控制”方法。
link
2042024.7.11AAMDM: Accelerated Auto-regressive Motion Diffusion Model使用 DDGAN 进行推断加速link
1772024.4.23Taming Diffusion Probabilistic Models for Character Control (CAMDM)这篇发表于 SIGGRAPH 2024 的论文聚焦基于扩散模型的实时角色控制,提出了条件自回归运动扩散模型(CAMDM),首次将运动扩散概率模型成功落地到实时交互式角色控制场景中。核心解决了传统扩散模型计算量大、可控性差、多样性不足的问题,实现了单模型支持多风格、实时响应用户控制、生成高质量且多样化的角色动画,同时能完成风格间的无缝过渡,是角色动画和运动生成领域的重要突破。PDF

基于动力学的方法

核心特征:输出为关节力矩或 PD 控制目标,需要物理仿真器执行。

与运动学方法的区别

维度运动学方法动力学方法
输出关节姿态/速度关节力矩/PD 控制目标
物理仿真
抗扰动能力
训练成本
实时性
mindmap
基于动力学的方法
    参考学习
        运动生成 + 运动模仿/sim2real
        运动先验 + 下游控制
    无参考的强化学习
        设计规则作为先验
        纯强化学习无先验

无参考的强化学习

优势:
(1) 能够生成新颖且符合物理规律的动作
(2) 数据依赖少

局限性:
(1) 开销问题
(2) 可扩展性问题
(3) 需要大量手工调优奖励函数,收敛速度慢,在步态切换、跳跃等复杂机动动作上难以实现稳定表现。

IDYearName解决了什么痛点主要贡献是什么TagsLink
2007.7.29SIMBICON: simple biped locomotion control① 零力矩点(ZMP)方法依赖预计算轨迹,灵活性不足;
② 强化学习 / 策略搜索需设计复杂奖励函数,高维状态下难以收敛;
③ 数据驱动方法多为运动学建模,缺乏物理适应性。
“有限状态机 + 全局坐标控制 + 质心反馈” 的极简组合,无需复杂动力学建模,实现实时、鲁棒的物理基双足运动生成link
IDPaperNote
185Gait-Conditioned Reinforcement Learning with Multi-Phase Curriculum for Humanoid Locomotion1. 单个循环策略同时学习站立、行走、奔跑及步态过渡,避免多策略架构的切换复杂度
2. 一种路由机制根据步态 ID 动态激活步态目标,核心解决不同步态的奖励目标冲突问题
3.让机器人自主学习符合人体生物力学的自然运动,摆脱对 MoCap 数据的依赖
4. 用于技能扩展的渐近式多阶段课程。

基于参考的学习,例如APM、模仿学习,动作空间还是来自于数据,物理只是一种动作合理化的方法。 优势:

  1. 物理的方法与数据的方法相结合,利用两种范式的优势,提升运动质量、多样性的泛化能力。
    局限性:
  2. 依赖高质量数据
  3. 存在数据角色与被驱动角色之间的形态不匹配
  4. 难以泛化到数据分布之外

运动先验 + 下游控制

类似于“生成 + 控制”

  1. 每个任务都需要单独训练策略
IDYearName解决了什么痛点主要贡献是什么TagsLink
1982022.5.12AMP: Adversarial Motion Priors for Stylized Physics-Based Character Control模仿学习时,模仿目标需要精心设定,模仿效果的目标函数也难设定。不模仿特定的动作,而是模仿目标动作的风格。通过对抗学习来判断模仿的风格像不像。
AMP 动作先验 = 对抗式判别器。
link

运动规划器 + 运动控制器 + 运动执行器(PD控制)

运动规划器:当前状态 + 控制目标 → 下一帧参考动画
运动控制器:下一帧参考动画 + 当前状态 → PD 控制目标

类似“可控生成 + 动作优化” 。
局限性:

  1. 规划器和控制器之间存在GAP,导致动作质量下降
  2. 控制策略难以准确跟踪规划的运动,需要微调,限制了其泛化能力
IDPaperNote
190DReCon: data-driven responsive control of physics-based charactersMotion Matching+RL 跟踪 +PD 执行
189PARC: Physics-based Augmentation with Reinforcement Learning for Character Controllers迭代数据扩增
188CLOSD: CLOSING THE LOOP BETWEEN SIMULATION AND DIFFUSION FOR MULTI-TASK CHARACTER CONTROLDiffusion 规划器 +RL 跟踪器

(规划器, 控制器)+PD

由于规划器与控制器之间的 GAP,此文章开始尝试把它们统一到一个模型中

IDPaperNote
183Maskedmimic: Unified physics-based character control through masked motion掩码运动补全
192PDP: Physics-Based Character Animation via Diffusion PolicyRL 专家蒸馏
184UniPhys: Unified Planner and Controller with Diffusion for Flexible1. 把运动规划和控制整合到一个模型中,消除两个模型带来的 domaingap
2. 文本、目标、轨迹等多模态输入
3. Diffusion Forcing 范式进行训练,消除长期累计误差
4. 通过引导采样,无需 finetune,即可泛化到不同(包括没见过)的控制信号。
具体方法为行为克隆学习,先从动捕数据中提取状态 - 策略对,再用 diffusion 学习策略。

或者更直接一点,把PD也整合进一个模型,生成模型直接出力/力矩

IDPaperNote
186Diffuse-CLoC: Guided Diffusion for Physics-based Character Look-ahead直接生成力/力矩

控制 + 转移 + PD

与生成模型一样,数据也可以用于学状态转移,由RL来指导角色的控制性

IDPaperNote
191Universal Humanoid Motion Representations for Physics-Based ControlPrior+ 蒸馏 +RL

运动执行器:

运动执行器可以是PD、PID等,图形学习里用的几乎都是PD。
所谓PD控制,实际不是控制器而是执行器。

PD控制器是传统方法,需要调 \(k_d\)、\(k_s\) 两个参数。用LQR可以计算出最能贴合目标的PD效果。

优点:

  1. 同“可控生成”

本文出自CaterpillarStudyGroup,转载请注明出处。

https://caterpillarstudygroup.github.io/GAMES105_mdbook/