Simbody
3.7

An articulated body inertia (ABI) matrix P(q) contains the spatial inertia properties that a body appears to have when it is the free base body of an articulated multibody tree in a given configuration q. More...
Public Member Functions  
ArticulatedInertia_ ()  
Default construction produces uninitialized junk at zero cost; be sure to fill this in before referencing it. More...  
ArticulatedInertia_ (const SymMat33P &mass, const Mat33P &massMoment, const SymMat33P &inertia)  
Construct an ArticulatedInertia from the mass, first moment, and inertia matrices it contains. More...  
ArticulatedInertia_ (const SpatialInertia_< P > &rbi)  
Construct an articulated body inertia (ABI) from a rigid body spatial inertia (RBI). More...  
ArticulatedInertia_ &  setMass (const SymMat33P &mass) 
Set the mass distribution matrix M in this ArticulatedInertia (symmetric). More...  
ArticulatedInertia_ &  setMassMoment (const Mat33P &massMoment) 
Set the mass first moment distribution matrix F in this ArticulatedInertia (full). More...  
ArticulatedInertia_ &  setInertia (const SymMat33P &inertia) 
Set the mass second moment (inertia) matrix J in this ArticulatedInertia (symmetric). More...  
const SymMat33P &  getMass () const 
Get the mass distribution matrix M from this ArticulatedInertia (symmetric). More...  
const Mat33P &  getMassMoment () const 
Get the mass first moment distribution matrix F from this ArticulatedInertia (full). More...  
const SymMat33P &  getInertia () const 
Get the mass second moment (inertia) matrix J from this ArticulatedInertia (symmetric). More...  
ArticulatedInertia_ &  operator+= (const ArticulatedInertia_ &src) 
Add in a compatible ArticulatedInertia to this one. More...  
ArticulatedInertia_ &  operator= (const ArticulatedInertia_ &src) 
Subtract a compatible ArticulatedInertia from this one. More...  
SpatialVecP  operator* (const SpatialVecP &v) const 
Multiply an ArticulatedIneria by a SpatialVec (66 flops). More...  
template<int N>  
Mat< 2, N, Vec3P >  operator* (const Mat< 2, N, Vec3P > &m) const 
Multiply an ArticulatedInertia by a row of SpatialVecs (66*N flops). More...  
ArticulatedInertia_  shift (const Vec3P &s) const 
Rigidshift the origin of this Articulated Body Inertia P by a shift vector s to produce a new ABI P'. More...  
ArticulatedInertia_ &  shiftInPlace (const Vec3P &s) 
Rigidshift this ABI in place by s. More...  
const SpatialMatP  toSpatialMat () const 
Convert the compactlystored ArticulatedInertia (21 elements) into a full SpatialMat with 36 elements. More...  
Related Functions  
(Note that these are not member functions.)  
template<class P >  
ArticulatedInertia_< P >  operator+ (const ArticulatedInertia_< P > &l, const ArticulatedInertia_< P > &r) 
Add two compatible articulated inertias. More...  
template<class P >  
ArticulatedInertia_< P >  operator (const ArticulatedInertia_< P > &l, const ArticulatedInertia_< P > &r) 
Subtract one compatible articulated inertia from another. More...  
An articulated body inertia (ABI) matrix P(q) contains the spatial inertia properties that a body appears to have when it is the free base body of an articulated multibody tree in a given configuration q.
Despite the complex relative motion that occurs within a multibody tree, at any given configuration q there is still a linear relationship between a spatial force F applied to a point of the base body and the resulting acceleration A of that body and that point: F = P(q)*A + c, where c is a velocity dependent inertial bias force. P is thus analogous to a rigid body spatial inertia (RBI), but for a body which has other bodies connected to it by joints which are free to move.
An ABI P is a symmetric 6x6 spatial matrix, consisting of 2x2 blocks of 3x3 matrices, similar to the RBI. However, unlike the RBI which has only 10 independent elements, all 21 elements of P's lower triangle are significant. For example, the apparent mass of an articulated body depends on which way you push it, and in general there is no welldefined center of mass. This is a much more expensive matrix to manipulate than an RBI. In Simbody's formulation, we only work with ABIs in the Ground frame, so there is never a need to rotate or reexpress them. (That is done by rotating RBIs prior to using them to construct the ABIs.) Thus only shifting operations need be performed when transforming ABIs from body to body. Cheap rigid body shifting is done when moving an ABI within a body or across a prescribed mobilizer; otherwise we have to perform an articulated shift operation which is quite expensive.
For a full discussion of the properties of articulated body inertias, see Section 7.1 (pp. 119123) of Roy Featherstone's excellent 2008 book, Rigid Body Dynamics Algorithms.
In spatial matrix form, an ABI P may be considered to consist of the following 3x3 subblocks:
P = [ J F ] [~F M ]
Here M is a (symmetric) mass distribution, F is a full matrix giving the first mass moment distribution, and J is a (symmetric) inertia matrix.
Typedefs exist for the most common invocations of ArticulatedInertia_<P>:

inline 
Default construction produces uninitialized junk at zero cost; be sure to fill this in before referencing it.

inline 
Construct an ArticulatedInertia from the mass, first moment, and inertia matrices it contains.

inlineexplicit 
Construct an articulated body inertia (ABI) from a rigid body spatial inertia (RBI).
Every RBI is also the ABI for that (unarticulated) rigid body. 12 flops.

inline 
Set the mass distribution matrix M in this ArticulatedInertia (symmetric).

inline 
Set the mass first moment distribution matrix F in this ArticulatedInertia (full).

inline 
Set the mass second moment (inertia) matrix J in this ArticulatedInertia (symmetric).

inline 
Get the mass distribution matrix M from this ArticulatedInertia (symmetric).

inline 
Get the mass first moment distribution matrix F from this ArticulatedInertia (full).

inline 
Get the mass second moment (inertia) matrix J from this ArticulatedInertia (symmetric).

inline 
Add in a compatible ArticulatedInertia to this one.
Both inertias must be expressed in the same frame and measured about the same point. 21 flops.

inline 
Subtract a compatible ArticulatedInertia from this one.
Both inertias must be expressed in the same frame and measured about the same point. 21 flops.

inline 
Multiply an ArticulatedIneria by a SpatialVec (66 flops).

inline 
Multiply an ArticulatedInertia by a row of SpatialVecs (66*N flops).
ArticulatedInertia_ SimTK::ArticulatedInertia_< P >::shift  (  const Vec3P &  s  )  const 
Rigidshift the origin of this Articulated Body Inertia P by a shift vector s to produce a new ABI P'.
The calculation is
P' = [ J' F' ] = [ 1 sx ] [ J F ] [ 1 0 ] [~F' M ] [ 0 1 ] [~F M ] [sx 1 ]
where sx is the cross product matrix of s (not s). Note that for historical reasons this is defined so that it shifts by s, which is unfortunate and is opposite the SpatialInertia::shift() method. Cost is 72 flops.
ArticulatedInertia_& SimTK::ArticulatedInertia_< P >::shiftInPlace  (  const Vec3P &  s  ) 

inline 
Convert the compactlystored ArticulatedInertia (21 elements) into a full SpatialMat with 36 elements.

related 
Add two compatible articulated inertias.
Cost is 21 flops.

related 
Subtract one compatible articulated inertia from another.
Cost is 21 flops.