無人機學習筆記1:基於Crazyfile原始碼
Crazyfile韌體原始碼結構
最近在學習Crazyfile,學習中不斷獲取了新的知識,不敢獨享,希望在分享中提升自己同時幫助其它想學習飛控程式的人。
1、Crazyflie 2.0 系統結構
Crazyflie 2.0是架構在兩個微控制器之上的包括一個主控晶片stm32f405以及一個射頻及電源管理晶片NRF51:
1、NRF51採用Cortex-M0處理無線電通訊和電源管理,其功能包括:
- 1、開/關邏輯
- 2、控制電力系統的其餘部分(STM32、感測器和擴充套件板)
- 3、電池充電管理和電壓測量
- 4、管理廣播bootloader
- 5、廣播和BLE溝通
- 6、檢測和檢查安裝擴充套件板
2、STM32F405 [email protected],處理飛行控制和其他所有的繁重的工作:
- 1、感測器的讀取和運動控制
- 2、飛行控制
- 3、遙測(包括電池電壓)
- 4、額外的使用者開發
下圖旨在解釋它們之間如何一起工作。
nRF51822
nRF51兩個主要的任務是處理無線電通訊和電源管理。它作為一個無線電橋(原始資料包STM)通訊。
Crazyflie 2.0使用通訊方式包括CRTP和BLE,但硬體還支援其他協議如ANT。CRTP模式相容Crazyradio USB集線器,它提供了一個與低延遲資料鏈路2兆位元/秒。試驗表明,延遲之間的無線電連線是360和1.26毫秒,在2 mbps沒有重試和分別為1和32個位元組的資料包大小。最低可實現的延遲與藍芽7.5毫秒,但當前實現20毫秒左右。與Crazyradio CRTP連結的主要好處是它容易實現在任何支援USB主機的系統,使其成為Crazyflie開發和實驗的首選。BLE是主要的實現從一個移動裝置控制Crazyflie 2.0。
nRF51晶片的另一個特性是,它旨在從鈕釦電池執行,這意味著它非常適合低能量的操作。所以NRF51還負責電源管理。它處理開關邏輯這意味著NRF51總上電狀態,不同的操作可能按開/關按鈕時(按一個長時間。這是用於啟動載入程式)。也可以由外部源喚醒。
STM32F405
STM32執行主要的韌體儘管它是被NRF51喚醒。它實現了飛行控制,所有通訊演算法。擴充套件板口主要是連線到STM32的,所以一些擴充套件板的驅動都是在STM32裡面的
STM32F405有196 kb的RAM,應該足以滿足任何人的需求。它允許更多的計算量演算法,例如融合感測器和GPS資料。
微控制器內部通訊
兩個cpu之間的交往是由syslink處理協議。它是一個簡單的基於分組協議我們做了一個可擴充套件的通訊方案。
Syslink提供訊息攜帶所需的所有cpu之間的通訊。STM32作為主機NRF51作為從機。我們試圖儘可能保持NRF51簡單並且將複雜演算法執行在STM32內。
2、Crazyflie 2.0 韌體分析
首先從github上下載韌體,因為只是為了分析程式碼所以可以選擇直接clone的方式下載,下載後開啟韌體資料夾,然後開啟“src”目錄,這裡存放了Crazyfile的原始碼,然後對原始碼的各個資料夾的內容進行分析如下:
資料夾 | 內容 |
---|---|
init | 包括main函式,我們也是從這裡開始分析 |
config | 配置檔案 |
drivers | 硬體驅動層 |
hal | 硬體抽象層 |
modules | 韌體具體實現函式和標頭檔案 |
utils | 擴充套件工具相關如控制檯工具 |
deck | crazyfile的一些擴充套件板載模組 |
platform | 平臺相關檔案 |
lib | 包含原始碼引用的庫函式如freertos作業系統庫、CMSIS庫、STM32標準外設庫等 |
總體來看Crazyfile的檔案結構很是清晰明瞭,涇渭分明,典型的嵌入式軟體設計流程。我們不妨從底層分析到最上層。
最底層的程式碼應該就是硬體驅動層,這部分程式碼儲存在“src/drivers”目錄下,開啟該目錄可以看到兩個資料夾“src”和“interface”資料夾,分別儲存了驅動的c檔案和h標頭檔案,開啟src資料夾便可以看到所有的驅動檔案,當然這些都是c檔案,在“interface”資料夾下存放的都是標頭檔案,檔名一一對應,這些驅動檔案大都是和最底層的硬體打交道,當然這些驅動大都是基於ST標準外設庫,就像我們平時裸機開發stm32裡呼叫庫函式實現邏輯控制的方式,這些驅動的檔名對應相應的硬體外設,如diskio.c對應diskio驅動,“MPU6050.c”對應mpu6050驅動。
當硬體驅動寫好之後需要抽象一個硬體層供上層應用呼叫以保證我們的上層應用在硬體變動後依然能夠執行,這裡有些面向物件的思路。而這些硬體抽象層儲存在“src/hal”資料夾下,從標題上看這些硬體抽象層又進一步對底層驅動做了歸類,如我們的感測器被抽象成 sensors_bosch.c,可以看到 sensors_bosch.c裡重新定義了讀取感測器資料的新函式,又建立了感測器相關係統任務,系統任務直接呼叫新定義的函式,這樣當底層驅動有變動時系統任務依然能夠執行,我們只需要把底層驅動的介面與硬體抽象層對號入座即可。
看完硬體抽象層就該是上層應用了,其實我們呼叫的硬體抽象層都是為了上層應用所服務的,如我們通過硬體抽象層讀取感測器資料來進行資料融合姿態結算、讀取遙控器資料來判斷使用者輸入的指令。對於Crazyfile,其上層一些應用儲存在src/modules”目錄下,這裡包含了所有無人機上層的演算法,也是以後要學的核心內容。
第一篇部落格主要對工程的各個資料夾有所瞭解,這樣對學習原始碼有很大的幫助,至少知道程式碼應該在哪找,其中某個資料夾存放的函式有個大致瞭解。以後大致的學習方向是先分析Crazyfile的底層驅動及硬體抽象層。學習人家對程式碼結構的組織,反思自己在組織一個程式碼時的陋習。從而整體提升自己對工程的組織能力。然後再學習那些燒腦的演算法。最後做出一套屬於自己的無人機系統。
相關推薦
無人機學習筆記1:基於Crazyfile原始碼
Crazyfile韌體原始碼結構 最近在學習Crazyfile,學習中不斷獲取了新的知識,不敢獨享,希望在分享中提升自己同時幫助其它想學習飛控程式的人。 1、Crazyflie 2.0 系統結構 Crazyflie 2.0是架構在兩個微控制器之上的包括一個
Android學習筆記1:基於監聽的事件處理過程
基於監聽的事件處理過程 記錄一:安卓介面互動處理事件的兩個方式 (1)基於監聽的事件處理 (2)基於回撥的事件處理 基於回撥的事件處理日後再寫,先學習基於監聽的事件處理 通常以下步驟: (1)例項化物件 (2)為事件源物件新增監聽器物件,例如set...List
Effictive Java學習筆記1:創建和銷毀對象
安全 需要 () 函數 調用 bsp nbsp bean 成了 建議1:考慮用靜態工廠方法代替構造器 理由:1)靜態方法有名字啊,更容易懂和理解。構造方法重載容易讓人混淆,並不是好主意 2)靜態工廠方法可以不必每次調用時都創建一個新對象,而公共構造函數每次調用都會
golang學習筆記(1):安裝&helloworld
golang安裝:golang編譯器安裝過程比較簡單,也比較快,不同平臺下(win/linux/macos)都比較相似;https://dl.gocn.io/golang/1.9.2/go1.9.2.src.tar.gz 下載對應的系統版本的編譯器go的版本號由"." 分為3部分如當前的
寒假學習筆記1:結構化程序設計
控制流程 ram 循環 只有一個 嚴格 學習筆記 程序編寫 ont 部分 結構化程序設計(structured programming)是進行以模塊功能和處理過程設計為主的詳細設計的基本原則。 - 內容 主張使用順序、選擇、循環三種基本結構來嵌套連結成具有復雜層次的“結構
hibernate框架學習筆記1:搭建與測試
for this ble action 1.7 turn yiq targe cts hibernate框架屬於dao層,類似dbutils的作用,是一款ORM(對象關系映射)操作 使用hibernate框架好處是:操作數據庫不需要寫SQL語句,使用面向對象的方式完成
struts2框架學習筆記1:搭建測試
method lang app org char 示例 重要 type img Servlet是線程不安全的,Struts1是基於Servlet的框架 而Struts2是基於Filter的框架,解決了線程安全問題 因此Struts1和Struts2基本沒有關系,只是創造者取
Python學習筆記1:用戶登錄
\n win col lines %s courier class for ID 1 import getpass,sys 2 u=0 3 while u< 3: 4 user_name = input(‘Please input you
Python學習筆記1:簡單實現ssh客戶端和服務端
bsp dev bre 客戶端 break 基於 bin listen 客戶 實現基於python 3.6。 server端: 1 __author__ = "PyDev2018" 2 3 import socket,os 4 server = socket.s
Python3學習筆記1:變量和簡單數據類型
tle 小數點 per port 小數 指導 day this python 2018-09-16 17:22:11 變量聲明: 變量名 = ?? 如: 1 message = "HelloWorld" 2 message = 1 3 message =
Docker學習筆記1:入門使用
一、Docker簡介 Docker (訪問官網) 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後釋出到任何流行的 Linux 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何介面。(以上資訊來源於百度百科)好吧,讀完之後,
分散式學習筆記七:基於zookeeper實現分散式鎖
一、分散式鎖介紹 分散式鎖主要用於在分散式環境中保護跨程序、跨主機、跨網路的共享資源實現互斥訪問,以達到保證資料的一致性。 二、架構介紹 &nb
Python學習筆記1:數值和字串
Python旅程第一站: Python數值運算: type( ) 列印型別 四種基本型別:int, float, str, bool round( ) 取整,四捨五入
Python學習筆記1:數值和字符串
分享圖片 bsp rep 數值運算 round 取整 float 分享 基本類型 Python旅程第一站: Python數值運算: type( ) 打印類型 四種基本類型:int, float, str, bool round( ) 取整,四舍五
Java學習筆記1:計算機基礎知識、java語言基礎。
一、計算機基礎知識 1、 計算機是一種能夠按照程式執行,自動、高速處理海量資料的現代化智慧電子裝置。由硬體和軟體所組成,沒有安裝任何軟體的計算機稱為裸機。常見的形式有臺式計算機、筆記本計算機、大型計算機等。 硬體通常由CPU、主機板、記憶體、電源、主機箱、硬碟、顯示卡、鍵盤、滑鼠,顯示器等多
誠信線上私網申博包殺網 Tensorflow學習筆記1:Get Started
█直接聯絡電話:18475600009█微信:18475600009 Tensorflow學習筆記1:Get Started 關於Tensorflow的基本介紹 Tensorflow是一個基於圖的計算系統,其主要應用於機器學習。 從Tensorflow名字的字面意思可以拆分成兩部
the little go book學習筆記(1):簡介
1.Go簡介 Go語言是編譯型、靜態型別的類C的語言,並帶有GC(垃圾收集器,garbage collection)。這意味著什麼? 另外,Go是一種非常嚴格的語言,它幾乎總是要求我們"以標準答案去答題",在其它語言可以容忍的不規範編碼方式在Go語言中幾乎都會拋異常。例如匯入了包卻沒有使用這個包,Go不會去編
tensorflow學習筆記1:tf.Variable、tf.get_variable與tf.get_variable、tf.variable_scope對比總結
** 0. 淺談tensorflow變數機制 ** tensorflow提供了通過變數名稱來建立或者獲取一個變數的機制。通過這個機制,在不同的函式中可以直接通過變數的名字來使用變數,而不需要將變數通過引數的形式到處傳遞,實現了變數共享。 ** 1. 對比tf.V
Spring學習筆記1:Spring Framewock體系結構 及 jar包依賴
作者:凌承一 出處:http://www.cnblogs.com/ywlaker/ 很多人都在用spring開發java專案,但是配置maven依賴的時候並不能明確要配置哪些spring的jar,經常是胡亂新增一堆,編譯或執行報錯就繼續配置jar依賴,導致spring依賴
NanoPi NEO2 學習筆記 1:安裝系統、首次開機和一些設定
前幾天搞到了一塊NanoPi NEO2,A53的核心,512M記憶體,一個千兆網口,非常小的體積,質量也不錯,非常滿意,140元的價格可以買到這樣一塊ARM開發板也是非常划算了,非常適合低成本從微控制器轉向嵌入式學習 說實話這塊板子的資料和樹莓派相比較,可以說是少之又少,需要拿出十足的耐心,敢於折騰的決心去