記錄一下自己在Pixhawk上添加超聲波模塊進行定高的過程:
硬件:Pixhawk2.4.8(APM3.5固件)、STM32開發板、幾塊錢一個的超聲波模塊
軟件:Mission Planner、Keil(STM32編程用)
過程:
1.分析官方給出的各種RangFinder的添加方案和源碼,確定使用STM32單片機讀取超聲波數據,然后以串口方式發送給Pixhawk飛控。
相關源碼鏈接:https://github.com/ArduPilot/ardupilot/tree/master/libraries/AP_RangeFinder
官方給出的傳感器添加方式:http://ardupilot.org/copter/docs/common-rangefinder-maxbotixi2c.html
對AP_RangeFinder_LightWareSerial.cpp進行分析:
通過閱讀以上代碼,可以得出兩點信息:
a. 數據以字符串形式發送(單位為m),以回車符'\r'結尾;
b.兩次數據發送的時間間隔要小於200ms;
2.在Mission Planner中進行相關配置(以下圖片為盜用):
首先配置串口,這里我們配置串口4,波特率為115200,協議選擇9:Lidar
這里要特別注意,要保證其他的串口協議不為9,否則程序在運行時可能會在其他串口處找數據!
其次對RNGFND相關變量進行配置:
RNGFND_TYPE設為8,因為我們參考的是LightWareSerial的數據包格式;
RNGFND_MIN_CM和RNGFND_MAX_CM是設置超聲波的距離范圍;
其他幾項如下圖:
配置完之后,點擊右側Write Param;
3.STM32單片機編程
這里就不再詳述,就是配置一個STM32的定時器,輸入捕獲獲取超聲波距離值,然后配置一個串口,波特率115200,以字符串形式向外發送數據;
4.接線,測試:
把兩個板子的串口連接起來,打開Mission Planner,就可以在State中的sonarrange處看到我們發過去的距離信息
總結:
以上為串口通信方式添加,如果以IIC或AD方式,只要查看源碼對應部分的信息即可,IIC方式是把距離值分成高八位和第八位發出去;
網上有人用Arduino連接超聲波,然后以IIC方式發出去,也是一樣的道理;
(以上圖片均為盜用,但自己確實實現了,只是不想再去接線)
2018.1.31 補充
補充一點這幾天調試遇到的問題:
1.sonarrange有數據,並不代表飛行時用的就是該數據,要在參數列表中找到EKF2_RANGE_USE_HGT參數,改掉-1,這樣才能使用超聲波的數據(也有可能是EKF3_RANGE_USE_HGT,需要看自己使能的是哪個擴展卡爾曼濾波);
2.對於pixhawk的定高模式,自己在調試時總是無法實現定高,后來發現問題。這里記錄一下自己對如何使用定高模式的理解:
在定高模式下,油門的40%-60%為死區,也就是說,在這個區間內,飛機會自己調節油門以維持一定高度不變,如果想要改變高度,則把油門拉出該區間即可,此時油門對應的是飛機上升下降的速率,一旦到達想要的高度,立刻把油門拉回該區間,即可實現定高。
自己的問題在於,在油門為30%左右時由自穩切到定高,切到定高后並未把油門拉到50%左右,以致飛機總是掉高。