Add getRoll, getPitch, setRoll, setPitch methods

Add methods to Quaternion for consistency with getYaw and setYaw
This commit is contained in:
Oleg Kalachev
2025-08-09 18:10:11 +03:00
parent ea35db37da
commit dee4d97ab3

View File

@@ -116,29 +116,31 @@ public:
return euler; return euler;
} }
float getRoll() const {
return toEuler().x;
}
float getPitch() const {
return toEuler().y;
}
float getYaw() const { float getYaw() const {
// https://github.com/ros/geometry2/blob/589caf083cae9d8fae7effdb910454b4681b9ec1/tf2/include/tf2/impl/utils.h#L122 return toEuler().z;
float yaw; }
float sqx = x * x;
float sqy = y * y; void setRoll(float roll) {
float sqz = z * z; Vector euler = toEuler();
float sqw = w * w; *this = Quaternion::fromEuler(Vector(roll, euler.y, euler.z));
double sarg = -2 * (x * z - w * y) / (sqx + sqy + sqz + sqw); }
if (sarg <= -0.99999) {
yaw = -2 * atan2(y, x); void setPitch(float pitch) {
} else if (sarg >= 0.99999) { Vector euler = toEuler();
yaw = 2 * atan2(y, x); *this = Quaternion::fromEuler(Vector(euler.x, pitch, euler.z));
} else {
yaw = atan2(2 * (x * y + w * z), sqw + sqx - sqy - sqz);
}
return yaw;
} }
void setYaw(float yaw) { void setYaw(float yaw) {
// TODO: optimize?
Vector euler = toEuler(); Vector euler = toEuler();
euler.z = yaw; *this = Quaternion::fromEuler(Vector(euler.x, euler.y, yaw));
(*this) = Quaternion::fromEuler(euler);
} }
Quaternion operator * (const Quaternion& q) const { Quaternion operator * (const Quaternion& q) const {