rigidBodyDynamics: Removed quaternion counter and index: 'nw', 'wIndex'

Replaced with 'unitQuaterion()' virtual function to indicate if the
joint uses a unit quaternion to represent rotation.
This commit is contained in:
Henry Weller
2016-04-12 22:17:52 +01:00
parent 315a1baad3
commit a0170df6c1
11 changed files with 32 additions and 68 deletions

View File

@ -61,7 +61,7 @@ int main(int argc, char *argv[])
Field<spatialVector> fx(sphericalJoint.nBodies(), Zero);
// Set the angle of the pendulum to 0.3rad
sphericalJoint.joints()[1]
sphericalJoint.joints()[1].unitQuaternion
(
quaternion(quaternion::ZYX, vector(0.3, 0, 0)),
sphericalJoint.state().q()
@ -87,7 +87,7 @@ int main(int argc, char *argv[])
// using 'gnuplot sphericalJoint.gnuplot'
omegaFile
<< t << " "
<< sphericalJoint.joints()[1]
<< sphericalJoint.joints()[1].unitQuaternion
(
sphericalJoint.state().q()
).eulerAngles(quaternion::ZYX).x()

View File

@ -84,9 +84,9 @@ Foam::RBD::joints::Rs::~Rs()
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
Foam::label Foam::RBD::joints::Rs::nw() const
bool Foam::RBD::joints::Rs::unitQuaternion() const
{
return 1;
return true;
}
@ -97,7 +97,7 @@ void Foam::RBD::joints::Rs::jcalc
const scalarField& qDot
) const
{
J.X.E() = operator()(q).R().T();
J.X.E() = joint::unitQuaternion(q).R().T();
J.X.r() = Zero;
J.S = Zero;

View File

@ -88,9 +88,8 @@ public:
// Member Functions
//- Return the number of additional state variable for this joint
// For the quaternion this is 1 in addition to the 3 stored in q
virtual label nw() const;
//- Return true as this joint describes rotation using a quaternion
virtual bool unitQuaternion() const;
//- Update the model state for this joint
virtual void jcalc

View File

@ -86,12 +86,6 @@ Foam::RBD::joints::composite::~composite()
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
Foam::label Foam::RBD::joints::composite::nw() const
{
return last().nw();
}
void Foam::RBD::joints::composite::jcalc
(
joint::XSvc& J,

View File

@ -101,9 +101,6 @@ public:
// Member Functions
//- Return the number of additional state variables need by this joint
virtual label nw() const;
//- Update the model state for this joint
virtual void jcalc
(

View File

@ -93,9 +93,6 @@ protected:
//- Index of this joints data in the rigidBodyModel state
label qIndex_;
//- Index of this joints quaternion data in the rigidBodyModel state
label wIndex_;
private:
@ -113,12 +110,6 @@ private:
return qIndex_;
}
//- Allow the rigidBodyModel to set the wIndex for this joint
label& wIndex()
{
return wIndex_;
}
public:
@ -213,8 +204,8 @@ public:
//- Return the number of degrees of freedom in this joint
inline label nDoF() const;
//- Return the number of additional state variables need by this joint
inline virtual label nw() const;
//- Return true if this joint describes rotation using a quaternion
inline virtual bool unitQuaternion() const;
//- Return the index of this joint in the model
inline label index() const;
@ -223,10 +214,6 @@ public:
// in the rigidBodyModel state fields
inline label qIndex() const;
//- Return start index for the additional state variables for this joint
// in the rigidBodyModel w state field
inline label wIndex() const;
//- Return the joint motion sub-space
inline const List<spatialVector>& S() const;
@ -245,16 +232,16 @@ public:
// Member Operators
//- Return the state quaternion for this joint
//- Return the unit quaternion for this joint
// if it uses a quaternion representation for rotation
inline quaternion operator()
inline quaternion unitQuaternion
(
const scalarField& q
) const;
//- Set the state quaternion for this joint
//- Set the unit quaternion for this joint
// if it uses a quaternion representation for rotation
inline void operator()
inline void unitQuaternion
(
const quaternion& quat,
scalarField& q

View File

@ -29,8 +29,7 @@ inline Foam::RBD::joint::joint(const label nDoF)
:
S_(nDoF),
index_(0),
qIndex_(0),
wIndex_(0)
qIndex_(0)
{}
@ -41,9 +40,9 @@ inline Foam::label Foam::RBD::joint::nDoF() const
return S_.size();
}
inline Foam::label Foam::RBD::joint::nw() const
inline bool Foam::RBD::joint::unitQuaternion() const
{
return 0;
return false;
}
inline Foam::label Foam::RBD::joint::index() const
@ -56,11 +55,6 @@ inline Foam::label Foam::RBD::joint::qIndex() const
return qIndex_;
}
inline Foam::label Foam::RBD::joint::wIndex() const
{
return wIndex_;
}
inline const Foam::List<Foam::spatialVector>& Foam::RBD::joint::S() const
{
return S_;
@ -69,12 +63,12 @@ inline const Foam::List<Foam::spatialVector>& Foam::RBD::joint::S() const
// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * //
inline Foam::quaternion Foam::RBD::joint::operator()
inline Foam::quaternion Foam::RBD::joint::unitQuaternion
(
const scalarField& q
) const
{
if (nw() != 1)
if (!unitQuaternion())
{
FatalErrorInFunction
<< "Attempt to get the quaternion for a non-spherical joint"
@ -85,13 +79,13 @@ inline Foam::quaternion Foam::RBD::joint::operator()
}
inline void Foam::RBD::joint::operator()
inline void Foam::RBD::joint::unitQuaternion
(
const quaternion& quat,
scalarField& q
) const
{
if (nw() != 1)
if (!unitQuaternion())
{
FatalErrorInFunction
<< "Attempt to set quaternion for a non-spherical joint"

View File

@ -52,7 +52,7 @@ void Foam::RBD::rigidBodyModel::initializeRootBody()
XT_.append(spatialTransform());
nDoF_ = 0;
nw_ = 0;
unitQuaternions_ = false;
resizeState();
}
@ -204,11 +204,10 @@ Foam::label Foam::RBD::rigidBodyModel::join_
joint& curJoint = joints_[joints_.size() - 1];
curJoint.index() = joints_.size() - 1;
curJoint.qIndex() = prevJoint.qIndex() + prevJoint.nDoF();
curJoint.wIndex() = prevJoint.wIndex() + prevJoint.nw();
// Increment the degrees of freedom
nDoF_ += curJoint.nDoF();
nw_ += curJoint.nw();
unitQuaternions_ = unitQuaternions_ || curJoint.unitQuaternion();
resizeState();

View File

@ -123,11 +123,8 @@ protected:
// used to set the size of the of joint state fields q, qDot and qDdot.
label nDoF_;
//- The number of additional state variable needed to describe the joint
// states. Typically this is the number of quaternion joints for which
// the 'w' element is additional to the 3-degrees of freedom of the
// joint.
label nw_;
//- True if any of the joints using quaternions
bool unitQuaternions_;
//- Motion restraints
PtrList<restraint> restraints_;
@ -242,11 +239,8 @@ public:
// used to set the size of the of joint state fields q, qDot and qDdot.
inline label nDoF() const;
//- Return the number of additional state variable needed to describe
// the joint states. Typically this is the number of quaternion
// joints for which the 'w' element is additional to the 3-degrees of
// freedom of the joint.
inline label nw() const;
//- Return true if any of the joints using quaternions
inline bool unitQuaternions() const;
//- Return the acceleration due to gravity
inline const vector& g() const;

View File

@ -58,9 +58,9 @@ inline Foam::label Foam::RBD::rigidBodyModel::nDoF() const
}
inline Foam::label Foam::RBD::rigidBodyModel::nw() const
inline bool Foam::RBD::rigidBodyModel::unitQuaternions() const
{
return nw_;
return unitQuaternions_;
}

View File

@ -56,13 +56,13 @@ Foam::RBD::rigidBodySolver::~rigidBodySolver()
void Foam::RBD::rigidBodySolver::correctQuaternionJoints()
{
if (model_.nw())
if (model_.unitQuaternions())
{
forAll (model_.joints(), i)
{
const label qi = model_.joints()[i].qIndex();
if (model_.joints()[i].nw() == 1)
if (model_.joints()[i].unitQuaternion())
{
// Calculate the change in the normalized quaternion axis
vector dv((q().block<vector>(qi) - q0().block<vector>(qi)));
@ -76,11 +76,11 @@ void Foam::RBD::rigidBodySolver::correctQuaternionJoints()
// Transform the previous time quaternion
quaternion quat
(
normalize(model_.joints()[i](q0())*dQuat)
normalize(model_.joints()[i].unitQuaternion(q0())*dQuat)
);
// Update the joint state
model_.joints()[i](quat, q());
model_.joints()[i].unitQuaternion(quat, q());
}
}
}