搜索
bottom↓
回复: 10

我的陀螺仪旋转了90度,计算出来姿态旋转只有30度

[复制链接]

出0入0汤圆

发表于 2011-10-19 10:40:11 | 显示全部楼层 |阅读模式
如题…L3G4200D 输出 采样率250Hz 即周期0.004s
然后 :Degree = data * 8.75 / 1000 * 0.004
把Degree带入四元数算法,计算周期250Hz
得到的值如题…比如z轴实际转动90度,数据只显示30度 ,X Y轴类似。
可能的原因1:因为sprintf转换三个浮点数成字符串,DMA输出到串口。会不会是sprintf太耗时间导致计算周期达不到250HZ
可能的原因2:stm32振荡器设置有问题,系统频率不是72MHz(串口能正常通讯怎么解释?)
可能的原因3:传感器的寄存器设置有问题(L3G4200D设置应该注意什么?)

我用定时器测出来算法耗时(假设系统时钟正确)

陀螺仪加速度提取 200us
四元数据计算 587us
(不包括浮点转换为字符串输出的时间)

四元数纯浮点计算,加起来还不到1ms 用的是自己网上收集的快速三角,反三角,平方,开平方 math.h

不知道是什么问题唉…课多没时间去测试,中午不睡觉了…

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2011-10-19 12:18:05 | 显示全部楼层
直接积分  呢?

是不是 四元数据  算法有问题?

出0入0汤圆

 楼主| 发表于 2011-10-19 12:28:10 | 显示全部楼层
直接积分没试过。。
系统时钟没问题

出0入0汤圆

 楼主| 发表于 2011-10-19 12:33:43 | 显示全部楼层
问题找到了,在rt_kprintf()
sprintf转换三个浮点数 用了300~500us不等,这个不足以影响系统。
但是如果转换完成后输出,马上就变成 7749us 至8065 us


yaw =   2.3   roll =   4.2   prith =  -3.4  
姿态计算 耗时: 7749 us

yaw =   2.3   roll =   4.2   prith =  -3.5  
姿态计算 耗时: 7704 us

yaw = -151.6   roll = -120.8   prith = -52.5  //角度偏差大的时候sprintf转换更耗时
姿态计算 耗时?8065 us

7.7ms 已经大大超过整个系统周期4ms了
看来我要早点写好发送线程,丢掉串口助手了,不能再用rt_kprintf做输出了


但是就上面的时间测试来说,数据采集,初步的滤波 ,然后单精度计算四元数,用STM32可以做得很好,整个过程不超过1ms
不知道卡尔曼滤波加上之后如何。我预计应该在1ms内能完成卡尔曼滤波的计算。
如果都可以做到,全单精度浮点计算,用STM32是没什么压力,只做姿态的话,应该可以上500HZ。

以下是测试的源代码

start_measure_time();          //开始计时
#ifdef print_posture
                if(acc.count % 16 == 1)                                                                          //调试时输出数据
                {
                        sprintf(f_buf1, "%5.1f ", final_angle.fYaw  *180/ONE_PI);
                        sprintf(f_buf2, "%5.1f ", final_angle.fRoll *180/ONE_PI);
                        sprintf(f_buf3, "%5.1f ", final_angle.fPitch*180/ONE_PI);
                        rt_kprintf("\nyaw = %s  roll = %s  prith = %s ", f_buf1, f_buf2, f_buf3);
                }
#endif       

mb_temp = (int)stop_measure_time();    //结束计时
rt_kprintf("\n姿态计算 耗时:%5d us",mb_temp);
        }

出0入663汤圆

发表于 2011-10-19 13:54:42 | 显示全部楼层
rt_kprintf默认是轮询发送的。

出0入0汤圆

 楼主| 发表于 2011-10-19 18:43:11 | 显示全部楼层
回复【4楼】gzhuli  咕唧霖
-----------------------------------------------------------------------

原来是这样。。怪不得那么花时间。是不是缓冲不够了,所以在等发送完成?

出0入0汤圆

发表于 2011-10-19 22:48:56 | 显示全部楼层
想问一下LZ  怎么配置l3g4200的 我现在可以读写 读ID也是0x43 但是读三轴数据的时候 就是不会变化 无论我怎么动板子!
求解啊!!!

出0入663汤圆

发表于 2011-10-19 22:59:25 | 显示全部楼层
你应该是直接用serial.c的吧?
初始化rt_serial_init()时,dev->flag有没有RT_DEVICE_FLAG_DMA_TX?

出0入0汤圆

 楼主| 发表于 2011-10-20 09:55:47 | 显示全部楼层
是的,有没有就不知道了,我没有看过太多关于rt-thread的源码。
我就直接用rt_kprintf输出,其他的没有关注。
我已经将数据改成用结构体输出了,用USART2发送,没有注_册设备,用的是中断的方式。这样做方便和我的以前做的上位机通信。每帧数据32字节,就是一个完整的结构体。上位机可以绘图,这样观察数据好一些,也不会有延迟。中午回去我看一下DMA,换成DMA发送就更好了。

出0入663汤圆

发表于 2011-10-20 11:18:17 | 显示全部楼层
serial.c的串口初始化函数rt_serial_init()是由你调用的,dev结构体是你初始化传进去的,你怎么说不知道有没有……
只要rt_serial_init()传进去的dev->flag带有RT_DEVICE_FLAG_DMA_TX标志,就会启用DMA发送模式,如果没有就是轮询。

出0入0汤圆

发表于 2011-10-20 16:05:39 | 显示全部楼层
专业提供 ST InvenSense 各种陀螺仪
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 07:19

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表