I have an inverse dynamics analysis question for systems with a closed kinematic chain and a joint rotational axis direction that is 'skewed' and not along any of the parent or child body x, y, or z axes (for example, <axis>0.0048 0.9991 0.0424</axis>).
For a model with only open kinematic chains, we can perform a standard OpenSim inverse dynamics analysis, and OpenSim reports the inverse dynamics moments that would generate the input motion. Even if the joint axes are skewed in their respective bodies, OpenSim still outputs joint moments that can immediately be used as coordinate actuators to perform a forward dynamic simulation that will replicate the original inverse dynamic input motion. So all is good.
In contrast, if we have a model with a closed kinematic chain, then to do an inverse dynamics analysis, we need to prescribe the motion of the independent coordinates and perform a forward dynamic simulation. If we perform a Joint Reaction Analysis as part of the forward dynamic simulation, we can get the net reaction force and moment from each joint applied to either the parent or child body and expressed in terms of the parent or child body. HOWEVER, if some of the axes in the model are skewed with respect to the parent or child body, it is not clear how to take the outputs of the Joint Reaction Analysis and turn them into coordinate actuators that can be applied to the skewed joint axes of the model when performing a subsequent forward dynamic simulation.
One possible way around this problem is to take the joint reaction moment output by the Joint Reaction Analysis, express it in terms of the body in which the skewed joint axis is fixed, and then dot it with the skewed joint axis unit vector to get the component of the reaction moment along the axis direction. It seems like the result could then be used as a coordinate actuator to drive the model in a forward dynamic simulation with no specified motions but that will reproduce the specified motions.
I have two questions about the close kinematic chain case with skewed joint axes:
1) Is my proposed method for calculating a coordinate actuator moment to be used in a forward dynamic simulation correct?
2) Even if it is, is there an easier way to get the component of the joint reaction moment that is already along the direction of a skewed joint axis, similar to what an Inverse Dynamics Analysis gives automatically for an open kinematic chain?
Thanks for any light that you can shed on these questions!
OpenSim Inverse Dynamics for Closed Kinematic Chain with Skewed Joint Axes
- B.J. Fregly
- Posts: 51
- Joined: Wed Mar 12, 2008 6:55 am
- Carmichael Ong
- Posts: 401
- Joined: Fri Feb 24, 2012 11:50 am
Re: OpenSim Inverse Dynamics for Closed Kinematic Chain with Skewed Joint Axes
Your thought process and reasoning all seem sound to me. A few extra thoughts in response to the two questions:
1. As of OpenSim 4.0, we allow users to express the results in any Frame component in the model, so if you add a Frame (perhaps a PhysicalOffsetFrame) that aligns with the skewed axis, you might be able to get results directly from the JointReaction analysis.
2. I can't think of an easy workaround for InverseDynamics. The Tool uses Simbody's getMobilityForces() at this line, which gets generalized forces computed by the model and its generalized coordinates.
I'm wondering if another way to go might be to see if RRA can solve the problem, and instead of using CoordinateActuator's that correspond to each coordinate of the model, use CoordinateActuator's that are all skewed (but still have full control of Coordinate's). I haven't thought about this too deeply, so I may likely be missing something that could be a major roadblock.
1. As of OpenSim 4.0, we allow users to express the results in any Frame component in the model, so if you add a Frame (perhaps a PhysicalOffsetFrame) that aligns with the skewed axis, you might be able to get results directly from the JointReaction analysis.
2. I can't think of an easy workaround for InverseDynamics. The Tool uses Simbody's getMobilityForces() at this line, which gets generalized forces computed by the model and its generalized coordinates.
I'm wondering if another way to go might be to see if RRA can solve the problem, and instead of using CoordinateActuator's that correspond to each coordinate of the model, use CoordinateActuator's that are all skewed (but still have full control of Coordinate's). I haven't thought about this too deeply, so I may likely be missing something that could be a major roadblock.