当前位置:网站首页>VTOL in Px4_ att_ Control source code analysis [supplement]

VTOL in Px4_ att_ Control source code analysis [supplement]

2022-07-07 22:16:00 r1ch4rd

VTOL Source code analysis supplement

The last article roughly analyzed PX4 For in the VTOL Control strategy :

 This is the flow chart of control strategy in the developer handout

The above figure is taken from the developer Roman Bapst A piece of The notes
Among them VTOL Controller The last part also makes a more detailed illustration :
 Picture description here


Add :

fill_actuator_outputs():

Composite model (Standard)

The function is mainly used in various models , Calculate all kinds of flight_mode Under the actuator Output .

multirotor controls:

    // roll
    _actuators_out_0->control[actuator_controls_s::INDEX_ROLL] =
        _actuators_mc_in->control[actuator_controls_s::INDEX_ROLL] * _mc_roll_weight;
    // pitch
    _actuators_out_0->control[actuator_controls_s::INDEX_PITCH] =
        _actuators_mc_in->control[actuator_controls_s::INDEX_PITCH] * _mc_pitch_weight;
    // yaw
    _actuators_out_0->control[actuator_controls_s::INDEX_YAW] =
        _actuators_mc_in->control[actuator_controls_s::INDEX_YAW] * _mc_yaw_weight;
    // throttle
    _actuators_out_0->control[actuator_controls_s::INDEX_THROTTLE] =
        _actuators_mc_in->control[actuator_controls_s::INDEX_THROTTLE] * _mc_throttle_weight;

_actuators_mc_in yes mc_att_control Calculated results of , The above function is used to recalculate the expected output value according to the weight , The same applies to fixed wing mode .

Each output update_transition_state() Calculated mc The weight

 _mc_roll_weight = mc_weight; _mc_pitch_weight = mc_weight; _mc_yaw_weight = mc_weight; _mc_throttle_weight = mc_weight;

In rotor mode, the input quantity is multiplied by each weight : When switching modes , The weight of the rotor represents the proportion assigned by the rotor motor under the composite model ; In full rotor mode ,mc The weight of 1, Fixed wing motor off .

fixed wing controls:

        // roll
        _actuators_out_1->control[actuator_controls_s::INDEX_ROLL] =
            -_actuators_fw_in->control[actuator_controls_s::INDEX_ROLL];

        // pitch
        _actuators_out_1->control[actuator_controls_s::INDEX_PITCH] =
            _actuators_fw_in->control[actuator_controls_s::INDEX_PITCH];
        // yaw
        _actuators_out_1->control[actuator_controls_s::INDEX_YAW] =
            _actuators_fw_in->control[actuator_controls_s::INDEX_YAW];

        _actuators_out_1->control[actuator_controls_s::INDEX_AIRBRAKES] = _reverse_output;
  • Aileron locked : Set all outputs to zero
            _actuators_out_1->control[actuator_controls_s::INDEX_ROLL] = 0.0f; _actuators_out_1->control[actuator_controls_s::INDEX_PITCH] = 0.0f; _actuators_out_1->control[actuator_controls_s::INDEX_YAW] = 0.0f; _actuators_out_1->control[actuator_controls_s::INDEX_AIRBRAKES] = 0.0f;
  • Ailerons not locked : Do not change the yaw output , Only roll and pitch outputs
            // roll
            _actuators_out_1->control[actuator_controls_s::INDEX_ROLL] =
                -_actuators_fw_in->control[actuator_controls_s::INDEX_ROLL];

            // pitch
            _actuators_out_1->control[actuator_controls_s::INDEX_PITCH] =
                _actuators_fw_in->control[actuator_controls_s::INDEX_PITCH];

            _actuators_out_1->control[actuator_controls_s::INDEX_YAW] = 0.0f;
            _actuators_out_1->control[actuator_controls_s::INDEX_AIRBRAKES] = 0.0f;

Tailstock type (Tailsitter)

Pay attention to two points under the tailstock :
- In rotor mode, the aileron is used to control the yaw angle :

// NOTE: There is no mistake in the line below, multicopter yaw axis is controlled by elevon roll actuation!
            _actuators_out_1->control[actuator_controls_s::INDEX_ROLL] =
                _actuators_mc_in->control[actuator_controls_s::INDEX_YAW]; //roll elevon
            _actuators_out_1->control[actuator_controls_s::INDEX_PITCH] =
                _actuators_mc_in->control[actuator_controls_s::INDEX_PITCH]; //pitch elevon

 Picture description here
The picture above shows the tailstock VTOL, Observe to understand the principle , That is, the differential pressure is changed through the differential aileron , Make the body yaw .

Inverse conversion TRANSITION_TO_MC Motor mixed control at :

// in transition engines are mixed by weight (BACK TRANSITION ONLY)
    _actuators_out_0->timestamp = _actuators_mc_in->timestamp;
    _actuators_out_1->timestamp = _actuators_mc_in->timestamp;
    _actuators_out_0->control[actuator_controls_s::INDEX_ROLL] = _actuators_mc_in->control[actuator_controls_s::INDEX_ROLL]
            * _mc_roll_weight;
    _actuators_out_0->control[actuator_controls_s::INDEX_PITCH] =
        _actuators_mc_in->control[actuator_controls_s::INDEX_PITCH] * _mc_pitch_weight;
    _actuators_out_0->control[actuator_controls_s::INDEX_YAW] = _actuators_mc_in->control[actuator_controls_s::INDEX_YAW] *
            _mc_yaw_weight;
    _actuators_out_0->control[actuator_controls_s::INDEX_THROTTLE] =
        _actuators_mc_in->control[actuator_controls_s::INDEX_THROTTLE];

    // NOTE: There is no mistake in the line below, multicopter yaw axis is controlled by elevon roll actuation!
    _actuators_out_1->control[actuator_controls_s::INDEX_ROLL] = -_actuators_fw_in->control[actuator_controls_s::INDEX_ROLL]
            * (1 - _mc_yaw_weight);
    _actuators_out_1->control[actuator_controls_s::INDEX_PITCH] =
        _actuators_mc_in->control[actuator_controls_s::INDEX_PITCH] * _mc_pitch_weight;
    // **LATER** + (_actuators_fw_in->control[actuator_controls_s::INDEX_PITCH] + _params->fw_pitch_trim) *(1 - _mc_pitch_weight);
    _actuators_out_1->control[actuator_controls_s::INDEX_THROTTLE] =
        _actuators_fw_in->control[actuator_controls_s::INDEX_THROTTLE];

Tilting (Tiltrotor)

  • In rotor mode :
    Recalculate the motor output according to the weight
    _actuators_out_0->timestamp = _actuators_mc_in->timestamp;
    _actuators_out_0->control[actuator_controls_s::INDEX_ROLL] = _actuators_mc_in->control[actuator_controls_s::INDEX_ROLL] * _mc_roll_weight; _actuators_out_0->control[actuator_controls_s::INDEX_PITCH] = _actuators_mc_in->control[actuator_controls_s::INDEX_PITCH] * _mc_pitch_weight; _actuators_out_0->control[actuator_controls_s::INDEX_YAW] = _actuators_mc_in->control[actuator_controls_s::INDEX_YAW] * _mc_yaw_weight;
  • Fixed wing mode :
    _actuators_out_1->timestamp = _actuators_fw_in->timestamp;
    _actuators_out_1->control[actuator_controls_s::INDEX_ROLL] =
        -_actuators_fw_in->control[actuator_controls_s::INDEX_ROLL];
    _actuators_out_1->control[actuator_controls_s::INDEX_PITCH] =
        (_actuators_fw_in->control[actuator_controls_s::INDEX_PITCH] + _params->fw_pitch_trim);
    _actuators_out_1->control[actuator_controls_s::INDEX_YAW] =
        _actuators_fw_in->control[actuator_controls_s::INDEX_YAW];  // yaw
    _actuators_out_1->control[4] = _tilt_control;   

vtol_type.cpp:

VtolType::update_mc_state() Copy the virtual attitude expectation to the actual attitude expectation

void VtolType::update_fw_state()
// copy virtual attitude setpoint to real attitude setpoint

VtolType::check_quadchute_condition()
Fixed wing mode uses tecs Track tracking , Used during conversion local_pos_sp

原网站

版权声明
本文为[r1ch4rd]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/02/202202130608041937.html