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 torquefree rigid body B with axially symmetric inertia, in a Newtonian frame (World) N. More...
#include <drake/multibody/benchmarks/free_body/free_body.h>
Public Member Functions  
FreeBody (const Eigen::Quaterniond &initial_quat_NB, const Eigen::Vector3d &initial_w_NB_B, const Eigen::Vector3d &initial_p_NoBcm_N, const Eigen::Vector3d &initial_v_NBcm_B, const Eigen::Vector3d &gravity_N)  
Constructs a class that can be queried for exact values of orientation, position, and motion of a torquefree rigid body at time t. More...  
~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_initial_quat_NB () const 
const Eigen::Vector3d &  get_initial_w_NB_B () const 
Eigen::Vector3d  CalcInitial_w_NB_N () const 
const Eigen::Vector3d &  get_initial_p_NoBcm_N () const 
const Eigen::Vector3d &  get_uniform_gravity_expressed_in_world () const 
Eigen::Vector3d  CalcInitial_v_NBcm_N () const 
void  set_initial_quat_NB (const Eigen::Quaterniond &quat_NB) 
void  set_initial_w_NB_B (const Eigen::Vector3d &w_NB_B) 
void  set_initial_p_NoBcm_N (const Eigen::Vector3d &p_NoBcm_N) 
void  set_initial_v_NBcm_B (const Eigen::Vector3d &v_NBcm_B) 
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 torquefree 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 
Constructs a class that can be queried for exact values of orientation, position, and motion of a torquefree rigid body at time t.
[in]  initial_quat_NB  Value at time t = 0 of the quaternion relating righthanded orthonormal vectors Nx, Ny, Nz fixed in N (world) to righthanded orthonormal unit vectors Bx, By, Bz fixed in B (body). Note: The unit vector Bz is parallel to body B's symmetry axis. Note: The quaternion should already be normalized before it is passed. 
[in]  initial_W_NB_B  Value at time t = 0 of the angular velocity in N of body B, expressed in N. 
[in]  initial_p_NoBcm_N  Value at time t = 0 of the position vector from No (origin of world N) to Bcm (B's center of mass), expressed in N. 
[in]  initial_v_NBcm_N  Value at time t = 0 of the velocity in N of Bcm (B's center of mass), expressed in N. 
[in]  gravity_N  Local gravitational acceleration, expressed in N. 

default 

inline 

inline 
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 

inline 

inline 

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 