liguole 发表于 2011-11-5 21:53:16

问个低级的问题 直接对角速度积分相比四元数有什么弱点吗 这个问题不知道应该怎么查

问个低级的问题 直接对角速度积分相比四元数有什么弱点吗 这个问题不知道应该怎么查

majianjia 发表于 2011-11-5 22:51:56

回复【楼主位】liguole李国乐
问个低级的问题 直接对角速度积分相比四元数有什么弱点吗 这个问题不知道应该怎么查

-----------------------------------------------------------------------

同问!!

g921002 发表于 2011-11-6 00:21:35

角速度直接積分在pitch或roll大於正負30度以上的值基本上是垃圾。

majianjia 发表于 2011-11-6 07:48:45

回复【2楼】g921002
-----------------------------------------------------------------------
不会吧?陀螺仪应该不会吧?
如果是加速度计转换成角度,才会受arctan 的影响以至于角度大了精度下降。

zht9961020 发表于 2011-11-6 09:36:06

看一遍惯性导航原理就明白了

liguole 发表于 2011-11-6 18:31:39

开别人源!
以下均为原作者的话,如有版权问题请与我联系!120538967

原作者:5iMX dongfang
资料来源:http://bbs.5imx.com/bbs/viewthread.php?tid=504301&highlight=%CB%C4%D4%AA%CA%FD

ourdev_692510DX36ZT.doc(文件大小:258K) (原文件名:捷联系统的四元数法姿态算法.doc)


算法名:捷联系统的四元数法姿态算法

算法输入:物体的初始姿态,3轴陀螺仪不同时刻的Yaw,Pitch,Roll的角速度;
算法输出:物体的当前姿态。

具体算法:(有颜色的是李国乐加的)
1. 初始姿态的四元数(w,x,y,z)=(1,0,0,0) 命名为A(四元数初值)
2. 读取3轴陀螺仪当前时刻的Yaw,Pitch,Roll角速度,乘以上次计算以来的间隔时间,得到上一时刻以来(Yaw,Pitch,Roll)的变化量,命名为欧拉角b(角速度对时间积分的角度变化量得到欧拉角)
3. b是Tait-Bryan angle定义的欧拉角,将其转为四元数B(欧拉角->四元数)
4. A=A×B,做四元数乘法,即可得到当前姿态对应的新的四元数A(更新四元数)
5.重复2~4部,即可连续更新姿态(循环计算)
6.将四元数A重新转换为Tait-Bryan angle形式的欧拉角a,就可以以直观的形式查看当前姿态(四元数->欧拉角)


这里严重感谢http://www.cppblog.com/heath/archive/2009/12/13/103127.html 的作者,他的代码解决了我最重要的问题: Tait-Bryan angle定义的欧拉角和四元数的双向转换。但他是个游戏开发者,没做姿态更新,我补充了姿态更新的代码。


另外补充一句,我使用的是arduino做的开发,也就是12M的8位AVR单片机,目前,每秒在获取数据400个的速度下,如此大工作量的算法依然能跑。3D旋转N圈,大约10秒钟,各轴漂移在5度左右。



\核心算法1,欧拉角转四元数
void Quaternion::FromEulerAngle(const EulerAngle &ea)
{
      float fCosHRoll = cos(ea.fRoll * .5f);
      float fSinHRoll = sin(ea.fRoll * .5f);
      float fCosHPitch = cos(ea.fPitch * .5f);
      float fSinHPitch = sin(ea.fPitch * .5f);
      float fCosHYaw = cos(ea.fYaw * .5f);
      float fSinHYaw = sin(ea.fYaw * .5f);

      w = fCosHRoll * fCosHPitch * fCosHYaw + fSinHRoll * fSinHPitch * fSinHYaw;
      x = fCosHRoll * fSinHPitch * fCosHYaw + fSinHRoll * fCosHPitch * fSinHYaw;
      y = fCosHRoll * fCosHPitch * fSinHYaw - fSinHRoll * fSinHPitch * fCosHYaw;
      z = fSinHRoll * fCosHPitch * fCosHYaw - fCosHRoll * fSinHPitch * fSinHYaw;
}


核心算法2,四元数转欧拉角

