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:
commit
3c5ea84863
10 changed files with 57 additions and 5 deletions
|
@ -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(¤tProfile->pidProfile);
|
navigationUsePIDs(¤tProfile->pidProfile);
|
||||||
navigationUseRcControlsConfig(¤tProfile->rcControlsConfig);
|
navigationUseRcControlsConfig(¤tProfile->rcControlsConfig);
|
||||||
navigationUseRxConfig(&masterConfig.rxConfig);
|
navigationUseRxConfig(&masterConfig.rxConfig);
|
||||||
|
navigationUseFlight3DConfig(&masterConfig.flight3DConfig);
|
||||||
navigationUseEscAndServoConfig(&masterConfig.escAndServoConfig);
|
navigationUseEscAndServoConfig(&masterConfig.escAndServoConfig);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*-----------------------------------------------------------
|
/*-----------------------------------------------------------
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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 },
|
||||||
|
|
|
@ -452,6 +452,7 @@ void init(void)
|
||||||
¤tProfile->pidProfile,
|
¤tProfile->pidProfile,
|
||||||
¤tProfile->rcControlsConfig,
|
¤tProfile->rcControlsConfig,
|
||||||
&masterConfig.rxConfig,
|
&masterConfig.rxConfig,
|
||||||
|
&masterConfig.flight3DConfig,
|
||||||
&masterConfig.escAndServoConfig
|
&masterConfig.escAndServoConfig
|
||||||
);
|
);
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue