PX4中vtol_att_control 源码解析【补】

论坛 期权论坛 脚本     
匿名技术用户   2020-12-27 05:40   1147   0

VTOL源码分析补充

上一篇大致分析了PX4中对于VTOL的控制策略:

这是开发者讲义中的控制策略流程图

上图摘自开发者Roman Bapst的一篇讲义
其中的VTOL Controller上篇也做了较为详细的图解:
这里写图片描述


补充:

fill_actuator_outputs():

复合式机型(Standard)

函数的主要作用是在各种机型下,计算各种flight_mode下的actuator输出。

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_inmc_att_control的计算结果,上述函数的作用是根据权重重新计算期望输出值,同理适用固定翼模式。

各个输出量update_transition_state()计算得到的mc权重

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

旋翼模式下输入量乘以各权重:转换模式时,旋翼的权重代表复合式机型下旋翼电机分配的比重;而在全旋翼模式下,mc权重为1,固定翼电机关闭。

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;
  • 副翼锁定情况下: 输出全部置零
            _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;
  • 副翼未锁定: 不改变偏航输出,只有滚转和俯仰输出
            // 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;

尾座式(Tailsitter)

尾座式下关注两点:
- 旋翼模式下利用副翼做偏航角的控制:

// 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

这里写图片描述
上图是尾座式VTOL,观察即可了解原理,即通过差动副翼改变压差,使得机体偏航。

反转换TRANSITION_TO_MC时的电机混控:

// 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];

倾转式(Tiltrotor)

  • 旋翼模式下:
    根据权重重新计算电机输出
    _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;
  • 固定翼模式:
    _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()虚拟姿态期望值拷贝至实际姿态期望值

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

VtolType::check_quadchute_condition()
固定翼模式使用tecs轨迹跟踪,转换过程中使用local_pos_sp

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP