Sensitifity of Force Dependent Kinematics (FDK) to inital driver definition

Hi Tobias,

We have identified the reason behind the difference in results. This is happening due to the nature of FDK, which tries to minimize reaction forces/moments in the FDK degrees of freedom in the given time point. By choosing different level to be excluded we solve a slightly different problem and leave the remaining DoF in a suboptimal condition if we think of it in terms of a reaction force/moment, the muscle recruitment ensures that the system is in equilibrium by finding needed forces to balance the body. The current solutions are not wrong, but slightly suboptimal in the described sense – we can see that the differences up to half a degree in most of the cases, and all solutions look quite similar to the optimal posture, which can be found using a couple of different approaches:

  1. Inverse inverse dynamics analysis: an optimization problem is solved with the design variables being the individual IVA and the objective function being the objective function of the muscle recruitment optimization, sum of all muscles activities in the power of 3. By minimizing this objective function we find the most relaxed and “natural posture”.
  2. Second approach is to construct a new set of FDK DoFs, which will include all angles at the same time, but would still have a single DoF that would stay free to “close” the kinematic chain. One of the solutions is to use the same number (5=6-1) of orthogonal linear combinations (curvature modes) of all angles to construct new FDK measures (a couple of options, see commented block as well):
AnyKinEqSimpleDriver FDK_Modes = { // Flexion ONLY
         AnyKinMeasureLinComb LinComb = {
      OutDim = 5; // 6DoF-1DoF to close the kinematic chain (excluding lin. comb {1, 1, 1, 1, 1, 1})
//      Coef = { // solution #1, all mutually orthogonal as well as to {1, 1, 1, 1, 1, 1}
//        {1, -1,  0,  0,  0,  0},
//        {1,  1, -2,  0,  0,  0},
//        {1,  1,  1, -3,  0,  0},
//        {1,  1,  1,  1, -4,  0},
//        {1,  1,  1,  1,  1, -5}
//      };

      Coef = { // solution #2, orthogonal to {1, 1, 1, 1, 1, 1}
        {1, -1,  0,  0,  0,  0},
        {0,  1, -1,  0,  0,  0},
        {0,  0,  1, -1,  0,  0},
        {0,  0,  0,  1, -1,  0},
        {0,  0,  0,  0,  1, -1}
      };

      AnyKinMeasureOrg org = {
        AnySphericalJoint &jntt12l1 = ...refJoints.T12L1Jnt;
        AnySphericalJoint &jnt12 = ...refJoints.L1L2Jnt;    
        AnySphericalJoint &jnt23 = ...refJoints.L2L3Jnt; 
        AnySphericalJoint &jnt34 = ...refJoints.L3L4Jnt;
        AnySphericalJoint &jnt45 = ...refJoints.L4L5Jnt;
        AnySphericalJoint &jnt5sacrum = ...refJoints.L5SacrumJnt;      
        MeasureOrganizer = {0,3,6,9,12,15};
      };
    };

    DriverPos={0,0,0,0,0};
    DriverVel={0,0,0,0,0};
    CType={ForceDep,ForceDep,ForceDep,ForceDep,ForceDep};
    Reaction.Type={Off,Off,Off,Off,Off};
};

We will probably change the model to use the second solution in the next version of AMMR or will at least make it possible to switch it on. Thanks for finding this behavior.

Kind regards,
Pavel