码迷,mamicode.com
首页 > 其他好文 > 详细

实现PD控制

时间:2015-03-28 20:27:17      阅读:175      评论:0      收藏:0      [点我收藏+]

标签:

尝试为场加入PD控制

在之前的模拟中,需要最小化一个能量函数H。
这样做的原因是,由理想约束的特性(约束反力垂直于虚位移),对于不含体积蒙皮的情况,可以推出
对于表面点,有
J^T * Σfs = 0
对于内部点,有
Σfn = 0

而对于体积蒙皮的情况,
对于表面点,仍有
J^T * Σfs = 0
对于内部点,有
J^T * W^T * fn = 0
其中W为蒙皮权重矩阵

综合两种情况,可以发现,这些力平衡情况都同H函数对内部点n、对参数p的导数等于零是等价的。

不含体积蒙皮的情况,dH/dp = J^T * Σfs
含体积蒙皮的情况,  dH/dp = J^T * (Σfs + W^T * Σfn)

等式后一项有一个专门的名称,叫广义力,实际上就是普通力在参数空间的投影

现在控制的方法十分简单,就是加一项广义控制力fc
fc = kp*(p‘ - p) + kd*(dp‘/dt - dp/dt), 其中p‘是期望的参数值,p为实际参数值,kp,kd为控制增益,都为对角矩阵
于是新的总广义力为
dH1/dp = dH/dp + fc
H1     = H     + fc^T * p

现时有两种施加控制的方法,一种是在每一帧求解之前预先算出控制力,且在求解过程中保持控制力不变,称为显式控制;另一种是把控制力表示成求解状态的函数,在求解过程中不断更新,称为隐式控制。
隐式控制的稳定性比显式控制好。

使用隐式控制时,令
dp/dt = (pn+1-pn)/h,其中pn+1是待求解的本帧参数值,pn为上一帧参数值
需要求出fc对位置的导数
dfc/dpn+1 = -(kp + kd/h)
把这一项加入Hessian的计算即可

以下是当前对一条棍子的控制结果

技术分享

目标控制曲线如下:
技术分享
实际控制曲线如下。曲线逐渐变形的原因是控制增益被逐步降低了。
技术分享




附件列表

 

实现PD控制

标签:

原文地址:http://www.cnblogs.com/dydx/p/4374722.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!