|
|
@ -132,6 +132,7 @@ void AC_Avoid::adjust_velocity_fence(float kP, float accel_cmss, Vector3f &desir |
|
|
|
// maximum component of desired backup velocity in each quadrant
|
|
|
|
// maximum component of desired backup velocity in each quadrant
|
|
|
|
Vector2f quad_1_back_vel, quad_2_back_vel, quad_3_back_vel, quad_4_back_vel; |
|
|
|
Vector2f quad_1_back_vel, quad_2_back_vel, quad_3_back_vel, quad_4_back_vel; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#if AC_FENCE |
|
|
|
if ((_enabled & AC_AVOID_STOP_AT_FENCE) > 0) { |
|
|
|
if ((_enabled & AC_AVOID_STOP_AT_FENCE) > 0) { |
|
|
|
// Store velocity needed to back away from fence
|
|
|
|
// Store velocity needed to back away from fence
|
|
|
|
Vector2f backup_vel_fence; |
|
|
|
Vector2f backup_vel_fence; |
|
|
@ -152,6 +153,7 @@ void AC_Avoid::adjust_velocity_fence(float kP, float accel_cmss, Vector3f &desir |
|
|
|
adjust_velocity_exclusion_circles(kP, accel_cmss_limited, desired_velocity_xy_cms, backup_vel_fence, dt); |
|
|
|
adjust_velocity_exclusion_circles(kP, accel_cmss_limited, desired_velocity_xy_cms, backup_vel_fence, dt); |
|
|
|
find_max_quadrant_velocity(backup_vel_fence, quad_1_back_vel, quad_2_back_vel, quad_3_back_vel, quad_4_back_vel); |
|
|
|
find_max_quadrant_velocity(backup_vel_fence, quad_1_back_vel, quad_2_back_vel, quad_3_back_vel, quad_4_back_vel); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
#endif // AP_FENCE_ENABLED
|
|
|
|
|
|
|
|
|
|
|
|
if ((_enabled & AC_AVOID_STOP_AT_BEACON_FENCE) > 0) { |
|
|
|
if ((_enabled & AC_AVOID_STOP_AT_BEACON_FENCE) > 0) { |
|
|
|
// Store velocity needed to back away from beacon fence
|
|
|
|
// Store velocity needed to back away from beacon fence
|
|
|
@ -363,6 +365,7 @@ void AC_Avoid::adjust_velocity_z(float kP, float accel_cmss, float& climb_rate_c |
|
|
|
|
|
|
|
|
|
|
|
const AP_AHRS &_ahrs = AP::ahrs(); |
|
|
|
const AP_AHRS &_ahrs = AP::ahrs(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#if AC_FENCE |
|
|
|
// calculate distance below fence
|
|
|
|
// calculate distance below fence
|
|
|
|
AC_Fence *fence = AP::fence(); |
|
|
|
AC_Fence *fence = AP::fence(); |
|
|
|
if ((_enabled & AC_AVOID_STOP_AT_FENCE) > 0 && fence && (fence->get_enabled_fences() & AC_FENCE_TYPE_ALT_MAX) > 0) { |
|
|
|
if ((_enabled & AC_AVOID_STOP_AT_FENCE) > 0 && fence && (fence->get_enabled_fences() & AC_FENCE_TYPE_ALT_MAX) > 0) { |
|
|
@ -373,6 +376,7 @@ void AC_Avoid::adjust_velocity_z(float kP, float accel_cmss, float& climb_rate_c |
|
|
|
alt_diff = fence->get_safe_alt_max() + veh_alt; |
|
|
|
alt_diff = fence->get_safe_alt_max() + veh_alt; |
|
|
|
limit_alt = true; |
|
|
|
limit_alt = true; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
// calculate distance to (e.g.) optical flow altitude limit
|
|
|
|
// calculate distance to (e.g.) optical flow altitude limit
|
|
|
|
// AHRS values are always in metres
|
|
|
|
// AHRS values are always in metres
|
|
|
@ -657,6 +661,8 @@ float AC_Avoid::get_max_speed(float kP, float accel_cmss, float distance_cm, flo |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#if AC_FENCE |
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
/*
|
|
|
|
* Adjusts the desired velocity for the circular fence. |
|
|
|
* Adjusts the desired velocity for the circular fence. |
|
|
|
*/ |
|
|
|
*/ |
|
|
@ -1080,6 +1086,7 @@ void AC_Avoid::adjust_velocity_exclusion_circles(float kP, float accel_cmss, Vec |
|
|
|
// desired backup velocity is sum of maximum velocity component in each quadrant
|
|
|
|
// desired backup velocity is sum of maximum velocity component in each quadrant
|
|
|
|
backup_vel = quad_1_back_vel + quad_2_back_vel + quad_3_back_vel + quad_4_back_vel; |
|
|
|
backup_vel = quad_1_back_vel + quad_2_back_vel + quad_3_back_vel + quad_4_back_vel; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
#endif // AC_FENCE
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
/*
|
|
|
|
* Adjusts the desired velocity for the beacon fence. |
|
|
|
* Adjusts the desired velocity for the beacon fence. |
|
|
@ -1102,9 +1109,11 @@ void AC_Avoid::adjust_velocity_beacon_fence(float kP, float accel_cmss, Vector2f |
|
|
|
|
|
|
|
|
|
|
|
// adjust velocity using beacon
|
|
|
|
// adjust velocity using beacon
|
|
|
|
float margin = 0; |
|
|
|
float margin = 0; |
|
|
|
|
|
|
|
#if AC_FENCE |
|
|
|
if (AP::fence()) { |
|
|
|
if (AP::fence()) { |
|
|
|
margin = AP::fence()->get_margin(); |
|
|
|
margin = AP::fence()->get_margin(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
#endif |
|
|
|
adjust_velocity_polygon(kP, accel_cmss, desired_vel_cms, backup_vel, boundary, num_points, margin, dt, true); |
|
|
|
adjust_velocity_polygon(kP, accel_cmss, desired_vel_cms, backup_vel, boundary, num_points, margin, dt, true); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|