1
0
Fork 0
mirror of https://github.com/iNavFlight/inav.git synced 2025-07-25 17:25:18 +03:00

Merge pull request #117 from iNavFlight/thr-mid-hover

NAV: Make altitude hold aware of throttle expo curve midpoint. Closes #105
This commit is contained in:
Konstantin Sharlaimov 2016-03-27 21:15:36 +10:00
commit 3c5ea84863
10 changed files with 57 additions and 5 deletions

View file

@ -216,6 +216,7 @@ void resetPidProfile(pidProfile_t *pidProfile)
void resetNavConfig(navConfig_t * navConfig) void resetNavConfig(navConfig_t * navConfig)
{ {
// Navigation flags // Navigation flags
navConfig->flags.use_thr_mid_for_althold = 1;
navConfig->flags.extra_arming_safety = 1; navConfig->flags.extra_arming_safety = 1;
navConfig->flags.user_control_mode = NAV_GPS_ATTI; navConfig->flags.user_control_mode = NAV_GPS_ATTI;
navConfig->flags.rth_alt_control_style = NAV_RTH_AT_LEAST_ALT; navConfig->flags.rth_alt_control_style = NAV_RTH_AT_LEAST_ALT;
@ -802,6 +803,7 @@ void activateConfig(void)
navigationUsePIDs(&currentProfile->pidProfile); navigationUsePIDs(&currentProfile->pidProfile);
navigationUseRcControlsConfig(&currentProfile->rcControlsConfig); navigationUseRcControlsConfig(&currentProfile->rcControlsConfig);
navigationUseRxConfig(&masterConfig.rxConfig); navigationUseRxConfig(&masterConfig.rxConfig);
navigationUseFlight3DConfig(&masterConfig.flight3DConfig);
navigationUseEscAndServoConfig(&masterConfig.escAndServoConfig); navigationUseEscAndServoConfig(&masterConfig.escAndServoConfig);
#endif #endif

View file

@ -252,7 +252,6 @@ static void ppmEdgeCallback(timerCCHandlerRec_t* cbRec, captureCompare_t capture
ppmDev.numChannels = ppmDev.pulseIndex; ppmDev.numChannels = ppmDev.pulseIndex;
} }
} else { } else {
debug[2]++;
ppmDev.stableFramesSeenCount = 0; ppmDev.stableFramesSeenCount = 0;
} }

View file

