無人機的編程大概是怎樣的過程?

本題已收錄至知乎圓桌 ? 玩轉無人機,更多無人機(Drone)操控、應用、研發方面的話題歡迎關注討論。


謝邀。作為一個主要從事建築行業,把電子機械作為愛好發展的人淺談無人機,僅供參考。
-------------------------------
可移步我的github下載我一年前做的非常非常基礎的四旋翼飛控,具體編程不再贅述 地址:
GitHub - yingnanbao/Crux-Lite: Crux Lite
參考我的網頁分析圖進行硬體製作,燒錄程序後調試PID,然後就可以飛了。(好好調再飛,失控了很危險的)
http://www.deform.design/cruxlite
-------------------------------


首先,無人機基礎的框架,不難。難在精益求精。

正題開始前,先科普一下四旋翼的原理:

圖自己畫的,不侵不刪

首先要明白基礎的多旋翼無人機最基本的幾個部分:
1,自身姿態數據獲取
2,自身姿態控制
3,遙控通信
4,附加功能

◆1)要獲取自身姿態數據,需要依靠4個感測器:
加速度感測器:可以告訴你重力G的矢量方向。缺點:由於慣性在運功過程中趨向不穩定,在靜態狀態下趨向穩定。
陀螺儀感測器:可以告訴你當前時間的角速度。缺點:由於敏感度高和感測器自身素質的緣故,在運動過程中趨向穩定,在靜態狀態下傾向漂移。(可理解為在靜止狀態下,由於感測器誤差,會持續顯示角速度為極小的某一值,一定時間的條件下會形成誤差積累影響姿態角獲取)。
磁場感測器:可以告訴你地磁場方向。
大氣壓感測器:可以告訴你當前海拔。

這四個感測器一共可以提供10個數據源(三軸加速度,三軸角速度,三軸磁場角,氣壓)。通過濾波以及平衡(主要在於建立加速度感測器和角速度感測器之間的互補關係,詳見代碼),可以構建成比較穩定可靠的自身姿態數據來源。(互補平衡是這一部分的重點)
有一種模塊叫做10dof,10 degrees of freedom,它上面同時整合了上述四個模塊,可以採購來作為IMU(inertia measurement unit)的數據來源。
◆2)實現自身姿態控制,基礎方式為PID控制,筆者嘗試了單級PID,控制效果並不理想,串級PID的效果十分明顯。
PID就是 比例-積分-微分控制。比例項產生目標,積分項平衡系統誤差,微分項提高響應精度。在這裡貼出我的老帖子的解釋:

作者:大力水腳
鏈接:怎樣DIY一個簡單的四旋翼? - 大力水腳的回答
來源:知乎
著作權歸作者所有,轉載請聯繫作者獲得授權。

串級PID中,內環P是角速度差x參考值Kp,負責修正值的主要輸出,舉例說,你的四軸正在以1度/秒的速度偏移,此時你的遙控器告訴四軸我想要你以-2度/秒的速度反向偏移,此時P項的輸出量就是: (差值error = 3) x Kp,Kp需要在調試中確定具體數值。
在其後是內環I,也就是積分項。舉例說,如果答主四軸有一個電機出廠有瑕疵,轉速比其他電機稍微慢一點點,導致系統在P基礎上自行修正總是無法到達目標值,此時差量就會不斷積累,並且最終乘以對應的Ki之後,作為輸出值的一部分輸出。在若干次修正過後,就會一直有一個值附加在這個不太好的電機上,由於輸出值變高了,所以這個電機的轉速也就變快了,從而平衡掉之前的瑕疵。
最後是內環D。在系統自動平衡的過程中,很多時候會過度修正,導致系統在目標值附近震蕩,有時還會離散,這時D的作用就體現出來了。它存在的意義是感知當前角速度的變化率,並且在之前P和I的基礎上,減小輸出,起到阻尼的作用。在調試PID參數時注意觀察就會發現它的作用。

