Skip to content
Roman Dvořák edited this page Feb 11, 2019 · 4 revisions

Welcome to the ThunderFly PX4Firmware wiki!

Mixer file

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í

How reading of Mixer files works?

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())

Možné chybové hlášky z mixeru v bootlog

  • "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

Módy řízení

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

Pro potřeby řízení vírníku přidány další 2 flagy

bool flag_control_prerotator_enabled
bool flag_control_roverroof_enabled

V souboru Commander.cpp#L3226 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	        ----                  ----

Stabilizovaný mód

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 ale počítá ECL_RollController::control_bodyrate což je dobře popsáno na obrázku