0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C语言实现欧拉角转四元数

zhc135136 来源:SmartHWFW 2023-08-07 09:57 次阅读

1. 说在前面的话

2. 欧拉角

3. 欧拉角与四元数关系

4. Matlabe 欧拉角转四元数

5.C语言实现欧拉角转四元数

6. 获取资源

1. 说在前面的话

1)在介绍以下内容之前,我们假设读者已经对复数与2D旋转、3D空间中的旋转、四元数的性质以及四元数与3D旋转等数学理论有一定的阅读理解基础。

2)欧拉角与四元数姿态表示方法是目前工程上最常用的两种方法。欧拉角表示法具有简便、几何意义明显等优点,同时姿态敏感器可以直接测出这些参数,能较方便地求解用这些姿态参数描述的姿态动力学方程。但采用欧拉角的姿态描述方法存在奇点问题,且需多次三角运算。而采用四元数表示方法则可以避免这些问题,因此目前工程上开始采用四元数来描述飞行器运动及动力学方程中的姿态,而在设计控制规律时,由于欧拉角的直观性和几何意义,仍然采用欧拉角描述。

2. 欧拉角

根据欧拉定理,刚体绕固定点的位移也可以是绕该点的若干次有限转动的合成。在欧拉转动中,将载体坐标系转动三次得到导航坐标系。在三次转动中,每次的旋转轴是被转动坐标系的某一坐标轴,每次的转动角即为欧拉角。因此,用欧拉角确定的姿态矩阵是三次坐标转换矩阵的乘积。

最终的姿态矩阵还与三次转动的顺序有关,下面公式采用3-2-1顺序,即按照Z-Y-X轴的顺序旋转(东北地坐标系(对应的载体坐标系前右下)):

4a947fe4-3466-11ee-9e74-dac502259ad0.png

于是可得姿态矩阵

4aac1be0-3466-11ee-9e74-dac502259ad0.png

式中,字符"c","s"分别为"cos"和"sin"的缩写形式。

3. 欧拉角与四元数关系

根据四元数的定义,可以将欧拉角式转换为四元数,以欧拉3-2-1转动为例:第一次先绕Z轴转动,φ = θ =0,

四元数表示为:

4ad3f91c-3466-11ee-9e74-dac502259ad0.png

第二次先绕Y轴转动,φ = ψ = 0,

四元数表示为:

4ae80aba-3466-11ee-9e74-dac502259ad0.png

第三次先绕X轴转动,θ = ψ = 0,

四元数表示为:

4afdcb16-3466-11ee-9e74-dac502259ad0.png

则,绕三轴转动的合成为

4b1abfc8-3466-11ee-9e74-dac502259ad0.png

4b27b0e8-3466-11ee-9e74-dac502259ad0.png

该转换方法在360±°内均有效,是一对一的关系。

4. MATLAB 欧拉角转四元数

4b524218-3466-11ee-9e74-dac502259ad0.png

4b7da5e8-3466-11ee-9e74-dac502259ad0.png

5. C语言实现欧拉角转四元数

欧拉角转四元数的步骤如下:

STEP1:确定每个欧拉角的轴和旋转角度。Yaw对应y轴,Pitch对应x轴,Roll对应z轴。记为yaw_angle,pitch_angle和roll_angle。

STEP2:分别根据每个欧拉角的旋转轴和旋转角度,构造旋转四元数的各个分量。以yaw_angle为例,qw = cos(yaw_angle/2)qx = 0qy = sin(yaw_angle/2)qz = 0

同样地,根据pitch_angle和roll_angle可以得到对应的旋转四元数分量。

STEP3:根据旋转四元数的分量,构造最终的旋转四元数。旋转四元数的分量为(qw, qx, qy, qz)。

请注意,欧拉角到四元数的转换是一个多对一的映射,即不同的欧拉角可能对应相同的旋转四元数。因此,在实际应用中,可能需要根据具体需求选择适合的欧拉角表示方式。

校验结果:

4b944096-3466-11ee-9e74-dac502259ad0.png

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • matlab
    +关注

    关注

    175

    文章

    2924

    浏览量

    228470
  • C语言
    +关注

    关注

    180

    文章

    7534

    浏览量

    128923
  • 飞行器
    +关注

    关注

    13

    文章

    697

    浏览量

    45048
  • 欧拉角
    +关注

    关注

    0

    文章

    5

    浏览量

    6740

原文标题:MEMS_惯性传感器程序集02-欧拉角转四元数

文章出处:【微信号:SmartHWFW,微信公众号:SmartHWFW】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    CRC算法和c语言实现

    CRC算法和c语言实现
    发表于 08-20 19:21

    最全PID控制算法的C语言实现()

    最近项目中用到PID控制算法,查了很多资料,资料上说的一塌糊涂,什么手动调节啊?说的和没说一样,对于刚接触PID的人根本弄不明白。当我看到《最全PID控制算法的C语言实现》的时候,只看了前面一部分就搞明白了,里面还有C
    发表于 06-01 10:53

    STM32单片机驱动MPU605互补滤波 算法将原始数据转化成欧拉角法)

    STM32单片机驱动MPU605互补滤波 算法将原始数据转化成欧拉角法),串口显示欧拉角,参考匿名代码
    发表于 07-06 10:02

    欧拉角之间的转换

    欧拉角之间的转换
    发表于 08-17 12:08

    飞控姿态解算中,欧拉角之间的转换

    //欧拉角void cjx_from_euler(float roll, float pitch, float yaw){ floa
    发表于 11-17 13:09

    请问姿态解算算法和怎么学?

    最近使用MPU6050,但是历程里有好多算法的编程,什么欧拉角shen'm根本看不懂,不知道如何着手。
    发表于 04-08 04:43

    更新算法问题

    我采用的算法计算欧拉角,板子上的数据通过串口保存下来在在matlab上计算的,结果如附件,横轴是时间,纵轴是姿态角,三个依次是pit rol和yaw,我是测试的时候将器件晃动了
    发表于 06-21 04:37

    请问我用欧拉角造成的这些问题该怎么解决?

    我用欧拉角的时候出现了一些问题。我是按偏航,俯仰,横滚的顺序解算的,动作是三个轴依次3
    发表于 06-26 04:37

    如何用C语言实现OOP编程?

    老大看到OOP编程很好,就让我学,怎么用C语言实现OOP编程的,请大侠指点
    发表于 10-30 03:45

    mpu6050采用dmp获取转换成欧拉角,在pitch为正负90度左右roll会发生突变,正常吗?

    mpu6050采用dmp获取转换成欧拉角,在pitch为正负90度左右roll会发生突变,正常吗?为什么会这样呢?怎样能让它不突变?
    发表于 04-26 11:23

    如何用C语言实现面向对象编程

    1 用C语言实现面向对象编程GOF的《设计模式》一书的副标题叫做“可复用面向对象软件的基础”,从标题就能看出面向对象是设计模式基本思想。由于C语言并不是面向对象的
    发表于 07-12 07:24

    基于Proteus和C语言实现

    基于Proteus和C语言实现一共个题目,有没有人愿意尝试一下?
    发表于 07-14 06:20

    如何使用C语言实现模糊PID控制?

    如何使用C语言实现模糊PID控制?
    发表于 09-24 08:54

    C语言实现常用排序算法是什么?

    C语言实现常用排序算法是什么?
    发表于 10-19 06:41

    小白求助,求基于Proteus和C语言实现的程序和仿真

    小白求助,求基于Proteus和C语言实现的程序和仿真
    发表于 10-19 06:20