Browse Source

handle line segment termination in navigator

- if following line segment (fixed-wing position control) switch waypoint when in acceptance radius OR passed the second waypoint. this handles the case of being beyond the second waypoint but not within the acceptance radius without the need to fly back to the waypoint (e.g. after a loiter up to waypoint alt)
- sync navigator and fw pos ctrl waypoint acceptance altitude
master
Thomas Stastny 3 years ago committed by Silvan Fuhrer
parent
commit
f8c2ee73db
  1. 2
      src/modules/fw_pos_control_l1/FixedwingPositionControl.cpp
  2. 4
      src/modules/fw_pos_control_l1/FixedwingPositionControl.hpp
  3. 36
      src/modules/navigator/mission_block.cpp

2
src/modules/fw_pos_control_l1/FixedwingPositionControl.cpp

@ -994,7 +994,7 @@ FixedwingPositionControl::handle_setpoint_type(const uint8_t setpoint_type, cons
// POSITION: achieve position setpoint altitude via loiter // POSITION: achieve position setpoint altitude via loiter
// close to waypoint, but altitude error greater than twice acceptance // close to waypoint, but altitude error greater than twice acceptance
if ((!_vehicle_status.in_transition_mode) && (dist >= 0.f) if ((!_vehicle_status.in_transition_mode) && (dist >= 0.f)
&& (dist_z > 2.f * _param_fw_clmbout_diff.get()) && (dist_z > _param_nav_fw_alt_rad.get())
&& (dist_xy < 2.f * math::max(acc_rad, loiter_radius_abs))) { && (dist_xy < 2.f * math::max(acc_rad, loiter_radius_abs))) {
// SETPOINT_TYPE_POSITION -> SETPOINT_TYPE_LOITER // SETPOINT_TYPE_POSITION -> SETPOINT_TYPE_LOITER
position_sp_type = position_setpoint_s::SETPOINT_TYPE_LOITER; position_sp_type = position_setpoint_s::SETPOINT_TYPE_LOITER;

4
src/modules/fw_pos_control_l1/FixedwingPositionControl.hpp

@ -447,7 +447,9 @@ private:
(ParamFloat<px4::params::NAV_LOITER_RAD>) _param_nav_loiter_rad, (ParamFloat<px4::params::NAV_LOITER_RAD>) _param_nav_loiter_rad,
(ParamFloat<px4::params::FW_TKO_PITCH_MIN>) _takeoff_pitch_min (ParamFloat<px4::params::FW_TKO_PITCH_MIN>) _takeoff_pitch_min,
(ParamFloat<px4::params::NAV_FW_ALT_RAD>) _param_nav_fw_alt_rad
) )

36
src/modules/navigator/mission_block.cpp

@ -307,8 +307,40 @@ MissionBlock::is_mission_item_reached()
} }
if (dist_xy >= 0.0f && dist_xy <= acceptance_radius bool passed_curr_wp = false;
&& dist_z <= alt_acc_rad_m) {
if (_navigator->get_vstatus()->vehicle_type == vehicle_status_s::VEHICLE_TYPE_FIXED_WING) {
const float dist_prev_to_curr = get_distance_to_next_waypoint(_navigator->get_position_setpoint_triplet()->previous.lat,
_navigator->get_position_setpoint_triplet()->previous.lon, _navigator->get_position_setpoint_triplet()->current.lat,
_navigator->get_position_setpoint_triplet()->current.lon);
if (dist_prev_to_curr > 1.0e-6f && _navigator->get_position_setpoint_triplet()->previous.valid) {
// Fixed-wing guidance interprets this condition as line segment following
// vector from previous waypoint to current waypoint
float vector_prev_to_curr_north;
float vector_prev_to_curr_east;
get_vector_to_next_waypoint_fast(_navigator->get_position_setpoint_triplet()->previous.lat,
_navigator->get_position_setpoint_triplet()->previous.lon, _navigator->get_position_setpoint_triplet()->current.lat,
_navigator->get_position_setpoint_triplet()->current.lon, &vector_prev_to_curr_north,
&vector_prev_to_curr_east);
// vector from next waypoint to aircraft
float vector_curr_to_vehicle_north;
float vector_curr_to_vehicle_east;
get_vector_to_next_waypoint_fast(_navigator->get_position_setpoint_triplet()->current.lat,
_navigator->get_position_setpoint_triplet()->current.lon, _navigator->get_global_position()->lat,
_navigator->get_global_position()->lon, &vector_curr_to_vehicle_north,
&vector_curr_to_vehicle_east);
// if dot product of vectors is positive, we are passed the current waypoint (the terminal point on the line segment) and should switch to next mission item
passed_curr_wp = vector_prev_to_curr_north * vector_curr_to_vehicle_north + vector_prev_to_curr_east *
vector_curr_to_vehicle_east > 0.0f;
}
}
if (dist_xy >= 0.0f && (dist_xy <= acceptance_radius || passed_curr_wp) && dist_z <= alt_acc_rad_m) {
_waypoint_position_reached = true; _waypoint_position_reached = true;
} }
} }

Loading…
Cancel
Save