AC_WPNav: recalc leash lengths if set_horizontal_velocity is called
Resolves bug in which do-set-speed allowed reducing the speed during the mission but not increasing it. Slow down distance is also recalculated. Unnecessary call to calc_wp_leash_length removed from set_spline_origin_and_destination.
This commit is contained in:
parent
46fba47c8e
commit
ad99918fee
@ -271,6 +271,8 @@ void AC_WPNav::set_horizontal_velocity(float velocity_cms)
|
|||||||
if (_wp_speed_cms >= WPNAV_WP_SPEED_MIN) {
|
if (_wp_speed_cms >= WPNAV_WP_SPEED_MIN) {
|
||||||
_wp_speed_cms = velocity_cms;
|
_wp_speed_cms = velocity_cms;
|
||||||
_pos_control.set_speed_xy(_wp_speed_cms);
|
_pos_control.set_speed_xy(_wp_speed_cms);
|
||||||
|
// flag that wp leash must be recalculated
|
||||||
|
_flags.recalc_wp_leash = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -335,11 +337,7 @@ void AC_WPNav::set_wp_origin_and_destination(const Vector3f& origin, const Vecto
|
|||||||
_track_desired = 0; // target is at beginning of track
|
_track_desired = 0; // target is at beginning of track
|
||||||
_flags.reached_destination = false;
|
_flags.reached_destination = false;
|
||||||
_flags.fast_waypoint = false; // default waypoint back to slow
|
_flags.fast_waypoint = false; // default waypoint back to slow
|
||||||
|
|
||||||
// calculate slow down distance (the distance from the destination when the target point should begin to slow down)
|
|
||||||
_flags.slowing_down = false; // target is not slowing down yet
|
_flags.slowing_down = false; // target is not slowing down yet
|
||||||
calc_slow_down_distance(_wp_speed_cms, _wp_accel_cms);
|
|
||||||
|
|
||||||
_flags.segment_type = SEGMENT_STRAIGHT;
|
_flags.segment_type = SEGMENT_STRAIGHT;
|
||||||
|
|
||||||
// initialise the limited speed to current speed along the track
|
// initialise the limited speed to current speed along the track
|
||||||
@ -511,6 +509,19 @@ void AC_WPNav::update_wpnav()
|
|||||||
}else{
|
}else{
|
||||||
// run horizontal position controller
|
// run horizontal position controller
|
||||||
_pos_control.update_xy_controller(false);
|
_pos_control.update_xy_controller(false);
|
||||||
|
|
||||||
|
// check if leash lengths need updating
|
||||||
|
check_wp_leash_length();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// check_wp_leash_length - check if waypoint leash lengths need to be recalculated
|
||||||
|
// should be called after _pos_control.update_xy_controller which may have changed the position controller leash lengths
|
||||||
|
void AC_WPNav::check_wp_leash_length()
|
||||||
|
{
|
||||||
|
// exit immediately if recalc is not required
|
||||||
|
if (_flags.recalc_wp_leash) {
|
||||||
|
calculate_wp_leash_length();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -549,6 +560,12 @@ void AC_WPNav::calculate_wp_leash_length()
|
|||||||
_track_speed = min(speed_z/pos_delta_unit_z, _wp_speed_cms/pos_delta_unit_xy);
|
_track_speed = min(speed_z/pos_delta_unit_z, _wp_speed_cms/pos_delta_unit_xy);
|
||||||
_track_leash_length = min(leash_z/pos_delta_unit_z, _pos_control.get_leash_xy()/pos_delta_unit_xy);
|
_track_leash_length = min(leash_z/pos_delta_unit_z, _pos_control.get_leash_xy()/pos_delta_unit_xy);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// calculate slow down distance (the distance from the destination when the target point should begin to slow down)
|
||||||
|
calc_slow_down_distance(_track_speed, _track_accel);
|
||||||
|
|
||||||
|
// set recalc leash flag to false
|
||||||
|
_flags.recalc_wp_leash = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
///
|
///
|
||||||
@ -673,9 +690,6 @@ void AC_WPNav::set_spline_origin_and_destination(const Vector3f& origin, const V
|
|||||||
_pos_control.calc_leash_length_xy();
|
_pos_control.calc_leash_length_xy();
|
||||||
_pos_control.calc_leash_length_z();
|
_pos_control.calc_leash_length_z();
|
||||||
|
|
||||||
// calculate leash lengths
|
|
||||||
calculate_wp_leash_length();
|
|
||||||
|
|
||||||
// calculate slow down distance
|
// calculate slow down distance
|
||||||
calc_slow_down_distance(_wp_speed_cms, _wp_accel_cms);
|
calc_slow_down_distance(_wp_speed_cms, _wp_accel_cms);
|
||||||
|
|
||||||
|
@ -131,6 +131,10 @@ public:
|
|||||||
/// update_wpnav - run the wp controller - should be called at 100hz or higher
|
/// update_wpnav - run the wp controller - should be called at 100hz or higher
|
||||||
void update_wpnav();
|
void update_wpnav();
|
||||||
|
|
||||||
|
// check_wp_leash_length - check recalc_wp_leash flag and calls calculate_wp_leash_length() if necessary
|
||||||
|
// should be called after _pos_control.update_xy_controller which may have changed the position controller leash lengths
|
||||||
|
void check_wp_leash_length();
|
||||||
|
|
||||||
/// calculate_wp_leash_length - calculates track speed, acceleration and leash lengths for waypoint controller
|
/// calculate_wp_leash_length - calculates track speed, acceleration and leash lengths for waypoint controller
|
||||||
void calculate_wp_leash_length();
|
void calculate_wp_leash_length();
|
||||||
|
|
||||||
@ -202,6 +206,7 @@ protected:
|
|||||||
uint8_t reached_destination : 1; // true if we have reached the destination
|
uint8_t reached_destination : 1; // true if we have reached the destination
|
||||||
uint8_t fast_waypoint : 1; // true if we should ignore the waypoint radius and consider the waypoint complete once the intermediate target has reached the waypoint
|
uint8_t fast_waypoint : 1; // true if we should ignore the waypoint radius and consider the waypoint complete once the intermediate target has reached the waypoint
|
||||||
uint8_t slowing_down : 1; // true when target point is slowing down before reaching the destination
|
uint8_t slowing_down : 1; // true when target point is slowing down before reaching the destination
|
||||||
|
uint8_t recalc_wp_leash : 1; // true if we need to recalculate the leash lengths because of changes in speed or acceleration
|
||||||
SegmentType segment_type : 1; // active segment is either straight or spline
|
SegmentType segment_type : 1; // active segment is either straight or spline
|
||||||
} _flags;
|
} _flags;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user