EulerAngle Quaternion::ToEulerAngle() const
{
      EulerAngle ea;

      ea.fRoll= atan2(2 * (w * z + x * y) , 1 - 2 * (z * z + x * x));
      ea.fPitch = asin(CLAMP(2 * (w * x - y * z) , -1.0f , 1.0f));
      ea.fYaw   = atan2(2 * (w * y + z * x) , 1 - 2 * (x * x + y * y));

      return ea;
}



核心算法3,四元数乘法
Quaternion Quaternion::Multiply(const Quaternion &b)
{
      Quaternion c;
      c.w=w*b.w      -x*b.x      -y*b.y      -z*b.z;
      c.x=w*b.x      +x*b.w      +y*b.z      -z*b.y;
      c.y=w*b.y      -x*b.z      +y*b.w      +z*b.x;
      c.z=w*b.z      +x*b.y      -y*b.x      +z*b.w;
      c.Normalize();
      return c;
}
次要的规范化算法:
voidQuaternion::Normalize(){
      float s=getS();
      w/=s;
      x/=s;
      y/=s;
      z/=s;
}
float Quaternion::getS(){
      return sqrt(w*w+x*x+y*y+z*z);
}

我的loop函数,算法的集成部分:

Quaternion nowQ;
void loop() {
int intx, inty,intz;
floatpitch,roll,yaw;

gyro.ReadGyroOutCalibrated_Radian(&pitch, &roll, &yaw);

EulerAngle dt;
dt.fRoll=roll;
dt.fPitch=pitch;
dt.fYaw=-yaw;

Quaternion dQ;
dQ.FromEulerAngle(dt);
nowQ=nowQ.Multiply(dQ);

count++;
if (count>1000){
    EulerAngle nowG=nowQ.ToEulerAngle();
    Serial.print(nowG.fRoll/3.1415926535*180,11);//横滚
    Serial.print(",");
    Serial.print(nowG.fPitch/3.1415926535*180,11);//俯仰
    Serial.print(",");
    Serial.print(nowG.fYaw/3.1415926535*180,11);//偏航
    Serial.print(",");
    Serial.print(nowQ.getS(),11);//偏航
    Serial.println();
    count=0;
}
}

liguole 发表于 2011-11-6 18:46:47

回复【4楼】zht9961020
-----------------------------------------------------------------------

在这里发问,主要是因为看不懂惯导理论 尝试着找个捷径!还请不吝指教!先谢了 ./emotion/em063.gif

lijieamd 发表于 2011-11-6 20:23:07

回复【6楼】liguole 李国乐
-----------------------------------------------------------------------

这个是真的没有捷径。实际上你在尝试寻找捷径的过程中,就会发现没有所谓的捷径,呵呵。

racede 发表于 2011-11-6 20:39:05

Mark!

whyjld 发表于 2011-11-6 22:03:24

感觉便宜的传感器数据直接用很短时间就漂移的不能用了

majianjia 发表于 2011-11-6 22:39:02

