APM 傳感器驅動解析 --- 前後端分離

上一篇文章中介紹了 ArduPliot 傳感器採集用到的集中基本協議

初學者可以先閱讀上一篇文章  https://mp.csdn.net/console/editor/html/106586743

英文原文地址 https://ardupilot.org/dev/docs/code-overview-sensor-drivers.html

基本概念   

        處理器通過上一篇文章所屬的各種協議與外設設備或者傳感器通信,ArduPilot 傳感器驅動中,設計到一個重要的概念:前端/後端分離,典型的示意圖如下。

        無人機設備(Vehicle code)代碼只能調用庫的前端(又稱傳感器驅動程序)。系統在啓動時,前端會根據傳感器的自動檢測(即在已知的I2C地址上探測響應)或用戶定義的_TYPE參數(例如RNGFND_TYPE、RNGFND_TYPE2)創建一個或多個後端。前端維護着指向每個後端的指針,這些指針通常保存在名爲 _drivers [] 的數組中。

      一般來所,用戶可設置的參數始終保存在前端中。

傳感器驅動程序如何運行呢

       上圖顯示了 ardupilot 架構的放大視圖 ,左上方的藍色框說明了傳感器驅動程序的後端如何在後臺線程中運行,收集來自傳感器的原始數據,將其轉換爲標準單位,然後保存在驅動程序內的緩衝區中。

       設備代碼的主線程定期運行,(例如直升機主線程400 Hz),主線程可以通過驅動程序的前端訪問數據。例如,爲了計算最新的姿態估計,AHRS / EKF 將從傳感器驅動程序的前端獲取最新的加速度計,陀螺儀和指南針信息。

       該圖片有些籠統,對於使用I2C或SPI的驅動程序,它們必須在後臺線程中運行,使得傳感器的高速通信不會影響主循環的性能,但對於使用串行(又稱爲UART)接口的驅動程序,在主線程中運行是安全的,因爲底層的串行驅動程序本身會在後臺收集數據幷包含緩衝區。

設備代碼和前端示例

        以下示例顯示了直升機飛行器代碼如何從測距儀(又名聲納,激光雷達)中提取數據,直升機代碼的調度程序以20Hz的頻率調用車輛的 read_rangefinder()任務。下面是此方法的圖片,可以在 sensors.cpp文件中看到,rangefinder.update()通過驅動程序的前端調用。

        以下是測距儀驅動程序的前端更新方法。這使驅動程序有機會在主線程中進行任何可能需要的常規處理。每個後端的更新方法都依次調用。 

UART /串行後端示例 

        接下來是使用串行協議的LightWare後端的更新方法。如用戶Wiki所述,串行測距儀可以連接到任何飛行控制器的串行端口,但是用戶必須通過設置 SERIALX_BAUD 和 SERIALX_PROTOCOL 參數來指定使用哪個串行端口以及使用哪種波特率。

    在串行驅動程序的後端代碼中,它首先通過 serial_manager class 查找用戶要使用哪個UART,該類將查找上述參數設置。 

         每次調用驅動程序的後端 update()方法時,都會調用 get_reading 方法,該方法檢查傳感器是否收到了新字符,然後對收到的數據進行解碼。

      由於串行通信自身配備了緩衝區,因此傳感器的所有數據處理(請參見get_reading方法)都在此處在主線程中運行。即就像在I2C和SPI驅動程序中看到的那樣,沒有“ register_periodic_callback”。

 

I2C後端示例

     此示例顯示了 Lightware I2C 驅動程序的後端。在這種情況下,前端會在初始化期間獲取 I2C 總線並將其傳遞給後端。

 

SPI後端示例

        此示例顯示了MPU9250 IMU 的驅動後端運行方式,其中數據包括陀螺儀,加速度計和指南針。前端獲取 SPI 總線,並在初始化期間將其傳遞到後端。

         在初始化期間將調用 start()方法並配置傳感器,使用信號量來確保不干擾同一總線上的其他 SPI 設備。

        已註冊_read_sample 方法,以便在1000hz處調用它。請注意,在_read_sample方法中無需使用/提供信號量,因爲這是作爲定期回調代碼的一部分完成的。

         _block_read顯示瞭如何從傳感器的寄存器中讀取數據。

 

其他建議

        編寫傳感器驅動程序時,切勿包含任何等待或睡眠代碼,因爲這會延遲與所使用總線相關的主線程或後臺線程。

        如果編寫了新庫,則必須將其添加到車輛目錄中的 wscript 文件(即/ ardupilot / ArduCopter / wscript)中,以便將其鏈接到最終的二進制文件中。

 

知識總結

         傳感器驅動運行過程中,前後臺運行的設計宗旨是保證I2C或SPI的驅動程序在後臺線程中運行,使得傳感器的高速通信不會影響主循環的性能,但對於使用串行(又稱爲UART)接口的驅動程序,在主線程中運行是安全的,因爲底層的串行驅動程序本身會在後臺收集數據幷包含緩衝區,可以實現數據存儲。

         對於類似  I2C 或者 SPI  接口類型傳感器而言,初始化時首先將配置參數傳遞到後端,並且通過  register_periodic_callback 回調函數定時調用數據採集與數據解碼任務,從而完成後臺數據採集。

 

上述總結基於本人理解,有誤之處煩請各位指出,郵箱: [email protected]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章