[心得] 四軸後續

作者: wtchen (沒有存在感的人)   2016-12-23 02:02:13
(前情提要在LinuxDev板,#1M4NwTYZ)
改寫得差不多了,來分享一下後續
(正在等加了天線的RF module,拿到了再找好天氣試飛)
先給source code https://github.com/gnitnaw/RTPiDrone
(mkdir build; cd build; cmake ..
後 make doc可以看到編好的文件,記得要安裝doxygen)
講一下跟本板有關的事項:
- linked list很好用
去年的版本我已經發現週期會不定時突然暴增找不到原因。
今年這部份解決了,是卡在file i/o上。
每 1 or 2個 控制週期(4ms)我會將四軸當下的state存下來,
可是SD卡有時會突然不回應(idle快一秒)
四軸飛控如果半秒沒刷新state鐵掛。
(SD卡會有這樣的問題有可能是因為wear leveling的關係,
問題是你不可能不用wear leveling)
所以解決方案就是另開一個thread作file i/o
當有data要存下來時,把該data保存在linked list的最後,
然後叫醒(pthread_cond_signal)做file i/o的thread
該thread會從linked list最前面開始存入,直到該list只剩一個item。
(因為是thread,控制週期一到它會讓出CPU,就算i/o沒結束)
- 控制週期的問題
普通的non-RT Linux是不可靠的,你得用Preempt RT或Xenomai
使用以下的函式可以指定在某絕對時間Time醒來。
(不過建議先把ntp關掉就是)
clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &Time, NULL);
使用Xenomai的情況下,誤差差不多200us左右
Preempt_RT在priority max的情況下會比Xenomai更好。
- 通訊模組
我是用nRF24l01,支援SPI,可以把讀取時間降到最低(8Mbps)
如果改用UART介面會慢很多(最多115200bps)
(慢不要緊,可是Preempt RT/Xenomai都會導致系統吞吐量下降)
(CPU負擔增加,real time效果也會變差)
不過nRF24l01的問題是訊號太差,我最多只能離5公尺遠,不然收不到訊號。
其他的東西因為跟本板比較無關,就先不說了。
有問題推文問好了。
最後,感謝大家的協助,我從本板學到很多。
作者: cs8425 (cs)   2016-12-23 12:58:00
nRF24l01有加pa的版本(要裝天線) 個人實測可以到1km
作者: wtchen (沒有存在感的人)   2016-12-23 17:12:00
1km 是指空曠無障礙處?
作者: cs8425 (cs)   2016-12-23 18:40:00
河堤空曠無障礙 測到1km之後就沒測了
作者: descent (「雄辯是銀,沉默是金」)   2016-12-23 22:52:00
已經可以飛了嗎?
作者: Schottky (順風相送)   2016-12-24 21:33:00

Links booklink

Contact Us: admin [ a t ] ucptt.com