2021-08-23 10:50:03 索煒達電子 909
項目編號:E480
文件大?。?9M
源碼說明:帶中文注釋
開發(fā)環(huán)境:C編譯器
簡要概述:
下位機STM32端無人船/無人車程序,配合樹莓派、英偉達Jetson Nano等上位機端程序使用
系統(tǒng)架構方面:
STM32采用類操作系統(tǒng)式框架,任務可分不同頻率被調用。優(yōu)點是該框架可以提高系統(tǒng)靈活性,降低系統(tǒng)耦合性。這么做的還有許多無人機飛控廠家,如crazypony等。
下位機工程可選擇編譯,只需要改動一個宏定義,系統(tǒng)即可進行相應改變,自動選擇傳感器元件。主要應用于對GY901與MPU6050+HML5883兩套慣性測量裝置同時兼容,無縫切換。
傳感器上電自動自檢,自動校準,保障數據精度
GPS模塊采用先進的UBX協(xié)議,系統(tǒng)上電前自動配置GPS輸出必要信息,濾除不必要信息,大幅提高數據處理效率
系統(tǒng)核心方面:
上、下位機內部數據緩沖區(qū)采用先進的環(huán)形緩沖區(qū),大幅降低數據高速傳輸時的丟包率,提高上下位機對數據處理速度
STM32采用有限狀態(tài)機設計,可通過遙控器進入不同狀態(tài),執(zhí)行不同操作。提高系統(tǒng)靈活性。
采用先進的Madgwick梯度下降姿態(tài)解算算法,較以前的卡爾曼濾波方法大幅降低了下位機對數據迭代的次數,采用此方法僅需10Hz的采樣速度即可收斂至當前載具的姿態(tài)
Madgwick梯度下降姿態(tài)解算算法,這是最終實現的算法。首先它的好處就是對迭代次數、傳感器采樣頻率要求很低,而這恰好彌補了Kalman濾波器的缺點——吃性能。由于下位機采用STM32F1系列,時鐘頻率最高72Mhz,這也就使想要在32上同時采用姿態(tài)解算算法和控制是不太可行的。梯度下降實際上是一種在機器學習中應用的比較廣泛的算法,普遍用在優(yōu)化問題上。也就是說,梯度下降中的“下降”可以理解為使一個函數的輸出值與理論值之間誤差逐步下降,用在姿態(tài)解算上也就是使解算姿態(tài)與真實姿態(tài)之間誤差逐步下降。
GPS模塊由于需要實時接收大量數據,嚴重占用MCU任務處理時間,因此加入了DMA。并且在工程中配置為DMA與中斷處理兩種可選方式選擇編譯,提高了效率、靈活性。
功能拓展方面:
可設置的載具模型(汽車模型、海上模型)可最優(yōu)化使用GPS輸出數據,GPS輸出數據將根據所選模型進行適配。
可在Google Map上標點直接導出為載具軌跡
GPS模塊使用Ublox的M8(有一塊自帶HMC5883磁力計的版本)
姿態(tài)傳感器使用MPU6050
遙控器使用WFR07\WFT07 具體連線請參考本目錄下的兩幅圖片
車體電機說明:
使用前兩個輪子使用舵機轉向(舵機型號與連線參考本目錄下的舵機線.png)
后兩個輪子各用一個電機驅動(使用PID控制兩電機轉速基本相同)。
如果車體不同,直接刪掉原腳本,按照相類似的函數定義方法在腳本中修改即可
1.將本文件下載到某個文件夾下
2.打開Keil5,編譯,下載到STM32中
3.按照【STM32資源使用情況.xlsx】表格,將相應的傳感器連線
以上就可以了。此外,如果不連接上位機的話,將只能遙控控制;如果接了上位機,則可以進行定點巡航、采點等。
STM32型號為ZET6,由于使用了定時器8,因此必須使用大容量產品。
上位機負責和地面站通信,路線規(guī)劃等等,可以移植到ROS上。
下位機就用比較簡單的架構,大體上就是把姿態(tài)解算、電機控制等任務分5,10,50,100Hz的頻率運行。
樹莓派使用Python腳本在后臺以進程的形式運行(如果使用的是非ROS版上位機程序的話)
建議使用非ROS版上位機程序,原因:開發(fā)環(huán)境容易配置(只需要Python),并且穩(wěn)定性好。
開發(fā)無人船過程中參考的傳感器手冊以及算法資料
開發(fā)日志記錄了項目從一開始的立項到后面一步步測試成功的大大小小細節(jié)。前后由于放棄了舊的姿態(tài)算法、選取了新的姿態(tài)算法,因此前期關于姿態(tài)的說明僅供參考用。
通信協(xié)議的部分已摘抄出來,放在該目錄下。即:整體框架與通信協(xié)議.docx
Periphrals文件夾存儲STM32的外設硬件部分代碼
Software文件夾存儲STM32軟件部分代碼,即PID算法等
CONFIGURATION.h頭文件用于設置、條件編譯等
initialize.c為STM32初始化時運行的代碼
語音提示GPS連接情況、機體運行情況等。(只需要給上位機接一個小音箱)
使用遙控器控制
采集GPS坐標:此時在使用遙控器控制的同時,上位機在后臺記錄當前GPS坐標點
輸入GPS坐標,自主導航。(輸入坐標的方法可用Google Earth采點或使用之前采集的GPS坐標)
目錄│文件列表:
│ CONFIGURATION.h
│ STM32資源使用情況.xlsx
│ WFR07.jpg
│ WFT07.jpg
│ 舵機線.png
├ Libraries
│ ├ CMSIS
│ │ │ License.doc
│ │ └ CM3
│ │ ├ CoreSupport
│ │ │ │ core_cm3.c
│ │ │ └ core_cm3.h
│ │ └ DeviceSupport
│ │ └ ST
│ │ └ STM32F10x
│ │ │ stm32f10x.h
│ │ │ system_stm32f10x.c
│ │ │ system_stm32f10x.h
│ │ └ startup
│ │ ├ arm
│ │ │ │ startup_stm32f10x_cl.s
│ │ │ │ startup_stm32f10x_hd.s
│ │ │ │ startup_stm32f10x_hd_vl.s
│ │ │ │ startup_stm32f10x_ld.s
│ │ │ │ startup_stm32f10x_ld_vl.s
│ │ │ │ startup_stm32f10x_md.s
│ │ │ │ startup_stm32f10x_md_vl.s
│ │ │ └ startup_stm32f10x_xl.s
│ │ ├ gcc_ride7
│ │ │ │ startup_stm32f10x_cl.s
│ │ │ │ startup_stm32f10x_hd.s
│ │ │ │ startup_stm32f10x_hd_vl.s
│ │ │ │ startup_stm32f10x_ld.s
│ │ │ │ startup_stm32f10x_ld_vl.s
│ │ │ │ startup_stm32f10x_md.s
│ │ │ │ startup_stm32f10x_md_vl.s
│ │ │ └ startup_stm32f10x_xl.s
│ │ ├ iar
│ │ │ │ startup_stm32f10x_cl.s
│ │ │ │ startup_stm32f10x_hd.s
│ │ │ │ startup_stm32f10x_hd_vl.s
│ │ │ │ startup_stm32f10x_ld.s
│ │ │ │ startup_stm32f10x_ld_vl.s
│ │ │ │ startup_stm32f10x_md.s
│ │ │ │ startup_stm32f10x_md_vl.s
│ │ │ └ startup_stm32f10x_xl.s
│ │ └ TrueSTUDIO
│ │ │ startup_stm32f10x_cl.s
│ │ │ startup_stm32f10x_hd.s
│ │ │ startup_stm32f10x_hd_vl.s
│ │ │ startup_stm32f10x_ld.s
│ │ │ startup_stm32f10x_ld_vl.s
│ │ │ startup_stm32f10x_md.s
│ │ │ startup_stm32f10x_md_vl.s
│ │ └ startup_stm32f10x_xl.s
│ └ STM32F10x_StdPeriph_Driver
│ ├ inc
│ │ │ misc.h
│ │ │ stm32f10x_adc.h
│ │ │ stm32f10x_bkp.h
│ │ │ stm32f10x_can.h
│ │ │ stm32f10x_cec.h
│ │ │ stm32f10x_crc.h
│ │ │ stm32f10x_dac.h
│ │ │ stm32f10x_dbgmcu.h
│ │ │ stm32f10x_dma.h
│ │ │ stm32f10x_exti.h
│ │ │ stm32f10x_flash.h
│ │ │ stm32f10x_fsmc.h
│ │ │ stm32f10x_gpio.h
│ │ │ stm32f10x_i2c.h
│ │ │ stm32f10x_iwdg.h
│ │ │ stm32f10x_pwr.h
│ │ │ stm32f10x_rcc.h
│ │ │ stm32f10x_rtc.h
│ │ │ stm32f10x_sdio.h
│ │ │ stm32f10x_spi.h
│ │ │ stm32f10x_tim.h
│ │ │ stm32f10x_usart.h
│ │ └ stm32f10x_wwdg.h
│ └ src
│ │ misc.c
│ │ stm32f10x_adc.c
│ │ stm32f10x_bkp.c
│ │ stm32f10x_can.c
│ │ stm32f10x_cec.c
│ │ stm32f10x_crc.c
│ │ stm32f10x_dac.c
│ │ stm32f10x_dbgmcu.c
│ │ stm32f10x_dma.c
│ │ stm32f10x_exti.c
│ │ stm32f10x_flash.c
│ │ stm32f10x_fsmc.c
│ │ stm32f10x_gpio.c
│ │ stm32f10x_i2c.c
│ │ stm32f10x_iwdg.c
│ │ stm32f10x_pwr.c
│ │ stm32f10x_rcc.c
│ │ stm32f10x_rtc.c
│ │ stm32f10x_sdio.c
│ │ stm32f10x_spi.c
│ │ stm32f10x_tim.c
│ │ stm32f10x_usart.c
│ └ stm32f10x_wwdg.c
├ obj
│ └ Template.hex
├ Output
│ └ UAS.hex
├ Project
│ │ Eastar_UAS.uvguix.85234
│ │ Eastar_UAS.uvoptx
│ │ Estello_UAS.uvguix.85234
│ │ Estello_UAS.uvoptx
│ │ Estello_UAS.uvprojx
│ │ EventRecorderStub.scvd
│ │ JLinkSettings.ini
│ │ Template.uvguix.85234
│ └ Template.uvoptx
└ User
│ Inclusion.h
│ initialize.c
│ main.c
│ stm32f10x_conf.h
│ stm32f10x_it.c
│ stm32f10x_it.h
│ system_stm32f10x.c
│ system_stm32f10x.h
├ COMPASS
│ │ COMPASS.c
│ └ COMPASS.h
├ DATAFUSION
│ │ DATAFUSION.c
│ └ DATAFUSION.h
├ Delay
│ │ delay.c
│ └ delay.h
├ EXT
│ │ ext.c
│ └ ext.h
├ FILTER
│ │ FILTER.c
│ └ FILTER.h
├ GeneralFunction
│ │ General_fucntion.c
│ └ General_fucntion.h
├ GPS
│ │ GPS.c
│ └ GPS.h
├ IIC
│ │ IIC.c
│ └ IIC.h
├ IMU
│ │ IMU.c
│ │ IMU.h
│ └ MPU6050.h
├ InputCapture
│ │ input_capture.c
│ └ input_capture.h
├ INPUT_CAPTURE
│ │ INPUT_CAPTURE.c
│ └ INPUT_CAPTURE.h
├ LoopSequence
│ │ Loop.c
│ └ Loop.h
├ Motor
│ │ Motor.c
│ └ Motor.h
├ NRF24L01
│ └ NRF24L01.c
├ PathPlanning
│ │ PathPlanning.c
│ └ PathPlanning.h
├ PID
│ │ PID.c
│ └ PID.h
├ PWM
│ │ pwm.c
│ └ pwm.h
├ RingBuff
│ │ ring_buff.c
│ └ ring_buff.h
├ TD
│ │ TD.c
│ └ TD.h
├ Usart
│ │ USART.c
│ └ USART.h
├ WDG
│ │ WDG.c
│ └ WDG.h
└ WirelessUSART
│ WirelessPort.c
└ WirelessPort.h