當內環的PID設置完畢後,可以看到系統會有比較強的自穩能力,表現在用手施加干擾以後可以很快回到近似的初始位置,但是由於沒有外環P,此時的內環並不能感知當前四軸的姿態。外環P的意義就是把當前的角度差折算成預期角速度輸出給內環PID,例如角度偏差5度,此時如果想讓四軸保持水平,那麼角度差是5度,乘以外環Kp以後,就可以把此值輸出給內環PID進行計算了,而當姿態趨近平衡位置時,輸出也趨近於零,內環PID便會嘗試把角速度穩定在0度/秒。

以上就是四軸PID計算的基本原理。

當得到PID系統給出的修正值後,該數值就可以用於無人機自身姿態角的平衡。在該系統中,誤差等於目標姿態(也就是遙控器給出的當前姿態要求,如前傾5度並同時左傾2度並同時以0.5度每秒左旋)和當前姿態的差值,修正值用於附加在各個螺旋槳電機的輸出值,從而完成姿態控制。

◆3)遙控通信相對而言簡單一些,可以通過各種模塊,各種方式來完成,這裡筆者選用的兩枚2.4ghz帶放大器的arduino通訊模塊,有效穩定遙控距離在開闊場地測試過的可以達到500米,也可在航模店購買更專業的設備。

◆4)目前多旋翼的主流功能就是航拍了。但是在成熟的控制和通訊系統下,多旋翼的功能可以有很多很多。具體功能的實現,完全取決於你所匹配的「吊艙」的功能和你的數據鏈「帶寬」。 你甚至可以DIY一個大地紅引爆裝置,遙控它去點你平時不敢點的兩萬響大地紅,或者DIY一個水球投擲端去欺負平時老惡作劇你的隔壁小孩。

到此就是一個比較基礎的四旋翼系統教程。在這裡謹作為一個愛好者拋磚引玉。引申下去的話題太多太多,歡迎各位大牛拋一些機器視覺,光流定位或者無線通訊的知識或者學習資源。

我的基礎飛控完全開源,歡迎使用,但我本人不對其使用負任何責任。請酌情使用。

Fly happy, Fly safe.


突然想艾特一下輪子哥 不知能不能蹭熱度交到碼農好朋友@vczh


如果是設計到底層的編程,當然很難了。假如你要自己去生產一台無人機的話,搞得定各種元件的組裝,你也難以搞得定飛控,這個時候就涉及到多個層面的編程。 @大力水腳 已經說得比較細。當然這種情況是屬於,從 0 開始組裝一台無人機,並且在晶元上面寫代碼,對無人機進行操控的情況。如果你僅僅想要入門,也許下面的內容適合你。


因為我想大部分人想要看到的是,如果我已經有一台無人機了,加入我就是想在無人機上面寫代碼去實現一些東西呢?比如說:我希望實現無人機編隊,我希望做一些有趣的手勢操控,我希望去做一些有趣的飛行動作 … 首先理解好這個圖(圖來自大疆創新):

實際上跟前面所說的四旋翼原理是類似的(如果是其他種類的無人機,會有不同的概念)。最簡單的理解就是:『飛機在某個角度上面傾斜了,就會往前飛』。概念不一定最準確,但是你可以先入門,知道飛機靠什麼動力前行。理解了這個概念之後,你會發現,你操控一台飛機,最最頂層的邏輯就是:我控制好 YAW, ROLL, PITCH 這幾個核心的力。實際上就是三軸陀螺儀的核心信息。VR 的 Headset, iPhone 等,使用的都是這個東西。


比如說還是這個 Demo,利用 Apple Watch 去控制一台 Mini Drone 進行飛行:


視頻封面Apple Watch Control Parrot Mini Drone—在線播放—優酷網,視頻高清在線觀看視頻

看上去交互很有趣,實際上核心代碼就是這樣而已:


獲取 Apple Watch 感測器數據 ( Swift ):

let data:CMAcceleration = (accel?.acceleration)!

print("ok
x is : %@
and y is %@
z is %@" , data.x , data.y , data.z)

控制飛行邏輯( Objective-C ) :

if ( abs(xValue) &> 70 ) {
if (xValue &> 0) {
//前進
[self setFlag:1];
[self setPitch:50];
}else{
//後退
[self setFlag:1];
[self setPitch:-50];
}
}

if ( abs(yValue) &> 70 ) {
if (yValue &> 0) {
//往左
[self setFlag:1];
[self setRoll:-50];
}else{
//往右
[self setFlag:1];
[self setRoll:50];
}
}

if ( abs(yValue) &< 70 abs(xValue) &< 70 ) { [self setFlag:0]; [self setRoll:0]; [self setPitch:0]; }

如果大家希望實踐的話,可以去購買一台 Parrot Mini Drone 進行試驗,成本也就幾百塊人民幣。他們有開放的 SDK,可以給小朋友進行編程開發,流程極其簡單。很容易就可以上手了。哈哈,當然,如果你有充足的資金,你可以直接上一台 DJI Phantom 系列的飛機來試驗。


由我們的工程師稍微改進了演算法之後,我們可以做成這樣,飛機可以轉彎漂移:

視頻封面Drone Drift By Mesh—在線播放—優酷網,視頻高清在線觀看視頻

當然了,這些都是基於已經封裝好的 API,在頂層去做開發。所以大家能夠做出來的就只是個玩具而已。真正做出有用的東西來,需要的專業知識,最終的工程量是很大的。我覺得對於大部分的程序員來說,理解好原理之後,可以不斷深入去開發。同時我覺得這個事情非常非常需要想像力,看你最終需要實現一個怎樣的需求。有時候的事情並不會太複雜。


好了,既然大家已經理解原理了。那麼,我給大家出一道題目。如果是實現這樣的拋飛功能,你用代碼實現的話,思路是怎樣的呢?歡迎大家在評論中留言,然後你會發現,噢,原來那些廣告中所謂的拋飛功能原來如此。


視頻封面Mesh Team Throw Drone Test—在線播放—優酷網,視頻高清在線觀看視頻

利益相關:Mesh ( Mesh - Meshing with future lives )


簡歷:info[at]kiwiinc.net


以前自己做過微型四旋翼。從硬體到控制演算法全部自己弄,所以還算有一些經驗。

在控制理論的框架下,無人機系統和所有控制系統一樣,可以分為: 飛行控制器,執行器,控制對象和感測器這幾大部分。這幾部分中,除了控制對象是無人機的硬體部分,其他幾個部分都需要編寫程序。下面以四旋翼無人機為基礎,說說每一部分要做些什麼。


飛行控制器:

飛行控制器的設計是無人機設計中最核心的部分。控制器中的控制演算法的好壞直接關係到無人機飛行的效果。但是飛行控制器的設計和其他控制系統的設計步驟沒有很大區別。

控制器設計的步驟:

  1. 建立數學模型。
  2. 根據模型設計相應的控制演算法,並進行穩定性分析。
  3. 在計算機中對控制器和無人機模型進行模擬,以驗證控制演算法的效果。
  4. 將控制演算法編寫到控制器中。
  5. 調試。

控制演算法可以選擇最簡單的PID,或者更高級的自適應控制、魯棒控制、最優控制等等。如果要做編隊飛行,還可以採用networked control(不知道怎麼翻譯)。不同的控制方法有不同的特點,具體根據想要實現的效果來選定。其中,如何處理飛行器系統的非線性特性是控制器設計的難點。

執行器:

四旋翼無人機的執行器是四個帶動螺旋槳旋轉的電機。為了實現四旋翼各種姿態的飛行,四個電機的轉速需要快速的跟隨控制器給出的控制信號來變化。所以我們需要編寫相應的控制演算法對電機進行控制。電機的控制演算法主要是根據飛行控制器給出的控制信號對流入電機的電流(功率)進行控制。

四旋翼最主要的兩種電機是微型四旋翼使用的空心杯電機和普通大小的四旋翼使用的無刷直流電機。這兩種電機的控制方式不太相同。

空心杯電機是一種直流電機,可以採用最簡單的PWM方式進行控制。相應的控制演算法就是編寫將控制信號轉換成PWM信號的程序。

無刷直流電機雖然名字上有直流兩個字,但本質上還是交流的,叫直流的原因是供電電源是採用直流的。所以在直流電源和最終流入電機的交流電之間還需要一個電調來進行轉換。電調說白了就是一個逆變器,它根據飛行控制給出的控制信號將電源輸出的直流逆變成交流來驅動電機轉動。所以電調的編程就是編寫這個逆變器的控制演算法。另外,因為電機的三相交流電的切換時機對電機的轉動至關重要,所以電調控制器需要反饋轉子的位置信息來決定換相時機。通常無刷直流電機分為有感(帶轉子位置感測器)和無感(不帶感測器)兩種。對於有感電機,很簡單,直接測量轉子的位置就行了。而對於無感電機, 轉子的位置需要間接的通過反電動勢來判斷。

感測器:

現在有越來越多的感測器被裝到無人飛行器上。從最基本的陀螺儀,加速計和磁力計,到後面的GPS,氣壓計,超聲波測距,激光測距,以及攝像頭。更多的感測器能讓飛行器非得更平穩。但是這些不同感測器的數據測出的物理量是不一樣的,但包含的信息卻是有冗餘的。所以需要一個良好的演算法來進行數據融合,以提高測量精度。比如要測量四旋翼的俯仰角,加速計可以通過測量重力加速度的方向來計算當前傾斜角度,但是飛行器飛行過程中自身的加速的會疊加到重力加速度上造成測量不精確。另一方面角度也可以通過對陀螺儀測量的角速度數據進行積分來算出,但測量誤差會隨著積分而累計。這兩種感測器都能得到角度信息,但結果都不完美。所以為了得到精確的角度,需要設計一個合理的數據融合演算法將這兩個測量元件的結果進行結合。

除了數據融合,感測器還需要以下程序:

1. 濾波程序對測量數據需要進行濾波處理,可以採用平均值濾波、卡爾曼濾波等等方法。

2. 姿態解算要用到歐拉角或者四元數。

3. 校準程序來獲取姿態的初值。

以上差不多就是一個無人機軟體部分需要做的工作了。當然這只是一個大概框架,其中很多細節如果要深究都是不簡單的。


要編不難吧。要編好,我覺得挺難的


作為一名機械工程的本科生,曾在實驗室比較系統的研究過無人機。這個問題本身很大,我只能說給出一個製作無人機的總體思路。很抱歉,我沒辦法在文章里完全讓你明白所有的開發過程,但可以比較清楚的讓你了解這一個過程。

-------------------------------------------------------------------------------

上面是一個四軸的飛行器,也可以叫無人機。我們可以從中發現,對於無人機來說,最重要的是它的四個軸,也就是能提供在空中平衡的螺旋槳。每個螺旋槳通過電機驅動轉起來。四個軸的螺旋槳就會根據電機狀態或大或小的產生升力。這些升力的組合就可以讓無人機在空中做懸停、滾轉、俯仰、偏航等動作。比如我們可以在無人機中間下面增加一個相機用來航拍,那麼這些動作就可以幫助相機來找到好的拍攝角度。而這些動作的實現,是電機帶動的。那麼,我們就需要通過控制電機來控制飛行動作

這時候,我們就需要引入控制板來進行控制了。

比如這個,這是一個arduino控制板。說到底就是用來做控制功能的硬體。當然可以用來做無人機控制硬體的單片機控制板太多了,這裡就不一一羅列了。

當我們有了控制硬體以後,那麼主要的過程就是需要對控制硬體的編程和優化了。這個過程其實很複雜,比如我們需要根據不同電機帶動螺旋槳提供的升力和無人機本身自重的大小進行力學建模,需要通過實驗測定不同動作所需要的電機狀態等。這些過程統稱為建模,建模過程在現在的主流單片機中大多有開源的資料供我們使用,我們要做的就是把代碼輸入,根據實際情況調整參數大小。也就是我們俗稱的調參

所以總結來說也就是做一個完整的無人機主要需要:

控制板(硬體)+電機(硬體)+螺旋槳(硬體)+建模編程(軟體)

-------------------------------------------------------------------------------

這裡我不想涉及複雜的PID控制,簡單來說PID演算法的目的就是為了讓你的控制效果又快又好的完成。當然如果做這個肯定需要深入了解PID,我寫過一個簡單理解PID功能的帖子,不涉及數學,可以參閱一下思路。

用一顆學美術的心來理解PID調節 - 知乎專欄

-------------------------------------------------------------------------------

1。有人提到卡爾曼濾波演算法,它的目的主要是消除干擾的影響

2。MPU6050是一塊感測器,它可以幫助無人機了解自己現在所在的位置和加速度信息。

有問題會不斷更新:)


其實只要飛起來的話,寫一下電機輸出方程,用mpu6050陀螺儀做內環反饋,不要外環,加個p就可以飛起來 我第一次飛起來就是這樣飛的。其實為什麼要用串級分析一下模型就知道電機的力到姿態角是跨了兩階導的。內環的作用是控制角速度,外環控制角度


民用相對簡單一些,但要效果好也是挺複雜的一件事,不過好歹代碼的通用性和可移植性要好很多,一段成熟代碼可以被反覆用到不同無人機產品中,大部分情況下只需要微調代碼或參數即可適配。軍用的那就是普通人無法想像的複雜了,想想一架對地攻擊無人機一枚炸彈丟出去那可是要死人的,如果被恐怖組織截獲控制代碼,這架空中炸彈卡車就成了壞人的武器了(還記得伊朗俘獲美軍無人機RQ-170的新聞嗎?),因此代碼如何提高健壯性和冗餘度都是不過分的,何況還有數不勝數的突髮狀況處理的代碼片段,這些都會導致代碼的複雜度成倍上升,甚至很多地方為了特殊需要(如為了安全、更高執行效率等),還不能採取模塊化即面向對象的方式編程,懂編程的應該都知道面向對象和面向過程開發效率的巨大差距。

然而這還不是全部,在代碼完成後,測試流程民用和軍用也存在兩套完全不同的標準,民用的測試標準要低很多,飛出去故障了了不起掉地上砸壞了,軍用的那可是會產生嚴重後果的,後者的代碼審查機制要嚴格得多,加上代碼的複雜性又遠高於前者,也就可以想見其開發成本的高昂了,在如今的軍用無人機研發成本中,軟體研發成本已經趨向於佔到整機研發成本的一半甚至更高了。


無人機涉及編程的部分包括嵌入式軟體和演算法。

嵌入式軟體包括底層的驅動程序,中間層的操作系統。這裡和其他產品的架構大同小異,無非是感測器換了一下。

演算法主要包括組合導航部分和自動控制部分另外也涉及一些感測器校準的演算法,組合導航部分就是通過感測器的測量值,通過卡爾曼濾波來計算最優估計,自動控制是根據目標姿態、目標位置和估計出來的此刻的姿態、位置設計自適應控制、PID等控制律。

如果是計算機專業或對嵌入式系統比較熟悉的,嵌入式軟體這塊應該不難,演算法的話理解起來可能有點難度,需要學習一些理論知識,必學的有空間坐標變換(方向餘弦矩陣,四元數),卡爾曼濾波理論(KF,EKF),控制理論,數字信號處理等。


作用別人的輪子,搭積木式的做自己想要的流程很簡單,例如,符合xxx條件的時候,做xxx事情。然而自己做輪子就難了,例如,如何提供一個函數,判定現實中xxx條件滿足。計算機能精確領會並處理的數據都是離散的,有明確意義的。而現實丟給你的感測器數據是有干擾的,在你沒有第一遍分析之前是意義不明的。造輪子簡直是各種數學模型用起來,完全不是工程問題,是學術問題,寫這種代碼你手邊的書肯定不是(21天入門c語言),想像下手邊一疊,大學高等數學,信號與系統,線性代數,離散數學,多麼酸爽。


