-
Notifications
You must be signed in to change notification settings - Fork 4
Home
Příkaz mixer může mít 2 režimy.
- První režim "load" kompletně smaže nastavení mixeru v zařízení a následně načte a rozparseruje nový mixér.
- Druhý režim "append" přidá nové mixery na konec stávajícího mixování
Mixer se začne načítat na základě systémové aplikace 'mixer.cpp' Ta po přijmutí vstupních parametrů a ověření dostupnosti HW zavolá funkci load_mixer_file() ze souboru 'src/lib/mixer/mixer_load.c'.
Funkce prochází soubor řádek po řadku a hladá, kdy narazí na začátek řádku, který odpovídá předpisu mixeru. Tzn.
- řádek delší než 2 znaky
- První znak je velký
- Druhý znak je dvojtečka Následně se prochází řádky a hledají se mezery ' '. Ověří se maximální velikost řádku (ta je opravdu velká) Upravený řádek s daty se vloží do bufferu (Buffer jako pointer je vstupním parametrem funkce load_mixer_file())
- "can't open %s\n", devname -
- "can't reset mixers on %s", devname - pouze v "load" režimu
- "can't load mixer file: %s", fname - Chyba, kterou vyvolá parserovací funkce - "load_mixer_file(..)"
- "failed to load mixers from %s", fname - Soubor načten a rozparserován. Nepovedlo se přidat nastavení na konec mixovacího nastavení v PX4.
- "Mixer file '%s' is loaded", fname
Program je větven pomocí následujících parametrů:
bool flag_external_manual_override_ok # external override non-fatal for system. Only true for fixed wing
bool flag_control_manual_enabled # true if manual input is mixed in
bool flag_control_auto_enabled # true if onboard autopilot should act
bool flag_control_offboard_enabled # true if offboard control should be used
bool flag_control_rates_enabled # true if rates are stabilized
bool flag_control_attitude_enabled # true if attitude stabilization is mixed in
bool flag_control_rattitude_enabled # true if rate/attitude stabilization is enabled
bool flag_control_force_enabled # true if force control is mixed in
bool flag_control_acceleration_enabled # true if acceleration is controlled
bool flag_control_velocity_enabled # true if horizontal velocity (implies direction) is controlled
bool flag_control_position_enabled # true if position is controlled
bool flag_control_altitude_enabled # true if altitude is controlled
bool flag_control_climb_rate_enabled # true if climb rate is controlled
bool flag_control_termination_enabled # true if flighttermination is enabled
bool flag_control_fixed_hdg_enabled # true if using a fixed heading for user control
V souboru Commander.cpp#L3172 lze vyčíst, jaké režimy jsou při kterém módu zapnuté:
Název rezimu MANUALNI STABILIZOVANY
bool flag_control_manual_enabled true true
bool flag_control_auto_enabled false false
bool flag_control_offboard_enabled false false
bool flag_control_rates_enabled ? true
bool flag_control_attitude_enabled ? true
bool flag_control_rattitude_enabled false false
bool flag_control_force_enabled -- --
bool flag_control_acceleration_enabled false false
bool flag_control_velocity_enabled false false
bool flag_control_position_enabled false false
bool flag_control_altitude_enabled --- ---
bool flag_control_climb_rate_enabled --- ---
bool flag_control_termination_enabled false false
bool flag_control_fixed_hdg_enabled ---- ----
Při stabilizovaném režimu se ve funkci RotorwindControl.cpp/vehicle_manual_poll
spočítá setpoint na všechny tři osy. Tento výpočet je proveden následovně:
_att_sp.roll_body = _manual.y * _parameters.man_roll_max + _parameters.rollsp_offset_rad;
_att_sp.roll_body = math::constrain(_att_sp.roll_body, -_parameters.man_roll_max, _parameters.man_roll_max);
_manual.y - je vstup z ovladače - má hodnoty -1..1
man_roll_max - [rad] - je jeden z parametrů 'FW_MAN_R_MAX', který určuje maximální náklon při letu v dané ose.
rollsp_offfset_rad - [rad] - offset
Z důvodu možného offsetu je toto číslo oříznuto pomocí <-man_roll_max, man_roll_max>
Nyní máme číslo, které nám říká, jakého setpointu chceme dosáhnout. Zatím je to vztaženo vzhledem k reálným osám letadla.
Dále ve funkci ECL_RollController::control_attitude()
se určí chyba setpointu a reálného směru vírníku
float roll_error = ctl_data.roll_setpoint - ctl_data.roll;
(ctl_data.roll_setpoint
je proměnná _att_sp.roll_body
z dřívějšího příkladu)
Určí se rate setpointu
_rate_setpoint = roll_error / _tc;
_tc
je časová konstanta
Následně jsou ve stabilizovaném režimu prevedeny funkce control_euler_rate
, které zajišťují kontrolovaný průlet zatáčkou. Pro každou osu jsou počítána jinak. (Osa YAW je řešena úplně jinak)
- Pitch
_bodyrate_setpoint = cosf(roll) * _rate_setpoint + cosf(pitch) * sinf(roll) * yaw_rate_setpoint;
- Roll
_bodyrate_setpoint = roll_rate_setpoint - sinf(pitch)*yaw_rate_setpoint;
Ve všech případech se ále počítá ECL_RollController::control_bodyrate
což je dobře popsáno na obrázku