mirror of
https://github.com/PX4/PX4-Autopilot.git
synced 2026-05-31 10:26:52 +08:00
TECS: enable direct height-rate control
Signed-off-by: RomanBapst <bapstroman@gmail.com>
This commit is contained in:
+16
-3
@@ -201,6 +201,13 @@ void TECS::updateHeightRateSetpoint(float alt_sp_amsl_m, float target_climbrate_
|
|||||||
_hgt_rate_setpoint = math::constrain(_hgt_rate_setpoint, -_max_sink_rate, _max_climb_rate);
|
_hgt_rate_setpoint = math::constrain(_hgt_rate_setpoint, -_max_sink_rate, _max_climb_rate);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TECS::_update_height_rate_setpoint(float hgt_rate_sp)
|
||||||
|
{
|
||||||
|
// Limit the rate of change of height demand to respect vehicle performance limits
|
||||||
|
_hgt_rate_setpoint = math::constrain(hgt_rate_sp, -_max_sink_rate, _max_climb_rate);
|
||||||
|
_hgt_setpoint = _vert_pos_state;
|
||||||
|
}
|
||||||
|
|
||||||
void TECS::_detect_underspeed()
|
void TECS::_detect_underspeed()
|
||||||
{
|
{
|
||||||
if (!_detect_underspeed_enabled) {
|
if (!_detect_underspeed_enabled) {
|
||||||
@@ -510,7 +517,7 @@ void TECS::_update_STE_rate_lim()
|
|||||||
void TECS::update_pitch_throttle(float pitch, float baro_altitude, float hgt_setpoint,
|
void TECS::update_pitch_throttle(float pitch, float baro_altitude, float hgt_setpoint,
|
||||||
float EAS_setpoint, float equivalent_airspeed, float eas_to_tas, bool climb_out_setpoint, float pitch_min_climbout,
|
float EAS_setpoint, float equivalent_airspeed, float eas_to_tas, bool climb_out_setpoint, float pitch_min_climbout,
|
||||||
float throttle_min, float throttle_max, float throttle_cruise, float pitch_limit_min, float pitch_limit_max,
|
float throttle_min, float throttle_max, float throttle_cruise, float pitch_limit_min, float pitch_limit_max,
|
||||||
float target_climbrate, float target_sinkrate)
|
float target_climbrate, float target_sinkrate, float hgt_rate_sp)
|
||||||
{
|
{
|
||||||
// Calculate the time since last update (seconds)
|
// Calculate the time since last update (seconds)
|
||||||
uint64_t now = hrt_absolute_time();
|
uint64_t now = hrt_absolute_time();
|
||||||
@@ -548,8 +555,14 @@ void TECS::update_pitch_throttle(float pitch, float baro_altitude, float hgt_set
|
|||||||
// Calculate the demanded true airspeed
|
// Calculate the demanded true airspeed
|
||||||
_update_speed_setpoint();
|
_update_speed_setpoint();
|
||||||
|
|
||||||
// calculate heigh rate setpoint based on altitude demand
|
if (PX4_ISFINITE(hgt_rate_sp)) {
|
||||||
updateHeightRateSetpoint(hgt_setpoint, target_climbrate, target_sinkrate, baro_altitude);
|
// use the provided height rate setpoint instead of the height setpoint
|
||||||
|
_update_height_rate_setpoint(hgt_rate_sp);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// calculate heigh rate setpoint based on altitude demand
|
||||||
|
updateHeightRateSetpoint(hgt_setpoint, target_climbrate, target_sinkrate, baro_altitude);
|
||||||
|
}
|
||||||
|
|
||||||
// Calculate the specific energy values required by the control loop
|
// Calculate the specific energy values required by the control loop
|
||||||
_update_energy_estimates();
|
_update_energy_estimates();
|
||||||
|
|||||||
@@ -84,7 +84,7 @@ public:
|
|||||||
void update_pitch_throttle(float pitch, float baro_altitude, float hgt_setpoint,
|
void update_pitch_throttle(float pitch, float baro_altitude, float hgt_setpoint,
|
||||||
float EAS_setpoint, float equivalent_airspeed, float eas_to_tas, bool climb_out_setpoint, float pitch_min_climbout,
|
float EAS_setpoint, float equivalent_airspeed, float eas_to_tas, bool climb_out_setpoint, float pitch_min_climbout,
|
||||||
float throttle_min, float throttle_setpoint_max, float throttle_cruise,
|
float throttle_min, float throttle_setpoint_max, float throttle_cruise,
|
||||||
float pitch_limit_min, float pitch_limit_max, float target_climbrate, float target_sinkrate);
|
float pitch_limit_min, float pitch_limit_max, float target_climbrate, float target_sinkrate, float hgt_rate_sp = NAN);
|
||||||
|
|
||||||
float get_throttle_setpoint() { return _last_throttle_setpoint; }
|
float get_throttle_setpoint() { return _last_throttle_setpoint; }
|
||||||
float get_pitch_setpoint() { return _last_pitch_setpoint; }
|
float get_pitch_setpoint() { return _last_pitch_setpoint; }
|
||||||
@@ -311,6 +311,11 @@ private:
|
|||||||
float alt_amsl);
|
float alt_amsl);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update the desired height rate setpoint
|
||||||
|
*/
|
||||||
|
void _update_height_rate_setpoint(float hgt_rate_sp);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Detect if the system is not capable of maintaining airspeed
|
* Detect if the system is not capable of maintaining airspeed
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -2085,7 +2085,7 @@ FixedwingPositionControl::tecs_update_pitch_throttle(const hrt_abstime &now, flo
|
|||||||
float pitch_min_rad, float pitch_max_rad,
|
float pitch_min_rad, float pitch_max_rad,
|
||||||
float throttle_min, float throttle_max, float throttle_cruise,
|
float throttle_min, float throttle_max, float throttle_cruise,
|
||||||
bool climbout_mode, float climbout_pitch_min_rad,
|
bool climbout_mode, float climbout_pitch_min_rad,
|
||||||
uint8_t mode)
|
uint8_t mode, float hgt_rate_sp)
|
||||||
{
|
{
|
||||||
const float dt = math::constrain((now - _last_tecs_update) * 1e-6f, 0.01f, 0.05f);
|
const float dt = math::constrain((now - _last_tecs_update) * 1e-6f, 0.01f, 0.05f);
|
||||||
_last_tecs_update = now;
|
_last_tecs_update = now;
|
||||||
@@ -2186,7 +2186,7 @@ FixedwingPositionControl::tecs_update_pitch_throttle(const hrt_abstime &now, flo
|
|||||||
throttle_min, throttle_max, throttle_cruise,
|
throttle_min, throttle_max, throttle_cruise,
|
||||||
pitch_min_rad - radians(_param_fw_psp_off.get()),
|
pitch_min_rad - radians(_param_fw_psp_off.get()),
|
||||||
pitch_max_rad - radians(_param_fw_psp_off.get()),
|
pitch_max_rad - radians(_param_fw_psp_off.get()),
|
||||||
_param_climbrate_target.get(), _param_sinkrate_target.get());
|
_param_climbrate_target.get(), _param_sinkrate_target.get(), hgt_rate_sp);
|
||||||
|
|
||||||
tecs_status_publish();
|
tecs_status_publish();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -359,7 +359,7 @@ private:
|
|||||||
float pitch_min_rad, float pitch_max_rad,
|
float pitch_min_rad, float pitch_max_rad,
|
||||||
float throttle_min, float throttle_max, float throttle_cruise,
|
float throttle_min, float throttle_max, float throttle_cruise,
|
||||||
bool climbout_mode, float climbout_pitch_min_rad,
|
bool climbout_mode, float climbout_pitch_min_rad,
|
||||||
uint8_t mode = tecs_status_s::TECS_MODE_NORMAL);
|
uint8_t mode = tecs_status_s::TECS_MODE_NORMAL, float hgt_rate_sp = NAN);
|
||||||
|
|
||||||
DEFINE_PARAMETERS(
|
DEFINE_PARAMETERS(
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user