aboutsummaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorThomas Gubler <thomasgubler@gmail.com>2013-10-24 17:57:21 +0200
committerThomas Gubler <thomasgubler@gmail.com>2013-10-24 17:57:21 +0200
commit1e89f30120f30f0cac9c4bdd7b81ee2da96bcc8f (patch)
tree94bf3b4eb750868bdc7fbf95a8c8a063b206d91e /src/lib
parentccc6dd73a02f83d8fb857ca25cfe998a3b1303d4 (diff)
downloadpx4-firmware-1e89f30120f30f0cac9c4bdd7b81ee2da96bcc8f.tar.gz
px4-firmware-1e89f30120f30f0cac9c4bdd7b81ee2da96bcc8f.tar.bz2
px4-firmware-1e89f30120f30f0cac9c4bdd7b81ee2da96bcc8f.zip
constrain integrator part in control output until startup detection is available for safety reasons
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/ecl/attitude_fw/ecl_pitch_controller.cpp5
-rw-r--r--src/lib/ecl/attitude_fw/ecl_roll_controller.cpp5
-rw-r--r--src/lib/ecl/attitude_fw/ecl_yaw_controller.cpp5
3 files changed, 9 insertions, 6 deletions
diff --git a/src/lib/ecl/attitude_fw/ecl_pitch_controller.cpp b/src/lib/ecl/attitude_fw/ecl_pitch_controller.cpp
index eb1031cd3..4b43e73e6 100644
--- a/src/lib/ecl/attitude_fw/ecl_pitch_controller.cpp
+++ b/src/lib/ecl/attitude_fw/ecl_pitch_controller.cpp
@@ -161,9 +161,10 @@ float ECL_PitchController::control_bodyrate(float roll, float pitch,
}
/* integrator limit */
- _integrator = math::constrain(_integrator, -_integrator_max, _integrator_max);
+ //xxx: until start detection is available: integral part in control signal is limited here
+ float integrator_constrained = math::constrain(_integrator * k_i_rate, -_integrator_max, _integrator_max);
/* store non-limited output */
- _last_output = ((_rate_error * _k_d * scaler) + _integrator * k_i_rate * scaler + (_rate_setpoint * k_roll_ff)) * scaler;
+ _last_output = ((_rate_error * _k_d * scaler) + integrator_constrained * scaler + (_rate_setpoint * k_roll_ff)) * scaler;
return math::constrain(_last_output, -_max_deflection_rad, _max_deflection_rad);
}
diff --git a/src/lib/ecl/attitude_fw/ecl_roll_controller.cpp b/src/lib/ecl/attitude_fw/ecl_roll_controller.cpp
index ab3ac0a9d..658a0a501 100644
--- a/src/lib/ecl/attitude_fw/ecl_roll_controller.cpp
+++ b/src/lib/ecl/attitude_fw/ecl_roll_controller.cpp
@@ -133,11 +133,12 @@ float ECL_RollController::control_bodyrate(float pitch,
}
/* integrator limit */
- _integrator = math::constrain(_integrator, -_integrator_max, _integrator_max);
+ //xxx: until start detection is available: integral part in control signal is limited here
+ float integrator_constrained = math::constrain(_integrator * k_i_rate, -_integrator_max, _integrator_max);
//warnx("roll: _integrator: %.4f, _integrator_max: %.4f", (double)_integrator, (double)_integrator_max);
/* store non-limited output */
- _last_output = ((_rate_error * _k_d * scaler) + _integrator * k_i_rate * scaler + (_rate_setpoint * k_ff)) * scaler;
+ _last_output = ((_rate_error * _k_d * scaler) + integrator_constrained * scaler + (_rate_setpoint * k_ff)) * scaler;
return math::constrain(_last_output, -_max_deflection_rad, _max_deflection_rad);
}
diff --git a/src/lib/ecl/attitude_fw/ecl_yaw_controller.cpp b/src/lib/ecl/attitude_fw/ecl_yaw_controller.cpp
index e56a8d08d..b6938a59a 100644
--- a/src/lib/ecl/attitude_fw/ecl_yaw_controller.cpp
+++ b/src/lib/ecl/attitude_fw/ecl_yaw_controller.cpp
@@ -147,9 +147,10 @@ float ECL_YawController::control_bodyrate(float roll, float pitch,
}
/* integrator limit */
- _integrator = math::constrain(_integrator, -_integrator_max, _integrator_max);
+ //xxx: until start detection is available: integral part in control signal is limited here
+ float integrator_constrained = math::constrain(_integrator * k_i_rate, -_integrator_max, _integrator_max);
/* store non-limited output */
- _last_output = ((_rate_error * _k_d * scaler) + _integrator * k_i_rate * scaler + (_rate_setpoint * k_ff)) * scaler;
+ _last_output = ((_rate_error * _k_d * scaler) + integrator_constrained * scaler + (_rate_setpoint * k_ff)) * scaler;
return math::constrain(_last_output, -_max_deflection_rad, _max_deflection_rad);
}