[心得] 四轴后续

楼主: 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