開始利用Betaflight飛行控制器、簡單的10個Python文件和樹莓派,為你的FPV戰斗無人機構建自己的自動駕駛儀。

FPV無人機搭載樹莓派在“Kill House”機庫中飛行
基于Betaflight的FPV無人機因其經濟實惠和操作簡便。然而,與基于ArduPilot的無人機和飛機不同,它們在設計時并未考慮自主飛行功能。這并不意味著自主飛行無法實現——只是使用Betaflight固件實現起來要復雜得多。
為何要在Betaflight上追求FPV自動駕駛?自主飛行具有諸多優勢,例如在飛行過程中避免電子系統的干擾、在無FPV操作員控制的情況下穿越干擾區域等。然而,在Betaflight上實現這一自主飛行功能絕非易事。
作為一名熱衷于推進FPV無人機技術的軟件開發者,我接受了這一挑戰,致力于研究和開發一種基于Betaflight的簡單FPV自動駕駛儀。我的目標是開發一個初始模板,讓他們能夠從零開始,基于Betaflight構建自己的FPV戰斗無人機自動駕駛儀。
在本文中,我將分享我的研究成果——一份詳細的、逐步指導如何在Betaflight上使用樹莓派構建FPV自動駕駛儀的指南。無論你是業余愛好者、發燒友還是面臨類似挑戰的開發者,這份指南都將為你節省數月的時間。
那么,讓我們開始吧,一起創造這些令人驚嘆的事物!
自動駕駛儀
與目前戰場上使用的“作戰就緒”自動駕駛儀不同,這款“空載駕駛儀”(自動駕駛儀)缺乏在戰場上識別或跟蹤目標的能力。相反,它專為基本自主操作而設計,能夠向前飛行2秒并釋放其有效載荷(炸彈)。
這款自動駕駛儀可作為開發者的模板,為那些希望啟動自己的研發計劃的人提供一個起點。我們的目標是推動技術發展,創造出能夠自主進行目標轟炸,同時避免戰場上電子戰系統干擾的作戰級自動駕駛儀。
該概念涉及使用一款在戰場戰場上廣泛使用的標準FPV戰斗無人機,并配備一臺預裝了基于Python的代碼的伴侶計算機(如樹莓派)。此設置實現了所宣稱的功能,使無人機能夠在沒有FPV操作員參與的情況下自主飛行并釋放其有效載荷。
接線圖
讓我們先從接線圖開始。該設置采用了一款圍繞Aocoda F460堆棧構建的FPV無人機,這是一款高性能系統,包括Aocoda F405 v2飛行控制器(FC)和3060S(60A)電子調速器(ESC)。下圖展示了各種組件(包括舵機模塊、攝像機、ELRS接收器、VTX和樹莓派)如何與飛行控制器焊接在一起。

F405 v2 FC和FPV戰斗無人機組件
以下是每個組件的接線詳情:
攝像機:黃色(CAM)、紅色(5V)、黑色(GND)
投放系統:紅色(5V)、黑色(GND)、粉色(S5),對應飛行控制器(FC)上的SERVO1。
VTX(視頻發射器):紅色(9V)、黑色(GND)、綠色(VTX)、藍色T4(UART4上的TX)連接到VTX上對應的RX引腳。
ELRS接收器:紅色(4.5V)、黑色(GND)、藍色(T2)、藍色(R2)。FC上的T2和R2與UART2對齊,其中T2連接到接收器上的RX,R2連接到TX。
樹莓派:使用Type-C轉USB線將飛行控制器連接到樹莓派,通過MSP協議進行通信。
與往常一樣,ESC使用堆棧捆綁包中包含的8針線連接到FC,無需額外解釋。
Betaflight配置
如前所述,配置FPV無人機是解決方案的關鍵部分。然而,我不會詳細介紹所有所需的設置,而是僅關注支持自主飛行基本場景所需的關鍵配置。
要配置FPV無人機以進行自主飛行,我們需要將以下模式分配給無線電控制器上的適當AUX通道:

