You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
136 lines
4.1 KiB
136 lines
4.1 KiB
//This class converts horizontal acceleration commands to fin flapping commands. |
|
#pragma once |
|
#include <AP_Notify/AP_Notify.h> |
|
#include <SRV_Channel/SRV_Channel.h> |
|
|
|
extern const AP_HAL::HAL& hal; |
|
|
|
#define NUM_FINS 4 //Current maximum number of fins that can be added. |
|
#define RC_SCALE 1000 |
|
class Fins |
|
{ |
|
public: |
|
friend class Blimp; |
|
|
|
enum motor_frame_class { |
|
MOTOR_FRAME_UNDEFINED = 0, |
|
MOTOR_FRAME_AIRFISH = 1, |
|
}; |
|
enum motor_frame_type { |
|
MOTOR_FRAME_TYPE_AIRFISH = 1, |
|
}; |
|
|
|
//constructor |
|
Fins(uint16_t loop_rate); |
|
|
|
// var_info for holding Parameter information |
|
static const struct AP_Param::GroupInfo var_info[]; |
|
|
|
enum class DesiredSpoolState : uint8_t { |
|
SHUT_DOWN = 0, // all fins should move to stop |
|
THROTTLE_UNLIMITED = 2, // all fins can move as needed |
|
}; |
|
|
|
enum class SpoolState : uint8_t { |
|
SHUT_DOWN = 0, // all motors stop |
|
THROTTLE_UNLIMITED = 3, // throttle is no longer constrained by start up procedure |
|
}; |
|
|
|
bool initialised_ok() const |
|
{ |
|
return true; |
|
} |
|
|
|
void armed(bool arm) |
|
{ |
|
if (arm != _armed) { |
|
_armed = arm; |
|
AP_Notify::flags.armed = arm; |
|
} |
|
|
|
} |
|
bool armed() const |
|
{ |
|
return _armed; |
|
} |
|
|
|
protected: |
|
// internal variables |
|
const uint16_t _loop_rate; // rate in Hz at which output() function is called (normally 400hz) |
|
uint16_t _speed_hz; // speed in hz to send updates to motors |
|
float _throttle_avg_max; // last throttle input from set_throttle_avg_max |
|
DesiredSpoolState _spool_desired; // desired spool state |
|
SpoolState _spool_state; // current spool mode |
|
|
|
float _time; //current timestep |
|
|
|
bool _armed; // 0 if disarmed, 1 if armed |
|
|
|
float _amp[NUM_FINS]; //amplitudes |
|
float _off[NUM_FINS]; //offsets |
|
float _omm[NUM_FINS]; //omega multiplier |
|
float _pos[NUM_FINS]; //servo positions |
|
|
|
float _right_amp_factor[NUM_FINS]; |
|
float _front_amp_factor[NUM_FINS]; |
|
float _down_amp_factor[NUM_FINS]; |
|
float _yaw_amp_factor[NUM_FINS]; |
|
|
|
float _right_off_factor[NUM_FINS]; |
|
float _front_off_factor[NUM_FINS]; |
|
float _down_off_factor[NUM_FINS]; |
|
float _yaw_off_factor[NUM_FINS]; |
|
|
|
int8_t _num_added; |
|
|
|
//MIR This should probably become private in future. |
|
public: |
|
float right_out; //input right movement, negative for left, +1 to -1 |
|
float front_out; //input front/forwards movement, negative for backwards, +1 to -1 |
|
float yaw_out; //input yaw, +1 to -1 |
|
float down_out; //input height control, +1 to -1 |
|
|
|
AP_Float freq_hz; |
|
AP_Int8 turbo_mode; |
|
|
|
bool _interlock; // 1 if the motor interlock is enabled (i.e. motors run), 0 if disabled (motors don't run) |
|
bool _initialised_ok; // 1 if initialisation was successful |
|
|
|
// get_spool_state - get current spool state |
|
enum SpoolState get_spool_state(void) const |
|
{ |
|
return _spool_state; |
|
} |
|
|
|
float max(float one, float two) |
|
{ |
|
if (one >= two) { |
|
return one; |
|
} else { |
|
return two; |
|
} |
|
} |
|
|
|
void output_min(); |
|
|
|
void add_fin(int8_t fin_num, float right_amp_fac, float front_amp_fac, float yaw_amp_fac, float down_amp_fac, |
|
float right_off_fac, float front_off_fac, float yaw_off_fac, float down_off_fac); |
|
|
|
void setup_fins(); |
|
|
|
float get_throttle_hover() |
|
{ |
|
return 0; //TODO |
|
} |
|
|
|
void set_desired_spool_state(DesiredSpoolState spool); |
|
|
|
void output(); |
|
|
|
float get_throttle() |
|
{ |
|
return 0.1f; //TODO |
|
} |
|
|
|
void rc_write(uint8_t chan, uint16_t pwm); |
|
};
|
|
|