
ArduPilot Lua 腳本指南3 步自定義飛行行為【免費(fèi)下載鏈接】ardupilotArduPlane, ArduCopter, ArduRover, ArduSub source項(xiàng)目地址: https://gitcode.com/GitHub_Trending/ar/ardupilotArduPilot 是開源無人機(jī)飛控固件覆蓋多旋翼、固定翼等機(jī)型。它內(nèi)置的 Lua 腳本系統(tǒng)讓你不改固件就能擴(kuò)展自定義飛行行為適合想給飛行功能加料的開發(fā)者和高階玩家。3 步啟用 Lua 腳本支持 圖STM32H7 級飛控板ArduPilot Lua 腳本的典型運(yùn)行載體第 1 步確認(rèn)硬件。閃存芯片里的存儲空間大于 1MB 的飛控會自動編譯進(jìn)腳本引擎Pixhawk 4、CubeBlack 這類 STM32F7/H7 機(jī)型都滿足。第 2 步準(zhǔn)備固件。從官方倉庫獲取源碼按 README 安裝依賴即可沒有硬件也能用 SITL軟件在環(huán)即把固件跑在電腦模擬器里先行驗(yàn)證。第 3 步開啟并放腳本。在地面站把SCR_ENABLE設(shè)為 1 并重啟飛控再把.lua腳本放進(jìn) SD 卡的scripts文件夾開機(jī)自動加載。ArduPilot 腳本引擎如何工作 ??原理先講透。ArduPilot 在固件里內(nèi)置了 Lua 5.3.6 解釋器源碼在 lua/ 目錄。腳本跑在獨(dú)立線程里不會卡住主飛行控制回路。每個腳本本質(zhì)是個函數(shù)函數(shù)末尾return 函數(shù)名, 毫秒數(shù)引擎就會在毫秒數(shù)到達(dá)后再次調(diào)用它這就是每 100ms 更新一次的機(jī)制。另外任務(wù)執(zhí)行到 SCRIPTING 指令時(shí)AP_Mission 任務(wù)模塊里的start_command_do_scripting函數(shù)會把它轉(zhuǎn)交給腳本所以任務(wù)也能驅(qū)動腳本。必備參數(shù)參數(shù)作用設(shè)置示例SCR_ENABLE腳本總開關(guān)改后需重啟設(shè)為 1SCR_HEAP_SIZE腳本內(nèi)存字節(jié)平臺默認(rèn) 43KB–200KB按腳本復(fù)雜度上調(diào)進(jìn)階參數(shù)參數(shù)作用示例SCR_VM_I_COUNT虛擬機(jī)指令執(zhí)行上限防腳本吃滿 CPU設(shè)為 200000SCR_THD_PRIORITY腳本線程優(yōu)先級按實(shí)時(shí)性調(diào)按機(jī)型調(diào)整SCR_DEBUG_OPTS打開詳細(xì)日志排錯用調(diào)試時(shí)啟用SCR_LD_CHECKSUM腳本校驗(yàn)和完整性檢查防篡改腳本執(zhí)行正式環(huán)境開啟Lua 腳本 3 個實(shí)用場景 ?圖SITL 模擬器輸出的數(shù)據(jù)曲線ArduPilot Lua 腳本上機(jī)前可在此類環(huán)境驗(yàn)證場景一自定義圓形軌跡。目標(biāo)讓飛機(jī)繞某點(diǎn)飛 10 米半徑的圓。 實(shí)現(xiàn)每幀用當(dāng)前航向機(jī)頭指向與正北的夾角算出圓周上的目標(biāo)坐標(biāo)喂給制導(dǎo)回路。function update() local angle ahrs:get_yaw() local radius 10 local x radius * math.cos(angle) local y radius * math.sin(angle) vehicle:set_target_position(x, y, 5) return update, 100 end return update()末尾的return update, 100就是告訴引擎100 毫秒后再來一次。效果目標(biāo)點(diǎn)持續(xù)刷新飛機(jī)能一直保持在圓上不用人工干預(yù)。場景二電池低壓預(yù)警。目標(biāo)電壓低于 10.5V 時(shí)給地面站推一條告警。 實(shí)現(xiàn)每秒讀一次電壓低于閾值就發(fā)文本消息告警處還能掛自動返航邏輯。function battery_monitor() local volt battery:voltage() if volt 10.5 then gcs:send_text(0, Low battery! Voltage: .. volt) end return battery_monitor, 1000 end return battery_monitor()檢查邏輯只有 5 行。效果地面站日志里每秒可見電壓狀態(tài)低電問題有足夠時(shí)間處置。場景三響應(yīng)自定義任務(wù)指令。目標(biāo)任務(wù)跑到自定義指令I(lǐng)D 100時(shí)執(zhí)行腳本里的一段邏輯。 實(shí)現(xiàn)用mission:register_handler注冊處理器函數(shù)內(nèi)判斷指令 ID。任務(wù)不再寫死新指令由腳本接管。function handle_mission_cmd(cmd) if cmd.id 100 then gcs:send_text(0, Custom mission command: .. cmd.param1) end end mission:register_handler(handle_mission_cmd)效果新增指令語義不用改固件任務(wù)與腳本配合地面站還能確認(rèn)指令確實(shí)被執(zhí)行。6 個 Lua 腳本常見坑 ?圖H7 級飛控板ArduPilot Lua 腳本真機(jī)驗(yàn)證前的地面測試對象坑 1SCR_HEAP_SIZE給小了會內(nèi)存溢出。解法留余量慣性推算示例腳本就要求至少 80000 字節(jié)。坑 2高頻回調(diào)里做重計(jì)算CPU 負(fù)載飆升。解法拉長返回的毫秒間隔必要時(shí)用collectgarbage()手動觸發(fā)垃圾回收即手動清理不再用的內(nèi)存。坑 3沒開校驗(yàn)和SCR_LD_CHECKSUM被篡改的腳本也能跑。解法對外發(fā)布的腳本先開校驗(yàn)。坑 4忘了部分參數(shù)改完要重啟才生效誤判為 bug。解法SCR_ENABLE這類參數(shù)改完立即重啟飛控???5直接真機(jī)試飛。解法先用 SITL 模擬器跑通SITL 模擬器 用Tools/autotest/sim_vehicle.py一鍵拉起再上機(jī)。坑 6出問題查不到痕跡。解法用gcs:send_text()打調(diào)試信息配合SCR_DEBUG_OPTS開詳細(xì)日志。上機(jī)之前腳本務(wù)必先在模擬器里驗(yàn)證、再做地面測試這是成本最低的一道保險(xiǎn)。想繼續(xù)深入讀 AP_Scripting 腳本模塊的源碼和 官方腳本示例目錄再動手寫你的第一個 Lua 腳本。【免費(fèi)下載鏈接】ardupilotArduPlane, ArduCopter, ArduRover, ArduSub source項(xiàng)目地址: https://gitcode.com/GitHub_Trending/ar/ardupilot創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考