2 Commits

Author SHA1 Message Date
Oleg Kalachev
dee4d97ab3 Add getRoll, getPitch, setRoll, setPitch methods
Add methods to Quaternion for consistency with getYaw and setYaw
2025-08-09 18:10:11 +03:00
Oleg Kalachev
ea35db37da Minor code simplification 2025-08-09 17:53:06 +03:00
2 changed files with 21 additions and 20 deletions

View File

@@ -11,8 +11,6 @@
#define WEIGHT_ACC 0.003 #define WEIGHT_ACC 0.003
#define RATES_LFP_ALPHA 0.2 // cutoff frequency ~ 40 Hz #define RATES_LFP_ALPHA 0.2 // cutoff frequency ~ 40 Hz
LowPassFilter<Vector> ratesFilter(RATES_LFP_ALPHA);
void estimate() { void estimate() {
applyGyro(); applyGyro();
applyAcc(); applyAcc();
@@ -20,6 +18,7 @@ void estimate() {
void applyGyro() { void applyGyro() {
// filter gyro to get angular rates // filter gyro to get angular rates
static LowPassFilter<Vector> ratesFilter(RATES_LFP_ALPHA);
rates = ratesFilter.update(gyro); rates = ratesFilter.update(gyro);
// apply rates to attitude // apply rates to attitude

View File

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