智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 3134|回复: 9
打印 上一主题 下一主题

[光电] 关于卡尔曼滤波时间的问题,求教~~~

[复制链接]

10

主题

99

帖子

0

精华

高级会员

Rank: 4

积分
653
威望
409
贡献
118
兑换币
143
注册时间
2011-10-31
在线时间
63 小时
跳转到指定楼层
#
发表于 2013-4-20 23:42:15 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
10贡献
本帖最后由 残爱冰 于 2013-4-20 23:44 编辑

我的卡尔曼滤波要花费3ms的时间,总线频率48M,我查了下,主要是acc_th = asin(acc_z)*57.296;这条语句
要2.8ms的时间!!如果我去掉ad_read();的话,相当于acc_th = asin(acc_z)*57.296;中的acc_z为常数,那么这条语句花费的时间就是30us。可是我保留ad_read();,直接令acc_th = asin(acc_z)*57.296;中的acc_z为常数,那么这条语句花费的时间就又是2.8ms,到底怎么回事啊??我看有人用的是反正切函数求的角度,我的acc_z计算值没有超出-1~1,这个asin()函数是double类型的形参,这个有问题吗?是不是建立工程的时候要勾选什么?可为什么去掉ad_read();的时候不会 啊?去掉ad_read();的话acc_z的值就超出-1~1了啊,结果直接就错了啊,所以它花费的时间才短??我想这个asin函数本身不要这么长的执行时间吧?建立工程的时候我只勾选了“float use 32,double use 64”,还要勾选什么吗?求救~~~~~~~~~~~~~~~
ad_read();    //采集ad值

voltage = ad_value[2]*1.2207;    //Voltage = ad_value/4096*5*1000 mV
  gyr_xw = (voltage-1690)/0.67/5.1; //灵敏度0.67,放大5.1倍     
  
voltage = ad_value[0]*1.2207;
  acc_z = (voltage-1477)/800.0;    //灵敏度为800mv/g
  acc_th = asin(acc_z)*57.296;

18

主题

134

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1148
QQ
威望
529
贡献
281
兑换币
284
注册时间
2012-11-9
在线时间
169 小时
9#
发表于 2013-4-27 20:08:18 | 只看该作者
残爱冰 发表于 2013-4-27 18:55
建立工程时要勾选“use float....”

float use 32,double use 64这个?
回复

使用道具 举报

10

主题

99

帖子

0

精华

高级会员

Rank: 4

积分
653
威望
409
贡献
118
兑换币
143
注册时间
2011-10-31
在线时间
63 小时
8#
 楼主| 发表于 2013-4-27 18:55:16 | 只看该作者
zhangguanghui 发表于 2013-4-27 13:21
楼主你是怎么解决的求指导?

建立工程时要勾选“use float....”
回复

使用道具 举报

18

主题

134

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1148
QQ
威望
529
贡献
281
兑换币
284
注册时间
2012-11-9
在线时间
169 小时
7#
发表于 2013-4-27 13:21:20 | 只看该作者
残爱冰 发表于 2013-4-21 13:41
谢谢,问题已解决,是工程问题

楼主你是怎么解决的求指导?
回复

使用道具 举报

10

主题

99

帖子

0

精华

高级会员

Rank: 4

积分
653
威望
409
贡献
118
兑换币
143
注册时间
2011-10-31
在线时间
63 小时
6#
 楼主| 发表于 2013-4-21 13:41:05 | 只看该作者
wen123 发表于 2013-4-21 11:10
先放大再用位运算缩小就可以了

谢谢,问题已解决,是工程问题
回复

使用道具 举报

10

主题

99

帖子

0

精华

高级会员

Rank: 4

积分
653
威望
409
贡献
118
兑换币
143
注册时间
2011-10-31
在线时间
63 小时
5#
 楼主| 发表于 2013-4-21 13:40:31 | 只看该作者
seakid 发表于 2013-4-20 23:52
用这么多浮点数。。还三角函数。一大堆double才不到3ms。
庆幸吧,兄弟。

问题已经解决了,不是浮点数的问题,因为我前面也用到好多浮点数,总的时间才几十us,但asin()一条语句就是几ms,说明浮点数的时间不至于消耗ms以上,还是谢谢你,你们站起来没?
回复

使用道具 举报

34

主题

1589

帖子

0

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
6271

论坛元老奖章优秀会员奖章活跃会员奖章在线王奖章

威望
3267
贡献
1194
兑换币
2035
注册时间
2012-11-28
在线时间
905 小时
4#
发表于 2013-4-21 11:10:43 | 只看该作者
残爱冰 发表于 2013-4-21 09:40
可以不用float么?怎么弄啊?

先放大再用位运算缩小就可以了
回复

使用道具 举报

10

主题

99

帖子

0

精华

高级会员

Rank: 4

积分
653
威望
409
贡献
118
兑换币
143
注册时间
2011-10-31
在线时间
63 小时
3#
 楼主| 发表于 2013-4-21 09:40:52 | 只看该作者
seakid 发表于 2013-4-20 23:52
用这么多浮点数。。还三角函数。一大堆double才不到3ms。
庆幸吧,兄弟。

可以不用float么?怎么弄啊?
回复

使用道具 举报

2

主题

479

帖子

0

精华

杰出人士

Rank: 12Rank: 12Rank: 12

积分
16171

论坛元老奖章优秀会员奖章活跃会员奖章在线王奖章资源大师奖章

威望
9831
贡献
3996
兑换币
2051
注册时间
2012-1-17
在线时间
1172 小时
2#
发表于 2013-4-20 23:52:51 | 只看该作者
用这么多浮点数。。还三角函数。一大堆double才不到3ms。
庆幸吧,兄弟。
回复

使用道具 举报

10

主题

99

帖子

0

精华

高级会员

Rank: 4

积分
653
威望
409
贡献
118
兑换币
143
注册时间
2011-10-31
在线时间
63 小时
1#
 楼主| 发表于 2013-4-20 23:43:10 | 只看该作者
忘了附上程序了
ad_read();    //采集ad值

        voltage = ad_value[2]*1.2207;    //Voltage = ad_value[i]/4096*5*1000 mV
  gyr_xw = (voltage-1690)/0.67/5.1; //灵敏度0.67,放大5.1倍     
  
        voltage = ad_value[0]*1.2207;
  acc_z = (voltage-1477)/800.0;    //灵敏度为800mv/g
  acc_th = asin(acc_z)*57.296;
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-12-29 19:17 , Processed in 0.053263 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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