天天看點

Ardupilot 飛控代碼解鎖流程分析摘要目錄1.代碼分析3.visio流程圖分析

摘要

本文檔隻有記錄分析ardupilot飛控代碼解鎖的過程,如果有分析不到的地方,歡迎批評指導,謝謝,聯系方式:18129927205

重點标志變量:

_flags.armed=0表示沒有解鎖,

_flags.armed=1表示解鎖

***arming_counter解鎖上鎖計數标志位

channel_yaw->get_control_in(); //獲得偏航值,傳遞給tmp變量,這個值通過pwm轉換的角度範圍是-4500到+4500

解鎖上鎖思路整理:首先判斷油門控制量的值是否大于0,如果大于0,不進行任何計數操作,直接傳回,然後進行偏航通道的判斷,以美國手為例,偏航在最右邊進行解鎖操作,偏航在最左邊進行解鎖操作,偏航在中間不進行操作。細節看visio流程圖。

目錄

文章目錄

  • 摘要
  • 目錄
  • 1.代碼分析
  • 3.visio流程圖分析

1.代碼分析

(1)首先上傳需要看的代碼

void Copter::arm_motors_check()
{
    static int16_t arming_counter;
    // 確定油門值比較低--------------------------------------ensure throttle is down
    if (channel_throttle->get_control_in() > 0) //獲得三通道油門值,如果大于0,直接傳回,不進行解鎖操作
    {
        arming_counter = 0;
        return;
    }
    int16_t tmp = channel_yaw->get_control_in(); //獲得偏航值,傳遞給tmp變量,這個值通過pwm轉換的角度範圍是-4500到+4500
    // 航向打大右邊
    if (tmp > 4000)
    {
        // 增加arm解鎖計數----------------------------------increase the arming counter to a maximum of 1 beyond the auto trim counter
        if( arming_counter <= AUTO_TRIM_DELAY )  //小于10s
        {
            arming_counter++;
        }
        //開始做準備解鎖的工作,此時準備解鎖電機,開始配置飛行------arm the motors and configure for flight
        if (arming_counter == ARM_DELAY && !motors->armed())  //計數到2s,并且沒有解了,這個時候arming_counter=0開始做清零
        {
            //解除保險解除計數器------------------------------reset arming counter if arming fail
            if (!init_arm_motors(false)) //傳回0,解鎖失敗,傳回1解鎖成功
            {
                arming_counter = 0;
            }
        }
        //解鎖電機,開始配置飛行-------------------------------arm the motors and configure for flight
        if (arming_counter == AUTO_TRIM_DELAY && motors->armed() && control_mode == STABILIZE) //等于10s,解鎖了,控制模式是自穩模式
        {
            auto_trim_counter = 250;
            //確定自動解鎖不觸發------------------------------ensure auto-disarm doesn't trigger immediately
            auto_disarm_begin = millis();
        }
    // 全部打到左邊
    }else if (tmp < -4000)
    {
        if (!mode_has_manual_throttle(control_mode) && !ap.land_complete) //如果不是自穩模式,也不是速率模式,也沒有着落
        {
            arming_counter = 0; //立即發揮
            return;
        }
        //增加計數器到解除武器延遲的最大值1------- increase the counter to a maximum of 1 beyond the disarm delay
        if( arming_counter <= DISARM_DELAY ) //上鎖計數2s
        {
            arming_counter++;
        }
        //上鎖電機----------------------------disarm the motors
        if (arming_counter == DISARM_DELAY && motors->armed()) //本來是上鎖的,并且這個時候已經計數到2s,
        {
            init_disarm_motors();
        }

    // 如果偏航是在中間的話,我們不進行計數處理
    }else
    {
        arming_counter = 0;
    }
}

           

#2.代碼截圖

Ardupilot 飛控代碼解鎖流程分析摘要目錄1.代碼分析3.visio流程圖分析
Ardupilot 飛控代碼解鎖流程分析摘要目錄1.代碼分析3.visio流程圖分析

3.visio流程圖分析

Ardupilot 飛控代碼解鎖流程分析摘要目錄1.代碼分析3.visio流程圖分析