mirror of
https://github.com/iNavFlight/inav.git
synced 2025-07-25 17:25:18 +03:00
FW: Increase default banking angle to 30 deg, add 'nav_fw_loiter_radius' parameter (cm) to control the radius of a circle in PH/RTH modes
This commit is contained in:
parent
fbeff0a1be
commit
d3f2df499d
4 changed files with 9 additions and 7 deletions
|
@ -258,18 +258,19 @@ void resetNavConfig(navConfig_t * navConfig)
|
|||
navConfig->rth_altitude = 1000; // 10m
|
||||
|
||||
// MC-specific
|
||||
navConfig->mc_max_bank_angle = 30;
|
||||
navConfig->mc_max_bank_angle = 30; // 30 deg
|
||||
navConfig->mc_hover_throttle = 1500;
|
||||
navConfig->mc_min_fly_throttle = 1200;
|
||||
|
||||
// Fixed wing
|
||||
navConfig->fw_max_bank_angle = 20;
|
||||
navConfig->fw_max_climb_angle = 15;
|
||||
navConfig->fw_max_bank_angle = 30; // 30 deg
|
||||
navConfig->fw_max_climb_angle = 20;
|
||||
navConfig->fw_max_dive_angle = 15;
|
||||
navConfig->fw_cruise_throttle = 1500;
|
||||
navConfig->fw_max_throttle = 1900;
|
||||
navConfig->fw_min_throttle = 1300;
|
||||
navConfig->fw_pitch_to_throttle = 20;
|
||||
navConfig->fw_loiter_radius = 3000; // 30m
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
@ -125,6 +125,7 @@ typedef struct navConfig_s {
|
|||
uint8_t fw_max_climb_angle; // Fixed wing max banking angle (deg)
|
||||
uint8_t fw_max_dive_angle; // Fixed wing max banking angle (deg)
|
||||
uint8_t fw_pitch_to_throttle; // Pitch angle (in deg) to throttle gain (in 1/1000's of throttle) (*10)
|
||||
uint16_t fw_loiter_radius; // Loiter radius when executing PH on a fixed wing
|
||||
} navConfig_t;
|
||||
|
||||
typedef struct gpsOrigin_s {
|
||||
|
|
|
@ -198,17 +198,16 @@ static void calculateVirtualPositionTarget_FW(float trackingPeriod)
|
|||
// If angular visibility of a waypoint is less than 30deg, don't calculate circular loiter, go straight to the target
|
||||
#define TAN_15DEG 0.26795f
|
||||
bool needToCalculateCircularLoiter = isApproachingLastWaypoint()
|
||||
&& (distanceToActualTarget <= (posControl.navConfig->waypoint_radius / TAN_15DEG))
|
||||
&& (distanceToActualTarget <= (posControl.navConfig->fw_loiter_radius / TAN_15DEG))
|
||||
&& (distanceToActualTarget > 50.0f);
|
||||
|
||||
// Calculate virtual position for straight movement
|
||||
if (needToCalculateCircularLoiter) {
|
||||
// We are closing in on a waypoint, calculate circular loiter
|
||||
float loiterRadius = posControl.navConfig->waypoint_radius * 0.9f;
|
||||
float loiterAngle = atan2_approx(-posErrorY, -posErrorX) + DEGREES_TO_RADIANS(45.0f);
|
||||
|
||||
float loiterTargetX = posControl.desiredState.pos.V.X + loiterRadius * cos_approx(loiterAngle);
|
||||
float loiterTargetY = posControl.desiredState.pos.V.Y + loiterRadius * sin_approx(loiterAngle);
|
||||
float loiterTargetX = posControl.desiredState.pos.V.X + posControl.navConfig->fw_loiter_radius * cos_approx(loiterAngle);
|
||||
float loiterTargetY = posControl.desiredState.pos.V.Y + posControl.navConfig->fw_loiter_radius * sin_approx(loiterAngle);
|
||||
|
||||
// We have temporary loiter target. Recalculate distance and position error
|
||||
posErrorX = loiterTargetX - posControl.actualState.pos.V.X;
|
||||
|
|
|
@ -599,6 +599,7 @@ const clivalue_t valueTable[] = {
|
|||
{ "nav_fw_climb_angle", VAR_UINT8 | MASTER_VALUE, &masterConfig.navConfig.fw_max_climb_angle, .config.minmax = { 5, 45 }, 0 },
|
||||
{ "nav_fw_dive_angle", VAR_UINT8 | MASTER_VALUE, &masterConfig.navConfig.fw_max_dive_angle, .config.minmax = { 5, 45 }, 0 },
|
||||
{ "nav_fw_pitch2thr", VAR_UINT8 | MASTER_VALUE, &masterConfig.navConfig.fw_pitch_to_throttle, .config.minmax = { 0, 100 }, 0 },
|
||||
{ "nav_fw_loiter_radius", VAR_UINT16 | MASTER_VALUE, &masterConfig.navConfig.fw_loiter_radius, .config.minmax = { 0, 10000 }, 0 },
|
||||
#endif
|
||||
|
||||
{ "serialrx_provider", VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, &masterConfig.rxConfig.serialrx_provider, .config.lookup = { TABLE_SERIAL_RX }, 0 },
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue