|
|
|
@ -791,18 +791,45 @@ void MulticopterPositionControl::control_auto(float dt)
@@ -791,18 +791,45 @@ void MulticopterPositionControl::control_auto(float dt)
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool current_setpoint_valid = false; |
|
|
|
|
bool previous_setpoint_valid = false; |
|
|
|
|
|
|
|
|
|
math::Vector<3> prev_sp; |
|
|
|
|
math::Vector<3> curr_sp; |
|
|
|
|
|
|
|
|
|
if (_pos_sp_triplet.current.valid) { |
|
|
|
|
/* in case of interrupted mission don't go to waypoint but stay at current position */ |
|
|
|
|
_reset_pos_sp = true; |
|
|
|
|
_reset_alt_sp = true; |
|
|
|
|
|
|
|
|
|
/* project setpoint to local frame */ |
|
|
|
|
math::Vector<3> curr_sp; |
|
|
|
|
map_projection_project(&_ref_pos, |
|
|
|
|
_pos_sp_triplet.current.lat, _pos_sp_triplet.current.lon, |
|
|
|
|
&curr_sp.data[0], &curr_sp.data[1]); |
|
|
|
|
curr_sp(2) = -(_pos_sp_triplet.current.alt - _ref_alt); |
|
|
|
|
|
|
|
|
|
if (PX4_ISFINITE(curr_sp(0)) && |
|
|
|
|
PX4_ISFINITE(curr_sp(1)) && |
|
|
|
|
PX4_ISFINITE(curr_sp(2))) { |
|
|
|
|
current_setpoint_valid = true; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (_pos_sp_triplet.previous.valid) { |
|
|
|
|
map_projection_project(&_ref_pos, |
|
|
|
|
_pos_sp_triplet.previous.lat, _pos_sp_triplet.previous.lon, |
|
|
|
|
&prev_sp.data[0], &prev_sp.data[1]); |
|
|
|
|
prev_sp(2) = -(_pos_sp_triplet.previous.alt - _ref_alt); |
|
|
|
|
|
|
|
|
|
if (PX4_ISFINITE(prev_sp(0)) && |
|
|
|
|
PX4_ISFINITE(prev_sp(1)) && |
|
|
|
|
PX4_ISFINITE(prev_sp(2))) { |
|
|
|
|
previous_setpoint_valid = true; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (current_setpoint_valid) { |
|
|
|
|
/* in case of interrupted mission don't go to waypoint but stay at current position */ |
|
|
|
|
_reset_pos_sp = true; |
|
|
|
|
_reset_alt_sp = true; |
|
|
|
|
|
|
|
|
|
/* scaled space: 1 == position error resulting max allowed speed */ |
|
|
|
|
math::Vector<3> scale = _params.pos_p.edivide(_params.vel_max); // TODO add mult param here
|
|
|
|
|
|
|
|
|
@ -812,13 +839,8 @@ void MulticopterPositionControl::control_auto(float dt)
@@ -812,13 +839,8 @@ void MulticopterPositionControl::control_auto(float dt)
|
|
|
|
|
/* by default use current setpoint as is */ |
|
|
|
|
math::Vector<3> pos_sp_s = curr_sp_s; |
|
|
|
|
|
|
|
|
|
if (_pos_sp_triplet.current.type == position_setpoint_s::SETPOINT_TYPE_POSITION && _pos_sp_triplet.previous.valid) { |
|
|
|
|
if (_pos_sp_triplet.current.type == position_setpoint_s::SETPOINT_TYPE_POSITION && previous_setpoint_valid) { |
|
|
|
|
/* follow "previous - current" line */ |
|
|
|
|
math::Vector<3> prev_sp; |
|
|
|
|
map_projection_project(&_ref_pos, |
|
|
|
|
_pos_sp_triplet.previous.lat, _pos_sp_triplet.previous.lon, |
|
|
|
|
&prev_sp.data[0], &prev_sp.data[1]); |
|
|
|
|
prev_sp(2) = -(_pos_sp_triplet.previous.alt - _ref_alt); |
|
|
|
|
|
|
|
|
|
if ((curr_sp - prev_sp).length() > MIN_DIST) { |
|
|
|
|
|
|
|
|
|