APM飛控系統(tǒng)是國外的一個開源飛控系統(tǒng),,能夠支持固定翼,,直升機,,3軸,,4軸,6軸飛行器,。在此我只介紹固定翼飛控系統(tǒng),。 APM飛控系統(tǒng)主要結(jié)構(gòu)和功能 飛控主芯片 Atmega1280/2560 主控芯片 PPM解碼芯片 Atmega168/328 負責監(jiān)視模式通道的pwm信號監(jiān)測,以便在手動模式和其他模式之間進行切換,。提高系統(tǒng)安全 慣性測量單元 雙軸陀螺,,單軸陀螺,三軸加速度計 測量三軸角速度,,三軸加速度,,配合三軸磁力計或gps測得方向數(shù)據(jù)進行校正,實現(xiàn)方向余弦算法,,計算出飛機姿態(tài),。 GPS導航模塊 Lea-5h或其他信號gps模塊 測量飛機當前的經(jīng)緯度,高度,,航跡方向(track),,地速等信息。 三軸磁力計模塊 HMC5843/5883模塊 測量飛機當前的航向(heading) 空速計 MPXV7002模塊 測量飛機空速(誤差較大,,而且測得數(shù)據(jù)不穩(wěn)定,,會導致油門一陣一陣變化) 空壓計 BMP085芯片 測量 空氣壓力,用以換算成高度 AD芯片 ADS7844芯片 將三軸陀螺儀,、三軸加速度計,、雙軸陀螺儀輸出溫度、空速計輸出的模擬電壓轉(zhuǎn)換成數(shù)字量,,以供后續(xù)計算 其他模塊 電源芯片,,usb電平轉(zhuǎn)換芯片等 飛控原理 在APM飛控系統(tǒng)中,,采用的是兩級PID控制方式,第一級是導航級,,第二級是控制級,,導航級的計算集中在medium_loop( ) 和fastloop( )的update_current_flight_mode( )函數(shù)中,控制級集中在fastloop( )的stabilize( )函數(shù)中,。導航級PID控制就是要解決飛機如何以預定空速飛行在預定高度的問題,,以及如何轉(zhuǎn)彎飛往目標問題,通過算法給出飛機需要的俯仰角,、油門和橫滾角,,然后交給控制級進行控制解算??刂萍壍娜蝿站褪且罁?jù)需要的俯仰角,、油門、橫滾角,,結(jié)合飛機當前的姿態(tài)解算出合適的舵機控制量,,使飛機保持預定的俯仰角,橫滾角和方向角,。最后通過舵機控制級set_servos_4( )將控制量轉(zhuǎn)換成具體的pwm信號量輸出給舵機,。值得一提的是,油門的控制量是在導航級確定的,??刂萍壷胁粚τ烷T控制量進行解算,而直接交給舵機控制級,。而對于方向舵的控制,,導航級并不給出方向舵量的解算,而是由控制級直接解算方向舵控制量,,然后再交給舵機控制級,。 以下,我剔除了APM飛控系統(tǒng)的細枝末節(jié),,僅僅將飛控系統(tǒng)的重要語句展現(xiàn),,只淺顯易懂地說明APM飛控系統(tǒng)的核心工作原理。 一,,如何讓飛機保持預定高度和空速飛行 要想讓飛機在預定高度飛行,,飛控必須控制好飛機的升降舵和油門,因此,,首先介紹固定翼升降舵和油門的控制,,固定翼的升降舵和油門控制方式主要有兩種: 一種是高度控制油門,空速控制升降舵方式。實際飛行存在四種情況,,第一種情況是飛機飛行過程中,,如果高度低于目標高度,飛控就會控制油門加大,,從而導致空速加大,,然后才導致拉升降舵,飛機爬升,;第二種情況與第一種情況相反;第三種情況是飛機在目標高度,,但是空速高于目標空速,,這種情況飛控會直接拉升降舵,使飛機爬升,,降低空速,,但是,高度增加了,,飛控又會減小油門,,導致空速降低,空速低于目標空速后,,飛控推升降舵,,導致飛機降低高度。這種控制方式的好處是,,飛機始終以空速為第一因素來進行控制,,因此保證了飛行的安全,特別是當發(fā)動機熄火等異常情況發(fā)生時,,使飛機能繼續(xù)保持安全,,直到高度降低到地面。這種方式的缺點在于對高度的控制是間接控制,,因此高度控制可能會有一定的滯后或者波動,。 另一種是高度控制升降舵,空速控制油門的方式,。這種控制方式的原理是設(shè)定好飛機平飛時的迎角,,當飛行高度高于或低于目標高度時,在平飛迎角的基礎(chǔ)上根據(jù)高度與目標高度的差設(shè)定一個經(jīng)過PID控制器輸出的限制幅度的爬升角,,由飛機當前的俯仰角和爬升角的偏差來控制升降舵面,,使飛機迅速達到這個爬升角,而盡快完成高度偏差的消除,。但飛機的高度升高或降低后,,必然造成空速的變化,因此采用油門來控制飛機的空速,即當空速低于目標空速后,,在當前油門的基礎(chǔ)上增加油門,,當前空速高于目標空速后,在當前油門的基礎(chǔ)上減小油門,。這種控制方式的好處是能對高度的變化進行第一時間的反應,,因此高度控制較好,缺點是當油門失效時,,比如發(fā)動機熄火發(fā)生時,,由于高度降低飛控將使飛機保持經(jīng)過限幅的最大仰角,最終由于動力的缺乏導致失速,。 但是以上僅僅是控制理論,。在實際控制系統(tǒng)中,由于有些參量并不能較準確地測得,,或者測量時數(shù)據(jù)不穩(wěn)定,,所以并不能完全按照上述的控制理論控制。例如空速的測量時相當不準確的,,而且數(shù)據(jù)波動較嚴重,,這樣,就無法完全按照上述理論進行控制,,必須在其基礎(chǔ)上進行適當修改,。以下以使用空速計情況和不使用空速計情況對APM飛控系統(tǒng)進行闡述。 (1),,使用空速計情況 在使用空速計的情況下,,升降舵是由空速控制。update_current_flight_mode( )調(diào)用calc_nav_pitch( )調(diào)用nav_pitch = -g.pidNavPitchAirspeed.get_pid(airspeed_error, dTnav),。nav_pitch就是導航俯仰角,,也就是說,使用空速計時,,APM系統(tǒng)對利用空速偏差airspeed_error作為輸入量進行導航級的俯仰角控制,。 在使用空速計的情況下,油門是由飛機機械能偏差控制,,也就是空速誤差和高度誤差共同決定,。update_current_flight_mode( )調(diào)用calc_throttle( )調(diào)用g.channel_throttle.servo_out = g.throttle_cruise + g.pidTeThrottle.get_pid(energy_error, dTnav); g.channel_throttle.servo_out += (g.channel_pitch.servo_out * g.kff_pitch_to_throttle); 式中energy_error = airspeed_energy_error + (float)altitude_error * 0.098f,是空速動能偏差,,加上飛機重力勢能偏差,。可以看出,,油門是由設(shè)定的巡航油門g.throttle_cruise,、機械能偏差PID調(diào)節(jié)量和升降舵通道補償共同決定,,但是巡航油門是設(shè)定值,是固定的,。g.kff_pitch_to_throttle默認是0,,所以,實際上油門的增減是由機械能偏差控制的,。 所以,,使用空速計時,APM飛控系統(tǒng)的油門升降舵控制屬于空速控制升降,,機械能控制油門方案,,類似于第一種控制方案,但是又有點區(qū)別,。 (2),,不使用空速計情況 不使用空速計時,升降舵是由高度偏差控制,。update_current_flight_mode( )中調(diào)用calc_nav_pitch( )調(diào)用nav_pitch = g.pidNavPitchAltitude.get_pid(altitude_error, dTnav)。所以升降舵的控制,,是由高度誤差altitude_error作為PID調(diào)節(jié)的輸入量,。 不使用空速計時,油門是由導航俯仰角控制,。update_current_flight_mode( )調(diào)用calc_throttle( )調(diào)用 if (nav_pitch >= 0) { g.channel_throttle.servo_out = throttle_target + (g.throttle_max - throttle_target) * nav_pitch / g.pitch_limit_max; } else { g.channel_throttle.servo_out = throttle_target - (throttle_target - g.throttle_min) * nav_pitch / g.pitch_limit_min; } 可以看出此時的油門控制是利用的是比例調(diào)節(jié),,依據(jù)的比例關(guān)系是 = 。 二,,如何讓飛機飛往目標 要使飛機飛往目標,,那就必須知道飛機當前位置、目標位置和當前航向等問題,。在APM飛控系統(tǒng)中,,GPS模塊能夠提供飛機當前經(jīng)緯度信息,航跡方向和地速信息,。根據(jù)這些信息,,再用程序解算飛機當前位置和目標位置的關(guān)系,就能知道目標航向角target_bearing,,知道了目標航向角target_bearing后就可以用于引導飛機飛向目標,。但是僅用目標航向角進行導航,不能壓航線飛行,,為了解決這個問題,,APM飛控系統(tǒng)中又增加了偏航距crosstrack_error的計算,,并且根據(jù)偏航距,計算出需要的偏航修正量crosstrack_error * g.crosstrack_gain,。使飛機能盡快飛到航線上。最后把目標航向角和偏航修正量組成導航航向角nav_bearing,提供給控制級PID,。所以目標航向角的計算和偏航修正量的計算是構(gòu)成如何讓飛機飛往目標的核心,。下面具體介紹APM中關(guān)于這部分的程序。 APM飛控系統(tǒng)中的GPS信息只能每秒更新4-10次,。所以,,計算目標航向角和偏航修正量的程序都在每秒大約執(zhí)行10次的medium_loop( )中。在medium_loop( ) 的case 1中會執(zhí)行navigate( ),,正是在這個函數(shù)中,,執(zhí)行了導航航向角nav_bearing的計算。 首先計算的是目標航向角,。在navigate( )中有: target_bearing = get_bearing(¤t_loc, &next_WP); nav_bearing = target_bearing; 第一個語句中current_loc和next_WP是結(jié)構(gòu)體,,里面存儲這一個位置點的經(jīng)度、緯度,、高度信息,,current_lot中存儲的是當前點,next_WP中存儲的是目標點,。根據(jù)這個進行在球體表面的三角函數(shù)計算(此文中,,由于篇幅所限,很多東西不進行詳細講解),,就可以得出目標航向target_bearing,。 接下來,要計算偏航修正量,。navigate( )調(diào)用update_navigation( )調(diào)用verify_commands( )調(diào)用verify_nav_wp( )調(diào)用update_crosstrack( ),,這個函數(shù)中有: crosstrack_error = sin(radians((target_bearing - crosstrack_bearing) / 100)) * wp_distance; nav_bearing += constrain(crosstrack_error * g.crosstrack_gain, -g.crosstrack_entry_angle.get(), g.crosstrack_entry_angle.get()); 第一句是計算偏航距的,偏航距是飛機當前位置點到航線的距離,,事實上就是求一個點到一條線之間的距離,。wp_distance是這個直角三角形的斜邊,target_bearing - crosstrack_bearing正是偏航距對應的邊相對的那個銳角,。第二句中crosstrack_error * g.crosstrack_gain使用偏航距乘以偏航修正增益就得出需要的偏航距修正量,,然后使用constrain( )函數(shù)將偏航距修正量限制在-g.crosstrack_entry_angle.get()與g.crosstrack_entry_angle.get()之間。g.crosstrack_entry_angle.get()其實就是最大的偏航距修正量,。在上一段中target_bearing計算時已經(jīng)有nav_bearing = target_bearing?,F(xiàn)在又nav_bearing += constrain(crosstrack_error * g.crosstrack_gain, -g.crosstrack_entry_angle.get(), g.crosstrack_entry_angle.get()),這樣其實就把目標航向角和偏航距修正都加到了nav_bearing 中,。 如何讓飛機按照導航級控制信息飛行 在導航級,,我們已經(jīng)解算出了讓飛機保持高度和空速飛行所需要的俯仰角和油門,以及按航線飛向目標所需要的導航航向,。這就解決了如何引導飛機進行飛行的問題,。也就是說,,飛控已經(jīng)知道該怎么讓飛機飛行了,現(xiàn)在就要解決飛控如何具體控制飛機的問題,,也就是說如何控制各個舵機或者油門,。 油門的控制 油門的控制,前面已經(jīng)提到,,其實油門的控制量是在導航級完成的,。并不傳給控制級程序解算,直接就交給舵機控制級去控制舵機,。 升降舵的控制 對于升降舵的控制,,在導航級已經(jīng)給出了需要的俯仰角nav_pitch,此時,,控制級的任務就是通過控制舵機讓飛機保持規(guī)定的俯仰角nav_pitch,。飛控通過慣性測量單元的DCM 算法能測量出飛機當前的俯仰角dcm.pitch_sensor,然后利用目標俯仰角與當前俯仰角的差值作為控制級升降PID調(diào)節(jié)的輸入,,進行PID控制運算,。程序如下: long tempcalc = nav_pitch +fabs(dcm.roll_sensor * g.kff_pitch_compensation) + (g.channel_throttle.servo_out * g.kff_throttle_to_pitch) - (dcm.pitch_sensor - g.pitch_trim); g.channel_pitch.servo_out = g.pidServoPitch.get_pid(tempcalc, delta_ms_fast_loop, speed_scaler); 語句中作為PID控制的輸入量是tempcalc,而tempcalc除了包含目標俯仰角與當前俯仰角的差值(nav_pitch-dcm.pitch_sensor)外,,還包含了fabs(dcm.roll_sensor * g.kff_pitch_compensation),、(g.channel_throttle.servo_out * g.kff_throttle_to_pitch)和g.pitch_trim。其作用如下: fabs(dcm.roll_sensor * g.kff_pitch_compensation)作用: 加入這個是因為飛機滾轉(zhuǎn)時時會掉高度,,所以提前加入了掉高度的預判fabs(dcm.roll_sensor * g.kff_pitch_compensation),。其中g(shù).kff_pitch_compensation默認值是0.3,。 (g.channel_throttle.servo_out * g.kff_throttle_to_pitch)作用: 其中g(shù).kff_throttle_to_pitch值為0,,也就是默認不加入這個影響。所以在此可以忽略油門控制量對升降舵控制的影響,。當然,,也可以通過地面站調(diào)節(jié)這個值。加入的目的也是用于預判,。 g.pitch_trim作用: 這是升降舵的微調(diào)值,,調(diào)試飛機時,為了使飛機平飛,,會調(diào)節(jié)升降微調(diào),,對升降通道的微調(diào)會記錄在其中。dcm.pitch_sensor - g.pitch_trim正是平飛需要的仰角,。 語句中的speed_scaler是一個縮放因子,,用于縮放輸出的控制量,它與空速或油門有關(guān),。 副翼的控制 飛機的轉(zhuǎn)彎靠的是滾轉(zhuǎn)副翼,,同時拉升降舵,,為了消除側(cè)滑還需要打方向舵。所以要想讓飛機轉(zhuǎn)彎,,導航級會根據(jù)轉(zhuǎn)彎的大小通過PID算法給出需要的側(cè)傾量,。前面已經(jīng)看到升降通道在發(fā)現(xiàn)飛機側(cè)傾時會根據(jù)g.kff_pitch_compensation給出側(cè)傾時需要的升降舵補償。即使這個補償不夠,,升降通道也會在發(fā)現(xiàn)飛機掉高度后拉升降舵,。所以,升降舵總能配合副翼在側(cè)傾時不掉高度進行轉(zhuǎn)彎,。導航級只要給出需要的側(cè)傾量nav_roll就行,。既然導航級已經(jīng)給出了當前需要的導航航向nav_roll(也就是導航側(cè)傾角),那么控制級的任務就是控制飛機保持這個側(cè)傾角,。因此飛控就用DCM算法得出的飛機當前側(cè)傾角dcm.roll_sensor與導航側(cè)傾角nav_roll之間的偏差作為控制級側(cè)傾的PID調(diào)節(jié)輸入量,,進行PID解算出需要的調(diào)節(jié)量。 g.channel_roll.servo_out = g.pidServoRoll.get_pid((nav_roll - dcm.roll_sensor), delta_ms_fast_loop, speed_scaler); 語句中的speed_scaler是一個縮放因子,,用于縮放輸出的控制量,,它與空速或油門有關(guān)。 方向舵的控制 在飛行中,,方向舵是配合飛機轉(zhuǎn)彎用的,,用來消除飛機轉(zhuǎn)彎時的側(cè)滑,也就是用來輔助轉(zhuǎn)彎用的,。只有在著陸以后,,方向舵才能控制機輪以控制飛機轉(zhuǎn)向。在導航級并沒有對飛機方向舵的控制,,只在控制級才有,。stabilize( )調(diào)用calc_nav_yaw(speed_scaler)中有: g.channel_rudder.servo_out = g.kff_rudder_mix * g.channel_roll.servo_out + g.pidServoRudder.get_pid(error, delta_ms_fast_loop, speed_scaler); 語句中g(shù).channel_roll.servo_out是副翼的控制量,g.kff_rudder_mix是方向與升降之間的關(guān)聯(lián)增益,。error是飛機橫向的加速度,,就是側(cè)滑加速度,是DCM算法解算出來的,。由此可以看出方向舵的控制由副翼控制量和橫向加速度PID調(diào)節(jié)量共同決定,。 這樣,通過兩級PID控制,,飛機就能按照預定的要求飛行,。這兩級PID控制就是APM飛控系統(tǒng)的核心。當然,,APM飛控系統(tǒng)的內(nèi)容遠不止這些,,這只不過是是飛控中最核心的部分。 其中涉及到的APM飛控系統(tǒng)的DCM算法也是飛控系統(tǒng)的重要組成部分,。這里不詳細介紹,,但是APM飛控DCM算法在進行校準時忽略了縱向加速度,,認為縱向加速度始終為0,所以這是APM飛控DCM算法的一個重大缺陷,。在此,,由于本文是寫給搞飛控是專業(yè)人士看的,所以不再詳細講述DCM算法,。 四,,APM飛控系統(tǒng)主程序安排。 void loop() { // We want this to execute at 50Hz if possible // ------------------------------------------- if (millis()-fast_loopTimer > 19) 1 { delta_ms_fast_loop = millis() - fast_loopTimer; 2 load= (float)(fast_loopTimeStamp - fast_loopTimer)/delta_ms_fast_loop; //cpu使用率 3 G_Dt=(float)delta_ms_fast_loop/1000.f; //陀螺儀積分時間(DCM算法) 4 fast_loopTimer = millis(); 5 mainLoop_count++; 6 // Execute the fast loop // --------------------- fast_loop(); 7 // Execute the medium loop // ----------------------- medium_loop(); 8 counter_one_herz++; 9 if(counter_one_herz == 50) 10 { one_second_loop(); 11 counter_one_herz = 0; 12 } if(millis()-perf_mon_timer>20000) 13 { //性能監(jiān)控時間到,,執(zhí)行性能監(jiān)控 if (mainLoop_count != 0) 14 { gcs.send_message(MSG_PERF_REPORT); 15 if (g.log_bitmask & MASK_LOG_PM) 16 Log_Write_Performance(); 17 resetPerfData(); 18 } } fast_loopTimeStamp = millis(); 19 } } 以上是飛控系統(tǒng)的主循環(huán)程序,,有19條語句,我在右側(cè)標了語句號,。循環(huán)的頻率是50Hz,,與標準舵機控制頻率相同,這是通過第一條語句if (millis()-fast_loopTimer > 19)實現(xiàn)的,,這個語句中millis( )函數(shù)在程序開始運行后開始執(zhí)行,,中間不停頓,返回的是從程序開始一直到當前的時間(毫秒),,在第5條語句有fast_loopTimer = millis(); 所以if (millis()-fast_loopTimer > 19)的意思就是如果現(xiàn)在的時間距離上一次執(zhí)行時間超過了19ms,,也就是20ms的時候,就會執(zhí)行一次下面所有的程序,,如果不滿足條件,,就一直等待。 接下來從第2條語句到第6條,,除了第三條語句是計算主程序執(zhí)行一次的時間外(可以認為是CPU使用率),,其他的都是做標記用。 接下來的程序是執(zhí)行fast_loop(),、medium_loop(),、one_second_loop()以及20秒一次的性能監(jiān)視,。此外,,在medium_loop( )中還會調(diào)用slow_loop( )(執(zhí)行周期1/3s)。其他語句是輔助作用,。飛控系統(tǒng)的主程序執(zhí)行的就是這幾個子程序,。以下一一說明功能。 (1) fast_loop( ) : 這是飛控系統(tǒng)控制的控制核心之一,。執(zhí)行頻率50Hz,。程序如下: void fast_loop() { // This is the fast loop - we want it to execute at 50Hz if possible // ----------------------------------------------------------------- if (delta_ms_fast_loop > G_Dt_max) G_Dt_max = delta_ms_fast_loop; // Read radio ////讀取遙控信號 // ---------- read_radio(); //APM_RC.InputCh(CH_ROLL)-> ch1_temp-> g.channel_roll.set_pwm(ch1_temp)(即轉(zhuǎn)為control_in) //油門還有control_failsafe(g.channel_throttle.radio_in); //g.channel_throttle.servo_out = g.channel_throttle.control_in; //airspeed_nudge,throttle_nudge, // check for loss of control signal failsafe condition ////檢查丟失控制信號故障安 // ------------------------------------ check_short_failsafe(); //關(guān)于failsafe和ch3_failsafe的處理 // Read Airspeed ///讀取空速 // ------------- if (g.airspeed_enabled == true && HIL_MODE != HIL_MODE_ATTITUDE) { //使能空速計真實飛行時為1 read_airspeed(); //讀取空速,并calc_airspeed_errors(); } else if (g.airspeed_enabled == true && HIL_MODE == HIL_MODE_ATTITUDE) { //真實飛行時為0 calc_airspeed_errors(); } #if HIL_MODE == HIL_MODE_SENSORS //飛行模式時為0 // update hil before dcm update hil.update(); #endif dcm.update_DCM(G_Dt); ////更新DCM // uses the yaw from the DCM to give more accurate turns ///使用從DCM獲得的偏航數(shù)據(jù),,進行更精確的轉(zhuǎn)彎 calc_bearing_error(); //計算得出bearing_error # if HIL_MODE == HIL_MODE_DISABLED //飛行模式時為1 if (g.log_bitmask & MASK_LOG_ATTITUDE_FAST) Log_Write_Attitude((int)dcm.roll_sensor, (int)dcm.pitch_sensor, (uint16_t)dcm.yaw_sensor); if (g.log_bitmask & MASK_LOG_RAW) Log_Write_Raw(); #endif // inertial navigation ////慣性導航 // ------------------ #if INERTIAL_NAVIGATION == ENABLED //這個不執(zhí)行,。本程序的捷聯(lián)慣性導航算法只能計算飛機飛行姿態(tài),,無法結(jié)算三維位置,,,所以,,不能實施完全的慣性導航?;蛘叱绦蜃髡哒谶M行相關(guān)試驗,,或者程序作者的慣性導航不是這個意思,僅是調(diào)試時調(diào)用這個,。 // TODO: implement inertial nav function //實施慣性導航功能 inertialNavigation(); #endif // custom code/exceptions for flight modes ///飛行模式的自定義代碼/異常 // --------------------------------------- update_current_flight_mode(); // 導航級PID // apply desired roll, pitch and yaw to the plane ////控制飛機的副翼,,升降,方向 if (control_mode > MANUAL) stabilize(); // 控制級PID //write out the servo PWM values // set_servos_4(); // XXX is it appropriate to be doing the comms below on the fast loop? ////現(xiàn)在適合做快速環(huán)路上的COMMS嗎,? #if HIL_MODE != HIL_MODE_DISABLED && HIL_PORT != GCS_PORT //飛行模式時為0 // kick the HIL to process incoming sensor packets //使用HIL處理傳入的傳感器數(shù)據(jù)包 hil.update(); #if HIL_PROTOCOL == HIL_PROTOCOL_MAVLINK hil.data_stream_send(45,1000); #else hil.send_message(MSG_SERVO_OUT); #endif #elif HIL_PROTOCOL == HIL_PROTOCOL_MAVLINK && HIL_MODE == HIL_MODE_DISABLED && HIL_PORT == 0 //飛行模式時為1 // Case for hil object on port 0 just for mission planning //HIL端口的對象,,只是用來進行任務規(guī)劃 hil.update(); hil.data_stream_send(45,1000); #endif // kick the GCS to process uplink data ////讓GCS處理上行數(shù)據(jù) gcs.update(); #if GCS_PROTOCOL == GCS_PROTOCOL_MAVLINK //飛行模式時為 gcs.data_stream_send(45,1000); #endif // XXX this should be absorbed into the above, // or be a "GCS fast loop" interface } 這是從我看APM飛控的程序中復制的fast_loop程序。語句后含有我以前對程序的解釋說明,。在此不再詳細說明,。 (2) medium_loop( ),這是飛控系統(tǒng)的另外一個核心,,執(zhí)行頻率10Hz,。用于執(zhí)行GPS數(shù)據(jù)和磁力計數(shù)據(jù)的更新、根據(jù)GPS數(shù)據(jù)進行導航計算,、更新高度信息和命令,、向地面發(fā)送無線數(shù)傳數(shù)據(jù)、控制slow_loop( )執(zhí)行和其他,。其中對導航起很重要作用的導航航向的計算就再medium_loop( )中執(zhí)行,。 (3) slow_loop( ),執(zhí)行周期是1/3s,。主要執(zhí)行長時間故障安全檢查,、讀取三段開關(guān)、讀取舵面正方向及混控開關(guān),、讀取地面站指令等操作,。 (4) one_second_loop( ),執(zhí)行周期1s,。主要執(zhí)行記錄電池電壓,、發(fā)送CPU使用時間等操作。 關(guān)于x-plane模擬 關(guān)于APM飛控使用x-plane進行模擬飛行的原理,,其實是利用x-plane的網(wǎng)絡對戰(zhàn)功能,。因為只有網(wǎng)絡對戰(zhàn)的時候,x-plane才會向外界輸出飛機當前經(jīng)緯度,、飛機姿態(tài),、空速等數(shù)據(jù)信息,。APM飛控進行x-plane模擬時需要設(shè)置網(wǎng)絡端口和進行輸出數(shù)據(jù)設(shè)定也證實了這點。X-plane可以模擬飛機型號,、飛機參數(shù),,飛行環(huán)境等對飛機飛行的影響。從飛機型號就可以選擇從戰(zhàn)斗機,、民航機到航模等各種不同飛機的選擇,。可以模擬飛機燃油,、重心,、重量的變化。最重要的,,它可以模擬外界環(huán)境施對飛行的影響,。可以設(shè)定高空,、中空,、低空的風速和風向??梢栽O(shè)定海平面氣壓和溫度,。此外x-plane還可錄下飛行時的數(shù)據(jù),可以供以后從各個角度觀察飛行情況,,察看飛行數(shù)據(jù),。 在x-plane上模擬其實就是讓APM系統(tǒng)通過網(wǎng)絡端口接收飛行數(shù)據(jù),飛控根據(jù)飛行數(shù)據(jù)解算出需要的控制操作,,再輸入x-plane控制飛機,。由于x-plane提供了非常接近真實飛機的模擬,所以x-plane模擬飛行用于飛控系統(tǒng)的調(diào)試時非常省時省力,。 |
|