摘要
本文檔隻有記錄分析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.代碼截圖