mirror of https://github.com/ArduPilot/ardupilot
ArduPlane: add terrain follow disable switch for CRUISE/FBWB
This commit is contained in:
parent
b84b6b52b3
commit
4115603f13
|
@ -785,6 +785,10 @@ private:
|
||||||
// soaring mode-change timer
|
// soaring mode-change timer
|
||||||
uint32_t soaring_mode_timer;
|
uint32_t soaring_mode_timer;
|
||||||
|
|
||||||
|
// terrain disable for non AUTO modes, set with an RC Option switch
|
||||||
|
bool non_auto_terrain_disable;
|
||||||
|
bool terrain_disabled();
|
||||||
|
|
||||||
// Attitude.cpp
|
// Attitude.cpp
|
||||||
void adjust_nav_pitch_throttle(void);
|
void adjust_nav_pitch_throttle(void);
|
||||||
void update_load_factor(void);
|
void update_load_factor(void);
|
||||||
|
|
|
@ -110,6 +110,10 @@ void RC_Channel_Plane::init_aux_function(const RC_Channel::aux_func_t ch_option,
|
||||||
// want to startup with reverse thrust
|
// want to startup with reverse thrust
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case AUX_FUNC::TER_DISABLE:
|
||||||
|
do_aux_function(ch_option, ch_flag);
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
// handle in parent class
|
// handle in parent class
|
||||||
RC_Channel::init_aux_function(ch_option, ch_flag);
|
RC_Channel::init_aux_function(ch_option, ch_flag);
|
||||||
|
@ -168,6 +172,27 @@ void RC_Channel_Plane::do_aux_function(const aux_func_t ch_option, const AuxSwit
|
||||||
case AUX_FUNC::FWD_THR:
|
case AUX_FUNC::FWD_THR:
|
||||||
break; // VTOL forward throttle input label, nothing to do
|
break; // VTOL forward throttle input label, nothing to do
|
||||||
|
|
||||||
|
case AUX_FUNC::TER_DISABLE:
|
||||||
|
switch (ch_flag) {
|
||||||
|
case AuxSwitchPos::HIGH:
|
||||||
|
plane.non_auto_terrain_disable = true;
|
||||||
|
if (plane.control_mode->allows_terrain_disable()) {
|
||||||
|
plane.set_target_altitude_current();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case AuxSwitchPos::MIDDLE:
|
||||||
|
break;
|
||||||
|
case AuxSwitchPos::LOW:
|
||||||
|
plane.non_auto_terrain_disable = false;
|
||||||
|
if (plane.control_mode->allows_terrain_disable()) {
|
||||||
|
plane.set_target_altitude_current();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
gcs().send_text(MAV_SEVERITY_INFO, "NON AUTO TERRN: %s", plane.non_auto_terrain_disable?"OFF":"ON");
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
RC_Channel::do_aux_function(ch_option, ch_flag);
|
RC_Channel::do_aux_function(ch_option, ch_flag);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -200,7 +200,7 @@ void Plane::set_target_altitude_current(void)
|
||||||
#if AP_TERRAIN_AVAILABLE
|
#if AP_TERRAIN_AVAILABLE
|
||||||
// also record the terrain altitude if possible
|
// also record the terrain altitude if possible
|
||||||
float terrain_altitude;
|
float terrain_altitude;
|
||||||
if (g.terrain_follow && terrain.height_above_terrain(terrain_altitude, true)) {
|
if (g.terrain_follow && terrain.height_above_terrain(terrain_altitude, true) && !terrain_disabled()) {
|
||||||
target_altitude.terrain_following = true;
|
target_altitude.terrain_following = true;
|
||||||
target_altitude.terrain_alt_cm = terrain_altitude*100;
|
target_altitude.terrain_alt_cm = terrain_altitude*100;
|
||||||
} else {
|
} else {
|
||||||
|
@ -289,12 +289,11 @@ void Plane::change_target_altitude(int32_t change_cm)
|
||||||
{
|
{
|
||||||
target_altitude.amsl_cm += change_cm;
|
target_altitude.amsl_cm += change_cm;
|
||||||
#if AP_TERRAIN_AVAILABLE
|
#if AP_TERRAIN_AVAILABLE
|
||||||
if (target_altitude.terrain_following) {
|
if (target_altitude.terrain_following && !terrain_disabled()) {
|
||||||
target_altitude.terrain_alt_cm += change_cm;
|
target_altitude.terrain_alt_cm += change_cm;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
change target altitude by a proportion of the target altitude offset
|
change target altitude by a proportion of the target altitude offset
|
||||||
(difference in height to next WP from previous WP). proportion
|
(difference in height to next WP from previous WP). proportion
|
||||||
|
@ -719,3 +718,13 @@ void Plane::rangefinder_height_update(void)
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
determine if Non Auto Terrain Disable is active and allowed in present control mode
|
||||||
|
*/
|
||||||
|
bool Plane::terrain_disabled()
|
||||||
|
{
|
||||||
|
return control_mode->allows_terrain_disable() && non_auto_terrain_disable;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -69,6 +69,9 @@ public:
|
||||||
// true for all q modes
|
// true for all q modes
|
||||||
virtual bool is_vtol_mode() const { return false; }
|
virtual bool is_vtol_mode() const { return false; }
|
||||||
|
|
||||||
|
// true if mode can have terrain following disabled by switch
|
||||||
|
virtual bool allows_terrain_disable() const { return false; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
// subclasses override this to perform checks before entering the mode
|
// subclasses override this to perform checks before entering the mode
|
||||||
|
@ -288,6 +291,8 @@ public:
|
||||||
const char *name() const override { return "FLY_BY_WIRE_B"; }
|
const char *name() const override { return "FLY_BY_WIRE_B"; }
|
||||||
const char *name4() const override { return "FBWB"; }
|
const char *name4() const override { return "FBWB"; }
|
||||||
|
|
||||||
|
bool allows_terrain_disable() const override { return true; }
|
||||||
|
|
||||||
// methods that affect movement of the vehicle in this mode
|
// methods that affect movement of the vehicle in this mode
|
||||||
void update() override;
|
void update() override;
|
||||||
|
|
||||||
|
@ -304,6 +309,8 @@ public:
|
||||||
const char *name() const override { return "CRUISE"; }
|
const char *name() const override { return "CRUISE"; }
|
||||||
const char *name4() const override { return "CRUS"; }
|
const char *name4() const override { return "CRUS"; }
|
||||||
|
|
||||||
|
bool allows_terrain_disable() const override { return true; }
|
||||||
|
|
||||||
// methods that affect movement of the vehicle in this mode
|
// methods that affect movement of the vehicle in this mode
|
||||||
void update() override;
|
void update() override;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue