四旋翼飛行器搭建教程(px4ardupoilotapm)_第1頁
四旋翼飛行器搭建教程(px4ardupoilotapm)_第2頁
四旋翼飛行器搭建教程(px4ardupoilotapm)_第3頁
四旋翼飛行器搭建教程(px4ardupoilotapm)_第4頁
四旋翼飛行器搭建教程(px4ardupoilotapm)_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、四旋翼飛行器搭建教程 (譯自加里斯.歐文 ) 本文將帶你通過建立自己的飛行控制器(飛空軟件),同時教你工作的具體細(xì)節(jié)。這些信息很難找到,特別是那些本身就不是航天工程師的人!就我個人而言,我用了六個月,因為我花費(fèi)了太多的時間查找bug和調(diào)試bug,但通過這篇文章你可以短期收獲同樣的經(jīng)驗。我會教你避開陷阱,這樣你就不會像我一樣浪費(fèi)時間。 第一個關(guān)鍵是你對硬件的選擇。我選擇從零開始建立自己系統(tǒng),在這一階段的時候我都不知道RC(remote controlled 遙控; radio coding 無線電編碼; )和飛行器是如何飛行的,這是一個巨大錯誤。開始我以為,通過自行購買附加電路,芯片和傳感器能省

2、很多錢,結(jié)果最終我花了一大筆錢!放過自己吧,直接去購買ardupilot 2.5控制板,組裝你的直升機(jī),了解遙控,了解飛行原理,然后回到這里。這個板子本質(zhì)上是只是一個連有一些傳感器Arduino(開源主控板,可查 本項目(ardupilot)由3D Robotics 提供贊助,這意味著他們銷售所設(shè)計的硬件獲利,并將所得利潤回饋社區(qū)。該軟硬件是完全開源的,所有人可以免費(fèi)復(fù)制下載。你可以直接從他們那里購買,或者從Hobbyking (named HKPilot) and RCTimer (named ArduFlyer).購買相同的拷貝件。 在這篇文章中,我將假定您有ardupilot硬件其本質(zhì)上

3、上是附傳感器Arduino。如果你選擇忽視我的建議,并且建立自己的硬件,或使用Arduino電路板,那么您需要更換的底層代碼(HAL庫)。我也會以為你在X配置(x型四旋翼),+ / X(兩種四旋翼配置)和六/八 旋翼飛行器之間切換(只是不同的電機(jī)的組合),配置的改變不會讓它在本文有任何實(shí)質(zhì)性的區(qū)別。理想的情況是,你已經(jīng)飛行過加載了arducopter代碼的四旋翼,因此你應(yīng)該將電機(jī)連接如下所示的位置和旋轉(zhuǎn)方向。 我也要假設(shè)你有一些arduino的經(jīng)驗,或至少是C / C + +的經(jīng)驗。Arduino庫不是特別智能的或適合,所以我們將使用一些更加合適的的ardupilot庫。然而,我們會盡量少使用

4、、最小幅度的使用,以提供DIY式解決方案的支持(這就是為什么你在這里畢竟)。我們將要使用的第一和主要庫是ardupilot硬件抽象層(HAL)庫。這個庫試圖隱藏了底層的區(qū)別,例如你如何讀取和寫入引腳和其它一些東西其優(yōu)勢是,軟件可移植到新的硬件,只需更換硬件抽象層。在ardupilot的情況下,有兩個硬件平臺,APM和PX4,每一個都有自己的底層庫允許ardupilot代碼運(yùn)行。如果您稍后決定在Raspberry Pi上運(yùn)行你的代碼,你只需要改變硬件層代碼。 硬件層是由如下幾個部分組成:RCInput無線輸入閱讀RC無線電rc input -。RCOutput無線輸出用于控制電動機(jī)和其它輸出rc

5、output -。Scheduler計劃表運(yùn)行特定的任務(wù)在固定時間間隔調(diào)度程序-。console控制臺提供訪問串行端口。I2C,SPI總線驅(qū)動程序(用于連接傳感器小電路板網(wǎng)絡(luò))GPIO 一般目的的輸入/輸出允許直接訪問Arduino引腳,但是在我們的案例中,主要的發(fā)光二極管如何下載:你需要下載Arduino的IDE ardupilot版。還需要將庫文件放在你的延伸文件夾中。還要確保你選擇你的板類型像Arduino的菜單這樣:Reading the Radio Inputs讀取無線電輸入我們的飛行控制系統(tǒng)要讀取無線電輸入信號(飛行指令),測量四旋翼的實(shí)時的姿態(tài)(偏航/俯仰/滾動),改變電機(jī)的轉(zhuǎn)速

6、以適應(yīng)四旋翼按照我們所期望的方式飛行。所以讓我們開始通過無線電開始學(xué)習(xí)。RC接收機(jī)有幾個輸出,有好幾個通道(或稱為棒/開關(guān)/旋鈕)。無線電輸出的50Hz脈沖,這個脈沖的寬度是由無線電發(fā)射機(jī)的搖桿位置決定的。通常情況下,脈沖持續(xù)1000us到2000us長并有18000us到19000us的間隙,所以表示0的油門 會產(chǎn)生一個1000us的脈沖,表示完全的油門 則有2000us長??杀氖?,大多數(shù)的接收機(jī)是不準(zhǔn)確的,我們通常要測量每個桿位的最小或最大值脈沖寬度(這我們接下來將要做的)。 Ardupilot的底層庫,為我們做了測量這些脈沖寬度的痛苦工作。如果你自己編寫這些代碼,你需要中斷其他工作并用

7、定時器來測量無線電信號analogread Arduino不適合做這項工作,因為它占用了處理器全部的計算容量,雖然它可以測量,但是同時也阻止我們其他事。(即 Arduino是單線程軟件,無法同時做兩項工作)實(shí)現(xiàn)一個測量信號的工作并不難,讓這種程序持續(xù)1個小時甚至更長是很普通的事,我們不是只做這么簡單的程序。 下面是一些使用APM 底層庫,測量通道“值”的代碼的簡單例子。通道“值”就是測量毫秒級的脈沖寬度。#include <AP_Common.h>#include <AP_Math.h>#include <AP_Param.h>#include <AP

8、_Progmem.h>#include <AP_ADC.h>#include <AP_InertialSensor.h> #include <AP_HAL.h> #include <AP_HAL_AVR.h>const AP_HAL:HAL& hal = AP_HAL_AVR_APM2; / Hardware abstraction layervoid setup() void loop() uint16_t channels8; / array for raw channel values / Read RC channels a

9、nd store in channels array hal.rcin->read(channels, 8); / Copy from channels array to something human readable - array entry 0 = input 1, etc. uint16_t rcthr, rcyaw, rcpit, rcroll; / Variables to store rc input rcthr = channels2; rcyaw = channels3; rcpit = channels1; rcroll = channels0; hal.conso

10、le->printf_P( PSTR("individual read THR %d YAW %d PIT %d ROLL %drn"), rcthr, rcyaw, rcpit, rcroll); hal.scheduler->delay(50); /Wait 50ms AP_HAL_MAIN(); / special macro that replace's one of Arduino's to setup the code (e.g. ensure loop() is called in a loop).創(chuàng)建一個新的草稿腳本,并將該腳本上

11、傳到Ardupilot 硬件上。使用串行記錄儀紀(jì)錄下每個通道的最大和最小值。(同時將脈沖調(diào)至極限)現(xiàn)在讓我們來衡量脈沖的“值”,以顯示他們所含有的意義。我們要使用一種稱為Map的功能,這是一種確定一個數(shù)值在某一區(qū)間將其判讀為另一“值”的功能。例如,有一個50的數(shù)值,在0100之間,而我們想要將他放入0到500這個區(qū)間來衡量,Map的功能將會定義其為250,并返回250這個值。Map功能會在你引用并定義(#include&defines)之后被啟用(從Arduino庫中引用)long map(long x, long in_min, long in_max, long out_min,

12、long out_max) return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;這樣使用Map功能:result = map(VALUE, FROM_MIN, FROM_MAX, TO_MIN, TO_MAX).你會感到仍然沒有接觸到 油門,毫無疑問你會對于自己沒有參與建立油門的判讀而感到高興,這個閥值是由電調(diào)生成的(如果你是按照我的建議做的)。俯仰和翻滾在正負(fù)45度之間會被測量,當(dāng)然你也可以設(shè)定為正負(fù)150度。我的loop()函數(shù)現(xiàn)在看起來像,更換為測量最大最小桿位的Map功能。我們也會改變函數(shù)類型,

13、變?yōu)閘ong型,以支持負(fù)數(shù)。long rcthr, rcyaw, rcpit, rcroll; / Variables to store rc inputrcthr = channels2;rcyaw = map(channels3, 1068, 1915, -150, 150);rcpit = map(channels1, 1077, 1915, -45, 45);rcroll = map(channels0, 1090, 1913, -45, 45);俯仰在桿位向前是是負(fù)的,翻滾或偏航在桿位向左是負(fù)的。如果實(shí)際操控中不對,請調(diào)整到正確位置。你現(xiàn)在應(yīng)該輸出這些值,并在串行接口上面觀察數(shù)據(jù)。理

14、想狀態(tài)下,當(dāng)桿位在中間的時候,這些值應(yīng)該為零(除了 thr 變量)。調(diào)試最大最小值,直到合適為止。這些數(shù)據(jù)會有一些擾動(在真值上下浮動)因為搖桿是模擬信號輸出,所以會有1度到2度的偏差。一旦你能夠?qū)⒛愕乃男盹w起來的時候,你就會考慮回到這里介紹均值濾波器。確保向前傾斜,滾動和偏航為左時,數(shù)值為負(fù)數(shù)如果不是的,請將Map函數(shù)前改為負(fù)函數(shù)。當(dāng)然你也要確保當(dāng)你增加油門值時,實(shí)際油門值也會增加。Controlling the motors控制電機(jī) 電機(jī)是由電調(diào)來控制的,他們的工作脈寬大約有1000us和2000us和無線接收機(jī)一樣脈寬為1000us意味著無,而脈寬為2000us意味著有。電調(diào)被設(shè)定為接

15、受50Hz的信號,但是大多數(shù)電機(jī)將5-10個儲存的值平均后,再發(fā)送給電機(jī)。這種模式也可以在四旋翼上使用,如果將平均濾波效應(yīng)最小化,四旋翼會表現(xiàn)的更好。因此,APM底層庫的脈沖工作在490Hz,這意味著5到10個脈沖將會快速被平均,很大程度上減小了濾波效應(yīng)。 在setup()函數(shù)中,可以這樣輸出:hal.rcout->set_freq(0xF, 490);hal.rcout->enable_mask(0xFF); 在你引用之后,讓我們定義一下每個Mapping輸出的電機(jī)名字mapping 的輸出口名與四旋翼(Arducopter)使用的一樣,只不過是從零開始而已。(編程中從0開始命名

16、,所以四個電機(jī)的命名是0到3,四旋翼四個電機(jī)則是1到4)#define MOTOR_FL 2 / Front left #define MOTOR_FR 0 / Front right#define MOTOR_BL 1 / back left#define MOTOR_BR 3 / back right你的loop函數(shù)里,讀取無線電信號后,將這個無線電閥值直接輸出給電機(jī)hal.rcout->write(MOTOR_FR, rcthr); 你現(xiàn)在可以編程你的四旋翼并實(shí)驗他,注意一定是不帶螺旋槳的。緩慢的提高閥值和前右電機(jī)的旋轉(zhuǎn)速度。再說一次,如果所有電機(jī)帶了螺旋槳,都會旋轉(zhuǎn)起來,但是四旋

17、翼還是會墜毀。我們需要的是穩(wěn)妥的做法,四旋翼的電機(jī),電調(diào),支撐架等等,都會略有不同,意味著施加在每個電機(jī)上的力略有不同,這意味著四旋翼永遠(yuǎn)不會真正意義上的水平。*以下內(nèi)容出于安全原因而省略*Determining Orientation 確定位置、方向 接下來就是定向了,或者說確定四旋翼的姿態(tài)。我們可以這樣,通過飛行指令改變電機(jī)的速度。有兩個傳感器來定向,加速計和陀螺儀。加速計測量每一個方向的加速情況,(重力是加速的原因之一,通過重力我們能確定地面方向)陀螺儀則測量角速度。(例如沒一個軸的旋轉(zhuǎn)速度。)然而,加速度計對振動非常敏感,不是特別靈敏;而陀螺儀是高度靈敏,且抗振動,但容易浮動。(靜止時

18、也會顯示1到2度每秒的角速度)所以,我們使用一個將兩個傳感器數(shù)據(jù)結(jié)合起來的融合算法,并得到兩全其美的結(jié)果 - 這樣的算法的不再本文的討論范圍之內(nèi)。該算法通常是一個卡爾曼濾波器,或在ArduPilot的情況下,直接余弦矩陣(DCM)。我提供了DCM的鏈接,如果你有一個數(shù)學(xué)背景并對此感興趣 ; 其余的人,我們不需要知道其具體細(xì)節(jié)。值得慶幸的是,我們可以使用MPU6050傳感器芯片,該芯片含有加速計和陀螺儀并有一個內(nèi)置的數(shù)字運(yùn)動處理單元(傳感器融合)。它將所有值融合起來,并給我提供了一個四元數(shù)值。四元數(shù)值是一種不同的提供定位方式(相對于歐拉角:航向偏轉(zhuǎn)),如果你已經(jīng)進(jìn)行了三維編程并且對此十分熟悉,你

19、會發(fā)現(xiàn)四元數(shù)值有一定優(yōu)勢。 為了方便起見,我們更傾向于使用歐拉角并且使用歐拉角編程而不是四元數(shù)值。此段代碼就是接合MPU6050傳感器的代碼在 setup()函數(shù)中/ Disable barometer to stop it corrupting bushal.gpio->pinMode(40,GPIO_OUTPUT);hal.gpio->write(40, 1);/ Initialise MPU6050 sensorins.init(AP_InertialSensor:COLD_START, AP_InertialSensor:RATE_100HZ, NULL);/ Initia

20、lise MPU6050's internal sensor fusion (akaDigitalMotionProcessing)hal.scheduler->suspend_timer_procs(); / stop bus collisionsns.dmp_init(); ins.push_gyro_offsets_to_dmp();hal.scheduler->resume_timer_procs();現(xiàn)在讓我們來讀取傳感器數(shù)據(jù),在loop()函數(shù)開頭加入這一行,這使得程序強(qiáng)行等待直到傳感器有新的數(shù)據(jù),不會改變電機(jī)的速度,直到我們得到新的數(shù)據(jù)。while (ins.

21、num_samples_available() = 0);*將延遲50Ms從loop()函數(shù)中移除,我們不再需要了。*現(xiàn)在我們從傳感器中得到偏航/俯仰/滾動的數(shù)據(jù),并將它們從弧度轉(zhuǎn)化為角度。ins.update();ins.quaternion.to_euler(&roll, &pitch, &yaw);roll = ToDeg(roll) ;pitch = ToDeg(pitch) ;yaw = ToDeg(yaw) ;我們將它從串行管理接口輸出hal.console->printf_P( PSTR("P:%4.1f R:%4.1f Y:%4.1fn&

22、quot;), pitch, roll, yaw );你需要為這個print語句設(shè)定一個閥值,例如:確保它每循環(huán)20次只打印一次(提示:使用一個計數(shù)器)。否則,串口線帶寬將被占滿。 四處移動你的直升機(jī),并確保生成正確的數(shù)值!Acrobatic / Rate mode control特技/速率模式控制 特技/速率模式是指你的發(fā)射機(jī)枝告訴四旋翼以一個特定的利率(如50deg/sec)轉(zhuǎn)動,當(dāng)您的遙控桿居中時四停止翻滾。相對于穩(wěn)定模式,搖桿返回中心位置將使四旋翼恢復(fù)水平。這是一種需要實(shí)踐以學(xué)習(xí)如何飛行的模式;但首先要實(shí)現(xiàn)穩(wěn)定飛行模式,因為我們所需要的是穩(wěn)定控制,這是是特技/速度控制的的最高層。 所以

23、,我們的目標(biāo)是讓搖桿指示達(dá)到某一個翻轉(zhuǎn)速率,而且四旋翼就努力按照這個速率運(yùn)動。因此,如果操作員要求在俯仰以50度/秒偏轉(zhuǎn),我們目前不偏轉(zhuǎn),那么我們需要加快后方馬達(dá)和減速前面的馬達(dá)。現(xiàn)在的問題是,我們要以速度來加速或減速?為了確定這一點(diǎn),你需要了解比例積分微分(PID)控制器,我們需要廣泛使用的。雖然有點(diǎn)黑科技的,原理是相當(dāng)簡單的。讓我們假設(shè)我們的四旋翼現(xiàn)在在俯仰方向上旋轉(zhuǎn),所以實(shí)際速率為0,讓我們進(jìn)一步假設(shè)操作手希望四旋翼在15度/秒旋轉(zhuǎn),所以期望=15,現(xiàn)在我們可以這樣說,我們得到的速率和實(shí)際速率之間的差(error)是:error = desired - actual = 15 - 0 =

24、 15差(error)=期望值實(shí)際值=150=15現(xiàn)在將差給我,我們將他和與其相關(guān)的Kp相乘,產(chǎn)生一個數(shù)值我們用來加速或減速電機(jī)。所以我們可以說電機(jī)是這樣改變的:frontMotors = throttle - error*KprearMotors = throttle + error*Kp前電機(jī)=閥值差*Kp后電機(jī)=閥值+差*Kp當(dāng)電動機(jī)加速四旋翼會開始轉(zhuǎn)動,并且差(error)誤會減少,從而導(dǎo)致前、后馬達(dá)的速度差減少。這是我們所期望的,電機(jī)速度的差異將使四旋翼獲得某一方向加速(即使飛行器處于運(yùn)動狀態(tài)),電機(jī)速度無差異將使其保持穩(wěn)定狀態(tài)(完美!)。信不信由你,這是我們真正需要的特技/速率模式

25、,這個原則適用于每個軸(偏航,俯仰,滾轉(zhuǎn)),并使用陀螺儀來告訴我們什,我們正在以什么樣的速率旋轉(zhuǎn)(實(shí)際的)。你可能會問的問題是,我應(yīng)該怎么設(shè)置的Kp為?嗯,這是用于實(shí)驗嘗試的問題 - 我已經(jīng)設(shè)置了一些能讓我的450毫米四旋翼運(yùn)行良好的值堅持一下,你會得到這些代碼。 如果你之前學(xué)過PID,你會知道實(shí)際上PID有兩個部分:積分和微分。積分(Ki為調(diào)諧參數(shù))基本上補(bǔ)償恒定誤差,有時Kp這個參數(shù)可能無法提供足夠的響應(yīng),以應(yīng)對所有的狀況,例如四旋翼是不平衡的,或者是風(fēng)的影響。現(xiàn)在我們忽略了微分。 現(xiàn)在開始定義PID 陣列 和 全局常量PID pids6;#define PID_PITCH_RATE 0#

26、define PID_ROLL_RATE 1#define PID_PITCH_STAB 2#define PID_ROLL_STAB 3#define PID_YAW_RATE 4#define PID_YAW_STAB 5現(xiàn)在,在setup()函數(shù)中將PID初始化為一些合理的值(你可能需要回來調(diào)整參數(shù))。pidsPID_PITCH_RATE.kP(0.7);/ pidsPID_PITCH_RATE.kI(1);pidsPID_PITCH_RATE.imax(50);pidsPID_ROLL_RATE.kP(0.7);/ pidsPID_ROLL_RATE.kI(1);pidsPID_ROL

27、L_RATE.imax(50);pidsPID_YAW_RATE.kP(2.5);/ pidsPID_YAW_RATE.kI(1);pidsPID_YAW_RATE.imax(50);pidsPID_PITCH_STAB.kP(4.5);pidsPID_ROLL_STAB.kP(4.5);pidsPID_YAW_STAB.kP(10);暫時不管那些我注釋掉的代碼,讓我們將四旋翼飛行正常。當(dāng)然我們很難從代碼中找到問題。從陀螺儀中取得每個軸的旋轉(zhuǎn)速率。Vector3f gyro = ins.get_gyro();陀螺儀中給出的是弧度率,我們將它轉(zhuǎn)化為角速率:float gyroPitch = To

28、Deg(gyro.y), gyroRoll = ToDeg(gyro.x), gyroYaw = ToDeg(gyro.z);接下來,我們要進(jìn)行ACRO(高度?)穩(wěn)定控制。我們只是要做到,油門高于最低點(diǎn)(至少約1000pts,我的最大值是1170,最小值是1070),否則四旋翼會晃動時;油門若為零,四旋翼顯然不會保持平衡。if(rcthr > 1170) / * MINIMUM THROTTLE TO DO CORRECTIONS MAKE THIS 20pts ABOVE YOUR MIN THR STICK */ long pitch_output = pidsPID_PITCH_RATE.get_pid(gyroPitch - rcpit, 1); long roll_output = pidsPID_ROLL_RATE.get_pid(gyroRoll -

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論