以Litebee無人機編程為例,使用的是scartch圖像化編程

Scartch 編程界面,在更多模塊中,可以找到Litebee的編程模塊,如上圖所示

Scartch編程其實就像是積木的過程,一層層的疊加,然後形成飛行器的飛行姿態

接下來我們簡單的編寫個小程序

這個是我們編程好的程序

為了增加趣味性,設置了個角色的小直升飛機

程序的運行效果:當點擊綠旗,角色直升機起飛,litebee起飛,1秒后角色的直升機降落,Litebee降落。

這只是其中的一個好玩的小編程。除此之外你可以設置更加複雜有趣的編程

下面結合四川九寨溝地震,我們編寫了程序,投放物資

當按下電腦的空格鍵,Litebee的槳葉就會旋轉,此時角色的直升機就會起飛,開始投放物資了。


我的切身經驗,從開源飛控代碼ardupilot入手,買一塊APM2.5或者pixhawk或者pixhack(雷迅家自己改造的),下載一個地面站MissonPlanner就OK了。

看ardupilot的開源代碼還是很有水平的(不得不承認人家老美開源代碼寫的真是NB),聽一個老師說ardupilot的無人機飛控代碼比國內很多研究所的飛控代碼都好,外環導航環寫的就高大上,立馬學習之;內環PID的設計我都懷疑它這樣設計還叫PID嗎,太花樣了;ardupilot的飛控代碼的確寫的很優美,容易上手,做二次開發也較容易。

二次開發,再來一套HLT半實物模擬、FlightGear、買幾架無人機(或者航模)模塊,自己組裝、調試一下,馬上就成專業玩家了。


我做的就是無人機編隊方面的東西,不過主要做演算法,因為無人機的狀態量,比如常見的俯仰角呀角速度呀位移呀之類的都是比較好得到的,所以國際上基本上都把無人機模型直接線性化,從而去控制無人機


首先,要牢記角的工程計算用單位是弧度,不是度。。。


瀉藥。
這問題問得好大啊,無人機編程這麼大的東西要怎麼回答。
飛控,簡單點PID就能飛,但飛不飛得穩另說。甚至偷懶用別的代碼,啥子圓點博士啥的。
雲台,你要不要,要的話,反饋環準備要多大,或者直接買一個。
反正如果耍著玩,隨便買幾個搭搭就行。如果要搞好,機械很重要,不能說機械時的建模就不是編程了吧。然後編程,那寫演算法的算不算。比如大疆專門有人做演算法的,我們就實現它們的演算法就行。如果你要做雙目視覺,就算遍地的演算法,也設計到一個多核的問題,這個基礎編程又是誰搞。
反正我覺得這個題目提的好大,自己玩可以,但是商業的真沒法回答,這就不是一個人乾的事。機械,編程,硬體耦合度實在太高了。想想小米發布會都能炸雞


蟹妖,其實我也沒有寫過無人機的代碼,只是讀過一些....


無人機飛行編程,之前有過對該類模型的研究和實踐,主要是針對控制飛行平衡的一些感測器編程


無非也是拿別人製作好的積木,組合拼接,只是資源相對一些成熟的開發項目來說,會少很多。
其次你要懂業務,懂這玩意有別於電腦和手機的特性,這點最重要


用STM32單片機, C語言編程,控制四個發動機帶動螺旋槳,然後就飛起來了。其實我是隨便說說的,呵呵。


推薦閱讀:

DJI 在機器視覺領域的研發實力有多強?
有哪些值得一讀的無人機 / 四旋翼方面的論文?
如何看待大疆創新在 2017 年 8 月 8 日九寨溝地震後,派出無人機救援隊趕赴災區?
無人機操控放棄實體遙控器改用手機 APP 是否安全?
目前有哪些無人機上市公司?

TAG:編程 | 無人機Drone | 控制理論 |