mirror of
https://github.com/ArduPilot/ardupilot
synced 2025-02-27 02:04:00 -04:00
AC_WPNav: add angle limits and set from AC's throttle controller
This commit is contained in:
parent
afd2f82768
commit
f82ce449d7
@ -1075,6 +1075,10 @@ get_throttle_rate(int16_t z_target_speed)
|
|||||||
set_throttle_out(g.throttle_cruise+output, true);
|
set_throttle_out(g.throttle_cruise+output, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// limit loiter & waypoint navigation from causing too much lean
|
||||||
|
// To-Do: ensure that this limit is cleared when this throttle controller is not running so that loiter is not left constrained for Position mode
|
||||||
|
wp_nav.set_angle_limit(4500 - constrain((z_rate_error - 100) * 10, 0, 3500));
|
||||||
|
|
||||||
// update throttle cruise
|
// update throttle cruise
|
||||||
// TO-DO: this may not be correct because g.rc_3.servo_out has not been updated for this iteration
|
// TO-DO: this may not be correct because g.rc_3.servo_out has not been updated for this iteration
|
||||||
if( z_target_speed == 0 ) {
|
if( z_target_speed == 0 ) {
|
||||||
|
@ -448,6 +448,7 @@ static void set_mode(uint8_t mode)
|
|||||||
set_roll_pitch_mode(POSITION_RP);
|
set_roll_pitch_mode(POSITION_RP);
|
||||||
set_throttle_mode(POSITION_THR);
|
set_throttle_mode(POSITION_THR);
|
||||||
set_nav_mode(POSITION_NAV);
|
set_nav_mode(POSITION_NAV);
|
||||||
|
wp_nav.clear_angle_limit(); // ensure there are no left over angle limits from throttle controller. To-Do: move this to the exit routine of throttle controller
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GUIDED:
|
case GUIDED:
|
||||||
|
@ -26,7 +26,8 @@ AC_WPNav::AC_WPNav(AP_InertialNav* inav, APM_PI* pid_pos_lat, APM_PI* pid_pos_lo
|
|||||||
_pid_pos_lat(pid_pos_lat),
|
_pid_pos_lat(pid_pos_lat),
|
||||||
_pid_pos_lon(pid_pos_lon),
|
_pid_pos_lon(pid_pos_lon),
|
||||||
_pid_rate_lat(pid_rate_lat),
|
_pid_rate_lat(pid_rate_lat),
|
||||||
_pid_rate_lon(pid_rate_lon)
|
_pid_rate_lon(pid_rate_lon),
|
||||||
|
_lean_angle_max(MAX_LEAN_ANGLE)
|
||||||
{
|
{
|
||||||
AP_Param::setup_object_defaults(this, var_info);
|
AP_Param::setup_object_defaults(this, var_info);
|
||||||
}
|
}
|
||||||
@ -340,8 +341,8 @@ void AC_WPNav::get_loiter_accel_lat_lon(int16_t accel_lat, int16_t accel_lon)
|
|||||||
accel_right = -accel_lat*_sin_yaw + accel_lon*_cos_yaw;
|
accel_right = -accel_lat*_sin_yaw + accel_lon*_cos_yaw;
|
||||||
|
|
||||||
// update angle targets that will be passed to stabilize controller
|
// update angle targets that will be passed to stabilize controller
|
||||||
_desired_roll = constrain((accel_right/(-z_accel_meas))*(18000/M_PI), -4500, 4500);
|
_desired_roll = constrain((accel_right/(-z_accel_meas))*(18000/M_PI), -_lean_angle_max, _lean_angle_max);
|
||||||
_desired_pitch = constrain((-accel_forward/(-z_accel_meas*_cos_roll))*(18000/M_PI), -4500, 4500);
|
_desired_pitch = constrain((-accel_forward/(-z_accel_meas*_cos_roll))*(18000/M_PI), -_lean_angle_max, _lean_angle_max);
|
||||||
}
|
}
|
||||||
|
|
||||||
// get_bearing_cd - return bearing in centi-degrees between two positions
|
// get_bearing_cd - return bearing in centi-degrees between two positions
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
#define MAX_LOITER_OVERSHOOT 1000 // maximum distance (in cm) that we will allow the target loiter point to be from the current location when switching into loiter
|
#define MAX_LOITER_OVERSHOOT 1000 // maximum distance (in cm) that we will allow the target loiter point to be from the current location when switching into loiter
|
||||||
#define WPINAV_MAX_POS_ERROR 2000.0f // maximum distance (in cm) that the desired track can stray from our current location.
|
#define WPINAV_MAX_POS_ERROR 2000.0f // maximum distance (in cm) that the desired track can stray from our current location.
|
||||||
#define WP_SPEED 500 // default horizontal speed betwen waypoints in cm/s
|
#define WP_SPEED 500 // default horizontal speed betwen waypoints in cm/s
|
||||||
|
#define MAX_LEAN_ANGLE 4500 // default maximum lean angle
|
||||||
|
|
||||||
class AC_WPNav
|
class AC_WPNav
|
||||||
{
|
{
|
||||||
@ -53,6 +54,15 @@ public:
|
|||||||
/// update_loiter - run the loiter controller - should be called at 10hz
|
/// update_loiter - run the loiter controller - should be called at 10hz
|
||||||
void update_loiter();
|
void update_loiter();
|
||||||
|
|
||||||
|
/// set_angle_limit - limits maximum angle in centi-degrees the copter will lean
|
||||||
|
void set_angle_limit(int32_t lean_angle) { _lean_angle_max = lean_angle; }
|
||||||
|
|
||||||
|
/// clear_angle_limit - reset angle limits back to defaults
|
||||||
|
void clear_angle_limit() { _lean_angle_max = MAX_LEAN_ANGLE; }
|
||||||
|
|
||||||
|
/// get_angle_limit - retrieve maximum angle in centi-degrees the copter will lean
|
||||||
|
int32_t get_angle_limit() { return _lean_angle_max; }
|
||||||
|
|
||||||
///
|
///
|
||||||
/// waypoint navigation
|
/// waypoint navigation
|
||||||
///
|
///
|
||||||
@ -145,6 +155,8 @@ protected:
|
|||||||
int32_t _desired_pitch; // fed to stabilize controllers at 50hz
|
int32_t _desired_pitch; // fed to stabilize controllers at 50hz
|
||||||
int32_t _desired_altitude; // fed to alt hold controller at 50hz
|
int32_t _desired_altitude; // fed to alt hold controller at 50hz
|
||||||
|
|
||||||
|
int32_t _lean_angle_max; // maximum lean angle. can we set from main code so that throttle controller can stop leans that cause copter to lose altitude
|
||||||
|
|
||||||
// internal variables
|
// internal variables
|
||||||
Vector3f _target; // loiter's target location in cm from home
|
Vector3f _target; // loiter's target location in cm from home
|
||||||
Vector3f _origin; // starting point of trip to next waypoint in cm from home (equivalent to next_WP)
|
Vector3f _origin; // starting point of trip to next waypoint in cm from home (equivalent to next_WP)
|
||||||
|
Loading…
Reference in New Issue
Block a user