您的位置:首页 > 其它

姿态解算基本完成,程序编写笔记

2013-05-13 19:47 302 查看
断断续续进行姿态解算已经大概有两个月了,这两个月中遇到了不少的问题.但结果还算是圆满吧. 我手里有两块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系统里面,到时候定期更新我的博客,大家敬请关注.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: