mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-10-19 02:43:33 +08:00
Airspeed Selector: enable airspeed_validated in control modules (#12887)
* FW attitude controller, FW position controller and VTOL attitude controller subscribe to airspeed_validated topic * add possibility to switch off the airspeed valid checks * remove airspeed valid checks from commander * clean up of VTOL transition logic * Airspeed Selector: remove dynamic allocation of airspeed validators (depending on number of connected sensors) but do it statically for the maximum number allowed. Check for number of connected sensors not only during start up, but always when vehicle is disarmed. * Airspeed Selector: change work queue from lp to att_pos_ctrl as this module is safety-critical * add airspeed selector to px4_fmu-v2 defaults
This commit is contained in:
committed by
Daniel Agar
parent
a46581987c
commit
ebdc29bc5f
@@ -181,17 +181,30 @@ void Standard::update_vtol_state()
|
||||
|
||||
} else if (_vtol_schedule.flight_mode == vtol_mode::TRANSITION_TO_FW) {
|
||||
// continue the transition to fw mode while monitoring airspeed for a final switch to fw mode
|
||||
if (((_params->airspeed_disabled ||
|
||||
_airspeed->indicated_airspeed_m_s >= _params->transition_airspeed) &&
|
||||
time_since_trans_start > _params->front_trans_time_min) ||
|
||||
can_transition_on_ground()) {
|
||||
|
||||
const bool airspeed_triggers_transition = PX4_ISFINITE(_airspeed_validated->equivalent_airspeed_m_s)
|
||||
&& !_params->airspeed_disabled;
|
||||
const bool minimum_trans_time_elapsed = time_since_trans_start > _params->front_trans_time_min;
|
||||
|
||||
bool transition_to_fw = false;
|
||||
|
||||
if (minimum_trans_time_elapsed) {
|
||||
if (airspeed_triggers_transition) {
|
||||
transition_to_fw = _airspeed_validated->equivalent_airspeed_m_s >= _params->transition_airspeed;
|
||||
|
||||
} else {
|
||||
transition_to_fw = true;
|
||||
}
|
||||
}
|
||||
|
||||
transition_to_fw |= can_transition_on_ground();
|
||||
|
||||
if (transition_to_fw) {
|
||||
_vtol_schedule.flight_mode = vtol_mode::FW_MODE;
|
||||
|
||||
// don't set pusher throttle here as it's being ramped up elsewhere
|
||||
_trans_finished_ts = hrt_absolute_time();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -242,15 +255,16 @@ void Standard::update_transition_state()
|
||||
|
||||
// do blending of mc and fw controls if a blending airspeed has been provided and the minimum transition time has passed
|
||||
if (_airspeed_trans_blend_margin > 0.0f &&
|
||||
_airspeed->indicated_airspeed_m_s > 0.0f &&
|
||||
_airspeed->indicated_airspeed_m_s >= _params->airspeed_blend &&
|
||||
PX4_ISFINITE(_airspeed_validated->equivalent_airspeed_m_s) &&
|
||||
_airspeed_validated->equivalent_airspeed_m_s > 0.0f &&
|
||||
_airspeed_validated->equivalent_airspeed_m_s >= _params->airspeed_blend &&
|
||||
time_since_trans_start > _params->front_trans_time_min) {
|
||||
|
||||
mc_weight = 1.0f - fabsf(_airspeed->indicated_airspeed_m_s - _params->airspeed_blend) /
|
||||
mc_weight = 1.0f - fabsf(_airspeed_validated->equivalent_airspeed_m_s - _params->airspeed_blend) /
|
||||
_airspeed_trans_blend_margin;
|
||||
// time based blending when no airspeed sensor is set
|
||||
|
||||
} else if (_params->airspeed_disabled) {
|
||||
} else if (_params->airspeed_disabled || !PX4_ISFINITE(_airspeed_validated->equivalent_airspeed_m_s)) {
|
||||
mc_weight = 1.0f - time_since_trans_start / _params->front_trans_time_min;
|
||||
mc_weight = math::constrain(2.0f * mc_weight, 0.0f, 1.0f);
|
||||
|
||||
|
||||
@@ -130,11 +130,24 @@ void Tailsitter::update_vtol_state()
|
||||
|
||||
case vtol_mode::TRANSITION_FRONT_P1: {
|
||||
|
||||
bool airspeed_condition_satisfied = _airspeed->indicated_airspeed_m_s >= _params->transition_airspeed;
|
||||
airspeed_condition_satisfied |= _params->airspeed_disabled;
|
||||
|
||||
// check if we have reached airspeed and pitch angle to switch to TRANSITION P2 mode
|
||||
if ((airspeed_condition_satisfied && pitch <= PITCH_TRANSITION_FRONT_P1) || can_transition_on_ground()) {
|
||||
const bool airspeed_triggers_transition = PX4_ISFINITE(_airspeed_validated->equivalent_airspeed_m_s)
|
||||
&& !_params->airspeed_disabled;
|
||||
|
||||
bool transition_to_fw = false;
|
||||
|
||||
if (pitch <= PITCH_TRANSITION_FRONT_P1) {
|
||||
if (airspeed_triggers_transition) {
|
||||
transition_to_fw = _airspeed_validated->equivalent_airspeed_m_s >= _params->transition_airspeed;
|
||||
|
||||
} else {
|
||||
transition_to_fw = true;
|
||||
}
|
||||
}
|
||||
|
||||
transition_to_fw |= can_transition_on_ground();
|
||||
|
||||
if (transition_to_fw) {
|
||||
_vtol_schedule.flight_mode = vtol_mode::FW_MODE;
|
||||
}
|
||||
|
||||
|
||||
@@ -137,20 +137,25 @@ void Tiltrotor::update_vtol_state()
|
||||
break;
|
||||
|
||||
case vtol_mode::TRANSITION_FRONT_P1: {
|
||||
// allow switch if we are not armed for the sake of bench testing
|
||||
bool transition_to_p2 = can_transition_on_ground();
|
||||
|
||||
float time_since_trans_start = (float)(hrt_absolute_time() - _vtol_schedule.transition_start) * 1e-6f;
|
||||
|
||||
// check if we have reached airspeed to switch to fw mode
|
||||
transition_to_p2 |= !_params->airspeed_disabled &&
|
||||
_airspeed->indicated_airspeed_m_s >= _params->transition_airspeed &&
|
||||
time_since_trans_start > _params->front_trans_time_min;
|
||||
const bool airspeed_triggers_transition = PX4_ISFINITE(_airspeed_validated->equivalent_airspeed_m_s)
|
||||
&& !_params->airspeed_disabled;
|
||||
|
||||
// check if airspeed is invalid and transition by time
|
||||
transition_to_p2 |= _params->airspeed_disabled &&
|
||||
_tilt_control >= _params_tiltrotor.tilt_transition &&
|
||||
time_since_trans_start > _params->front_trans_time_openloop;
|
||||
bool transition_to_p2 = false;
|
||||
|
||||
if (time_since_trans_start > _params->front_trans_time_min) {
|
||||
if (airspeed_triggers_transition) {
|
||||
transition_to_p2 = _airspeed_validated->equivalent_airspeed_m_s >= _params->transition_airspeed;
|
||||
|
||||
} else {
|
||||
transition_to_p2 = _tilt_control >= _params_tiltrotor.tilt_transition &&
|
||||
time_since_trans_start > _params->front_trans_time_openloop;;
|
||||
}
|
||||
}
|
||||
|
||||
transition_to_p2 |= can_transition_on_ground();
|
||||
|
||||
if (transition_to_p2) {
|
||||
_vtol_schedule.flight_mode = vtol_mode::TRANSITION_FRONT_P2;
|
||||
@@ -244,18 +249,20 @@ void Tiltrotor::update_transition_state()
|
||||
_mc_yaw_weight = 1.0f;
|
||||
|
||||
// reduce MC controls once the plane has picked up speed
|
||||
if (!_params->airspeed_disabled && _airspeed->indicated_airspeed_m_s > ARSP_YAW_CTRL_DISABLE) {
|
||||
if (!_params->airspeed_disabled && PX4_ISFINITE(_airspeed_validated->equivalent_airspeed_m_s) &&
|
||||
_airspeed_validated->equivalent_airspeed_m_s > ARSP_YAW_CTRL_DISABLE) {
|
||||
_mc_yaw_weight = 0.0f;
|
||||
}
|
||||
|
||||
if (!_params->airspeed_disabled && _airspeed->indicated_airspeed_m_s >= _params->airspeed_blend) {
|
||||
_mc_roll_weight = 1.0f - (_airspeed->indicated_airspeed_m_s - _params->airspeed_blend) /
|
||||
if (!_params->airspeed_disabled && PX4_ISFINITE(_airspeed_validated->equivalent_airspeed_m_s) &&
|
||||
_airspeed_validated->equivalent_airspeed_m_s >= _params->airspeed_blend) {
|
||||
_mc_roll_weight = 1.0f - (_airspeed_validated->equivalent_airspeed_m_s - _params->airspeed_blend) /
|
||||
(_params->transition_airspeed - _params->airspeed_blend);
|
||||
}
|
||||
|
||||
// without airspeed do timed weight changes
|
||||
if (_params->airspeed_disabled
|
||||
&& time_since_trans_start > _params->front_trans_time_min) {
|
||||
if ((_params->airspeed_disabled || !PX4_ISFINITE(_airspeed_validated->equivalent_airspeed_m_s)) &&
|
||||
time_since_trans_start > _params->front_trans_time_min) {
|
||||
_mc_roll_weight = 1.0f - (time_since_trans_start - _params->front_trans_time_min) /
|
||||
(_params->front_trans_time_openloop - _params->front_trans_time_min);
|
||||
_mc_yaw_weight = _mc_roll_weight;
|
||||
|
||||
@@ -345,7 +345,7 @@ VtolAttitudeControl::Run()
|
||||
_local_pos_sub.update(&_local_pos);
|
||||
_local_pos_sp_sub.update(&_local_pos_sp);
|
||||
_pos_sp_triplet_sub.update(&_pos_sp_triplet);
|
||||
_airspeed_sub.update(&_airspeed);
|
||||
_airspeed_validated_sub.update(&_airspeed_validated);
|
||||
_tecs_status_sub.update(&_tecs_status);
|
||||
_land_detected_sub.update(&_land_detected);
|
||||
vehicle_cmd_poll();
|
||||
|
||||
@@ -65,7 +65,7 @@
|
||||
#include <uORB/Subscription.hpp>
|
||||
#include <uORB/SubscriptionCallback.hpp>
|
||||
#include <uORB/topics/actuator_controls.h>
|
||||
#include <uORB/topics/airspeed.h>
|
||||
#include <uORB/topics/airspeed_validated.h>
|
||||
#include <uORB/topics/manual_control_setpoint.h>
|
||||
#include <uORB/topics/parameter_update.h>
|
||||
#include <uORB/topics/position_setpoint_triplet.h>
|
||||
@@ -116,7 +116,7 @@ public:
|
||||
struct actuator_controls_s *get_actuators_mc_in() {return &_actuators_mc_in;}
|
||||
struct actuator_controls_s *get_actuators_out0() {return &_actuators_out_0;}
|
||||
struct actuator_controls_s *get_actuators_out1() {return &_actuators_out_1;}
|
||||
struct airspeed_s *get_airspeed() {return &_airspeed;}
|
||||
struct airspeed_validated_s *get_airspeed() {return &_airspeed_validated;}
|
||||
struct position_setpoint_triplet_s *get_pos_sp_triplet() {return &_pos_sp_triplet;}
|
||||
struct tecs_status_s *get_tecs_status() {return &_tecs_status;}
|
||||
struct vehicle_attitude_s *get_att() {return &_v_att;}
|
||||
@@ -136,7 +136,7 @@ private:
|
||||
uORB::SubscriptionCallbackWorkItem _actuator_inputs_fw{this, ORB_ID(actuator_controls_virtual_fw)};
|
||||
uORB::SubscriptionCallbackWorkItem _actuator_inputs_mc{this, ORB_ID(actuator_controls_virtual_mc)};
|
||||
|
||||
uORB::Subscription _airspeed_sub{ORB_ID(airspeed)}; // airspeed subscription
|
||||
uORB::Subscription _airspeed_validated_sub{ORB_ID(airspeed_validated)}; // airspeed subscription
|
||||
uORB::Subscription _fw_virtual_att_sp_sub{ORB_ID(fw_virtual_attitude_setpoint)};
|
||||
uORB::Subscription _land_detected_sub{ORB_ID(vehicle_land_detected)};
|
||||
uORB::Subscription _local_pos_sp_sub{ORB_ID(vehicle_local_position_setpoint)}; // setpoint subscription
|
||||
@@ -166,7 +166,7 @@ private:
|
||||
actuator_controls_s _actuators_out_0{}; //actuator controls going to the mc mixer
|
||||
actuator_controls_s _actuators_out_1{}; //actuator controls going to the fw mixer (used for elevons)
|
||||
|
||||
airspeed_s _airspeed{}; // airspeed
|
||||
airspeed_validated_s _airspeed_validated{}; // airspeed
|
||||
manual_control_setpoint_s _manual_control_sp{}; //manual control setpoint
|
||||
position_setpoint_triplet_s _pos_sp_triplet{};
|
||||
tecs_status_s _tecs_status{};
|
||||
|
||||
@@ -63,7 +63,7 @@ VtolType::VtolType(VtolAttitudeControl *att_controller) :
|
||||
_actuators_fw_in = _attc->get_actuators_fw_in();
|
||||
_local_pos = _attc->get_local_pos();
|
||||
_local_pos_sp = _attc->get_local_pos_sp();
|
||||
_airspeed = _attc->get_airspeed();
|
||||
_airspeed_validated = _attc->get_airspeed();
|
||||
_tecs_status = _attc->get_tecs_status();
|
||||
_land_detected = _attc->get_land_detected();
|
||||
_params = _attc->get_params();
|
||||
|
||||
@@ -187,7 +187,7 @@ protected:
|
||||
struct actuator_controls_s *_actuators_fw_in; //actuator controls from fw_att_control
|
||||
struct vehicle_local_position_s *_local_pos;
|
||||
struct vehicle_local_position_setpoint_s *_local_pos_sp;
|
||||
struct airspeed_s *_airspeed; // airspeed
|
||||
struct airspeed_validated_s *_airspeed_validated; // airspeed
|
||||
struct tecs_status_s *_tecs_status;
|
||||
struct vehicle_land_detected_s *_land_detected;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user