Betaflight配置器中的模式部分
ANGLE:激活ANGLE模式,使自動駕駛儀能夠在穩定飛行模式下控制無人機。
ALTHOLD:保持當前高度,防止飛行過程中發生任何意外的高度變化。
BEEPER:激活無人機的蜂鳴器,在緊急情況下(如在樹林中丟失無人機)可用于定位無人機。
MSP OVERRIDE:最關鍵的模式,允許自動駕駛儀通過在msp_override_channels_mask變量中定義的切換來接管控制權。
MSP OVERRIDE的詳細配置說明將在下文的“MSP OVERRIDE”部分提供。
還需要正確配置舵機模塊。如下圖所示,SERVO1已設置為響應AUX2的切換。請確保在你的配置中復制此設置。

舵機部分,AUX2設置為控制SERVO1舵機設備
最后,為了完成配置,我們需要啟用并設置MSP OVERRIDE模式。這需要在CLI中配置msp_override_channels_mask變量。為了我們的自動駕駛儀的目的,掩碼值已計算為47,對應于位掩碼00101111。

在CLI中設置msp_override_channels_mask
要設置它,請執行以下腳本。
setmsp_override_channels_mask =47savegetmsp_override_channels_mask
每次更改后,請務必通過在CLI中輸入save命令來保存配置。
MSP OVERRIDE
現在,你將明白為什么我們在上一節中為msp_override_channels_mask設置了位掩碼00101111(47)。
Betaflight中的MSP OVERRIDE模式允許自動駕駛儀(樹莓派)覆蓋特定的AUX值,從而直接控制無人機。激活后,此模式允許自動駕駛儀調整ROLL、PITCH、YAW、THROTTLE和AUX值等參數。在此設置中,我們使用MSP OVERRIDE來管理無人機的方向、速度、整體飛行,并在必要時觸發與SERVO1(AUX2)鏈接的舵機模塊以釋放炸彈。
Betaflight中的msp_override_channels_mask變量決定了自動駕駛儀將覆蓋哪些發射機(無線電控制器)通道。在我們的場景中,通道保留用于飛行控制的ROLL、PITCH、YAW和THROTTLE,以及用于激活SERVO1的AUX2,以便在必要時釋放炸彈。
需要注意的是,掩碼邏輯遵循反向位順序。為了清晰起見,請參考下圖,該圖解釋了掩碼值如何計算為47(0x00101111)以及為何選擇這些通道。
msp_override_channels_mask的掩碼
在msp_override_channels_mask中,值為1表示覆蓋已啟用,而0表示已禁用。如所示,我們為前四個專用于飛行控制的通道(ROLL、PITCH、YAW、THROTTLE)以及控制有效載荷釋放的AUX2啟用了覆蓋。
樹莓派配置
根據最初的設計,樹莓派作為伴侶計算機,通過MSP協議與飛行控制器(FC)上的Betaflight固件進行通信。
雖然Betaflight最初并非為自主飛行而設計,但最近的更新引入了強大的MSP OVERRIDE模式,使我們能夠開發自動駕駛儀,正如我們之前所討論的。
安裝在FPV戰斗無人機電池組上的樹莓派
為了開始探索自動駕駛儀,我們應按照GitHub倉庫中“Betaflight上的FPV戰斗無人機自動駕駛儀(空載版本)”的“樹莓派配置”部分中概述的步驟進行操作,包括復制文件、設置適當的服務以及創建日志文件夾以允許收集遙測數據和一般日志。
https://github.com/under0tech/autopilot_bee_ept
架構
自動駕駛儀具有多線程架構。其核心是一個由命令路由器管理的命令隊列,該路由器處理所有傳入的命令。路由器在其專用線程(稱為路由器線程)中運行,而另外兩個線程——遙測線程和空載駕駛儀線程——則專注于將命令追加到隊列中。
Betaflight的簡單自動駕駛儀
遙測線程處理系統監控和遙測請求,將命令排隊以向自動駕駛儀提供關鍵數據,如當前高度、飛機速度和實時RC通道值。而空載駕駛儀線程則管理與自主飛行和有效載荷投放相關的命令,如炸彈投放。
有關自動駕駛儀架構的更詳細解釋,請參閱GitHub倉庫中提供的README_DEV.md文件。
https://github.com/under0tech/autopilot_bee_ept/blob/main/README_DEV.md
模式
與我之前為實驗目的克隆的原始自動駕駛儀不同,我們現在擁有了一個真正的遙控器——RadioMaster Pocket M2,它允許我們根據需要切換AUX開關和相關模式。
RadioMaster Pocket M2無線電控制器
在此自動駕駛儀的實現中,我將其設計為僅具有兩種模式:
1.OFF——自動駕駛儀保持非活動狀態,等待操作員輸入以切換到另一種模式。在此狀態下,只有遙測監控和日志記錄功能可用。
2.READY——激活基本功能,無人機向前飛行兩秒,然后投放其有效載荷(例如,炸彈)。
模式由command_telemetry_mode_change(telemetry)函數管理,該函數依賴于AUX3的值。低值(1000)對應于OFF模式,中間值(1503)未分配,而高值(2000)則激活READY模式。
該函數在router.py文件中實現。
def command_telemetry_mode_change(telemetry): previous_throttle = autopilot.state['throttle'] rc_chs = struct.unpack('<'?+?'H'?* (len(telemetry) //?2), telemetry)? ? autopilot.state['roll'] = rc_chs[0]? ? autopilot.state['pitch'] = rc_chs[1]? ? autopilot.state['yaw'] = rc_chs[2]? ? autopilot.state['throttle'] = rc_chs[3]? ? autopilot.state['aux1'] = rc_chs[4]? ? autopilot.state['aux2'] = rc_chs[5]? ? autopilot.state['aux3'] = rc_chs[6]? ? autopilot.state['aux4'] = rc_chs[7]? ? aux3_raw =?int(autopilot.state['aux3'])? ? autopilot_mode = autopilot.state['bee_state']? ? if aux3_raw ==?1000:? ? ? ? autopilot_mode =?'OFF'? ? elif aux3_raw ==?1503:? ? ? ? mavs.prepare_go_forward(previous_throttle)? ? ? ? time.sleep(0.1)? ? elif aux3_raw ==?2000:? ? ? ? autopilot_mode =?'READY'? ? if autopilot_mode != autopilot.state['bee_state']:? ? ? ? autopilot.state['bee_state'] = autopilot_mode? ? ? ? messages.display(? ? ? ? ? ? ? ? ? ? messages.bee_state_changed_to, [autopilot_mode])? ? ? ? command_queue.queue.clear()
你可能已經注意到,中間值(1503)會觸發自動駕駛儀執行其主要場景的準備步驟,盡管它并未分配一個獨特的模式名稱。我做出這一選擇是有意的,并且完全清楚它偏離了預期的架構。然而,我認為代碼中至少有一處不完美是可以接受的——細心的開發者可能會很快發現并糾正這一點。
遙測
如前所述,遙測線程負責處理系統監控和遙測請求的命令排隊。它為自動駕駛儀提供關鍵數據,如當前高度、飛機速度和實時RC通道值。
importtimeimportautopilotimportmessagesimportrouterimportdefinitionsasvarsdeftelemetry_requestor(stop_command): whileautopilot.state['connection'] ==Falseandnotstop_command.is_set(): try: time.sleep(5) messages.display(messages.telemetry_process_connecting, [vars.companion_computer]) exceptExceptionase: messages.display(messages.fatal_error, [e]) pass ifnotstop_command.is_set(): messages.display(messages.telemetry_process_connected, [vars.companion_computer]) whilenotstop_command.is_set(): try: router.put_command(router.Command(2,'MONITOR',{'target':'MSP_ANALOG'})) router.put_command(router.Command(2,'TELEMETRY',{'target':'MSP_ALTITUDE'})) router.put_command(router.Command(1,'TELEMETRY',{'target':'MSP_RC'})) time.sleep(4) except: pass stopped_time = time.strftime("%H:%M:%S, %Y, %d %B", time.localtime()) messages.display(messages.telemetry_requestor_done, [stopped_time])
遙測請求以2秒的間隔添加到隊列中。
如上所示,MSP_ALTITUDE和MSP_ANALOG請求每2秒發送一次,以為自動駕駛儀提供當前高度和飛機速度數據。同時,MSP_RC值對于模式切換和整體控制至關重要,因此每秒請求一次,以確保對自主飛行器的更響應和高效控制。
空載駕駛儀
空載駕駛儀線程管理與向前飛行和有效載荷投放相關的命令排隊,如炸彈投放。這些命令每1秒添加到隊列中。
defgo_forward(): set_row_rc( vars.default_roll, vars.default_pitch +20, vars.default_yaw, int(autopilot.state['throttle']), vars.default_servo_aux2) wait_for_execution('go_forward') set_row_rc( vars.default_roll, vars.default_pitch, vars.default_yaw, int(autopilot.state['throttle']), vars.default_servo_aux2) wait_for_execution('go_forward') returnTruedefdeliver(): set_row_rc( vars.default_roll, vars.default_pitch, vars.default_yaw, int(autopilot.state['throttle']), 2000)# 2000 to open the servo-device (to deliver the bomb) wait_for_execution('deliver') returnTrue
當FPV操作員將飛行器切換到READY模式時,它會向前飛行2秒,然后投放炸彈。這一邏輯在commands.py文件中的go_forward()和deliver()函數中實現。
MSP命令
在邏輯層面,命令路由器(router.py)通過執行commands.py中的命令來管理駕駛儀邏輯。這些命令在更低的邏輯層面上封裝了更精確的FPV無人機控制。
importserialimporttimeimportautopilotimportdefinitionsasvarsimportmsp_helperasmspcommand_delays = { 'go_forward':2, 'deliver':1}command_target_ids = { 'MSP_ANALOG': msp.MSP_ANALOG, 'MSP_ALTITUDE': msp.MSP_ALTITUDE, 'MSP_RC': msp.MSP_RC}serial_port = {}defwait_for_execution(target, delay=0): ifdelay ==0: delay = command_delays.get(target) time.sleep(delay)defget_target_id(target): returnint(command_target_ids.get(target))defconnect(): globalserial_port serial_port = serial.Serial( vars.companion_computer, vars.companion_baud_rate, timeout=1)defdisconnect(): serial_port.close()defreboot(): disconnect() time.sleep(1) connect()defset_row_rc(roll, pitch, yaw, throttle, servo_aux): # ROLL/PITCH/THROTTLE/YAW/AUX1/AUX2/AUX3/AUX4 data = [roll, pitch, throttle, yaw,0, servo_aux,0,0] msp.send_msp_command(serial_port, msp.MSP_SET_RAW_RC, data) msp_command_id, payload = msp.read_msp_response(serial_port) ifmsp_command_id != msp.MSP_SET_RAW_RC: returnFalse returnTruedefcopter_init(): # connect() returnset_row_rc( vars.default_roll, vars.default_pitch, vars.default_yaw, vars.default_throttle, vars.default_servo_aux2)deftelemetry(target): msp_target_command_id = get_target_id(target) msp.send_msp_request(serial_port, msp_target_command_id) time.sleep(0.1) msp_command_id, payload = msp.read_msp_response(serial_port) ifmsp_command_id == msp_target_command_id: returnpayload return{}defprepare_go_forward(throttle): set_row_rc( vars.default_roll, vars.default_pitch, vars.default_yaw, int(throttle), vars.default_servo_aux2)
如上所示,它處理主要場景的準備prepare_go_forward(throttle)、遙測請求telemetry(target)和系統監控。此外,它還管理四軸飛行器的初始化connect(),并將AUX通道配置為某些特定值set_row_rc(roll, pitch, yaw, throttle, servo_aux),從而在無人機自動飛行期間實現自主控制和操作。
MSP助手
在自主飛行過程中,無人機由Betaflight固件通過伴侶計算機(樹莓派)使用MSP協議進行控制,如前所述。該協議提供有關無人機當前狀態的遙測數據,并啟用飛行控制(偏航、俯仰、橫滾、油門)以及通過切換AUX通道來控制伺服機構。
為了封裝所有與低級或協議特定通信相關的功能,我實現了msp_helper.py模塊。
importstruct# MSP command IDsMSP_ANALOG =110MSP_ALTITUDE =109MSP_RC =105MSP_SET_RAW_RC =200defget_checksum(msp_command_id, payload): checksum =0 length =len(payload) forbyteinbytes([length, msp_command_id]) + payload: checksum ^= byte checksum &=0xFF returnchecksumdefsend_msp_command(serial_port, msp_command_id, data): payload =bytearray() forvalueindata: payload += struct.pack('<1H', value)? ? header =?b'$M<'? ? length =?len(payload)? ? checksum = get_checksum(msp_command_id, payload)? ? msp_package = header +?bytes([length, msp_command_id]) + payload +?bytes([checksum])? ? serial_port.write(msp_package)def?send_msp_request(serial_port, msp_command_id):? ? header =?b'$M<'? ? length =?0? ? checksum = get_checksum(msp_command_id,?bytes([]))? ? msp_package = header + struct.pack(', length, msp_command_id) +?bytes([checksum])? ? serial_port.write(msp_package)def?read_msp_response(serial_port):? ? response = serial_port.readline()? ? if?response.startswith(b'$M>'): length = response[3] msp_command_id = response[4] payload = response[5:5+ length] returnmsp_command_id, payload else: raiseValueError("Invalid MSP response")
如上所示,msp_helper.py封裝了發送MSP命令、發送MSP請求、計算校驗和以及讀取MSP響應等命令。為了我們的自動駕駛儀的目的,我只包含了四個MSP命令:MSP_ANALOG、MSP_ALTITUDE、MSP_RC和MSP_SET_RAW_RC。然而,MSP協議還支持許多其他命令。
消息和日志
在運行過程中,自動駕駛儀會生成并向各種目標(包括應用程序控制臺)發送消息,同時還會將消息和日志存儲在日志文件中。每次自動駕駛儀啟動時都會創建一個新的日志文件。
FPV無人機的飛行記錄
日志文件保存在Logs文件夾中,可以在無人機飛行后的任何時間進行查看。與飛機上的“黑匣子”類似,這些文件有助于分析飛行情況并調查可能發生的任何緊急情況。
我強烈建議將logger.py設置為DEBUG模式以捕獲詳細信息。這一做法將最大限度地從日志中學習,并促進你的FPV戰斗無人機版本的自動駕駛儀系統隨著每次飛行而不斷改進。
下一步是什么?
本指南為構建與Betaflight固件兼容的自動駕駛儀提供了一個基礎模板。如果你正在考慮開發自動駕駛儀,那么本指南將是一個很好的起點。你可以通過融入計算機視覺、目標識別、目標跟蹤、目標跟隨、巡航控制等高級功能來增強它。
-
無人機
+關注
關注
230文章
10761瀏覽量
185768 -
樹莓派
+關注
關注
121文章
1958瀏覽量
107056 -
FPV
+關注
關注
0文章
23瀏覽量
4700
發布評論請先 登錄
The Drone Pi :用樹莓派做無人機(一)——材料準備
用樹莓派做無人機(二)——工作原理和框架構造
【ELF靈翼自拍無人機申請】靈翼航拍無人機測評
無人機有人管了 全國首個無人機飛行服務中心試運行
無人機反制槍針對無人機飛行有哪些優勢?
大疆正式發布全新產品DJI FPV無人機
大疆重磅推出沉浸式飛行無人機DJI FPV
大疆發布沉浸式飛行無人機DJI FPV
如何為樹莓派 FPV 戰斗無人機構建自動駕駛儀的“眼睛”!

評論