mirror of
https://github.com/okalachev/flix.git
synced 2026-08-16 00:38:56 +00:00
62 lines
1.4 KiB
Arduino
62 lines
1.4 KiB
Arduino
// Copyright (c) 2024 Oleg Kalachev <okalachev@gmail.com>
|
|
// Repository: https://github.com/okalachev/flix
|
|
|
|
// Fail-safe functions
|
|
|
|
extern float controlTime;
|
|
extern float controlRoll, controlPitch, controlThrottle, controlYaw;
|
|
|
|
float rcLossTimeout = 1;
|
|
float descendTime = 10;
|
|
float disarmTilt = radians(120);
|
|
|
|
void failsafe() {
|
|
rcLossFailsafe();
|
|
autoFailsafe();
|
|
tiltFailsafe();
|
|
}
|
|
|
|
// RC loss failsafe
|
|
void rcLossFailsafe() {
|
|
if (!armed) return;
|
|
if (t - controlTime > rcLossTimeout) {
|
|
descend();
|
|
}
|
|
}
|
|
|
|
// Smooth descend on RC lost
|
|
void descend() {
|
|
mode = AUTO;
|
|
attitudeTarget = Quaternion();
|
|
thrustTarget -= dt / descendTime;
|
|
if (thrustTarget < 0) {
|
|
thrustTarget = 0;
|
|
armed = false;
|
|
}
|
|
}
|
|
|
|
// Allow pilot to interrupt automatic flight
|
|
void autoFailsafe() {
|
|
static float roll, pitch, yaw, throttle;
|
|
if (abs(roll - controlRoll) > 0.05 || abs(pitch - controlPitch) > 0.05 || abs(yaw - controlYaw) > 0.05 || abs(throttle - controlThrottle) > 0.05) {
|
|
// controls changed and mode switch is not configured
|
|
if (mode == AUTO && invalid(controlMode)) mode = STAB; // regain control by the pilot
|
|
}
|
|
roll = controlRoll;
|
|
pitch = controlPitch;
|
|
yaw = controlYaw;
|
|
throttle = controlThrottle;
|
|
}
|
|
|
|
// Disarm if tilted too much
|
|
void tiltFailsafe() {
|
|
if (!armed) return;
|
|
if (mode != STAB) return;
|
|
|
|
Vector up = Quaternion::rotateVector(Vector(0, 0, 1), attitude);
|
|
float tilt = acos(up.z);
|
|
if (disarmTilt && tilt > disarmTilt) {
|
|
armed = false;
|
|
}
|
|
}
|