mirror of
https://github.com/PX4/PX4-Autopilot.git
synced 2026-05-31 18:47:21 +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:
committed by
Simon Wilks
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.
|
* 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
|
// the transition to fw mode switch is off
|
||||||
if (_vtol_schedule.flight_mode == MC_MODE) {
|
if (_vtol_schedule.flight_mode == MC_MODE) {
|
||||||
// in mc mode
|
// in mc mode
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ Tailsitter::~Tailsitter()
|
|||||||
void Tailsitter::update_vtol_state()
|
void Tailsitter::update_vtol_state()
|
||||||
{
|
{
|
||||||
// simply switch between the two modes
|
// simply switch between the two modes
|
||||||
if (!is_fixed_wing_requested()) {
|
if (!_attc->is_fixed_wing_requested()) {
|
||||||
_vtol_mode = ROTARY_WING;
|
_vtol_mode = ROTARY_WING;
|
||||||
} else {
|
} else {
|
||||||
_vtol_mode = FIXED_WING;
|
_vtol_mode = FIXED_WING;
|
||||||
|
|||||||
@@ -158,7 +158,7 @@ void Tiltrotor::update_vtol_state()
|
|||||||
* forward completely. For the backtransition the motors simply rotate back.
|
* 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
|
// plane is in multicopter mode
|
||||||
switch(_vtol_schedule.flight_mode) {
|
switch(_vtol_schedule.flight_mode) {
|
||||||
|
|||||||
@@ -97,7 +97,6 @@ VtolAttitudeControl::VtolAttitudeControl() :
|
|||||||
memset(&_airspeed,0,sizeof(_airspeed));
|
memset(&_airspeed,0,sizeof(_airspeed));
|
||||||
memset(&_batt_status,0,sizeof(_batt_status));
|
memset(&_batt_status,0,sizeof(_batt_status));
|
||||||
memset(&_vehicle_cmd,0, sizeof(_vehicle_cmd));
|
memset(&_vehicle_cmd,0, sizeof(_vehicle_cmd));
|
||||||
memset(&_vehicle_transition_cmd,0, sizeof(_vehicle_cmd));
|
|
||||||
|
|
||||||
_params.idle_pwm_mc = PWM_LOWEST_MIN;
|
_params.idle_pwm_mc = PWM_LOWEST_MIN;
|
||||||
_params.vtol_motor_count = 0;
|
_params.vtol_motor_count = 0;
|
||||||
@@ -325,9 +324,35 @@ VtolAttitudeControl::vehicle_cmd_poll() {
|
|||||||
|
|
||||||
if (updated) {
|
if (updated) {
|
||||||
orb_copy(ORB_ID(vehicle_command), _vehicle_cmd_sub , &_vehicle_cmd);
|
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.
|
* Update parameters.
|
||||||
*/
|
*/
|
||||||
@@ -502,11 +527,6 @@ void VtolAttitudeControl::task_main()
|
|||||||
vehicle_battery_poll();
|
vehicle_battery_poll();
|
||||||
vehicle_cmd_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
|
// update the vtol state machine which decides which mode we are in
|
||||||
_vtol_type->update_vtol_state();
|
_vtol_type->update_vtol_state();
|
||||||
|
|
||||||
@@ -514,10 +534,10 @@ void VtolAttitudeControl::task_main()
|
|||||||
if (!_v_control_mode.flag_control_offboard_enabled)
|
if (!_v_control_mode.flag_control_offboard_enabled)
|
||||||
{
|
{
|
||||||
if (_vtol_type->get_mode() == ROTARY_WING) {
|
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) {
|
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 vehicle_local_position_s* get_local_pos () {return &_local_pos;}
|
||||||
struct airspeed_s* get_airspeed () {return &_airspeed;}
|
struct airspeed_s* get_airspeed () {return &_airspeed;}
|
||||||
struct battery_status_s* get_batt_status () {return &_batt_status;}
|
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;}
|
struct Params* get_params () {return &_params;}
|
||||||
|
|
||||||
@@ -167,7 +166,6 @@ private:
|
|||||||
struct airspeed_s _airspeed; // airspeed
|
struct airspeed_s _airspeed; // airspeed
|
||||||
struct battery_status_s _batt_status; // battery status
|
struct battery_status_s _batt_status; // battery status
|
||||||
struct vehicle_command_s _vehicle_cmd;
|
struct vehicle_command_s _vehicle_cmd;
|
||||||
struct vehicle_command_s _vehicle_transition_cmd; // stores transition commands only
|
|
||||||
|
|
||||||
Params _params; // struct holding the parameters
|
Params _params; // struct holding the parameters
|
||||||
|
|
||||||
@@ -191,6 +189,7 @@ private:
|
|||||||
* to waste energy when gliding. */
|
* to waste energy when gliding. */
|
||||||
unsigned _motor_count; // number of motors
|
unsigned _motor_count; // number of motors
|
||||||
float _airspeed_tot;
|
float _airspeed_tot;
|
||||||
|
int _transition_command;
|
||||||
|
|
||||||
VtolType * _vtol_type; // base class for different vtol types
|
VtolType * _vtol_type; // base class for different vtol types
|
||||||
Tiltrotor * _tiltrotor; // tailsitter vtol type
|
Tiltrotor * _tiltrotor; // tailsitter vtol type
|
||||||
@@ -217,6 +216,7 @@ private:
|
|||||||
int parameters_update(); //Update local paraemter cache
|
int parameters_update(); //Update local paraemter cache
|
||||||
void fill_mc_att_rates_sp();
|
void fill_mc_att_rates_sp();
|
||||||
void fill_fw_att_rates_sp();
|
void fill_fw_att_rates_sp();
|
||||||
|
void handle_command();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -63,7 +63,6 @@ _vtol_mode(ROTARY_WING)
|
|||||||
_local_pos = _attc->get_local_pos();
|
_local_pos = _attc->get_local_pos();
|
||||||
_airspeed = _attc->get_airspeed();
|
_airspeed = _attc->get_airspeed();
|
||||||
_batt_status = _attc->get_batt_status();
|
_batt_status = _attc->get_batt_status();
|
||||||
_vehicle_transition_cmd = _attc->get_vehicle_transition_cmd();
|
|
||||||
_params = _attc->get_params();
|
_params = _attc->get_params();
|
||||||
|
|
||||||
flag_idle_mc = true;
|
flag_idle_mc = true;
|
||||||
@@ -132,16 +131,3 @@ void VtolType::set_idle_fw()
|
|||||||
|
|
||||||
close(fd);
|
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;};
|
mode get_mode () {return _vtol_mode;};
|
||||||
|
|
||||||
bool is_fixed_wing_requested();
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
VtolAttitudeControl *_attc;
|
VtolAttitudeControl *_attc;
|
||||||
mode _vtol_mode;
|
mode _vtol_mode;
|
||||||
@@ -109,7 +107,6 @@ protected:
|
|||||||
struct vehicle_local_position_s *_local_pos;
|
struct vehicle_local_position_s *_local_pos;
|
||||||
struct airspeed_s *_airspeed; // airspeed
|
struct airspeed_s *_airspeed; // airspeed
|
||||||
struct battery_status_s *_batt_status; // battery status
|
struct battery_status_s *_batt_status; // battery status
|
||||||
struct vehicle_command_s *_vehicle_transition_cmd;
|
|
||||||
|
|
||||||
struct Params *_params;
|
struct Params *_params;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user