Program Listing for File attitude_conversions.cc¶
↰ Return to documentation for file (conversions/attitude_conversions.cc)
#include "lupnt/conversions/attitude_conversions.h"
namespace lupnt {
Vec3 RotToAngularVelocity(const Mat3& rot_b2w, const Mat3& rot_dot_b2w) {
Mat3 Omega = rot_dot_b2w * rot_b2w.transpose();
Omega = 0.5 * (Omega - Omega.transpose());
return Vec3(Omega(2, 1), Omega(0, 2), Omega(1, 0));
}
State ScalarFirstToLast(const State& quat) {
return NormalizeQuat(State(Vec4(quat(3), quat(0), quat(1), quat(2))));
}
State ScalarLastToFirst(const State& quat) {
return NormalizeQuat(State(Vec4(quat(1), quat(2), quat(3), quat(0))));
}
State NormalizeQuat(const State& quat) {
State q = quat.normalized();
if (q(0) < 0) q = -q;
return q; // [qw, qx, qy, qz] = [scalar, vector]
}
Mat3 QuatToRot(const State& quat) {
Eigen::Quaternion<Real> q(quat(0), quat(1), quat(2), quat(3)); // [w, x, y, z]
return q.toRotationMatrix();
}
State RotToQuat(const Mat3& rot) {
Eigen::Quaternion<Real> q(rot);
return NormalizeQuat(State(Vec4(q.w(), q.x(), q.y(), q.z())));
}
Mat3 RollPitchYawToRot(const Vec3& rpy) {
Eigen::AngleAxis<Real> roll(rpy(0), Vec3::UnitX());
Eigen::AngleAxis<Real> pitch(rpy(1), Vec3::UnitY());
Eigen::AngleAxis<Real> yaw(rpy(2), Vec3::UnitZ());
return (yaw * pitch * roll).toRotationMatrix();
}
Vec3 RotToRollPitchYaw(const Mat3& rot) {
auto ypr = rot.eulerAngles(2, 1, 0);
return Vec3(ypr[2], ypr[1], ypr[0]);
}
// Vector definitions
VEC_IMP_VECTOR(ScalarFirstToLast, 4);
VEC_IMP_VECTOR(ScalarLastToFirst, 4);
VEC_IMP_VECTOR(NormalizeQuat, 4);
} // namespace lupnt