mc_pos_control: use local position timestamp for dt

This commit is contained in:
Daniel Agar
2020-08-07 21:44:42 -04:00
parent c5eb084236
commit 14f734ac15
2 changed files with 21 additions and 32 deletions
@@ -59,7 +59,7 @@ public:
~Takeoff() = default; ~Takeoff() = default;
// initialize parameters // initialize parameters
void setSpoolupTime(const float seconds) { _spoolup_time_hysteresis.set_hysteresis_time_from(false, (hrt_abstime)(seconds * (float)1_s)); } void setSpoolupTime(const float seconds) { _spoolup_time_hysteresis.set_hysteresis_time_from(false, seconds * 1_s); }
void setTakeoffRampTime(const float seconds) { _takeoff_ramp_time = seconds; } void setTakeoffRampTime(const float seconds) { _takeoff_ramp_time = seconds; }
/** /**
@@ -234,12 +234,6 @@ private:
*/ */
void limit_altitude(vehicle_local_position_setpoint_s &setpoint); void limit_altitude(vehicle_local_position_setpoint_s &setpoint);
/**
* Prints a warning message at a lowered rate.
* @param str the message that has to be printed.
*/
void warn_rate_limited(const char *str);
/** /**
* Adjust the setpoint during landing. * Adjust the setpoint during landing.
* Thrust is adjusted to support the land-detector during detection. * Thrust is adjusted to support the land-detector during detection.
@@ -260,8 +254,8 @@ private:
* setpoints. The failsafe will occur after LOITER_TIME_BEFORE_DESCEND. If force is set * setpoints. The failsafe will occur after LOITER_TIME_BEFORE_DESCEND. If force is set
* to true, the failsafe will be initiated immediately. * to true, the failsafe will be initiated immediately.
*/ */
void failsafe(vehicle_local_position_setpoint_s &setpoint, const PositionControlStates &states, const bool force, void failsafe(const hrt_abstime &now, vehicle_local_position_setpoint_s &setpoint, const PositionControlStates &states,
bool warn); const bool force, bool warn);
/** /**
* Reset setpoints to NAN * Reset setpoints to NAN
@@ -324,17 +318,6 @@ MulticopterPositionControl::init()
return true; return true;
} }
void
MulticopterPositionControl::warn_rate_limited(const char *string)
{
hrt_abstime now = hrt_absolute_time();
if (now - _last_warn > 200_ms) {
PX4_WARN("%s", string);
_last_warn = now;
}
}
int int
MulticopterPositionControl::parameters_update(bool force) MulticopterPositionControl::parameters_update(bool force)
{ {
@@ -542,11 +525,13 @@ MulticopterPositionControl::Run()
poll_subscriptions(); poll_subscriptions();
parameters_update(false); parameters_update(false);
// set _dt in controllib Block - the time difference since the last loop iteration in seconds const hrt_abstime time_stamp_now = _local_pos.timestamp;
const hrt_abstime time_stamp_now = hrt_absolute_time(); const float dt = math::constrain(((time_stamp_now - _time_stamp_last_loop) * 1e-6f), 0.002f, 0.04f);
setDt((time_stamp_now - _time_stamp_last_loop) / 1e6f);
_time_stamp_last_loop = time_stamp_now; _time_stamp_last_loop = time_stamp_now;
// set _dt in controllib Block - the time difference since the last loop iteration in seconds
setDt(dt);
const bool was_in_failsafe = _in_failsafe; const bool was_in_failsafe = _in_failsafe;
_in_failsafe = false; _in_failsafe = false;
@@ -587,7 +572,7 @@ MulticopterPositionControl::Run()
if (!_flight_tasks.update()) { if (!_flight_tasks.update()) {
// FAILSAFE // FAILSAFE
// Task was not able to update correctly. Do Failsafe. // Task was not able to update correctly. Do Failsafe.
failsafe(setpoint, _states, false, !was_in_failsafe); failsafe(time_stamp_now, setpoint, _states, false, !was_in_failsafe);
} else { } else {
setpoint = _flight_tasks.getPositionSetpoint(); setpoint = _flight_tasks.getPositionSetpoint();
@@ -624,7 +609,7 @@ MulticopterPositionControl::Run()
// handle smooth takeoff // handle smooth takeoff
_takeoff.updateTakeoffState(_control_mode.flag_armed, _vehicle_land_detected.landed, constraints.want_takeoff, _takeoff.updateTakeoffState(_control_mode.flag_armed, _vehicle_land_detected.landed, constraints.want_takeoff,
constraints.speed_up, !_control_mode.flag_control_climb_rate_enabled, time_stamp_now); constraints.speed_up, !_control_mode.flag_control_climb_rate_enabled, time_stamp_now);
constraints.speed_up = _takeoff.updateRamp(_dt, constraints.speed_up); constraints.speed_up = _takeoff.updateRamp(dt, constraints.speed_up);
const bool not_taken_off = _takeoff.getTakeoffState() < TakeoffState::rampup; const bool not_taken_off = _takeoff.getTakeoffState() < TakeoffState::rampup;
const bool flying = _takeoff.getTakeoffState() >= TakeoffState::flight; const bool flying = _takeoff.getTakeoffState() >= TakeoffState::flight;
@@ -660,12 +645,16 @@ MulticopterPositionControl::Run()
_control.setConstraints(constraints); _control.setConstraints(constraints);
_control.setInputSetpoint(setpoint); _control.setInputSetpoint(setpoint);
if (!_control.update(_dt)) { if (!_control.update(dt)) {
warn_rate_limited("PositionControl: invalid setpoints"); if ((time_stamp_now - _last_warn) > 1_s) {
failsafe(setpoint, _states, true, !was_in_failsafe); PX4_WARN("invalid setpoints");
_last_warn = time_stamp_now;
}
failsafe(time_stamp_now, setpoint, _states, true, !was_in_failsafe);
_control.setInputSetpoint(setpoint); _control.setInputSetpoint(setpoint);
constraints = FlightTask::empty_constraints; constraints = FlightTask::empty_constraints;
_control.update(_dt); _control.update(dt);
} }
// Fill local position, velocity and thrust setpoint. // Fill local position, velocity and thrust setpoint.
@@ -931,15 +920,15 @@ MulticopterPositionControl::start_flight_task()
} }
void void
MulticopterPositionControl::failsafe(vehicle_local_position_setpoint_s &setpoint, const PositionControlStates &states, MulticopterPositionControl::failsafe(const hrt_abstime &now, vehicle_local_position_setpoint_s &setpoint,
const bool force, bool warn) const PositionControlStates &states, const bool force, bool warn)
{ {
// do not warn while we are disarmed, as we might not have valid setpoints yet // do not warn while we are disarmed, as we might not have valid setpoints yet
if (!_control_mode.flag_armed) { if (!_control_mode.flag_armed) {
warn = false; warn = false;
} }
_failsafe_land_hysteresis.set_state_and_update(true, hrt_absolute_time()); _failsafe_land_hysteresis.set_state_and_update(true, now);
if (!_failsafe_land_hysteresis.get_state() && !force) { if (!_failsafe_land_hysteresis.get_state() && !force) {
// just keep current setpoint and don't do anything. // just keep current setpoint and don't do anything.