回复【5楼】liguole李国乐
开别人源!
以下均为原作者的话,如有版权问题请与我联系!120538967
原作者:5imx dongfang
资料来源:http://bbs.5imx.com/bbs/viewthread.php?tid=504301&highlight=%cb%c4%d4%aa%ca%fd
(原文件名:捷联系统的四元数法姿态算法.doc)
算法名:捷联系统的四元数法姿态算法
算法输入:物体的初始姿态,3轴陀螺仪不同时刻的yaw,pitch,roll的角速度;
算法输出:物体的当前姿态。
具体算法:(有颜色的是李国乐加的)
1. 初始姿态的四元数(w,x,y,z)=(1,0,0,0) 命名为a(四元数初值)
2. 读取3轴陀螺仪当前时刻的yaw,pitch,roll角速度,乘以上次计算以来的间隔时间,得到上一时刻以来(yaw,pitch,......
-----------------------------------------------------------------------

这个我已经从新写成C语言版的了。需要的话,在我的飞行器那个帖子里有源码。
里面的thread_posture.c 线程里面有。

zht9961020 发表于 2011-11-7 08:06:26

捷径就是直接把更新那几个公式背下来就行,中间推导过程不用管,看惯性导航的书都是公式,我也看不懂,到最后用还是那几个公式,所以直接用就行了,基本原理明白就可以了

denglu 发表于 2011-11-28 00:20:17

mark

nirvanasyl 发表于 2011-11-28 09:20:03

mark

jmp2002911 发表于 2011-11-28 09:46:16

假如在横滚90度的情况下,飞机俯仰陀螺如果感知90度的输出,如果只是按单个陀螺仪积分,那么会得出飞机俯仰了90度,而实际上飞机只是偏航90度

number007cool 发表于 2012-12-3 14:35:22

帖子中的链接刚看过,不错

number007cool 发表于 2012-12-3 14:47:53

majianjia 发表于 2011-11-6 22:39 static/image/common/back.gif
回复【5楼】liguole李国乐
开别人源!
以下均为原作者的话,如有版权问题请与我联系!120538967


现在帖子很多 不好找能否给个链接谢谢

oskrivers 发表于 2012-12-4 10:34:14

四元数是用来做姿态解算的,直接对角度积分得到的是机体系的角度,控制的时候需要地理系中的角度,所以可以使用四元数进行解算

liguole 发表于 2013-2-7 21:58:59

本帖最后由 liguole 于 2013-2-7 22:00 编辑

第七实验室 姿态板的配套资料,只发了姿态解算及更新部分,在这里上传也不知道合适不合适!抛别人的砖引更好的玉吧! 老外的开源奉献精神,着实让我学习,没有MK的开源,四轴项目就不会得到这么好的发展! 如有不妥请联系我,随时删除。QQ120538967 不一定 在线!{:smile:}

zywei_09 发表于 2013-2-8 12:35:19

liguole 发表于 2013-2-7 21:58 static/image/common/back.gif
第七实验室 姿态板的配套资料,只发了姿态解算及更新部分,在这里上传也不知道合适不合适!抛别人的砖引更 ...

里面用的是《捷联惯导算法心得》里的代码,貌似阿莫论坛所有的姿态解算都用的是那个帖子里的代码。

dave_xia 发表于 2013-3-13 09:34:37

liguole 发表于 2011-11-6 18:31 static/image/common/back.gif
开别人源!
以下均为原作者的话,如有版权问题请与我联系!120538967



非常感谢你的分享!

gunsir 发表于 2014-3-5 13:45:36

jmp2002911 发表于 2011-11-28 09:46
假如在横滚90度的情况下,飞机俯仰陀螺如果感知90度的输出,如果只是按单个陀螺仪积分,那么会得出飞机俯仰 ...

这个例子非常好,正解~~

zhuyi 发表于 2014-7-29 18:11:21

gunsir 发表于 2014-3-5 13:45
这个例子非常好,正解~~

不大理解,能帮忙详细点吗

gunsir 发表于 2014-8-12 08:10:28

zhuyi 发表于 2014-7-29 18:11
不大理解,能帮忙详细点吗

各个姿态角(欧拉角)之间有耦合关系,在很小的幅度内各轴单独积分可以近似为姿态角,但是范围一大,这种误差会非常大,直至完全不准确,因为原理上就是不对的,各个轴单独积分就相当于忽略了相互间的影响,要知道一个坐标架的三个轴是绑在一起的~~建议看看清楚欧拉角的定义就明白了~~

zhuyi 发表于 2014-8-12 09:56:02

gunsir 发表于 2014-8-12 08:10
各个姿态角(欧拉角)之间有耦合关系,在很小的幅度内各轴单独积分可以近似为姿态角,但是范围一大,这种 ...

哦,大概就是说动作幅度大了,XYZ轴混乱了是吗? 那如果四轴动作幅度不大,不做特技,只求飞温,小幅度的情况下,单轴积分应该可以用吧?

gunsir 发表于 2014-8-15 08:32:38

zhuyi 发表于 2014-8-12 09:56
哦,大概就是说动作幅度大了,XYZ轴混乱了是吗? 那如果四轴动作幅度不大,不做特技,只求飞温,小幅度的情况下 ...

那你也得要融合加速度计的数据~~而且我感觉传感器准确是控制好的前提,否则很危险~~

zhuyi 发表于 2014-8-15 09:33:03

gunsir 发表于 2014-8-15 08:32
那你也得要融合加速度计的数据~~而且我感觉传感器准确是控制好的前提,否则很危险~~ ...

大概了解了,谢谢!

默默七 发表于 2014-8-18 22:25:34

陀螺仪会飘。
当然也有KK板只用3个陀螺仪也控制的很好的。
页: [1]
查看完整版本: 问个低级的问题 直接对角速度积分相比四元数有什么弱点吗 这个问题不知道应该怎么查