evaluate transition command in vtol controller instead of vtol type, use distinct state variables instead of additional command struct

This commit is contained in:
Andreas Antener
2015-08-17 12:22:31 +02:00
committed by Simon Wilks
parent 8fc52fea22
commit 80a3c74cfc
7 changed files with 33 additions and 30 deletions
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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;
+1 -1
View File
@@ -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;
}
-3
View File
@@ -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;