@ -2118,6 +2118,11 @@ void navigationUseRcControlsConfig(rcControlsConfig_t *initialRcControlsConfig)
posControl.rcControlsConfig = initialRcControlsConfig; posControl.rcControlsConfig = initialRcControlsConfig;
} }
void navigationUseFlight3DConfig(flight3DConfig_t * initialFlight3DConfig)
{
posControl.flight3DConfig = initialFlight3DConfig;
}
void navigationUseRxConfig(rxConfig_t * initialRxConfig) void navigationUseRxConfig(rxConfig_t * initialRxConfig)
{ {
posControl.rxConfig = initialRxConfig; posControl.rxConfig = initialRxConfig;
@ -2170,6 +2175,7 @@ void navigationInit(navConfig_t *initialnavConfig,
pidProfile_t *initialPidProfile, pidProfile_t *initialPidProfile,
rcControlsConfig_t *initialRcControlsConfig, rcControlsConfig_t *initialRcControlsConfig,
rxConfig_t * initialRxConfig, rxConfig_t * initialRxConfig,
flight3DConfig_t * initialFlight3DConfig,
escAndServoConfig_t * initialEscAndServoConfig) escAndServoConfig_t * initialEscAndServoConfig)
{ {
/* Initial state */ /* Initial state */
@ -2201,6 +2207,7 @@ void navigationInit(navConfig_t *initialnavConfig,
navigationUseRcControlsConfig(initialRcControlsConfig); navigationUseRcControlsConfig(initialRcControlsConfig);
navigationUseRxConfig(initialRxConfig); navigationUseRxConfig(initialRxConfig);
navigationUseEscAndServoConfig(initialEscAndServoConfig); navigationUseEscAndServoConfig(initialEscAndServoConfig);
navigationUseFlight3DConfig(initialFlight3DConfig);
} }
/*----------------------------------------------------------- /*-----------------------------------------------------------

View file

@ -26,6 +26,7 @@
#include "flight/pid.h" #include "flight/pid.h"
#include "flight/failsafe.h" #include "flight/failsafe.h"
#include "flight/mixer.h"
/* GPS Home location data */ /* GPS Home location data */
extern gpsLocation_t GPS_home; extern gpsLocation_t GPS_home;
@ -68,7 +69,7 @@ enum {
typedef struct navConfig_s { typedef struct navConfig_s {
struct { struct {
uint8_t __stub; // Don't remember throttle when althold was initiated, assume that throttle is at middle = zero climb rate uint8_t use_thr_mid_for_althold; // Don't remember throttle when althold was initiated, assume that throttle is at Thr Mid = zero climb rate
uint8_t extra_arming_safety; // Forcibly apply 100% throttle tilt compensation uint8_t extra_arming_safety; // Forcibly apply 100% throttle tilt compensation
uint8_t user_control_mode; // NAV_GPS_ATTI or NAV_GPS_CRUISE uint8_t user_control_mode; // NAV_GPS_ATTI or NAV_GPS_CRUISE
uint8_t rth_alt_control_style; // Controls how RTH controls altitude uint8_t rth_alt_control_style; // Controls how RTH controls altitude
@ -218,10 +219,12 @@ void navigationUseConfig(navConfig_t *navConfigToUse);
void navigationUseRcControlsConfig(rcControlsConfig_t *initialRcControlsConfig); void navigationUseRcControlsConfig(rcControlsConfig_t *initialRcControlsConfig);
void navigationUseRxConfig(rxConfig_t * initialRxConfig); void navigationUseRxConfig(rxConfig_t * initialRxConfig);
void navigationUseEscAndServoConfig(escAndServoConfig_t * initialEscAndServoConfig); void navigationUseEscAndServoConfig(escAndServoConfig_t * initialEscAndServoConfig);
void navigationUseFlight3DConfig(flight3DConfig_t * initialFlight3DConfig);
void navigationInit(navConfig_t *initialnavConfig, void navigationInit(navConfig_t *initialnavConfig,
pidProfile_t *initialPidProfile, pidProfile_t *initialPidProfile,
rcControlsConfig_t *initialRcControlsConfig, rcControlsConfig_t *initialRcControlsConfig,
rxConfig_t * initialRxConfig, rxConfig_t * initialRxConfig,
flight3DConfig_t * initialFlight3DConfig,
escAndServoConfig_t * initialEscAndServoConfig); escAndServoConfig_t * initialEscAndServoConfig);
/* Navigation system updates */ /* Navigation system updates */

View file

@ -35,6 +35,10 @@
#include "sensors/acceleration.h" #include "sensors/acceleration.h"
#include "sensors/boardalignment.h" #include "sensors/boardalignment.h"
#include "io/escservo.h"
#include "io/rc_controls.h"
#include "io/rc_curves.h"
#include "flight/pid.h" #include "flight/pid.h"
#include "flight/imu.h" #include "flight/imu.h"
#include "flight/navigation_rewrite.h" #include "flight/navigation_rewrite.h"
@ -55,6 +59,7 @@ extern int16_t magHold;
* Altitude controller for multicopter aircraft * Altitude controller for multicopter aircraft
*-----------------------------------------------------------*/ *-----------------------------------------------------------*/
static int16_t rcCommandAdjustedThrottle; static int16_t rcCommandAdjustedThrottle;
static int16_t altHoldThrottleRCZero = 1500;
static filterStatePt1_t altholdThrottleFilterState; static filterStatePt1_t altholdThrottleFilterState;
/* Calculate global altitude setpoint based on surface setpoint */ /* Calculate global altitude setpoint based on surface setpoint */
@ -99,10 +104,21 @@ static void updateAltitudeThrottleController_MC(uint32_t deltaMicros)
bool adjustMulticopterAltitudeFromRCInput(void) bool adjustMulticopterAltitudeFromRCInput(void)
{ {
int16_t rcThrottleAdjustment = rcCommand[THROTTLE] - posControl.rxConfig->midrc; int16_t rcThrottleAdjustment = rcCommand[THROTTLE] - altHoldThrottleRCZero;
if (ABS(rcThrottleAdjustment) > posControl.rcControlsConfig->alt_hold_deadband) { if (ABS(rcThrottleAdjustment) > posControl.rcControlsConfig->alt_hold_deadband) {
// set velocity proportional to stick movement // set velocity proportional to stick movement
float rcClimbRate = rcThrottleAdjustment * posControl.navConfig->max_manual_climb_rate / 500; float rcClimbRate;
// Make sure we can satisfy max_manual_climb_rate in both up and down directions
if (rcThrottleAdjustment > 0) {
// Scaling from altHoldThrottleRCZero to maxthrottle
rcClimbRate = rcThrottleAdjustment * posControl.navConfig->max_manual_climb_rate / (posControl.escAndServoConfig->maxthrottle - altHoldThrottleRCZero);
}
else {
// Scaling from minthrottle to altHoldThrottleRCZero
rcClimbRate = rcThrottleAdjustment * posControl.navConfig->max_manual_climb_rate / (altHoldThrottleRCZero - posControl.escAndServoConfig->minthrottle);
}
updateAltitudeTargetFromClimbRate(rcClimbRate); updateAltitudeTargetFromClimbRate(rcClimbRate);
return true; return true;
@ -120,6 +136,24 @@ bool adjustMulticopterAltitudeFromRCInput(void)
void setupMulticopterAltitudeController(void) void setupMulticopterAltitudeController(void)
{ {
// Nothing here // Nothing here
if (posControl.navConfig->flags.use_thr_mid_for_althold) {
altHoldThrottleRCZero = lookupThrottleRCMid;
}
else {
// If throttle status is THROTTLE_LOW - use Thr Mid anyway
throttleStatus_e throttleStatus = calculateThrottleStatus(posControl.rxConfig, posControl.flight3DConfig->deadband3d_throttle);
if (throttleStatus == THROTTLE_LOW) {
altHoldThrottleRCZero = lookupThrottleRCMid;
}
else {
altHoldThrottleRCZero = rcCommand[THROTTLE];
}
}
// Make sure we are able to satisfy the deadband
altHoldThrottleRCZero = constrain(altHoldThrottleRCZero,
posControl.escAndServoConfig->minthrottle + posControl.rcControlsConfig->alt_hold_deadband + 10,
posControl.escAndServoConfig->maxthrottle - posControl.rcControlsConfig->alt_hold_deadband - 10);
} }
void resetMulticopterAltitudeController() void resetMulticopterAltitudeController()

View file

@ -62,6 +62,7 @@ typedef struct navigationFlags_s {
// Behaviour modifiers // Behaviour modifiers
bool isGCSAssistedNavigationEnabled; // Does iNav accept WP#255 - follow-me etc. bool isGCSAssistedNavigationEnabled; // Does iNav accept WP#255 - follow-me etc.
//bool isTerrainFollowEnabled; // Does iNav use sonar for terrain following (adjusting baro altitude target according to sonar readings)
bool forcedRTHActivated; bool forcedRTHActivated;
} navigationFlags_t; } navigationFlags_t;
@ -259,6 +260,7 @@ typedef struct {
rcControlsConfig_t * rcControlsConfig; rcControlsConfig_t * rcControlsConfig;
pidProfile_t * pidProfile; pidProfile_t * pidProfile;
rxConfig_t * rxConfig; rxConfig_t * rxConfig;
flight3DConfig_t * flight3DConfig;
escAndServoConfig_t * escAndServoConfig; escAndServoConfig_t * escAndServoConfig;
} navigationPosControl_t; } navigationPosControl_t;

View file

@ -27,7 +27,7 @@
int16_t lookupPitchRollRC[PITCH_LOOKUP_LENGTH]; // lookup table for expo & RC rate PITCH+ROLL int16_t lookupPitchRollRC[PITCH_LOOKUP_LENGTH]; // lookup table for expo & RC rate PITCH+ROLL
int16_t lookupYawRC[YAW_LOOKUP_LENGTH]; // lookup table for expo & RC rate YAW int16_t lookupYawRC[YAW_LOOKUP_LENGTH]; // lookup table for expo & RC rate YAW
int16_t lookupThrottleRC[THROTTLE_LOOKUP_LENGTH]; // lookup table for expo & mid THROTTLE int16_t lookupThrottleRC[THROTTLE_LOOKUP_LENGTH]; // lookup table for expo & mid THROTTLE
int16_t lookupThrottleRCMid; // THROTTLE curve mid point
void generatePitchRollCurve(controlRateConfig_t *controlRateConfig) void generatePitchRollCurve(controlRateConfig_t *controlRateConfig)
{ {
@ -49,6 +49,8 @@ void generateThrottleCurve(controlRateConfig_t *controlRateConfig, escAndServoCo
{ {
uint8_t i; uint8_t i;
lookupThrottleRCMid = escAndServoConfig->minthrottle + (int32_t)(escAndServoConfig->maxthrottle - escAndServoConfig->minthrottle) * controlRateConfig->thrMid8 / 100; // [MINTHROTTLE;MAXTHROTTLE]
for (i = 0; i < THROTTLE_LOOKUP_LENGTH; i++) { for (i = 0; i < THROTTLE_LOOKUP_LENGTH; i++) {
int16_t tmp = 10 * i - controlRateConfig->thrMid8; int16_t tmp = 10 * i - controlRateConfig->thrMid8;
uint8_t y = 1; uint8_t y = 1;

View file

@ -23,6 +23,7 @@
extern int16_t lookupPitchRollRC[PITCH_LOOKUP_LENGTH]; // lookup table for expo & RC rate PITCH+ROLL extern int16_t lookupPitchRollRC[PITCH_LOOKUP_LENGTH]; // lookup table for expo & RC rate PITCH+ROLL
extern int16_t lookupYawRC[YAW_LOOKUP_LENGTH]; // lookup table for expo & RC rate YAW extern int16_t lookupYawRC[YAW_LOOKUP_LENGTH]; // lookup table for expo & RC rate YAW
extern int16_t lookupThrottleRC[THROTTLE_LOOKUP_LENGTH]; // lookup table for expo & mid THROTTLE extern int16_t lookupThrottleRC[THROTTLE_LOOKUP_LENGTH]; // lookup table for expo & mid THROTTLE
extern int16_t lookupThrottleRCMid; // THROTTLE curve mid
void generatePitchRollCurve(controlRateConfig_t *controlRateConfig); void generatePitchRollCurve(controlRateConfig_t *controlRateConfig);
void generateYawCurve(controlRateConfig_t *controlRateConfig); void generateYawCurve(controlRateConfig_t *controlRateConfig);

View file

@ -586,6 +586,7 @@ const clivalue_t valueTable[] = {
{ "inav_max_eph_epv", VAR_FLOAT | MASTER_VALUE, &masterConfig.navConfig.inav.max_eph_epv, .config.minmax = { 0, 9999 }, 0 }, { "inav_max_eph_epv", VAR_FLOAT | MASTER_VALUE, &masterConfig.navConfig.inav.max_eph_epv, .config.minmax = { 0, 9999 }, 0 },
{ "inav_baro_epv", VAR_FLOAT | MASTER_VALUE, &masterConfig.navConfig.inav.baro_epv, .config.minmax = { 0, 9999 }, 0 }, { "inav_baro_epv", VAR_FLOAT | MASTER_VALUE, &masterConfig.navConfig.inav.baro_epv, .config.minmax = { 0, 9999 }, 0 },
{ "nav_use_midthr_for_althold", VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, &masterConfig.navConfig.flags.use_thr_mid_for_althold, .config.lookup = { TABLE_OFF_ON }, 0 },
{ "nav_extra_arming_safety", VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, &masterConfig.navConfig.flags.extra_arming_safety, .config.lookup = { TABLE_OFF_ON }, 0 }, { "nav_extra_arming_safety", VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, &masterConfig.navConfig.flags.extra_arming_safety, .config.lookup = { TABLE_OFF_ON }, 0 },
{ "nav_user_control_mode", VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, &masterConfig.navConfig.flags.user_control_mode, .config.lookup = { TABLE_NAV_USER_CTL_MODE }, 0 }, { "nav_user_control_mode", VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, &masterConfig.navConfig.flags.user_control_mode, .config.lookup = { TABLE_NAV_USER_CTL_MODE }, 0 },
{ "nav_position_timeout", VAR_UINT8 | MASTER_VALUE, &masterConfig.navConfig.pos_failure_timeout, .config.minmax = { 0, 10 }, 0 }, { "nav_position_timeout", VAR_UINT8 | MASTER_VALUE, &masterConfig.navConfig.pos_failure_timeout, .config.minmax = { 0, 10 }, 0 },

View file

@ -452,6 +452,7 @@ void init(void)
&currentProfile->pidProfile, &currentProfile->pidProfile,
&currentProfile->rcControlsConfig, &currentProfile->rcControlsConfig,
&masterConfig.rxConfig, &masterConfig.rxConfig,
&masterConfig.flight3DConfig,
&masterConfig.escAndServoConfig &masterConfig.escAndServoConfig
); );
#endif #endif