PPT
由于PPT内容非常非常丰富,博客里只贴几张最重要的,还有很多重要的还是直接去ppt里看吧 本章节ppt地址
Character Kinematics
Skeleton
- 围绕joint旋转
- joint之间叫body、bone、link
Kinematics of Chain
- 正向运动学:每个关节局部坐标系的方向等价于夫关节的局部坐标系的方向乘以当前坐标系的旋转
- Q就是每个关节局部坐标系的一个朝向
- 每个关节有一个局部坐标系,当Q0关节发生旋转,会带动后面所有关节旋转,此时Q1相对于Q0局部坐标系的相对位置是不会改变的,如果要计算Q1局部坐标系原点在世界坐标系的位置,等价于做一个变换,将相对于Q0局部坐标系下的位置转换到世界坐标系
Kinematics of a Character
- 可以把角色建模为由多个链条连接到同一个根节点构成的树形的一个结构
- 通常会把根节点设置在腰部
- 每个关节有不同的性质,比如旋转的范围和方式
- 膝盖、手肘:hinge、revolute joint(铰链、转动关节)
- 髋、肩:ball-and-socket joint(球状关节)
- 自由度:是指一个物理系统需要多少参数可以唯一、准确地描述它当前的状态
- xyz的位移和旋转,就是6个自由度
- Pose Parameters:root决定角色整体的位置和方向、每个内部关节旋转的表示
- 在文件开头会先定义一个角色,在每个关节旋转=0的时候(通常叫做T-Pose),每个关节和他的父关节的相对位置关系,接下来就会描述在之前这个定义的基础之上,关节的旋转是多少
- BVH files
- 用欧拉角表示关节旋转,所以也会定义欧拉角的顺序
- Format
- FC
- AMC
- FBX
Inverse Kinematics
- 应用比正向运动学更广泛
- 指定末端点的朝向,通过逆向运动学的算法自动算出每个关节的旋转
- IK的解:
- 是一个非常简单的常见的问题,比如胳膊和腿
- 第一个方法:
- 画两个圆,求出交点,交点就是关节点1的位置
- 第二个方法:
- 解决一个机械臂末关节点的位置和朝向的问题
先考虑位置
- 找到一些列参数θ,使得目标点的位置x减去f(θ) = 0,这是一个求根问题,这个求根问题可以转换成为一个优化问题,下面这个式子是求欧几里得范数也是L2范数,乘以1/2是为了求导时候和平方中和掉,留下一个没有额外系数的导数表达式
- 从初始位置开始,去找优化的最优点
- 因为这个优化函数是一个非线性函数,所以一般会用迭代的方法去解(梯度下降)
- 关键就是如何找到一个比较好的一个方向去更新参数,另外一个就是一个合适的距离去更新参数
- 找方向:坐标下降法(Coordinate Descent)
- 参数所对应的坐标轴的方向,沿着某个坐标轴更新参数,更新的距离是在坐标轴这个方向上所对应的目标值最小的那个点
- 完成更新之后可以换一个坐标轴做同样的行为,然后不断迭代
- 所以可以保证每次目标值不会增加
- 这个所谓坐标轴,就是说这个参数本身是一个维度,比如参数a,大小范围是[0,1],那么就在这个范围去找一个使得目标值最小的a,然后切换到b轴,同理,之后再切回a轴
- 上面是只有两个轴的情况,多个轴也一样,不过是按顺序一次切换轴,最后循环,叫做(Cyclic Coordinate Descent:CCD)循环坐标下降法
- 如何从一个向量旋转到和另一个向量重合:先叉乘得到旋转轴,然后点乘得到旋转角度
- 优点是:实现简单、快
- 缺点是:因为没有考虑函数本身的性质,只是在坐标轴上变换,所以收敛速度有时候很慢,甚至不收敛;第一个点移动的是最多的;结果对初始点很敏感,在目标点移动过程中求解IK,姿势并不会很稳定
- 找方向:梯度下降法(Cradient Descent)
- 梯度算出来的是增长最快的方向,所以向反方向移动就好
- 对于IK的函数来说,计算它的梯度,就等于,前向运动学函数中对于每一个旋转参数的导数乘上当前这个位置和目标位置的距离差
- 前面的这个导数经常写成一个矩阵的形式,也就是雅可比矩阵,其中,每个元素是一个joint的所有参数
- 所以这个方法也叫Jacobian Transpose方法
- 求解Jacobian矩阵:可以用深度学习框架的自动求导方法来做、也可以通过差分的方法来逐步计算出Jacobian矩阵、还有一个方式,就是计算两个向量的叉乘(假设所有joints是hinge joint,那么关节1的旋转轴是第一个向量,关节1到末端点关节4的向量是第二个向量),得到的叉乘就是Jacobian矩阵的一列
- 如果不是hinge joint,而是ball joint,可以当成是三个hinge关节重叠在一起,所以一个关节体现在Jacobian矩阵中是三列,每一列就等于 某个欧拉角对应的旋转轴 和 当前关节指向末端点的向量 的叉乘
- 在做叉乘的这个向量是基于世界坐标系的,但欧拉角呢是基于局部坐标系的,所以欧拉角的坐标轴需要从局部坐标系转换到世界坐标系,x轴可以直接乘以父关节的朝向,但是y、z轴不行,因为y轴是基于x轴内部进行旋转的,所以y轴不仅要乘以父关节的朝向,还要乘以x轴的旋转,z轴除了这两个外还需要乘上y轴的旋转
- Jacobian Transpose的方法比ccd收敛更快,但本质上还是一阶方法,所以收敛性还不是非常快,而且计算量大,因为每次迭代都要计算一次Jacobian矩阵的值
- Optimality Condition:如果梯度为0,说明无论怎么移动函数值都不会变化,是一个局部极值点
- Quadratic Programming 二次规划问题:一个函数是二次函数,A是正定的(是一个对称阵,对于任何一个θ,二次形式是大于等于0),然后可以找到极值点,ik问题可以转换成为一个二次函数求极值的问题,假设J成J的转置可逆,就可以消掉了
- Gauss-Newton Method是在J的转置乘J结果是可逆的情况下,可解
- Jacobian Inverse Method:使用Jacobian矩阵的伪逆;不同的J有不同的伪逆形式;优点:比Jacobian Transpose更快收敛,但是要计算逆,但逆可能不存在,导致求出的逆值很大,对应一个很大的移动,不稳定,所以在求逆之前,加上一个阻尼项,就有了:
- Damped Jacobian Inverse Method:而且可以通过给阻尼项乘上一个权重矩阵,来控制不同关节移动的权重
Character IK
- 很多个地方要移动位置,也可以写成一个优化函数的问题,求和,最后加一个正则项
- 但通常可以分开来算ik,比如将一个胳膊移动到一个位置x,选定一个根节点(髋关节)和末端节点,也就是最后是整个上半身都会进行调整
FABRIK
- 启发式方法