久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

【轉(zhuǎn)載】APM飛控淺析 (amoBBS 阿莫電子論壇)

 為幸福而奮斗66 2015-05-05
 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)試時非常省時省力,。

    本站是提供個人知識管理的網(wǎng)絡存儲空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點,。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導購買等信息,謹防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多