current inverseDynamicsSolver can be faster

Provide easy-to-use, extensible software for modeling, simulating, controlling, and analyzing the neuromusculoskeletal system.
POST REPLY
User avatar
Kevin Tanghe
Posts: 36
Joined: Mon Sep 22, 2014 6:54 am

current inverseDynamicsSolver can be faster

Post by Kevin Tanghe » Tue Jan 05, 2016 3:27 am

Hi,

I think the current inverse dynamics solver is suboptimal and can be faster. In the current code, the stage is realized to dynamics. This is however not necessary, the velocity stage should suffice, since this stage already allows to compute the coriolis forces.

I added some code, where I compare my inverse dynamics with the current inverseDynamicsSolver using sit-to-stand movements. The output is exactly the same, but my method is about 9 times faster. If I change my method to (unnecessarily) realize up to dynamics stage, the needed calculation time is in the order of magnitude of the current inverseDynamicsSolver.

Since I only have beginner c++ skills, I implemented my inverse dynamics solver using the vectors of the dynamic equation:

tau = M*udot + J*(h - g - Fext)

with tau the joint torques, M the mass matrix, udot the generalized accelerations, J the system Jacobian, h the coriolis forces in the body frame, g the gravitational forces in the body frame and Fext the external forces in the body frame.
I included the used kinematics and ground reaction forces files. One can use the gait2392 musculoskeletal model.

Maybe someone with more coding experience can have a look at it, to see if my statements also holds for other situations. If so, the current inverseDynamicsSolver might be improved in the next OpenSim version?

Regards,
Kevin
Attachments
compareID.cpp
(16.91 KiB) Downloaded 25 times
extForces.mot
File with the external forces. All coordinates are expressed in the ground frame.
(21.63 MiB) Downloaded 14 times
ik.mot
Inverse kinematics file.
(2.38 MiB) Downloaded 13 times

User avatar
Michael Sherman
Posts: 804
Joined: Fri Apr 01, 2005 6:05 pm

Re: current inverseDynamicsSolver can be faster

Post by Michael Sherman » Tue Jan 05, 2016 11:28 am

Hi, Kevin. Great job on writing a faster ID! I suspect that OpenSim 3.3 realizes to stage Dynamics because of Simbody 3.5's getTotalCentrifugalForces() method which incorrectly required Dynamics stage, but is exactly equivalent to the calculation you did using gyroscopic forces and Coriolis acceleration separately, each of which only requires Velocity stage. In Simbody 3.6 (the development version in the GitHub master branch) this was fixed a few months ago -- see PR 435. (That will be part of OpenSim 4.0.)

Another important change in that PR is that some expensive calculations that were being done in Dynamics stage got moved to Acceleration stage, so even if Dynamics is realized now it is cheaper than it used to be.

It is also possible that OpenSim realizes to Dynamics stage to get all the system forces evaluated; we'll need Ajay Seth to join the discussion to clarify that. You accounted for ground reactions and gravity but if there are other external forces in the model they would be ignored.

Kevin, would you please file an OpenSim GitHub issue here saying that ID should avoid Dynamics stage and referencing back to your forum post?

Thanks and regards,
Sherm

User avatar
Kevin Tanghe
Posts: 36
Joined: Mon Sep 22, 2014 6:54 am

Re: current inverseDynamicsSolver can be faster

Post by Kevin Tanghe » Wed Jan 06, 2016 2:52 am

Ok, I reported the issue.

POST REPLY