mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-04-14 10:07:39 +08:00
evaluate transition command in vtol controller instead of vtol type, use distinct state variables instead of additional command struct
This commit is contained in:
parent
8fc52fea22
commit
80a3c74cfc
@ -105,7 +105,7 @@ void Standard::update_vtol_state()
|
||||
* For the back transition the pusher motor is immediately stopped and rotors reactivated.
|
||||
*/
|
||||
|
||||
if (!is_fixed_wing_requested()) {
|
||||
if (!_attc->is_fixed_wing_requested()) {
|
||||
// the transition to fw mode switch is off
|
||||
if (_vtol_schedule.flight_mode == MC_MODE) {
|
||||
// in mc mode
|
||||
|
||||
@ -58,7 +58,7 @@ Tailsitter::~Tailsitter()
|
||||
void Tailsitter::update_vtol_state()
|
||||
{
|
||||
// simply switch between the two modes
|
||||
if (!is_fixed_wing_requested()) {
|
||||
if (!_attc->is_fixed_wing_requested()) {
|
||||
_vtol_mode = ROTARY_WING;
|
||||
} else {
|
||||
_vtol_mode = FIXED_WING;
|
||||
|
||||
@ -158,7 +158,7 @@ void Tiltrotor::update_vtol_state()
|
||||
* forward completely. For the backtransition the motors simply rotate back.
|
||||
*/
|
||||
|
||||
if (!is_fixed_wing_requested()) {
|
||||
if (!_attc->is_fixed_wing_requested()) {
|
||||
|
||||
// plane is in multicopter mode
|
||||
switch(_vtol_schedule.flight_mode) {
|
||||
|
||||
@ -97,7 +97,6 @@ VtolAttitudeControl::VtolAttitudeControl() :
|
||||
memset(&_airspeed,0,sizeof(_airspeed));
|
||||
memset(&_batt_status,0,sizeof(_batt_status));
|
||||
memset(&_vehicle_cmd,0, sizeof(_vehicle_cmd));
|
||||
memset(&_vehicle_transition_cmd,0, sizeof(_vehicle_cmd));
|
||||
|
||||
_params.idle_pwm_mc = PWM_LOWEST_MIN;
|
||||
_params.vtol_motor_count = 0;
|
||||
@ -325,9 +324,35 @@ VtolAttitudeControl::vehicle_cmd_poll() {
|
||||
|
||||
if (updated) {
|
||||
orb_copy(ORB_ID(vehicle_command), _vehicle_cmd_sub , &_vehicle_cmd);
|
||||
handle_command();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Check received command
|
||||
*/
|
||||
void
|
||||
VtolAttitudeControl::handle_command() {
|
||||
// update transition command if necessary
|
||||
if (_vehicle_cmd.command == vehicle_command_s::VEHICLE_CMD_DO_VTOL_TRANSITION) {
|
||||
_transition_command = int(_vehicle_cmd.param1 + 0.5f);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns true if fixed-wing mode is requested.
|
||||
* Changed either via switch or via command.
|
||||
*/
|
||||
bool
|
||||
VtolAttitudeControl::is_fixed_wing_requested()
|
||||
{
|
||||
bool to_fw = _manual_control_sp.aux1 > 0.0f;
|
||||
if (_v_control_mode.flag_control_offboard_enabled) {
|
||||
to_fw = _transition_command == vehicle_status_s::VEHICLE_VTOL_STATE_FW;
|
||||
}
|
||||
return to_fw;
|
||||
}
|
||||
|
||||
/**
|
||||
* Update parameters.
|
||||
*/
|
||||
@ -502,11 +527,6 @@ void VtolAttitudeControl::task_main()
|
||||
vehicle_battery_poll();
|
||||
vehicle_cmd_poll();
|
||||
|
||||
// update transition command if necessary
|
||||
if (_vehicle_cmd.command == vehicle_command_s::VEHICLE_CMD_DO_VTOL_TRANSITION) {
|
||||
orb_copy(ORB_ID(vehicle_command), _vehicle_cmd_sub , &_vehicle_transition_cmd);
|
||||
}
|
||||
|
||||
// update the vtol state machine which decides which mode we are in
|
||||
_vtol_type->update_vtol_state();
|
||||
|
||||
@ -514,10 +534,10 @@ void VtolAttitudeControl::task_main()
|
||||
if (!_v_control_mode.flag_control_offboard_enabled)
|
||||
{
|
||||
if (_vtol_type->get_mode() == ROTARY_WING) {
|
||||
_vehicle_transition_cmd.param1 = vehicle_status_s::VEHICLE_VTOL_STATE_MC;
|
||||
_transition_command = vehicle_status_s::VEHICLE_VTOL_STATE_MC;
|
||||
}
|
||||
else if (_vtol_type->get_mode() == FIXED_WING) {
|
||||
_vehicle_transition_cmd.param1 = vehicle_status_s::VEHICLE_VTOL_STATE_FW;
|
||||
_transition_command = vehicle_status_s::VEHICLE_VTOL_STATE_FW;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -117,7 +117,6 @@ public:
|
||||
struct vehicle_local_position_s* get_local_pos () {return &_local_pos;}
|
||||
struct airspeed_s* get_airspeed () {return &_airspeed;}
|
||||
struct battery_status_s* get_batt_status () {return &_batt_status;}
|
||||
struct vehicle_command_s* get_vehicle_transition_cmd () {return &_vehicle_transition_cmd;}
|
||||
|
||||
struct Params* get_params () {return &_params;}
|
||||
|
||||
@ -167,7 +166,6 @@ private:
|
||||
struct airspeed_s _airspeed; // airspeed
|
||||
struct battery_status_s _batt_status; // battery status
|
||||
struct vehicle_command_s _vehicle_cmd;
|
||||
struct vehicle_command_s _vehicle_transition_cmd; // stores transition commands only
|
||||
|
||||
Params _params; // struct holding the parameters
|
||||
|
||||
@ -191,6 +189,7 @@ private:
|
||||
* to waste energy when gliding. */
|
||||
unsigned _motor_count; // number of motors
|
||||
float _airspeed_tot;
|
||||
int _transition_command;
|
||||
|
||||
VtolType * _vtol_type; // base class for different vtol types
|
||||
Tiltrotor * _tiltrotor; // tailsitter vtol type
|
||||
@ -217,6 +216,7 @@ private:
|
||||
int parameters_update(); //Update local paraemter cache
|
||||
void fill_mc_att_rates_sp();
|
||||
void fill_fw_att_rates_sp();
|
||||
void handle_command();
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@ -63,7 +63,6 @@ _vtol_mode(ROTARY_WING)
|
||||
_local_pos = _attc->get_local_pos();
|
||||
_airspeed = _attc->get_airspeed();
|
||||
_batt_status = _attc->get_batt_status();
|
||||
_vehicle_transition_cmd = _attc->get_vehicle_transition_cmd();
|
||||
_params = _attc->get_params();
|
||||
|
||||
flag_idle_mc = true;
|
||||
@ -132,16 +131,3 @@ void VtolType::set_idle_fw()
|
||||
|
||||
close(fd);
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns true if fixed-wing mode is requested.
|
||||
* Changed either via switch or via command.
|
||||
*/
|
||||
bool VtolType::is_fixed_wing_requested()
|
||||
{
|
||||
bool to_fw = _manual_control_sp->aux1 > 0.0f;
|
||||
if (_v_control_mode->flag_control_offboard_enabled) {
|
||||
to_fw = fabsf(_vehicle_transition_cmd->param1 - vehicle_status_s::VEHICLE_VTOL_STATE_FW) < FLT_EPSILON;
|
||||
}
|
||||
return to_fw;
|
||||
}
|
||||
|
||||
@ -87,8 +87,6 @@ public:
|
||||
|
||||
mode get_mode () {return _vtol_mode;};
|
||||
|
||||
bool is_fixed_wing_requested();
|
||||
|
||||
protected:
|
||||
VtolAttitudeControl *_attc;
|
||||
mode _vtol_mode;
|
||||
@ -109,7 +107,6 @@ protected:
|
||||
struct vehicle_local_position_s *_local_pos;
|
||||
struct airspeed_s *_airspeed; // airspeed
|
||||
struct battery_status_s *_batt_status; // battery status
|
||||
struct vehicle_command_s *_vehicle_transition_cmd;
|
||||
|
||||
struct Params *_params;
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user