ShareIdeas

本博客不再更新,欢迎访问我的github,https://github.com/sunke-github/

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

     断断续续进行姿态解算已经大概有两个月了,这两个月中遇到了不少的问题.但结果还算是圆满吧. 我手里有两块2440 的板子,不知道是什么原因其中一块板子不能正常读取

ADXL345,只好花了几天的时间写了 2440下的模拟 IIC 程序. 网上有另外一位博友写的模拟 程序,我测试其没通过(读取的数据是错误).下面是两个月来编写程序的笔记,

已经可以成功初始化,下面进行数据读取实验

Multiple_read_ADXL345应该是读取正常
Multiple_read_L3G4200D 读取正常  
数据基本测试输出正常

我估计,可能是由于bin 文件要比axf文件小的多的多,实际运行要比MDK在线调试的速度要快的多.从而导致AHRS器件不能正确响应.


下面进行数据的滤波,计划用滑变平均进行滤波   2013.3.10

2013.3.19 日滤波完成   下面进行定时器的编程


2013.3.27   已经完成 定时器的编程,下面进行角度的积分运算 


2013.3.28  进行按键编程,程序AHRS传感器的切换   已经完成

下面进行真实值的计算,角度的积分

2013.3.29日已经完成 L3G4200D的积分 ,和校准.  数据存在一定的漂移

/*---------------------------------------------------------------------------------------------------------*/
发送数据  低 8位在前,高 8位在后
ADXL345 ,16g 13位模式下  3.9mg/LSB
L3G4200D  (默认 00)(00:250dps)   为8.75 mdps/digit 目前采用的   8.75*2
这些用于真实值的计算

生成的 bin可以在内存中直接运行,但是不能下载到 nand flash中运行





2013.4.12  确定使用卡尔曼滤波

2013.4.18  进行 四元数程序的编写,和与AHRS.c 算法的比较

2013.4 .27  确定  转序  yaw pitch roll   意外发现卡尔曼出现一个小错误

2013.4 .27  突然遇到一个问题, 四元数与卡尔曼的关系 ,  四元数是根据角增量 ,求出欧拉角 ,
            卡尔曼可以  对加速度角度和陀螺仪角速度互补滤波  得 到  角度  和角速率  .但是如何把两者结合起来呢  
            
            方案1, 可以直接用卡尔曼 得到的 角速率 与时间乘机 得角增量   ,方案一晃动时存在严重的漂移
            方案2, 既然卡尔曼可以得到角度  ,则再次 角度的差及为角增量   ,需要测试
            
213.4.28   如果计算欧拉角 ,则三个 角增量务必准确 ,三个角相互影响   无法只计算水平的角度

2013.4.29   验证四元数算法的正确 性 ,无滤波积分 可三维旋转     
2013.4.30   更改  pitch 的反函数为 asin()      
            目前的 旋转  角度 只能控制在  pitch ∈{-pi/2,pi/2}  roll∈{-pi,pi}   yaw ∈{-pi,pi} 
            
2013.5.1   增加串口查询复位功能
            近期任务:
            1,看完英文文档   
            2,把HMC5883L 航向角加入到 程序中(简单计算航向角,抑制其漂移)    
            3,测试 imu.c 
            4,测试 quaternion_imp.c    
            
2013.5.2   日  利用下面这个算法 ,直接积分, 效果反而比加上加计的效果要好,看样子没有正确利用加速度计 
                //进行限幅处理 ,如果过大则是机体转动引起的 ,而不是噪声数据.
            if((temp<=(bias_yaw+50))&&(temp>=(bias_yaw-50)) )    
            {
                bias_yaw*=0.999;
                bias_yaw +=(float)temp*0.001;
            }
            temp=temp-bias_yaw;
            Yaw_inc=(float)temp*0.0003054*0.005;            //角增量  时间0.005s 200HZ
    //只进行角度积分的角增量        
            temp=filter_0(temp_gyro_y);    
            if((temp<=(bias_pitch+50))&&(temp>=(bias_pitch-50)) )    
            {
                bias_pitch*=0.999;
                bias_pitch +=(float)temp*0.001;
            }
            temp=temp-bias_pitch;
            Pitch_inc=(float)temp*0.0003054*0.005;            //角增量  时间0.005s 200HZ
            
            temp=filter_0(temp_gyro_x);    
            if((temp<=(bias_roll+50))&&(temp>=(bias_roll-50)) )    
            {
                bias_roll*=0.999;
                bias_roll +=(float)temp*0.001;
            }
            temp=temp-bias_roll;
            Roll_inc=(float)temp*0.0003054*0.005;            //角增量  时间0.005s 200HZ

            目前我能想到比较好的折中的方法 是:

            1,是否进行加计求 欧拉角的优化 ,不过首先要求得准确的 yaw
            2,再利用矩阵旋转 ,利用加速度计计算出准确的欧拉角  .

说是 ,如果 在加计的基础上更新四元数  似乎 在角度的范围内有更好的表现 ,但是不能全姿态 .考虑是否放弃  卡尔曼


2013.5.3  日
      
      对比 互补滤波与卡尔曼 ,互补滤波 抑制振动较好,但是相对略有滞后, 可能与 滑动平均长度有关
      暂时放弃卡尔曼  ,下面进行 imu.c进行测试
            
            
            
2013.5.6   尝试利用模拟iic 通信    ,接口  CRO ( GPF0  GPF1 )( PA18 PA17  ) (EINT0  EINT1)    SDA  SCL
                                        NI ( GPF0  GPF1 )( 9   10     ) (EINT0  ENIT1)


2013.5.13  日 已经基本完成 模拟IIC 程序 的编写,   但是目前存在的问题 是 ,用模拟 IIC读取的数据 略比硬件IIC读取的数据噪声大.

硬件IIC 的时间大概是   1.5ms  模拟 iic  时间 定义在 c  时间大概为  1.6ms  目前 模拟IIC 程序基本编写完成  ,不进行 硬件IIC模拟iic 读取效果的对比

目前来看,虽然模拟 IIC 读取的数据噪声略比硬件IIC 大,但是是乎不怎么明显,我也懒的去对比效果了.姿态解算算是告于段落,下面进行嵌入式linux的学习,过两个月把算法移植到

liunx系统里面,到时候定期更新我的博客,大家敬请关注.

posted on 2013-05-13 19:47  ShareIdeas  阅读(1684)  评论(2编辑  收藏  举报