ggyyll8683
发表于 2013-2-10 18:49:33
好帖子,精辟
traff2007
发表于 2013-2-10 19:44:53
谢谢分享~
prosmarter
发表于 2013-2-12 19:41:28
mark{:smile:}
alaryt
发表于 2013-2-16 02:19:15
捷联式惯性导航原理
Dossoftware
发表于 2013-2-16 08:50:42
加上星光就可以搞弹道导弹了
jzjjzj
发表于 2013-2-16 17:31:43
本帖最后由 jzjjzj 于 2013-2-16 17:33 编辑
终于看懂了它们之间的关系了
zhaoweiqi40
发表于 2013-2-17 19:24:27
mark{:victory:}
monkey_hzh
发表于 2013-2-19 11:14:39
先顶一下 慢慢研究~~
fm0826
发表于 2013-2-19 12:49:45
收藏 捷联惯性导航系统
seanwood
发表于 2013-2-20 10:15:59
四元数是有三角函数运算,但是只在解出欧拉角的时候才用。每个积分周期是用不到的。
举个例子,比如为了积分精确,积分周期用1ms一次,但对外部电机的控制周期比如是10ms。那结算姿态只需要10ms一次。
欧拉角微分方程需要每1ms周期计算6个三角函数来积分。
四元数则只需要每10ms计算3个反三角函数,这运算量差距就很明显了。
leicai05
发表于 2013-2-20 10:17:06
学习中ing
hanshiruo
发表于 2013-2-20 12:58:18
学习学习
maogefff
发表于 2013-2-21 14:53:50
看了几遍了,没看一边似乎又多懂一点,还在继续啃
mazhenyu
发表于 2013-2-21 21:05:57
百年好贴
climberyoung
发表于 2013-2-22 13:37:02
楼主总结的非常好。
yat
发表于 2013-2-22 13:48:10
牛人 谢谢 mark
自由行
发表于 2013-2-22 14:58:20
学习!{:handshake:}
i8700
发表于 2013-2-25 09:54:09
不错,好贴,学习了
maogefff
发表于 2013-3-1 23:08:42
大哥,四轴飞行的时候应该是不停运动的啊,比如上升或者下降,那么加速度计测出来的值不就不准了么?
s19910223
发表于 2013-3-4 12:29:42
学习了 感谢楼主
炎阳
发表于 2013-3-7 11:12:44
感谢楼主
皮爱了西
发表于 2013-3-8 17:28:56
先收藏了,太深奥了
黑眼豆豆
发表于 2013-3-15 09:33:08
LZ说用加速度计算出欧拉角来初始化四元数,然而加速度计只能计算俯仰角和滚动角,不能计算偏航角。因此怎样计算初始四元数;另外,LZ在程序里初始化四元数是q0 = 1, q1 = 0, q2 = 0, q3 = 0,是否默认初始机体坐标与地理坐标重合,如果不重合是否会对以后的计算造成误差。程序里也没有看见用加速度计初始化四元数啊
tigerccc
发表于 2013-3-15 17:02:35
技术牛人,为人也如此无私,赞一个
残忆视觉
发表于 2013-3-16 17:05:29
有点迷糊,
黑眼豆豆
发表于 2013-3-18 16:52:34
seanwood 发表于 2013-2-20 10:15 static/image/common/back.gif
四元数是有三角函数运算,但是只在解出欧拉角的时候才用。每个积分周期是用不到的。
举个例子,比如为了积 ...
楼主的意思是每个积分周期都要初始化四元数,那eIntxyz还有用吗?那上一时刻算出的时刻在下一时刻也用不上啊
seanwood
发表于 2013-3-20 13:27:04
我什么时候说过每个周期都要初始化啊?
初始化,就是把 加速度计、电子罗盘的三轴结合算出的欧拉角,转换成四元数。
每个更新周期,是用陀螺仪的角速度去对四元数进行积分。
要用到欧拉角的时候,再使用 四元数->欧拉角,来结算出欧拉角。
示例代码中只有更新周期,没有初始化和欧拉角结算,不要想直接拿来用,帖子整个看一遍。
zhao137726
发表于 2013-3-20 15:11:36
太棒了,楼主写的太好了,简洁,明确。终于懂得了。谢谢楼主。
seanwood
发表于 2013-3-21 09:56:31
本帖最后由 seanwood 于 2013-3-21 10:00 编辑
有人问加电子罗盘的融合是怎么回事,我再献丑一回,开课讲解喽,来鼓掌来顶{:biggrin:}
我嚓,顶楼不能编辑的,只好放在楼中间了。这也好,给肯挨页翻帖子的朋友一个惊喜。//=====================================================================================================
// AHRS.c
// S.O.H. Madgwick
// 25th August 2010
//=====================================================================================================
// Description:
//
// Quaternion implementation of the 'DCM filter' .Incorporates the magnetic distortion
// compensation algorithms from my filter which eliminates the need for a reference
// direction of flux (bx bz) to be predefined and limits the effect of magnetic distortions to yaw
// axis only.
//
// User must define 'halfT' as the (sample period / 2), and the filter gains 'Kp' and 'Ki'.
//
// Global variables 'q0', 'q1', 'q2', 'q3' are the quaternion elements representing the estimated
// orientation.See my report for an overview of the use of quaternions in this application.
//
// User must call 'AHRSupdate()' every sample period and parse calibrated gyroscope ('gx', 'gy', 'gz'),
// accelerometer ('ax', 'ay', 'ay') and magnetometer ('mx', 'my', 'mz') data.Gyroscope units are
// radians/second, accelerometer and magnetometer units are irrelevant as the vector is normalised.
//
//=====================================================================================================
//----------------------------------------------------------------------------------------------------
// Header files
#include "AHRS.h"
#include <math.h>
//----------------------------------------------------------------------------------------------------
// Definitions
#define Kp 2.0f // proportional gain governs rate of convergence to accelerometer/magnetometer
#define Ki 0.005f // integral gain governs rate of convergence of gyroscope biases
#define halfT 0.5f // half the sample period
//---------------------------------------------------------------------------------------------------
// Variable definitions
float q0 = 1, q1 = 0, q2 = 0, q3 = 0; // quaternion elements representing the estimated orientation
float exInt = 0, eyInt = 0, ezInt = 0; // scaled integral error
//====================================================================================================
// Function
//====================================================================================================
void AHRSupdate(float gx, float gy, float gz, float ax, float ay, float az, float mx, float my, float mz) {
float norm;
float hx, hy, hz, bx, bz;
float vx, vy, vz, wx, wy, wz;
float ex, ey, ez;
// auxiliary variables to reduce number of repeated operations
float q0q0 = q0*q0;
float q0q1 = q0*q1;
float q0q2 = q0*q2;
float q0q3 = q0*q3;
float q1q1 = q1*q1;
float q1q2 = q1*q2;
float q1q3 = q1*q3;
float q2q2 = q2*q2;
float q2q3 = q2*q3;
float q3q3 = q3*q3;
// normalise the measurements
norm = sqrt(ax*ax + ay*ay + az*az);
ax = ax / norm;
ay = ay / norm;
az = az / norm;
norm = sqrt(mx*mx + my*my + mz*mz);
mx = mx / norm;
my = my / norm;
mz = mz / norm;
从机体坐标系的电子罗盘测到的矢量转成地理坐标系下的磁场矢量hxyz(测量值)
// compute reference direction of flux
hx = 2*mx*(0.5 - q2q2 - q3q3) + 2*my*(q1q2 - q0q3) + 2*mz*(q1q3 + q0q2);
hy = 2*mx*(q1q2 + q0q3) + 2*my*(0.5 - q1q1 - q3q3) + 2*mz*(q2q3 - q0q1);
hz = 2*mx*(q1q3 - q0q2) + 2*my*(q2q3 + q0q1) + 2*mz*(0.5 - q1q1 - q2q2);
计算地理坐标系下的磁场矢量bxyz(参考值)。
因为地理地磁水平夹角,我们已知是0度(抛去磁偏角的因素,固定向北),所以by=0,bx=某值
但地理参考地磁矢量在垂直面上也有分量bz,地球上每个地方都是不一样的。
我们无法得知,也就无法用来融合(有更适合做垂直方向修正融合的加速度计),所以直接从测量值hz上复制过来,bz=hz。
磁场水平分量,参考值和测量值的大小应该是一致的(bx*bx) + (by*by)) = ((hx*hx) + (hy*hy))。
因为by=0,所以就简化成(bx*bx)= ((hx*hx) + (hy*hy))。可算出bx。
bx = sqrt((hx*hx) + (hy*hy));
bz = hz;
// estimated direction of gravity and flux (v and w)
vx = 2*(q1q3 - q0q2);
vy = 2*(q0q1 + q2q3);
vz = q0q0 - q1q1 - q2q2 + q3q3;
我们把地理坐标系上的磁场矢量bxyz,转到机体上来wxyz。
因为by=0,所以所有涉及到by的部分都被省略了。
类似上面重力vxyz的推算,因为重力g的gz=1,gx=gy=0,所以上面涉及到gxgy的部分也被省略了
你可以看看两个公式:wxyz的公式,把bx换成gx(0),把bz换成gz(1),就变成了vxyz的公式了(其中q0q0+q1q1+q2q2+q3q3=1)。
wx = 2*bx*(0.5 - q2q2 - q3q3) + 2*bz*(q1q3 - q0q2);
wy = 2*bx*(q1q2 - q0q3) + 2*bz*(q0q1 + q2q3);
wz = 2*bx*(q0q2 + q1q3) + 2*bz*(0.5 - q1q1 - q2q2);
现在把加速度的测量矢量和参考矢量做叉积,把磁场的测量矢量和参考矢量也做叉积。都拿来来修正陀螺。
// error is sum of cross product between reference direction of fields and direction measured by sensors
ex = (ay*vz - az*vy) + (my*wz - mz*wy);
ey = (az*vx - ax*vz) + (mz*wx - mx*wz);
ez = (ax*vy - ay*vx) + (mx*wy - my*wx);
// integral error scaled integral gain
exInt = exInt + ex*Ki;
eyInt = eyInt + ey*Ki;
ezInt = ezInt + ez*Ki;
// adjusted gyroscope measurements
gx = gx + Kp*ex + exInt;
gy = gy + Kp*ey + eyInt;
gz = gz + Kp*ez + ezInt;
// integrate quaternion rate and normalise
q0 = q0 + (-q1*gx - q2*gy - q3*gz)*halfT;
q1 = q1 + (q0*gx + q2*gz - q3*gy)*halfT;
q2 = q2 + (q0*gy - q1*gz + q3*gx)*halfT;
q3 = q3 + (q0*gz + q1*gy - q2*gx)*halfT;
// normalise quaternion
norm = sqrt(q0*q0 + q1*q1 + q2*q2 + q3*q3);
q0 = q0 / norm;
q1 = q1 / norm;
q2 = q2 / norm;
q3 = q3 / norm;
}
//====================================================================================================
// END OF CODE
//====================================================================================================
黑眼豆豆
发表于 2013-3-22 08:38:23
seanwood 发表于 2013-3-21 09:56 static/image/common/back.gif
有人问加电子罗盘的融合是怎么回事,我再献丑一回,开课讲解喽,来鼓掌来顶
我嚓,顶楼不能编 ...
请问楼主,磁阻传感器测量值mxyz乘以旋转矩阵转换到地理坐标系变成hxyz,该矢量的方向应该也是东北天,如果说地磁水平分量正北,那么为什么不用bx=hx,而是用bx*bx=hx*hy,是考虑到转换矩阵中四元数的误差?
STM32_Study
发表于 2013-3-22 09:51:30
楼主的帖子解析得很明白,让我弄懂了很多东西
但还有一个疑问,单用加速度计和地磁传感器,在静态的情况下,能否准确计算出完整的欧拉角?
yaw需要通过地磁传感器来计算,但地磁本身对应磁平面的映射,也需要pitch和roll
我看了一些文献,提到单用加速度计和地磁传感器,当pitch和roll过大的时候(大于40度)的时候,地磁的计算就不准确了?
seanwood
发表于 2013-3-22 10:04:02
黑眼豆豆 发表于 2013-3-22 08:38 static/image/common/back.gif
请问楼主,磁阻传感器测量值mxyz乘以旋转矩阵转换到地理坐标系变成hxyz,该矢量的方向应该也是东北天,如 ...
你为啥要用电子罗盘呢?不就是为了修正四元数被陀螺积分过程中产生的误差嘛。hxyz和bxyz本来应该是完全相等,但是hxyz被四元数转到地理坐标系的时候因为四元数有误差,所以他们的误差,就是四元数的误差。
seanwood
发表于 2013-3-22 10:08:00
STM32_Study 发表于 2013-3-22 09:51 static/image/common/back.gif
楼主的帖子解析得很明白,让我弄懂了很多东西
但还有一个疑问,单用加速度计和地磁传感器,在静态的情况下 ...
如roll/pitch不是水平,地磁当然不能只靠地磁的xy来算。
但是谁让你先算地磁啊?先用加速度计算出roll和pitch,然后再用这个roll/pitch去和地磁三轴组合算出yaw,不就没误差了吗?
wangyeqing333
发表于 2013-3-22 10:13:30
搞下来研究研究
菜包
发表于 2013-3-22 11:59:41
太牛了,后悔没学好数学啊
michael.yang
发表于 2013-3-22 12:47:05
强贴留名!
黑眼豆豆
发表于 2013-3-22 14:33:45
seanwood 发表于 2013-3-22 10:04 static/image/common/back.gif
你为啥要用电子罗盘呢?不就是为了修正四元数被陀螺积分过程中产生的误差嘛。hxyz和bxyz本来应该是完全相 ...
不好意思,楼主不要怪我不求甚解啊!既然旋转矩阵有误差那么hxy就不一定是水平的,那么求参考地磁水平分量就不见得是(bx*bx)= ((hx*hx) + (hy*hy))?
IBC
发表于 2013-3-22 19:02:19
LZ讲得不错
虽然有些还没弄懂但还是支持一下
清风阙月
发表于 2013-3-23 22:01:03
seanwood 发表于 2013-3-21 09:56 static/image/common/back.gif
有人问加电子罗盘的融合是怎么回事,我再献丑一回,开课讲解喽,来鼓掌来顶
我嚓,顶楼不能编 ...
LZ这P值和I值必须通过实际测试得到吗??
不太会找P值,I值
我把P值放到2或3的时候,静置陀螺仪,显示出来的姿态定位有明显的偏差,而且会不停的晃动
如果再调大P值就晃动的更厉害了
除非把两个值都往小了调姿态能像点样子 但这样就是只有陀螺仪的效果了妥妥的错了
求问lz我这是什么问题 是磁阻传感器没调整好吗?
裸奔的流浪者
发表于 2013-3-26 20:54:33
开始看不懂,现在刚有点入门了,确实是刚体运动通俗易懂的讲解,楼主牛叉
xinmulan
发表于 2013-3-27 01:52:55
楼主的这个精神非常的值得大家学习。。这篇文章绝对是精品中的精品。
huangbing110110
发表于 2013-3-27 22:11:45
的确呀!白莲好贴
talangxue
发表于 2013-3-28 00:38:06
真心膜拜楼主的理解能力和讲解能力。启蒙贴啊
icifan
发表于 2013-3-29 11:34:52
一直在学习 还未能超越 谢谢
xukkkkkk
发表于 2013-3-29 13:12:09
问下下面这个函数这两段怎么理解
// 估计方向的重力
vx = 2*(q1*q3 - q0*q2);
vy = 2*(q0*q1 + q2*q3);
vz = q0*q0 - q1*q1 - q2*q2 + q3*q3;
// 错误的领域和方向传感器测量参考方向之间的交叉乘积的总和
ex = (ay*vz - az*vy);
ey = (az*vx - ax*vz);
ez = (ax*vy - ay*vx);
其他的都懂了,就这个还没想通
我搞了个FPV专用飞控 全传感器+osd+GPS
最近再搞个433遥控,可以回发数据
以前在模型论坛混,玩技术的不多,不深,现在改这里吧
说实话这里四轴发展太慢了,现在都GPS自主飞行了,坛子里好像没人搞,去搞微型四轴
有兴趣联系我吧,我的资料程序PCB全开源
试飞的视频在下面
hXttp://v.youku.com/v_show/id_XNTMyOTk5NjM2.hXtm
void IMUupdate(float gx, float gy, float gz, float ax, float ay, float az) {
float norm;
float vx, vy, vz;
float ex, ey, ez;
// 测量正常化
norm = sqrt(ax*ax + ay*ay + az*az);
ax = ax / norm;
ay = ay / norm;
az = az / norm;
// 估计方向的重力
vx = 2*(q1*q3 - q0*q2);
vy = 2*(q0*q1 + q2*q3);
vz = q0*q0 - q1*q1 - q2*q2 + q3*q3;
// 错误的领域和方向传感器测量参考方向之间的交叉乘积的总和
ex = (ay*vz - az*vy);
ey = (az*vx - ax*vz);
ez = (ax*vy - ay*vx);
// 积分误差比例积分增益
exInt = exInt + ex*Ki;
eyInt = eyInt + ey*Ki;
ezInt = ezInt + ez*Ki;
// 调整后的陀螺仪测量
gx = gx + Kp*ex + exInt;
gy = gy + Kp*ey + eyInt;
gz = gz + Kp*ez + ezInt;
// 整合四元数率和正常化
q0 = q0 + (-q1*gx - q2*gy - q3*gz)*halfT;
q1 = q1 + (q0*gx + q2*gz - q3*gy)*halfT;
q2 = q2 + (q0*gy - q1*gz + q3*gx)*halfT;
q3 = q3 + (q0*gz + q1*gy - q2*gx)*halfT;
// 正常化四元
norm = sqrt(q0*q0 + q1*q1 + q2*q2 + q3*q3);
q0 = q0 / norm;
q1 = q1 / norm;
q2 = q2 / norm;
q3 = q3 / norm;
}
luozhongchao123
发表于 2013-3-29 23:57:54
这段代码没有懂??
从机体坐标系的电子罗盘测到的矢量转成地理坐标系下的磁场矢量hxyz(测量值)
// compute reference direction of flux
hx = 2*mx*(0.5 - q2q2 - q3q3) + 2*my*(q1q2 - q0q3) + 2*mz*(q1q3 + q0q2);
hy = 2*mx*(q1q2 + q0q3) + 2*my*(0.5 - q1q1 - q3q3) + 2*mz*(q2q3 - q0q1);
hz = 2*mx*(q1q3 - q0q2) + 2*my*(q2q3 + q0q1) + 2*mz*(0.5 - q1q1 - q2q2);
john800422
发表于 2013-3-30 00:59:29
xukkkkkk 发表于 2013-3-29 13:12 static/image/common/back.gif
问下下面这个函数这两段怎么理解
// 估计方向的重力
vx = 2*(q1*q3 - q0*q2);
我的理解
myhonour
发表于 2013-3-30 07:15:12
真是好文章,超级喜欢这个帖子,感谢楼主~!!!!
IBC
发表于 2013-4-1 21:48:10
这几天由仔细看了看相关的资料,有点入门了
再次来谢谢LZ
mangetuzi
发表于 2013-4-3 11:26:20
mark 一下正在学习中
tonamatata
发表于 2013-4-3 14:37:36
先标记了 回去慢慢看
sgzzour
发表于 2013-4-3 20:34:55
很不错的东西,学习了、、、、
sgzzour
发表于 2013-4-3 20:39:53
xukkkkkk 发表于 2013-3-29 13:12 static/image/common/back.gif
问下下面这个函数这两段怎么理解
// 估计方向的重力
vx = 2*(q1*q3 - q0*q2);
这位仁兄的视频的确不错,怎么联系你呢?
wxj
发表于 2013-4-5 22:52:57
很好的帖子啊
nuaa
发表于 2013-4-6 00:52:38
很详细,收藏了。
wcm_e
发表于 2013-4-6 11:31:07
学习,mark
铁驴不倒
发表于 2013-4-8 12:57:08
好帖!慢慢研究
yssdsz
发表于 2013-4-8 15:49:19
mark~学习中》》》
xukkkkkk
发表于 2013-4-8 20:48:16
楼主,搞了多就到现在这个水平,我数学不好,搞了1年
xukkkkkk
发表于 2013-4-9 08:58:49
john800422 发表于 2013-3-30 00:59 static/image/common/back.gif
我的理解
你的截图是那本书上或者资料上的
john800422
发表于 2013-4-9 11:35:20
xukkkkkk 发表于 2013-4-9 08:58 static/image/common/back.gif
你的截图是那本书上或者资料上的
自己想的
自己寫的
Taylor1
发表于 2013-4-9 20:21:26
mark 卡尔曼算法
崆峒
发表于 2013-4-9 22:10:34
多谢楼主分享
nil00
发表于 2013-4-10 10:45:52
学习了。。。{:handshake:}
luozhongchao123
发表于 2013-4-14 22:08:52
john800422 发表于 2013-3-30 00:59 static/image/common/back.gif
我的理解
老兄,你的文章在那里找的,可以传上来看看不?
john800422
发表于 2013-4-14 22:53:32
luozhongchao123 发表于 2013-4-14 22:08 static/image/common/back.gif
老兄,你的文章在那里找的,可以传上来看看不?
自己想的
自己寫的
gcj567891
发表于 2013-4-19 09:33:57
楼主辛苦了,感谢楼主,正需要这个,虽然有点看不懂,慢慢看!
wzpwzphi
发表于 2013-4-21 11:50:36
我也想了解一下国外的四轴!楼主可否告诉我以上代码的出处?
jlian168
发表于 2013-4-25 17:05:06
mark,thanks.
wscjun
发表于 2013-4-25 22:41:20
真心谢谢楼主 很清晰的知识脉络 谢谢分享
孤独飞行
发表于 2013-4-25 22:56:18
学习学习{:smile:}
my_avr
发表于 2013-4-27 08:54:40
标记,学习,LZ辛苦了
CCALM
发表于 2013-4-27 21:38:56
mark{:smile:}{:smile:}{:smile:}{:smile:}
wudision
发表于 2013-4-27 21:52:50
好贴子,留着看,谢谢楼主
任我游8596
发表于 2013-4-28 03:27:59
{:hug:} {:hug:} {:hug:} {:hug:} {:hug:} {:hug:} {:hug:} {:hug:} {:hug:} {:hug:} {:hug:} {:hug:} {:hug:} {:hug:} {:hug:} {:hug:} {:hug:} {:hug:} {:hug:}
zouyf12
发表于 2013-4-28 12:00:15
请教前辈一个问题, 前辈帖子里写更新四元数的方法是用一阶龙库法,但是我看其他有些讲四元数的文章里又提到四元数乘法来更新,这两者有什么区别呢?
kyan3886
发表于 2013-4-28 16:56:21
陀螺倒是没用过,过去一直用磁通门+石英加速度计做电子罗盘的计算,目的是将倾斜了的三个磁通门器件算回大地坐标系,由于这些传感器都是单轴的,安装时有正交度误差以及磁坐标轴与重力坐标轴平行度问题,带来的误差也不小,这个又怎么去解决呢?
wickedseason
发表于 2013-4-28 20:09:40
MARK上先
zhuwenwujy
发表于 2013-4-29 17:37:18
顶一下楼主,慢慢来看~
whf199191
发表于 2013-4-29 18:08:01
牛人,mark~
oldbreadman
发表于 2013-4-30 19:28:19
这个帖子据说是精华,留个名先。
WUST_LJS
发表于 2013-4-30 22:48:50
好铁 !!! 楼主辛苦了!! 好人一生平安!!!
zhuchaohua
发表于 2013-4-30 23:07:21
总结得非常好马克先
WUST_LJS
发表于 2013-4-30 23:23:27
xukkkkkk 发表于 2013-3-29 13:12 static/image/common/back.gif
问下下面这个函数这两段怎么理解
// 估计方向的重力
vx = 2*(q1*q3 - q0*q2);
您好,请问下 您的算法也是用四元素么? 还是用MK的 那种方式?
看了您的视频, 佩服。
我是学生,最近入门四轴, 参考前人的资料在微型四轴能飞,P但ID响应不行,老是荡。现在不知道是数据融合的问题还是
PID的控制太过于简略。想把算法调稳定了再做大四轴。
能否参考下您的 算法。 万分感谢!!
520zhoupian
发表于 2013-5-1 13:11:22
好久没有看到到这样的帖子了,非常高兴,先拿下来看看,要是以后有什么值得分享的东西我也会像这样也大家讨论。
lyxooo1
发表于 2013-5-1 14:57:36
好帖子,顶!
elong2013
发表于 2013-5-1 17:13:18
楼主是高手,向楼主学习
520zhoupian
发表于 2013-5-1 17:40:07
公式最左边的上面带点的三个是本次更新后的角度,不带点的是上个更新周期算出来的角度。
这句话里好像有点表达错误,但是我也不确定,带点应该是本次更新后 角度的增量
sunhaoqin
发表于 2013-5-2 09:09:19
mark................
cai_mouse
发表于 2013-5-3 19:14:34
这个算法心得写得很好,谢谢楼主的分享。
颠覆理论
发表于 2013-5-3 21:07:08
标记一下
lologame
发表于 2013-5-4 08:40:01
void IMUupdate(float gx, float gy, float gz, float ax, float ay, float az)
这个函数的参数
gx gy gz, 是陀螺仪直接读出来的数据,还是转换成了实际角速度数据?
ax ay az,是加速度计直接读出来3个轴的数据吗?
初次接触四轴,希望大神点拨~~
树上的小鸟
发表于 2013-5-5 19:06:56
这个帖子,真心不错,谢谢楼主!{:smile:}
小笨蛋
发表于 2013-5-6 15:23:33
本帖最后由 小笨蛋 于 2013-5-6 16:23 编辑
恩,写的真好!我认认真真的打印出来看了几篇,并试图推导。
ex = (ay*vz - az*vy);
ey = (az*vx - ax*vz);
ez = (ax*vy - ay*vx);
我简单的算了一下,发现ex ey ez好像就是sin(角度偏差),在角度偏差比较小的情况下就应该等于(角度偏差)。、、、、请问这一句对不对?
然后乘以Kp来修正陀螺仪偏差。
还有我见过另一种算法是把欧拉角转换成四元数,在利用四元数相乘来更新四元数。不知道和你这种方式本质上是不是一样?我试图证明、、、未果。
我用matlab做四元数旋转的实验,结果单旋转Pitch轴的话会出现奇怪的现象,我单片机里面也出现相同的现象,不知道为什么。
% clc;
% clear all;
% close all;
q=;
euler3=;
a=[];
euan=[];
for i=1:1:360
p=euler2quat(euler3);
q=quatmultiply(p,q);
quatnormalize(q);
a=;
e=quat2euler(q);
euan=;
end
hold;
plot(a(:,1),'r','LineWidth',2);
plot(a(:,2),'g','LineWidth',2);
plot(a(:,3),'b','LineWidth',2);
plot(a(:,4),'c','LineWidth',2);
plot(euan(:,1),'m','LineWidth',2);
plot(euan(:,2),'y','LineWidth',2);
plot(euan(:,3),'k','LineWidth',2);
windancerhxw
发表于 2013-5-6 21:11:21
{:lol:}
很牛叉的样子,学习了
cyberjok
发表于 2013-5-6 21:31:27
不错的说。。。
g921002
发表于 2013-5-6 22:48:19
lologame 发表于 2013-5-4 08:40 static/image/common/back.gif
void IMUupdate(float gx, float gy, float gz, float ax, float ay, float az)
这个函数的参数
陀螺的部分是實際的角速度(rad/sec)
lologame
发表于 2013-5-7 08:11:55
g921002 发表于 2013-5-6 22:48 static/image/common/back.gif
陀螺的部分是實際的角速度(rad/sec)
嗯,我已成功验证,谢谢你的热心回复
mique
发表于 2013-5-8 09:20:11
mark 四轴 算法
丹峰
发表于 2013-5-8 15:00:08
收藏,以后慢慢研究