zoukankan      html  css  js  c++  java
  • 实现PD控制

    尝试为场加入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的计算即可

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

    rodCtrl.gif

    目标控制曲线如下:

    实际控制曲线如下。曲线逐渐变形的原因是控制增益被逐步降低了。





    附件列表

  • 相关阅读:
    Amazon Hiring Campus 2013
    Java历史
    vue配置环境踩坑
    ES6 第十八节 模块化操作
    ES6 第十七节 class类的使用
    ES6 第十六节 promise对象的使用
    ES6 第十五节 用proxy进行预处理
    ES6 第十四节 map数据结构
    ES6 第十三节 Set和WeakSet数据结构
    ES6 第十二节 Symbol在对象中的作用
  • 原文地址:https://www.cnblogs.com/dydx/p/4374722.html
Copyright © 2011-2022 走看看