開(kāi)始利用Betaflight飛行控制器、簡(jiǎn)單的10個(gè)Python文件和樹(shù)莓派,為你的FPV戰(zhàn)斗無(wú)人機(jī)構(gòu)建自己的自動(dòng)駕駛儀。

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

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

Betaflight配置器中的模式部分
ARM:用于啟動(dòng)和關(guān)閉電機(jī)。
ANGLE:激活A(yù)NGLE模式,使自動(dòng)駕駛儀能夠在穩(wěn)定飛行模式下控制無(wú)人機(jī)。
ALTHOLD:保持當(dāng)前高度,防止飛行過(guò)程中發(fā)生任何意外的高度變化。
BEEPER:激活無(wú)人機(jī)的蜂鳴器,在緊急情況下(如在樹(shù)林中丟失無(wú)人機(jī))可用于定位無(wú)人機(jī)。
MSP OVERRIDE:最關(guān)鍵的模式,允許自動(dòng)駕駛儀通過(guò)在msp_override_channels_mask變量中定義的切換來(lái)接管控制權(quán)。
MSP OVERRIDE的詳細(xì)配置說(shuō)明將在下文的“MSP OVERRIDE”部分提供。
還需要正確配置舵機(jī)模塊。如下圖所示,SERVO1已設(shè)置為響應(yīng)AUX2的切換。請(qǐng)確保在你的配置中復(fù)制此設(shè)置。

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

