mirror of
https://github.com/PX4/PX4-Autopilot.git
synced 2026-05-27 10:17:45 +08:00
mc_pos_control: use local position timestamp for dt
This commit is contained in:
@@ -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.
|
||||||
|
|||||||
Reference in New Issue
Block a user