|
|
|
@ -145,6 +145,7 @@ private:
@@ -145,6 +145,7 @@ private:
|
|
|
|
|
perf_counter_t _nonfinite_output_perf; /**< performance counter for non finite output */ |
|
|
|
|
|
|
|
|
|
bool _setpoint_valid; /**< flag if the position control setpoint is valid */ |
|
|
|
|
bool _debug; /**< if set to true, print debug output */ |
|
|
|
|
|
|
|
|
|
struct { |
|
|
|
|
float tconst; |
|
|
|
@ -324,7 +325,8 @@ FixedwingAttitudeControl::FixedwingAttitudeControl() :
@@ -324,7 +325,8 @@ FixedwingAttitudeControl::FixedwingAttitudeControl() :
|
|
|
|
|
_nonfinite_input_perf(perf_alloc(PC_COUNT, "fw att control nonfinite input")), |
|
|
|
|
_nonfinite_output_perf(perf_alloc(PC_COUNT, "fw att control nonfinite output")), |
|
|
|
|
/* states */ |
|
|
|
|
_setpoint_valid(false) |
|
|
|
|
_setpoint_valid(false), |
|
|
|
|
_debug(false) |
|
|
|
|
{ |
|
|
|
|
/* safely initialize structs */ |
|
|
|
|
_att = {}; |
|
|
|
@ -700,7 +702,8 @@ FixedwingAttitudeControl::task_main()
@@ -700,7 +702,8 @@ FixedwingAttitudeControl::task_main()
|
|
|
|
|
perf_count(_nonfinite_input_perf); |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
airspeed = _airspeed.true_airspeed_m_s; |
|
|
|
|
/* prevent numerical drama by requiring 0.5 m/s minimal speed */ |
|
|
|
|
airspeed = math::max(0.5f, _airspeed.true_airspeed_m_s); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
@ -785,7 +788,7 @@ FixedwingAttitudeControl::task_main()
@@ -785,7 +788,7 @@ FixedwingAttitudeControl::task_main()
|
|
|
|
|
speed_body_v = _att.R[0][1] * _global_pos.vel_n + _att.R[1][1] * _global_pos.vel_e + _att.R[2][1] * _global_pos.vel_d; |
|
|
|
|
speed_body_w = _att.R[0][2] * _global_pos.vel_n + _att.R[1][2] * _global_pos.vel_e + _att.R[2][2] * _global_pos.vel_d; |
|
|
|
|
} else { |
|
|
|
|
if (loop_counter % 10 == 0) { |
|
|
|
|
if (_debug && loop_counter % 10 == 0) { |
|
|
|
|
warnx("Did not get a valid R\n"); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -808,7 +811,7 @@ FixedwingAttitudeControl::task_main()
@@ -808,7 +811,7 @@ FixedwingAttitudeControl::task_main()
|
|
|
|
|
_roll_ctrl.reset_integrator(); |
|
|
|
|
perf_count(_nonfinite_output_perf); |
|
|
|
|
|
|
|
|
|
if (loop_counter % 10 == 0) { |
|
|
|
|
if (_debug && loop_counter % 10 == 0) { |
|
|
|
|
warnx("roll_u %.4f", (double)roll_u); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -821,7 +824,7 @@ FixedwingAttitudeControl::task_main()
@@ -821,7 +824,7 @@ FixedwingAttitudeControl::task_main()
|
|
|
|
|
if (!isfinite(pitch_u)) { |
|
|
|
|
_pitch_ctrl.reset_integrator(); |
|
|
|
|
perf_count(_nonfinite_output_perf); |
|
|
|
|
if (loop_counter % 10 == 0) { |
|
|
|
|
if (_debug && loop_counter % 10 == 0) { |
|
|
|
|
warnx("pitch_u %.4f, _yaw_ctrl.get_desired_rate() %.4f," |
|
|
|
|
" airspeed %.4f, airspeed_scaling %.4f," |
|
|
|
|
" roll_sp %.4f, pitch_sp %.4f," |
|
|
|
@ -845,7 +848,7 @@ FixedwingAttitudeControl::task_main()
@@ -845,7 +848,7 @@ FixedwingAttitudeControl::task_main()
|
|
|
|
|
if (!isfinite(yaw_u)) { |
|
|
|
|
_yaw_ctrl.reset_integrator(); |
|
|
|
|
perf_count(_nonfinite_output_perf); |
|
|
|
|
if (loop_counter % 10 == 0) { |
|
|
|
|
if (_debug && loop_counter % 10 == 0) { |
|
|
|
|
warnx("yaw_u %.4f", (double)yaw_u); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -853,13 +856,13 @@ FixedwingAttitudeControl::task_main()
@@ -853,13 +856,13 @@ FixedwingAttitudeControl::task_main()
|
|
|
|
|
/* throttle passed through */ |
|
|
|
|
_actuators.control[3] = (isfinite(throttle_sp)) ? throttle_sp : 0.0f; |
|
|
|
|
if (!isfinite(throttle_sp)) { |
|
|
|
|
if (loop_counter % 10 == 0) { |
|
|
|
|
if (_debug && loop_counter % 10 == 0) { |
|
|
|
|
warnx("throttle_sp %.4f", (double)throttle_sp); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
perf_count(_nonfinite_input_perf); |
|
|
|
|
if (loop_counter % 10 == 0) { |
|
|
|
|
if (_debug && loop_counter % 10 == 0) { |
|
|
|
|
warnx("Non-finite setpoint roll_sp: %.4f, pitch_sp %.4f", (double)roll_sp, (double)pitch_sp); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|