FhSim  3.1.0
Marine systems simulation
Loading...
Searching...
No Matches
QuaternionRate.h
1
15#pragma once
16
17#include <Eigen/Dense>
18
19namespace Ship
20{
21
24constexpr double kQuaternionNormGain = 2.0;
25
33inline Eigen::Vector4d QuaternionRate(const Eigen::Vector4d& q, const Eigen::Vector3d& omega, double gain)
34{
35 const double norm = q.norm();
36 const double qw = q(0) / norm;
37 const Eigen::Vector3d qVec = q.tail<3>() / norm;
38
39 Eigen::Matrix3d dyadic;
40 dyadic << 0, -qVec(2), qVec(1), qVec(2), 0, -qVec(0), -qVec(1), qVec(0), 0;
41
42 Eigen::Vector4d rate;
43 // The same expressions as the Ship used before, so that a unit quaternion gives the same bits.
44 rate(0) = (-0.5 * qVec.transpose() * omega)(0, 0);
45 rate.tail<3>() = 0.5 * (qw * Eigen::Matrix3d::Identity() - dyadic) * omega;
46 rate += gain * (1.0 - q.squaredNorm()) * q;
47 return rate;
48}
49
50} // namespace Ship
Simple waypoint object.
Definition CableAttach.h:16
constexpr double kQuaternionNormGain
Definition QuaternionRate.h:24
Eigen::Vector4d QuaternionRate(const Eigen::Vector4d &q, const Eigen::Vector3d &omega, double gain)
Definition QuaternionRate.h:33