Skip to content

Commit 740521a

Browse files
MC PositionControl: Add timeout for invalid TrajectorySetpoint (#25283) (#25341)
* MulticopterPositionControl: Add timeout before triggering emergency setpoint on invalid TrajectorySetpoint * Apply suggestions from code review * Cleanup & address review comments * Safegaurd against using old setpoint if states aren't valid anymore --------- Co-authored-by: Jacob Dahl <37091262+dakejahl@users.noreply.github.com>
1 parent aa745f2 commit 740521a

File tree

2 files changed

+26
-6
lines changed

2 files changed

+26
-6
lines changed

src/modules/mc_pos_control/MulticopterPositionControl.cpp

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -565,14 +565,33 @@ void MulticopterPositionControl::Run()
565565

566566
_control.setState(states);
567567

568+
const hrt_abstime now = hrt_absolute_time();
569+
568570
// Run position control
569-
if (!_control.update(dt)) {
570-
// Failsafe
571-
_vehicle_constraints = {0, NAN, NAN, false, {}}; // reset constraints
571+
if (_control.update(dt)) {
572+
573+
// Valid control update - store for fallback
574+
_last_valid_setpoint = _setpoint;
575+
576+
} else {
577+
578+
// Initial update failed - Try fallback if within timeout
579+
if (now < _last_valid_setpoint.timestamp + 200_ms) {
580+
// Use last valid setpoint
581+
adjustSetpointForEKFResets(vehicle_local_position, _last_valid_setpoint);
582+
_control.setInputSetpoint(_last_valid_setpoint);
583+
}
584+
585+
// Still failing / not within timeout - Go to failsafe
586+
if (!_control.update(dt)) {
587+
588+
_vehicle_constraints = {0, NAN, NAN, false, {}}; // reset constraints
572589

573-
_control.setInputSetpoint(generateFailsafeSetpoint(vehicle_local_position.timestamp_sample, states, true));
574-
_control.setVelocityLimits(_param_mpc_xy_vel_max.get(), _param_mpc_z_vel_max_up.get(), _param_mpc_z_vel_max_dn.get());
575-
_control.update(dt);
590+
_control.setInputSetpoint(generateFailsafeSetpoint(vehicle_local_position.timestamp_sample, states, true));
591+
_control.setVelocityLimits(_param_mpc_xy_vel_max.get(), _param_mpc_z_vel_max_up.get(), _param_mpc_z_vel_max_dn.get());
592+
593+
_control.update(dt);
594+
}
576595
}
577596

578597
// Publish internal position control setpoints

src/modules/mc_pos_control/MulticopterPositionControl.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ class MulticopterPositionControl : public ModuleBase<MulticopterPositionControl>
113113
hrt_abstime _time_position_control_enabled{0};
114114

115115
trajectory_setpoint_s _setpoint{PositionControl::empty_trajectory_setpoint};
116+
trajectory_setpoint_s _last_valid_setpoint{PositionControl::empty_trajectory_setpoint};
116117
vehicle_control_mode_s _vehicle_control_mode{};
117118

118119
vehicle_constraints_s _vehicle_constraints {

0 commit comments

Comments
 (0)