CogniPilot

MODELICA LIBRARY · ENGINEERING REFERENCE

RigidBody/RigidBody6DOF.mo

Download original .moGitHub source

Documentation: RigidBody.RigidBody6DOF

within RigidBody;
partial model RigidBody6DOF "Six-degree-of-freedom rigid body"
  parameter Real mass = 1.0 "Mass [kg]";
  parameter Real g = 9.8 "Gravity [m/s^2]";
  parameter Real ixx = 1.0 "Body inertia matrix xx entry [kg*m^2]";
  parameter Real iyy = 1.0 "Body inertia matrix yy entry [kg*m^2]";
  parameter Real izz = 1.0 "Body inertia matrix zz entry [kg*m^2]";
  parameter Real ixy = 0.0 "Body inertia matrix xy entry [kg*m^2]";
  parameter Real ixz = 0.0 "Body inertia matrix xz entry [kg*m^2]";
  parameter Real iyz = 0.0 "Body inertia matrix yz entry [kg*m^2]";
  parameter Real J[3, 3] = [
    ixx, ixy, ixz;
    ixy, iyy, iyz;
    ixz, iyz, izz
  ] "Body inertia matrix [kg*m^2]";
  parameter Real p_start[3] = {0, 0, 0} "Initial world position";
  parameter Real v_b_start[3] = {0, 0, 0} "Initial body velocity";
  parameter Real q_start[4] = {1, 0, 0, 0} "Initial quaternion w,x,y,z";
  parameter Real omega_start[3] = {0, 0, 0} "Initial body angular velocity";
  parameter Real qnorm_gain = 1.0 "Quaternion renormalization gain";

  Real F_b[3] "Total non-gravity force in body frame [N]";
  Real M_b[3] "Total moment in body frame [N*m]";
  output Real p[3](start = p_start, each fixed = true) "World position [m]";
  output Real v_b[3](start = v_b_start, each fixed = true) "Body velocity [m/s]";
  output Real q[4](start = q_start, each fixed = true) "Quaternion w,x,y,z";
  output Real omega[3](start = omega_start, each fixed = true)
    "Body angular velocity [rad/s]";
  output Real R[3, 3](start = identity(3))
    "Direction cosine matrix, body to world";
  output Real v_w[3](start = v_b_start) "World velocity [m/s]";
  output Real a_b[3](start = {0, 0, 0}) "Body specific force [m/s^2]";

protected
  RigidBody.State state;
  RigidBody.Wrench wrench;
  RigidBody.Parameters physicalParameters;
  Real worldPositionRate[3];
  Real bodyVelocityRate[3];
  Real attitudeRate[4];
  Real bodyAngularVelocityRate[3];

equation
  state.worldPosition = p;
  state.bodyVelocity = v_b;
  state.attitude = q;
  state.bodyAngularVelocity = omega;
  wrench.bodyForce = F_b;
  wrench.bodyTorque = M_b;
  physicalParameters = RigidBody.Parameters(
    mass=mass,
    gravity=g,
    inertia=J,
    quaternionNormGain=qnorm_gain);
  assert(RigidBody.validParameters(physicalParameters),
    "Rigid-body parameters require positive mass, nonnegative gravity, and symmetric positive-definite inertia");
  worldPositionRate = RigidBody.worldPositionRate(state);
  bodyVelocityRate = RigidBody.bodyVelocityRate(
    state, wrench, physicalParameters);
  attitudeRate = RigidBody.attitudeRate(state, physicalParameters);
  bodyAngularVelocityRate = RigidBody.bodyAngularVelocityRate(
    state, wrench, physicalParameters);

  R = LieGroups.SO3.Quat.to_DCM(state.attitude);
  v_w = worldPositionRate;
  a_b = F_b / mass;
  der(p) = worldPositionRate;
  der(v_b) = bodyVelocityRate;
  der(q) = attitudeRate;
  der(omega) = bodyAngularVelocityRate;
end RigidBody6DOF;