在CLI中設(shè)置msp_override_channels_mask
要設(shè)置它,請(qǐng)執(zhí)行以下腳本。
setmsp_override_channels_mask =47savegetmsp_override_channels_mask
每次更改后,請(qǐng)務(wù)必通過(guò)在CLI中輸入save命令來(lái)保存配置。
MSP OVERRIDE
現(xiàn)在,你將明白為什么我們?cè)谏弦还?jié)中為msp_override_channels_mask設(shè)置了位掩碼00101111(47)。
Betaflight中的MSP OVERRIDE模式允許自動(dòng)駕駛儀(樹(shù)莓派)覆蓋特定的AUX值,從而直接控制無(wú)人機(jī)。激活后,此模式允許自動(dòng)駕駛儀調(diào)整ROLL、PITCH、YAW、THROTTLE和AUX值等參數(shù)。在此設(shè)置中,我們使用MSP OVERRIDE來(lái)管理無(wú)人機(jī)的方向、速度、整體飛行,并在必要時(shí)觸發(fā)與SERVO1(AUX2)鏈接的舵機(jī)模塊以釋放炸彈。
Betaflight中的msp_override_channels_mask變量決定了自動(dòng)駕駛儀將覆蓋哪些發(fā)射機(jī)(無(wú)線電控制器)通道。在我們的場(chǎng)景中,通道保留用于飛行控制的ROLL、PITCH、YAW和THROTTLE,以及用于激活SERVO1的AUX2,以便在必要時(shí)釋放炸彈。
需要注意的是,掩碼邏輯遵循反向位順序。為了清晰起見(jiàn),請(qǐng)參考下圖,該圖解釋了掩碼值如何計(jì)算為47(0x00101111)以及為何選擇這些通道。
msp_override_channels_mask的掩碼
在msp_override_channels_mask中,值為1表示覆蓋已啟用,而0表示已禁用。如所示,我們?yōu)榍八膫€(gè)專用于飛行控制的通道(ROLL、PITCH、YAW、THROTTLE)以及控制有效載荷釋放的AUX2啟用了覆蓋。
樹(shù)莓派配置
根據(jù)最初的設(shè)計(jì),樹(shù)莓派作為伴侶計(jì)算機(jī),通過(guò)MSP協(xié)議與飛行控制器(FC)上的Betaflight固件進(jìn)行通信。
雖然Betaflight最初并非為自主飛行而設(shè)計(jì),但最近的更新引入了強(qiáng)大的MSP OVERRIDE模式,使我們能夠開(kāi)發(fā)自動(dòng)駕駛儀,正如我們之前所討論的。
安裝在FPV戰(zhàn)斗無(wú)人機(jī)電池組上的樹(shù)莓派
為了開(kāi)始探索自動(dòng)駕駛儀,我們應(yīng)按照GitHub倉(cāng)庫(kù)中“Betaflight上的FPV戰(zhàn)斗無(wú)人機(jī)自動(dòng)駕駛儀(空載版本)”的“樹(shù)莓派配置”部分中概述的步驟進(jìn)行操作,包括復(fù)制文件、設(shè)置適當(dāng)?shù)姆?wù)以及創(chuàng)建日志文件夾以允許收集遙測(cè)數(shù)據(jù)和一般日志。
https://github.com/under0tech/autopilot_bee_ept
架構(gòu)
自動(dòng)駕駛儀具有多線程架構(gòu)。其核心是一個(gè)由命令路由器管理的命令隊(duì)列,該路由器處理所有傳入的命令。路由器在其專用線程(稱為路由器線程)中運(yùn)行,而另外兩個(gè)線程——遙測(cè)線程和空載駕駛儀線程——?jiǎng)t專注于將命令追加到隊(duì)列中。
Betaflight的簡(jiǎn)單自動(dòng)駕駛儀
遙測(cè)線程處理系統(tǒng)監(jiān)控和遙測(cè)請(qǐng)求,將命令排隊(duì)以向自動(dòng)駕駛儀提供關(guān)鍵數(shù)據(jù),如當(dāng)前高度、飛機(jī)速度和實(shí)時(shí)RC通道值。而空載駕駛儀線程則管理與自主飛行和有效載荷投放相關(guān)的命令,如炸彈投放。
有關(guān)自動(dòng)駕駛儀架構(gòu)的更詳細(xì)解釋,請(qǐng)參閱GitHub倉(cāng)庫(kù)中提供的README_DEV.md文件。
https://github.com/under0tech/autopilot_bee_ept/blob/main/README_DEV.md
模式
與我之前為實(shí)驗(yàn)?zāi)康目寺〉脑甲詣?dòng)駕駛儀不同,我們現(xiàn)在擁有了一個(gè)真正的遙控器——RadioMaster Pocket M2,它允許我們根據(jù)需要切換AUX開(kāi)關(guān)和相關(guān)模式。
RadioMaster Pocket M2無(wú)線電控制器
在此自動(dòng)駕駛儀的實(shí)現(xiàn)中,我將其設(shè)計(jì)為僅具有兩種模式:
1.OFF——自動(dòng)駕駛儀保持非活動(dòng)狀態(tài),等待操作員輸入以切換到另一種模式。在此狀態(tài)下,只有遙測(cè)監(jiān)控和日志記錄功能可用。
2.READY——激活基本功能,無(wú)人機(jī)向前飛行兩秒,然后投放其有效載荷(例如,炸彈)。
模式由command_telemetry_mode_change(telemetry)函數(shù)管理,該函數(shù)依賴于AUX3的值。低值(1000)對(duì)應(yīng)于OFF模式,中間值(1503)未分配,而高值(2000)則激活READY模式。
該函數(shù)在router.py文件中實(shí)現(xiàn)。
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()
你可能已經(jīng)注意到,中間值(1503)會(huì)觸發(fā)自動(dòng)駕駛儀執(zhí)行其主要場(chǎng)景的準(zhǔn)備步驟,盡管它并未分配一個(gè)獨(dú)特的模式名稱。我做出這一選擇是有意的,并且完全清楚它偏離了預(yù)期的架構(gòu)。然而,我認(rèn)為代碼中至少有一處不完美是可以接受的——細(xì)心的開(kāi)發(fā)者可能會(huì)很快發(fā)現(xiàn)并糾正這一點(diǎn)。
遙測(cè)
如前所述,遙測(cè)線程負(fù)責(zé)處理系統(tǒng)監(jiān)控和遙測(cè)請(qǐng)求的命令排隊(duì)。它為自動(dòng)駕駛儀提供關(guān)鍵數(shù)據(jù),如當(dāng)前高度、飛機(jī)速度和實(shí)時(shí)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])
遙測(cè)請(qǐng)求以2秒的間隔添加到隊(duì)列中。
如上所示,MSP_ALTITUDE和MSP_ANALOG請(qǐng)求每2秒發(fā)送一次,以為自動(dòng)駕駛儀提供當(dāng)前高度和飛機(jī)速度數(shù)據(jù)。同時(shí),MSP_RC值對(duì)于模式切換和整體控制至關(guān)重要,因此每秒請(qǐng)求一次,以確保對(duì)自主飛行器的更響應(yīng)和高效控制。
空載駕駛儀
空載駕駛儀線程管理與向前飛行和有效載荷投放相關(guān)的命令排隊(duì),如炸彈投放。這些命令每1秒添加到隊(duì)列中。
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
當(dāng)FPV操作員將飛行器切換到READY模式時(shí),它會(huì)向前飛行2秒,然后投放炸彈。這一邏輯在commands.py文件中的go_forward()和deliver()函數(shù)中實(shí)現(xiàn)。
MSP命令
在邏輯層面,命令路由器(router.py)通過(guò)執(zhí)行commands.py中的命令來(lái)管理駕駛儀邏輯。這些命令在更低的邏輯層面上封裝了更精確的FPV無(wú)人機(jī)控制。
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)
如上所示,它處理主要場(chǎng)景的準(zhǔn)備prepare_go_forward(throttle)、遙測(cè)請(qǐng)求telemetry(target)和系統(tǒng)監(jiān)控。此外,它還管理四軸飛行器的初始化connect(),并將AUX通道配置為某些特定值set_row_rc(roll, pitch, yaw, throttle, servo_aux),從而在無(wú)人機(jī)自動(dòng)飛行期間實(shí)現(xiàn)自主控制和操作。
MSP助手
在自主飛行過(guò)程中,無(wú)人機(jī)由Betaflight固件通過(guò)伴侶計(jì)算機(jī)(樹(shù)莓派)使用MSP協(xié)議進(jìn)行控制,如前所述。該協(xié)議提供有關(guān)無(wú)人機(jī)當(dāng)前狀態(tài)的遙測(cè)數(shù)據(jù),并啟用飛行控制(偏航、俯仰、橫滾、油門(mén))以及通過(guò)切換AUX通道來(lái)控制伺服機(jī)構(gòu)。
為了封裝所有與低級(jí)或協(xié)議特定通信相關(guān)的功能,我實(shí)現(xiàn)了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封裝了發(fā)送MSP命令、發(fā)送MSP請(qǐng)求、計(jì)算校驗(yàn)和以及讀取MSP響應(yīng)等命令。為了我們的自動(dòng)駕駛儀的目的,我只包含了四個(gè)MSP命令:MSP_ANALOG、MSP_ALTITUDE、MSP_RC和MSP_SET_RAW_RC。然而,MSP協(xié)議還支持許多其他命令。
消息和日志
在運(yùn)行過(guò)程中,自動(dòng)駕駛儀會(huì)生成并向各種目標(biāo)(包括應(yīng)用程序控制臺(tái))發(fā)送消息,同時(shí)還會(huì)將消息和日志存儲(chǔ)在日志文件中。每次自動(dòng)駕駛儀啟動(dòng)時(shí)都會(huì)創(chuàng)建一個(gè)新的日志文件。
FPV無(wú)人機(jī)的飛行記錄
日志文件保存在Logs文件夾中,可以在無(wú)人機(jī)飛行后的任何時(shí)間進(jìn)行查看。與飛機(jī)上的“黑匣子”類似,這些文件有助于分析飛行情況并調(diào)查可能發(fā)生的任何緊急情況。
我強(qiáng)烈建議將logger.py設(shè)置為DEBUG模式以捕獲詳細(xì)信息。這一做法將最大限度地從日志中學(xué)習(xí),并促進(jìn)你的FPV戰(zhàn)斗無(wú)人機(jī)版本的自動(dòng)駕駛儀系統(tǒng)隨著每次飛行而不斷改進(jìn)。
下一步是什么?
本指南為構(gòu)建與Betaflight固件兼容的自動(dòng)駕駛儀提供了一個(gè)基礎(chǔ)模板。如果你正在考慮開(kāi)發(fā)自動(dòng)駕駛儀,那么本指南將是一個(gè)很好的起點(diǎn)。你可以通過(guò)融入計(jì)算機(jī)視覺(jué)、目標(biāo)識(shí)別、目標(biāo)跟蹤、目標(biāo)跟隨、巡航控制等高級(jí)功能來(lái)增強(qiáng)它。
-
無(wú)人機(jī)
+關(guān)注
關(guān)注
230文章
10738瀏覽量
185594 -
樹(shù)莓派
+關(guān)注
關(guān)注
121文章
1947瀏覽量
106998 -
FPV
+關(guān)注
關(guān)注
0文章
22瀏覽量
4688
發(fā)布評(píng)論請(qǐng)先 登錄
The Drone Pi :用樹(shù)莓派做無(wú)人機(jī)(一)——材料準(zhǔn)備
用樹(shù)莓派做無(wú)人機(jī)(二)——工作原理和框架構(gòu)造
用樹(shù)莓派做無(wú)人機(jī)(三)——推進(jìn)和飛行控制
用樹(shù)莓派做無(wú)人機(jī)(完)——樹(shù)莓派部分
【ELF靈翼自拍無(wú)人機(jī)申請(qǐng)】靈翼航拍無(wú)人機(jī)測(cè)評(píng)
無(wú)人機(jī)有人管了 全國(guó)首個(gè)無(wú)人機(jī)飛行服務(wù)中心試運(yùn)行
無(wú)人機(jī)飛手緊缺 看無(wú)人機(jī)行業(yè)發(fā)展趨勢(shì)如何?
改造Skye無(wú)人機(jī)刷Betaflight遇到了哪些問(wèn)題
怎樣去設(shè)計(jì)一個(gè)基于樹(shù)莓派和Python的無(wú)人機(jī)視覺(jué)跟蹤系統(tǒng)呢
無(wú)人機(jī)反制槍針對(duì)無(wú)人機(jī)飛行有哪些優(yōu)勢(shì)?
大疆正式發(fā)布全新產(chǎn)品DJI FPV無(wú)人機(jī)
大疆重磅推出沉浸式飛行無(wú)人機(jī)DJI FPV
大疆發(fā)布沉浸式飛行無(wú)人機(jī)DJI FPV
無(wú)人機(jī)自主飛行編程賽賽規(guī)發(fā)布

評(píng)論