作者wtchen (沒有存在感的人)
看板C_and_CPP
標題[心得] RPi四軸後續
時間Fri Dec 23 02:02:13 2016
(前情提要在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公尺遠,不然收不到訊號。
其他的東西因為跟本板比較無關,就先不說了。
有問題推文問好了。
最後,感謝大家的協助,我從本板學到很多。
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 90.41.173.65
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1482429736.A.0DF.html
※ 編輯: wtchen (90.41.173.65), 12/23/2016 02:03:18
※ 編輯: wtchen (90.41.173.65), 12/23/2016 02:03:27
※ 編輯: wtchen (90.41.173.65), 12/23/2016 02:04:20
1F:推 k1400: 12/23 12:12
2F:→ cs8425: nRF24l01有加pa的版本(要裝天線) 個人實測可以到1km 12/23 12:58
3F:→ wtchen: 1km 是指空曠無障礙處? 12/23 17:12
4F:→ cs8425: 河堤空曠無障礙 測到1km之後就沒測了 12/23 18:40
5F:推 descent: 已經可以飛了嗎? 12/23 22:52
我在室內測(綁住一軸),平衡已經沒問題了。
最近因為天氣太差(潮溼)+RF module有效距離不夠(5m),沒機會試飛
試飛恐怕要等一個月後。
現在正在等料送來,順便把該焊好的焊好
剛好arduino也被我玩掛了(唉)
※ 編輯: wtchen (90.41.173.65), 12/24/2016 00:28:36
6F:推 descent: 真不簡單, 期待後續的分享。 12/24 18:37
7F:推 Schottky: 推 12/24 21:33