Module: hingedRigidBodyStateEffector¶
Executive Summary¶
The hinged rigid body class is an instantiation of the state effector abstract class. The integrated test is validating the interaction between the hinged rigid body module and the rigid body hub that it is attached to. In this case, a hinged rigid body has an inertia tensor and is attached to the hub by a single degree of freedom torsional hinged with a linear spring constant and linear damping term.
Message Connection Descriptions¶
The following table lists all the module input and output messages. The module msg variable name is set by the user from python. The msg type contains a link to the message structure definition, while the description provides information on what this message is used for.
Figure 1: HingedRigidBodyStateEffector()
Module I/O Illustration¶
Msg Variable Name |
Msg Type |
Description |
---|---|---|
motorTorqueInMsgName |
(Optional) Input message of the hinge motor torque value |
|
hingedRigidBodyOutMsgName |
Output message containing the panel hinge state angle and angle rate |
|
hingedRigidBodyConfigLogOutMsgName |
Output message containing the panel inertial position and attitude states |
Detailed Module Description¶
Mathematical Modeling¶
See Allard, Schaub, and Piggott paper: General Hinged Solar Panel Dynamics Approximating First-Order Spacecraft Flexing for a detailed description of this model. A hinged rigid body has 2 states: theta and thetaDot
The module
PDF Description
contains further information on this module’s function,
how to run it, as well as testing.
Module Testing¶
The integrated tests has six scenarios it is testing. The first three are: one with gravity and no damping, one without gravity and without damping, and one without gravity with damping. These first three tests are verifying energy and momentum conservation. In the first two cases orbital energy, orbital momentum, rotational energy, and rotational angular momentum should all be conserved. In the third case orbital momentum, orbital energy, and rotational momentum should be conserved. This integrated test validates for all three scenarios that all of these parameters are conserved. The fourth scenario is verifying that the steady state deflection while a constant force is being applied matches the back of the envelope (BOE) calculation. The fifth scenario applies a constant force and removes the force and the test verifies that the frequency and amplitude match the BOE calculations. And the sixth scenario verifies that Basilisk gives identical results to a planar Lagrangian dynamical system created independently.
The document PDF Description
contains a more detailed discussion of the testing, as well as the expected results.
User Guide¶
This section is to outline the steps needed to setup a Hinged Rigid Body State Effector in python using Basilisk.
Import the hingedRigidBodyStateEffector class:
from Basilisk.simulation import hingedRigidBodyStateEffector
Create an instantiation of a Hinged Rigid body:
panel1 = hingedRigidBodyStateEffector.HingedRigidBodyStateEffector()
Define all physical parameters for a Hinged Rigid Body. For example:
IPntS_S = [[100.0, 0.0, 0.0], [0.0, 50.0, 0.0], [0.0, 0.0, 50.0]]
Do this for all of the parameters for a Hinged Rigid Body seen in the Hinged Rigid Body 1 Parameters Table.
Define the initial conditions of the states:
panel1.thetaInit = 5*numpy.pi/180.0 panel1.thetaDotInit = 0.0
Define a unique name for each state:
panel1.nameOfThetaState = "hingedRigidBodyTheta1" panel1.nameOfThetaDotState = "hingedRigidBodyThetaDot1"
Define an optional motor torque input message:
panel1.motorTorqueInMsgName = "motorTorque"
The angular states of the panel are created using an output message with the name
hingedRigidBodyOutMsgName
. The default value of this string ishingedRigidBody_OutputStates
:panel1.hingedRigidBodyOutMsgName = "panel1Angles"
If multiple panels are used, update the default config log state message to be unique:
panel1.hingedRigidBodyConfigLogOutMsgName = "panel1Log"
Add the panel to your spacecraftPlus:
scObject.addStateEffector(panel1)
See Module: spacecraftPlus documentation on how to set up a spacecraftPlus object.
Add the module to the task list:
unitTestSim.AddModelToTask(unitTaskName, panel1)
-
class
HingedRigidBodyStateEffector
: public StateEffector, public SysModel¶ - #include <hingedRigidBodyStateEffector.h>
hinged rigid body state effector class
Public Functions
-
HingedRigidBodyStateEffector
()¶ Contructor
This is the constructor, setting variables to default values
-
~HingedRigidBodyStateEffector
()¶ Destructor
This is the destructor, nothing to report here
-
void
SelfInit
()¶ This method initializes the object. It creates the module’s output messages.
- Return
void
-
void
CrossInit
()¶ This method subscribes to messages the HRB needs.
- Return
void
-
void
writeOutputStateMessages
(uint64_t CurrentClock)¶ This method takes the computed theta states and outputs them to the m messaging system.
- Return
void
- Parameters
CurrentClock
: The current simulation time (used for time stamping)
-
void
UpdateState
(uint64_t CurrentSimNanos)¶ This method is used so that the simulation will ask HRB to update messages.
- Return
void
- Parameters
CurrentSimNanos
: The current simulation time in nanoseconds
-
void
registerStates
(DynParamManager &statesIn)¶ Method for registering the HRB states
This method allows the HRB state effector to register its states: theta and thetaDot with the dyn param manager
-
void
linkInStates
(DynParamManager &states)¶ Method for getting access to other states
This method allows the HRB state effector to have access to the hub states and gravity
-
void
updateContributions
(double integTime, BackSubMatrices &backSubContr, Eigen::Vector3d sigma_BN, Eigen::Vector3d omega_BN_B, Eigen::Vector3d g_N)¶ Method for back-sub contributions
This method allows the HRB state effector to give its contributions to the matrices needed for the back-sub method
-
void
computeDerivatives
(double integTime, Eigen::Vector3d rDDot_BN_N, Eigen::Vector3d omegaDot_BN_B, Eigen::Vector3d sigma_BN)¶ Method for HRB to compute its derivatives
This method is used to find the derivatives for the HRB stateEffector: thetaDDot and the kinematic derivative
-
void
updateEffectorMassProps
(double integTime)¶ Method for giving the s/c the HRB mass props and prop rates
This method allows the HRB state effector to provide its contributions to the mass props and mass prop rates of the spacecraft
-
void
updateEnergyMomContributions
(double integTime, Eigen::Vector3d &rotAngMomPntCContr_B, double &rotEnergyContr, Eigen::Vector3d omega_BN_B)¶ Computing energy and momentum for HRBs
This method is for calculating the contributions of the HRB state effector to the energy and momentum of the s/c
-
void
calcForceTorqueOnBody
(double integTime, Eigen::Vector3d omega_BN_B)¶ Force and torque on s/c due to HRBs
-
void
prependSpacecraftNameToStates
()¶ class method
Public Members
-
double
mass
¶ [kg] mass of hinged rigid body
-
double
d
¶ [m] distance from hinge point H to hinged rigid body center of mass S
-
double
k
¶ [N-m/rad] torsional spring constant of hinge
-
double
c
¶ [N-m-s/rad] rotational damping coefficient of hinge
-
double
thetaInit
¶ [rad] Initial hinged rigid body angle
-
double
thetaDotInit
¶ [rad/s] Initial hinged rigid body angle rate
-
std::string
nameOfThetaState
¶ Identifier for the theta state data container
-
std::string
nameOfThetaDotState
¶ Identifier for the thetaDot state data container
-
Eigen::MatrixXd *
c_B
¶ [m] Vector from point B to CoM of s/c in B frame components
-
Eigen::MatrixXd *
cPrime_B
¶ [m/s] Body time derivative of vector c_B in B frame components
-
Eigen::Matrix3d
IPntS_S
¶ [kg-m^2] Inertia of hinged rigid body about point S in S frame components
-
Eigen::Vector3d
r_HB_B
¶ [m] vector pointing from body frame origin to Hinge location
-
Eigen::Matrix3d
dcm_HB
¶ DCM from body frame to hinge frame
-
std::string
hingedRigidBodyOutMsgName
¶ state output message name
-
std::string
motorTorqueInMsgName
¶ (optional) motor torque input message name
-
std::string
hingedRigidBodyConfigLogOutMsgName
¶ panel state config log message name
-
HingedRigidBodySimMsg
HRBoutputStates
¶ instance of messaging system message struct
-
BSKLogger
bskLogger
¶ BSK Logging
Private Functions
-
void
computePanelInertialStates
()¶ This method computes the panel states relative to the inertial frame
- Return
void
Private Members
-
double
theta
¶ [rad] hinged rigid body angle
-
double
thetaDot
¶ [rad/s] hinged rigid body angle rate
-
double
cTheta
¶ term needed for back substitution
-
double
u
¶ [N-m] optional motor torque
-
Eigen::Vector3d
r_HP_P
¶ [m] vector pointing from primary body frame P origin to Hinge location. If a single spacecraft body is modeled than P is the same as B
-
Eigen::Matrix3d
dcm_HP
¶ DCM from primary body frame to hinge frame
-
Eigen::Vector3d
aTheta
¶ term needed for back substitution
-
Eigen::Vector3d
bTheta
¶ term needed for back substitution
-
Eigen::Matrix3d
rTilde_HP_P
¶ Tilde matrix of rHB_B
-
Eigen::Matrix3d
dcm_SH
¶ DCM from hinge to hinged rigid body frame, S
-
Eigen::Matrix3d
dcm_SP
¶ DCM from body to S frame
-
Eigen::Vector3d
omega_PN_S
¶ [rad/s] omega_BN in S frame components
-
Eigen::Vector3d
sHat1_P
¶ unit direction vector for the first axis of the S frame
-
Eigen::Vector3d
sHat2_P
¶ unit direction vector for the second axis of the S frame
-
Eigen::Vector3d
sHat3_P
¶ unit direction vector for the third axis of the S frame
-
Eigen::Vector3d
r_SP_P
¶ Vector pointing from B to CoM of hinged rigid body in B frame components
-
Eigen::Matrix3d
rTilde_SP_P
¶ Tilde matrix of rSB_B
-
Eigen::Vector3d
rPrime_SP_P
¶ [m/s] Body time derivative of rSB_B
-
Eigen::Matrix3d
rPrimeTilde_SP_P
¶ Tilde matrix of rPrime_SB_B
-
Eigen::Matrix3d
ISPrimePntS_P
¶ [kg-m^2/s] time body derivative IPntS in body frame components
-
Eigen::Vector3d
omegaLoc_PN_P
¶ [rad/s] local copy of omegaBN
-
Eigen::Matrix3d
omegaTildeLoc_PN_P
¶ tilde matrix of omegaBN
-
int64_t
hingedRigidBodyOutMsgId
¶ state output message ID
-
int64_t
motorTorqueInMsgId
¶ motor torque message ID
-
int64_t
hingedRigidBodyConfigLogOutMsgId
¶ panel state config log msg ID
-
Eigen::Vector3d
r_SN_N
¶ [m] position vector of hinge CM S relative to inertial frame
-
Eigen::Vector3d
v_SN_N
¶ [m/s] inertial velocity vector of S relative to inertial frame
-
Eigen::Vector3d
sigma_SN
¶ MRP attitude of panel frame S relative to inertial frame
-
Eigen::Vector3d
omega_SN_S
¶ [rad/s] inertial panel frame angular velocity vector
-