Drake

The purpose of the FreeBody class is to provide the data (initial values and gravity) and methods for calculating the exact analytical solution for the translational and rotational motion of a toquefree rigid body B with axially symmetric inertia, in a Newtonian frame (World) N. More...
#include <multibody/benchmarks/free_body/free_body.h>
Public Member Functions  
FreeBody (const Eigen::Quaterniond &quat_NB_initial, const Eigen::Vector3d &w_NB_B_initial, const Eigen::Vector3d &p_NoBcm_N_initial, const Eigen::Vector3d &v_NBcm_B_initial, const Eigen::Vector3d &gravity_N)  
~FreeBody ()=default  
double  get_I () const 
Returns the body's moment of inertia about an axis perpendicular to its axis of rotation and passing through its center of mass. More...  
double  get_J () const 
Returns body's moment of inertia about its axis of rotation. More...  
const Eigen::Quaterniond &  get_quat_NB_initial () const 
const Eigen::Vector3d &  get_w_NB_B_initial () const 
const Eigen::Vector3d &  get_p_NoBcm_N_initial () const 
const Eigen::Vector3d &  get_v_NBcm_B_initial () const 
const Eigen::Vector3d &  get_uniform_gravity_expressed_in_world () const 
Eigen::Vector3d  GetInitialVelocityOfBcmInWorldExpressedInWorld () const 
void  set_quat_NB_initial (const Eigen::Quaterniond &quat_NB_initial) 
void  set_w_NB_B_initial (const Eigen::Vector3d &w_NB_B_initial) 
void  set_p_NoBcm_N_initial (const Eigen::Vector3d &p_NoBcm_N_initial) 
void  set_v_NBcm_B_initial (const Eigen::Vector3d &v_NBcm_B_initial) 
void  SetUniformGravityExpressedInWorld (const Eigen::Vector3d &gravity) 
std::tuple< Eigen::Quaterniond, Eigen::Vector4d, Eigen::Vector3d, Eigen::Vector3d >  CalculateExactRotationalSolutionNB (const double t) const 
Calculates exact solutions for quaternion and angular velocity expressed in bodyframe, and their time derivatives for torquefree rotational motion of axissymmetric rigid body B in Newtonian frame (World) N, where torquefree means the moment of forces about B's mass center is zero. More...  
std::tuple< Eigen::Vector3d, Eigen::Vector3d, Eigen::Vector3d >  CalculateExactTranslationalSolution (const double t) const 
Calculates exact solutions for translational motion of an arbitrary rigid body B in a Newtonian frame (world) N. More...  
Implements CopyConstructible, CopyAssignable, MoveConstructible, MoveAssignable  
FreeBody (const FreeBody &)=default  
FreeBody &  operator= (const FreeBody &)=default 
FreeBody (FreeBody &&)=default  
FreeBody &  operator= (FreeBody &&)=default 
The purpose of the FreeBody class is to provide the data (initial values and gravity) and methods for calculating the exact analytical solution for the translational and rotational motion of a toquefree rigid body B with axially symmetric inertia, in a Newtonian frame (World) N.
Examples of bodies with axially symmetric inertia include cylinders, rods or bars with a circular or square cross section and spinning tops. Since the only external forces on B are uniform gravitational forces, there exists an exact closedform analytical solution for B's motion. The closed form rotational solution is available since B is "torquefree", i.e., the moment of all forces about B's mass center is zero. This class calculates the body B's quaternion, angular velocity and angular acceleration expressed in B (bodyframe) as well as the position, velocity, acceleration of Bcm (B's center of mass) in N (World). Algorithm from [Kane, 1983] Sections 1.13 and 3.1, Pages 6062 and 159169.

inline 

default 
std::tuple< Quaterniond, Vector4d, Vector3d, Vector3d > CalculateExactRotationalSolutionNB  (  const double  t  )  const 
Calculates exact solutions for quaternion and angular velocity expressed in bodyframe, and their time derivatives for torquefree rotational motion of axissymmetric rigid body B in Newtonian frame (World) N, where torquefree means the moment of forces about B's mass center is zero.
The quaternion characterizes the orientation between righthanded orthogonal unit vectors Nx, Ny, Nz fixed in N and righthanded orthogonal unit vectors Bx, By, Bz fixed in B, where Bz is parallel to B's symmetry axis.
t  Current value of time. 
std::tuple  Description 

quat_NB  Quaternion relating frame N to frame B: [e0, e1, e2, e3] 
 Note: quat_NB is analogous to the rotation matrix R_NB. quatDt  Timederivative of `quat_NB', i.e., [ė0, ė1, ė2, ė3]. w_NB_B  B's angular velocity in N, expressed in B. alpha_NB_B  B's angular acceleration in N, expressed in B.
std::tuple< Vector3d, Vector3d, Vector3d > CalculateExactTranslationalSolution  (  const double  t  )  const 
Calculates exact solutions for translational motion of an arbitrary rigid body B in a Newtonian frame (world) N.
Algorithm from highschool physics.
t  Current value of time. 
std::tuple  Description 

xyz  Vector3d [x, y, z], Bcm's position from No, expressed in N. 
xyzDt  Vector3d [ẋ, ẏ, ż] Bcm's velocity in N, expressed in N. 
xyzDDt  Vector3d [ẍ ÿ z̈], Bcm's acceleration in N, expressed in N. 

inline 
Returns the body's moment of inertia about an axis perpendicular to its axis of rotation and passing through its center of mass.
For example, for a cylinder of radius r, length h and uniformly distributed mass m with its rotational axis aligined along its body frame zaxis this would be:
I = Ixx = Iyy = m / 12 (3 r² + h²)

inline 
Returns body's moment of inertia about its axis of rotation.
For example, for a cylinder of radius r, length h and uniformly distributed mass m with its rotational axis aligined along its body frame zaxis this would be:
J = Izz = m r² / 2

inline 

inline 

inline 

inline 

inline 

inline 

inline 

inline 

inline 

inline 

inline 