mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-10-24 17:13:34 +08:00
fw_pos_control_l1 add new simple min groundspeed
This commit is contained in:
committed by
Lorenz Meier
parent
161429f8c6
commit
e43e37cc46
@@ -419,7 +419,7 @@ FixedwingPositionControl::get_demanded_airspeed()
|
|||||||
}
|
}
|
||||||
|
|
||||||
float
|
float
|
||||||
FixedwingPositionControl::calculate_target_airspeed(float airspeed_demand)
|
FixedwingPositionControl::calculate_target_airspeed(float airspeed_demand, const Vector2f &ground_speed)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* Calculate accelerated stall airspeed factor from commanded bank angle and use it to increase minimum airspeed.
|
* Calculate accelerated stall airspeed factor from commanded bank angle and use it to increase minimum airspeed.
|
||||||
@@ -440,55 +440,32 @@ FixedwingPositionControl::calculate_target_airspeed(float airspeed_demand)
|
|||||||
|
|
||||||
if (_airspeed_valid && PX4_ISFINITE(_att_sp.roll_body)) {
|
if (_airspeed_valid && PX4_ISFINITE(_att_sp.roll_body)) {
|
||||||
|
|
||||||
adjusted_min_airspeed = constrain(_parameters.airspeed_min / sqrtf(cosf(_att_sp.roll_body)), _parameters.airspeed_min,
|
adjusted_min_airspeed = constrain(_parameters.airspeed_min / sqrtf(cosf(_att_sp.roll_body)),
|
||||||
_parameters.airspeed_max);
|
_parameters.airspeed_min, _parameters.airspeed_max);
|
||||||
}
|
}
|
||||||
|
|
||||||
// add minimum ground speed undershoot (only non-zero in presence of sufficient wind)
|
// groundspeed undershoot
|
||||||
// sanity check: limit to range
|
if (!_l1_control.circle_mode()) {
|
||||||
return constrain(airspeed_demand + _groundspeed_undershoot, adjusted_min_airspeed, _parameters.airspeed_max);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
// rotate ground speed vector with current attitude
|
||||||
FixedwingPositionControl::calculate_gndspeed_undershoot(const Vector2f &curr_pos,
|
|
||||||
const Vector2f &ground_speed,
|
|
||||||
const position_setpoint_s &pos_sp_prev, const position_setpoint_s &pos_sp_curr)
|
|
||||||
{
|
|
||||||
if (pos_sp_curr.valid && !_l1_control.circle_mode()) {
|
|
||||||
/* rotate ground speed vector with current attitude */
|
|
||||||
Vector2f yaw_vector(_R_nb(0, 0), _R_nb(1, 0));
|
Vector2f yaw_vector(_R_nb(0, 0), _R_nb(1, 0));
|
||||||
yaw_vector.normalize();
|
yaw_vector.normalize();
|
||||||
float ground_speed_body = yaw_vector * ground_speed;
|
|
||||||
|
|
||||||
/* The minimum desired ground speed is the minimum airspeed projected on to the ground using the altitude and horizontal difference between the waypoints if available*/
|
const float ground_speed_body = yaw_vector * ground_speed;
|
||||||
float distance = 0.0f;
|
|
||||||
float delta_altitude = 0.0f;
|
|
||||||
|
|
||||||
if (pos_sp_prev.valid) {
|
|
||||||
distance = get_distance_to_next_waypoint(pos_sp_prev.lat, pos_sp_prev.lon, pos_sp_curr.lat, pos_sp_curr.lon);
|
|
||||||
delta_altitude = pos_sp_curr.alt - pos_sp_prev.alt;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
distance = get_distance_to_next_waypoint((double)curr_pos(0), (double)curr_pos(1), pos_sp_curr.lat, pos_sp_curr.lon);
|
|
||||||
delta_altitude = pos_sp_curr.alt - _global_pos.alt;
|
|
||||||
}
|
|
||||||
|
|
||||||
float ground_speed_desired = _parameters.airspeed_min * cosf(atan2f(delta_altitude, distance));
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Ground speed undershoot is the amount of ground velocity not reached
|
|
||||||
* by the plane. Consequently it is zero if airspeed is >= min ground speed
|
|
||||||
* and positive if airspeed < min ground speed.
|
|
||||||
*
|
|
||||||
* This error value ensures that a plane (as long as its throttle capability is
|
* This error value ensures that a plane (as long as its throttle capability is
|
||||||
* not exceeded) travels towards a waypoint (and is not pushed more and more away
|
* not exceeded) travels towards a waypoint (and is not pushed more and more away
|
||||||
* by wind). Not countering this would lead to a fly-away.
|
* by wind). Not countering this would lead to a fly-away.
|
||||||
*/
|
*/
|
||||||
_groundspeed_undershoot = max(ground_speed_desired - ground_speed_body, 0.0f);
|
if (ground_speed_body < _groundspeed_min.get()) {
|
||||||
|
airspeed_demand += max(_groundspeed_min.get() - ground_speed_body, 0.0f);
|
||||||
} else {
|
}
|
||||||
_groundspeed_undershoot = 0.0f;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// add minimum ground speed undershoot (only non-zero in presence of sufficient wind)
|
||||||
|
// sanity check: limit to range
|
||||||
|
return constrain(airspeed_demand, adjusted_min_airspeed, _parameters.airspeed_max);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -772,8 +749,6 @@ FixedwingPositionControl::control_position(const Vector2f &curr_pos, const Vecto
|
|||||||
_att_sp.fw_control_yaw = false; // by default we don't want yaw to be contoller directly with rudder
|
_att_sp.fw_control_yaw = false; // by default we don't want yaw to be contoller directly with rudder
|
||||||
_att_sp.apply_flaps = vehicle_attitude_setpoint_s::FLAPS_OFF; // by default we don't use flaps
|
_att_sp.apply_flaps = vehicle_attitude_setpoint_s::FLAPS_OFF; // by default we don't use flaps
|
||||||
|
|
||||||
calculate_gndspeed_undershoot(curr_pos, ground_speed, pos_sp_prev, pos_sp_curr);
|
|
||||||
|
|
||||||
Vector2f nav_speed_2d{ground_speed};
|
Vector2f nav_speed_2d{ground_speed};
|
||||||
|
|
||||||
if (_airspeed_valid) {
|
if (_airspeed_valid) {
|
||||||
@@ -881,7 +856,7 @@ FixedwingPositionControl::control_position(const Vector2f &curr_pos, const Vecto
|
|||||||
_att_sp.yaw_body = _l1_control.nav_bearing();
|
_att_sp.yaw_body = _l1_control.nav_bearing();
|
||||||
|
|
||||||
tecs_update_pitch_throttle(pos_sp_curr.alt,
|
tecs_update_pitch_throttle(pos_sp_curr.alt,
|
||||||
calculate_target_airspeed(mission_airspeed),
|
calculate_target_airspeed(mission_airspeed, ground_speed),
|
||||||
radians(_parameters.pitch_limit_min) - _parameters.pitchsp_offset_rad,
|
radians(_parameters.pitch_limit_min) - _parameters.pitchsp_offset_rad,
|
||||||
radians(_parameters.pitch_limit_max) - _parameters.pitchsp_offset_rad,
|
radians(_parameters.pitch_limit_max) - _parameters.pitchsp_offset_rad,
|
||||||
_parameters.throttle_min,
|
_parameters.throttle_min,
|
||||||
@@ -929,7 +904,7 @@ FixedwingPositionControl::control_position(const Vector2f &curr_pos, const Vecto
|
|||||||
}
|
}
|
||||||
|
|
||||||
tecs_update_pitch_throttle(alt_sp,
|
tecs_update_pitch_throttle(alt_sp,
|
||||||
calculate_target_airspeed(mission_airspeed),
|
calculate_target_airspeed(mission_airspeed, ground_speed),
|
||||||
radians(_parameters.pitch_limit_min) - _parameters.pitchsp_offset_rad,
|
radians(_parameters.pitch_limit_min) - _parameters.pitchsp_offset_rad,
|
||||||
radians(_parameters.pitch_limit_max) - _parameters.pitchsp_offset_rad,
|
radians(_parameters.pitch_limit_max) - _parameters.pitchsp_offset_rad,
|
||||||
_parameters.throttle_min,
|
_parameters.throttle_min,
|
||||||
@@ -1255,7 +1230,7 @@ FixedwingPositionControl::control_takeoff(const Vector2f &curr_pos, const Vector
|
|||||||
const float takeoff_pitch_max_deg = _runway_takeoff.getMaxPitch(_parameters.pitch_limit_max);
|
const float takeoff_pitch_max_deg = _runway_takeoff.getMaxPitch(_parameters.pitch_limit_max);
|
||||||
|
|
||||||
tecs_update_pitch_throttle(pos_sp_curr.alt,
|
tecs_update_pitch_throttle(pos_sp_curr.alt,
|
||||||
calculate_target_airspeed(_runway_takeoff.getMinAirspeedScaling() * _parameters.airspeed_min),
|
calculate_target_airspeed(_runway_takeoff.getMinAirspeedScaling() * _parameters.airspeed_min, ground_speed),
|
||||||
radians(_parameters.pitch_limit_min),
|
radians(_parameters.pitch_limit_min),
|
||||||
radians(takeoff_pitch_max_deg),
|
radians(takeoff_pitch_max_deg),
|
||||||
_parameters.throttle_min,
|
_parameters.throttle_min,
|
||||||
@@ -1341,7 +1316,7 @@ FixedwingPositionControl::control_takeoff(const Vector2f &curr_pos, const Vector
|
|||||||
|
|
||||||
} else {
|
} else {
|
||||||
tecs_update_pitch_throttle(pos_sp_curr.alt,
|
tecs_update_pitch_throttle(pos_sp_curr.alt,
|
||||||
calculate_target_airspeed(_parameters.airspeed_trim),
|
calculate_target_airspeed(_parameters.airspeed_trim, ground_speed),
|
||||||
radians(_parameters.pitch_limit_min),
|
radians(_parameters.pitch_limit_min),
|
||||||
radians(_parameters.pitch_limit_max),
|
radians(_parameters.pitch_limit_max),
|
||||||
_parameters.throttle_min,
|
_parameters.throttle_min,
|
||||||
@@ -1555,7 +1530,7 @@ FixedwingPositionControl::control_landing(const Vector2f &curr_pos, const Vector
|
|||||||
const float throttle_land = _parameters.throttle_min + (_parameters.throttle_max - _parameters.throttle_min) * 0.1f;
|
const float throttle_land = _parameters.throttle_min + (_parameters.throttle_max - _parameters.throttle_min) * 0.1f;
|
||||||
|
|
||||||
tecs_update_pitch_throttle(terrain_alt + flare_curve_alt_rel,
|
tecs_update_pitch_throttle(terrain_alt + flare_curve_alt_rel,
|
||||||
calculate_target_airspeed(airspeed_land),
|
calculate_target_airspeed(airspeed_land, ground_speed),
|
||||||
radians(_parameters.land_flare_pitch_min_deg),
|
radians(_parameters.land_flare_pitch_min_deg),
|
||||||
radians(_parameters.land_flare_pitch_max_deg),
|
radians(_parameters.land_flare_pitch_max_deg),
|
||||||
0.0f,
|
0.0f,
|
||||||
@@ -1623,7 +1598,7 @@ FixedwingPositionControl::control_landing(const Vector2f &curr_pos, const Vector
|
|||||||
const float airspeed_approach = _parameters.land_airspeed_scale * _parameters.airspeed_min;
|
const float airspeed_approach = _parameters.land_airspeed_scale * _parameters.airspeed_min;
|
||||||
|
|
||||||
tecs_update_pitch_throttle(altitude_desired,
|
tecs_update_pitch_throttle(altitude_desired,
|
||||||
calculate_target_airspeed(airspeed_approach),
|
calculate_target_airspeed(airspeed_approach, ground_speed),
|
||||||
radians(_parameters.pitch_limit_min),
|
radians(_parameters.pitch_limit_min),
|
||||||
radians(_parameters.pitch_limit_max),
|
radians(_parameters.pitch_limit_max),
|
||||||
_parameters.throttle_min,
|
_parameters.throttle_min,
|
||||||
|
|||||||
@@ -373,6 +373,9 @@ private:
|
|||||||
param_t vtol_type;
|
param_t vtol_type;
|
||||||
} _parameter_handles {}; ///< handles for interesting parameters */
|
} _parameter_handles {}; ///< handles for interesting parameters */
|
||||||
|
|
||||||
|
DEFINE_PARAMETERS(
|
||||||
|
(ParamFloat<px4::params::FW_GND_SPD_MIN>) _groundspeed_min
|
||||||
|
)
|
||||||
|
|
||||||
// Update our local parameter cache.
|
// Update our local parameter cache.
|
||||||
int parameters_update();
|
int parameters_update();
|
||||||
@@ -438,9 +441,7 @@ private:
|
|||||||
float get_tecs_thrust();
|
float get_tecs_thrust();
|
||||||
|
|
||||||
float get_demanded_airspeed();
|
float get_demanded_airspeed();
|
||||||
float calculate_target_airspeed(float airspeed_demand);
|
float calculate_target_airspeed(float airspeed_demand, const Vector2f &ground_speed);
|
||||||
void calculate_gndspeed_undershoot(const Vector2f &curr_pos, const Vector2f &ground_speed,
|
|
||||||
const position_setpoint_s &pos_sp_prev, const position_setpoint_s &pos_sp_curr);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handle incoming vehicle commands
|
* Handle incoming vehicle commands
|
||||||
|
|||||||
@@ -727,3 +727,18 @@ PARAM_DEFINE_FLOAT(FW_T_HRATE_FF, 0.8f);
|
|||||||
* @group FW TECS
|
* @group FW TECS
|
||||||
*/
|
*/
|
||||||
PARAM_DEFINE_FLOAT(FW_T_SRATE_P, 0.02f);
|
PARAM_DEFINE_FLOAT(FW_T_SRATE_P, 0.02f);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Minimum groundspeed
|
||||||
|
*
|
||||||
|
* The controller will increase the commanded airspeed to maintain
|
||||||
|
* this minimum groundspeed to the next waypoint.
|
||||||
|
*
|
||||||
|
* @unit m/s
|
||||||
|
* @min 0.0
|
||||||
|
* @max 40
|
||||||
|
* @decimal 1
|
||||||
|
* @increment 0.5
|
||||||
|
* @group FW TECS
|
||||||
|
*/
|
||||||
|
PARAM_DEFINE_FLOAT(FW_GND_SPD_MIN, 5.0f);
|
||||||
|
|||||||
Reference in New Issue
Block a user