123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- #include "AC_InputManager_Heli.h"
- #include <AP_Math/AP_Math.h>
- #include <AP_HAL/AP_HAL.h>
- extern const AP_HAL::HAL& hal;
- const AP_Param::GroupInfo AC_InputManager_Heli::var_info[] = {
-
- AP_NESTEDGROUPINFO(AC_InputManager, 0),
-
-
-
-
-
-
-
- AP_GROUPINFO("STAB_COL_1", 1, AC_InputManager_Heli, _heli_stab_col_min, AC_ATTITUDE_HELI_STAB_COLLECTIVE_MIN_DEFAULT),
-
-
-
-
-
-
-
- AP_GROUPINFO("STAB_COL_2", 2, AC_InputManager_Heli, _heli_stab_col_low, AC_ATTITUDE_HELI_STAB_COLLECTIVE_LOW_DEFAULT),
-
-
-
-
-
-
-
- AP_GROUPINFO("STAB_COL_3", 3, AC_InputManager_Heli, _heli_stab_col_high, AC_ATTITUDE_HELI_STAB_COLLECTIVE_HIGH_DEFAULT),
-
-
-
-
-
-
-
- AP_GROUPINFO("STAB_COL_4", 4, AC_InputManager_Heli, _heli_stab_col_max, AC_ATTITUDE_HELI_STAB_COLLECTIVE_MAX_DEFAULT),
-
-
-
-
-
- AP_GROUPINFO("ACRO_COL_EXP", 5, AC_InputManager_Heli, _acro_col_expo, 0),
- AP_GROUPEND
- };
- float AC_InputManager_Heli::get_pilot_desired_collective(int16_t control_in)
- {
- float slope_low, slope_high, slope_range, slope_run, scalar;
- float stab_col_out, acro_col_out;
-
-
- if (control_in < 400){
- slope_low = _heli_stab_col_min / 1000.0f;
- slope_high = _heli_stab_col_low / 1000.0f;
- slope_range = 0.4f;
- slope_run = control_in / 1000.0f;
- } else if(control_in <600){
- slope_low = _heli_stab_col_low / 1000.0f;
- slope_high = _heli_stab_col_high / 1000.0f;
- slope_range = 0.2f;
- slope_run = (control_in - 400) / 1000.0f;
- } else {
- slope_low = _heli_stab_col_high / 1000.0f;
- slope_high = _heli_stab_col_max / 1000.0f;
- slope_range = 0.4f;
- slope_run = (control_in - 600) / 1000.0f;
- }
- scalar = (slope_high - slope_low)/slope_range;
- stab_col_out = slope_low + slope_run * scalar;
- stab_col_out = constrain_float(stab_col_out, 0.0f, 1.0f);
-
-
-
- if (_acro_col_expo > 1.0f) {
- _acro_col_expo = 1.0f;
- }
- if (_acro_col_expo <= 0.0f) {
- acro_col_out = control_in / 1000.0f;
- } else {
-
- float col_in, col_in3, col_out;
- col_in = (float)(control_in-500)/500.0f;
- col_in3 = col_in*col_in*col_in;
- col_out = (_acro_col_expo * col_in3) + ((1.0f-_acro_col_expo)*col_in);
- acro_col_out = 0.5f + col_out*0.5f;
- }
- acro_col_out = constrain_float(acro_col_out, 0.0f, 1.0f);
-
- if (_im_flags_heli.use_stab_col && (_stab_col_ramp < 1.0f)){
- _stab_col_ramp += 2.0f/(float)_loop_rate;
- } else if(!_im_flags_heli.use_stab_col && (_stab_col_ramp > 0.0f)){
- _stab_col_ramp -= 2.0f/(float)_loop_rate;
- }
- _stab_col_ramp = constrain_float(_stab_col_ramp, 0.0f, 1.0f);
-
- float collective_out;
- collective_out = (float)((1.0f-_stab_col_ramp)*acro_col_out + _stab_col_ramp*stab_col_out);
- collective_out = constrain_float(collective_out, 0.0f, 1.0f);
- return collective_out;
- }
|