方向余弦阵,欧拉角,四元数

1,方向余弦阵

坐标变换矩阵的每一个元素都是i系某个坐标系与b系坐标系的夹角的余弦。这个转换方法也同样适用于二维坐标转换。只不过二维坐标转换不仅需要考虑旋转,同时也需要考虑坐标的平移变换。

如上图所示,表示只进行旋转的时候二维坐标转换公式。此时旋转矩阵表示为P=

 

 

2,欧拉角

 经典的欧拉角有多种定义,下面只介绍内旋方式的定义。

 

所以,欧拉角只是绕着两个本机坐标轴在旋转,第三个坐标轴就没有用到。

之后提出 Tait-Bryan 角

经常说的yaw,pitch,roll就是用Tait-Bryan角实现的。并且yaw指的是绕z轴旋转的角度值,pitch指的是绕y轴旋转的角度值,roll指的是绕x轴旋转的角度值。

通常yaw角也用ψ表示,pitch角也用θ表示,roll角也用φ表示。并且yaw和roll的范围是[-∏,∏],pitch的范围是[-Π/2,Π/2].

不同的旋转组合虽然可以得到相同的坐标转换结果,但是得到的roll,pitch,yaw是不同的。

按照x,y,z顺序旋转得到由roll,pitch,yaw表示的方向余弦如下

由方向余弦得到roll pitch yaw的表达式如下

roll(φ)=atan2(R(3,2),R(3,3));

pitch(θ)=-asin(R(3,1));

yaw(ψ)=atan2(R(2,1),R(1,1));

3,四元数

四元数的理解可以参考http://www.qiujiawei.com/understanding-quaternions/(理解四元数,比较通俗的解释了四元数)

推导请查看秦永元版惯性导航中相关章节。

四元数的几何意义:实部表示旋转角度的1/2的余弦值。虚部表示旋转轴与旋转角度的1/2的正弦值的乘积。

四元数得到方向余弦矩阵的表达式

上式和下式是相同的,因为四元数的平方和等于1。

由方向余弦阵到四元数的转换可以参考以下matlab程序

function q=dcm2q(R)

T = 1 + R(1,1) + R(2,2) + R(3,3);

if T > 10^-8
    
    S = 0.5 / sqrt(T);
    qw = 0.25 / S;
    qx = ( R(3,2) - R(2,3) ) * S;
    qy = ( R(1,3) - R(3,1) ) * S;
    qz = ( R(2,1) - R(1,2) ) * S;

else
    
    if (R(1,1) > R(2,2)) && (R(1,1) > R(3,3))
        
        S = sqrt( 1 + R(1,1) - R(2,2) - R(3,3)) * 2; % S=4*qx
        qw = (R(3,2) - R(2,3)) / S;
        qx = 0.25 * S;
        qy = (R(1,2) + R(2,1)) / S;
        qz = (R(1,3) + R(3,1)) / S;
        
    elseif (R(2,2) > R(3,3))
        
        S = sqrt( 1 + R(2,2) - R(1,1) - R(3,3) ) * 2; %S=4*qy
        qw = (R(1,3) - R(3,1)) / S;
        qx = (R(1,2) + R(2,1)) / S;
        qy = 0.25 * S;
        qz = (R(2,3) + R(3,2)) / S;

    else
        
        S = sqrt( 1 + R(3,3) - R(1,1) - R(2,2) ) * 2; % S=4*qz
        qw = (R(2,1) - R(1,2)) / S;
        qx = (R(1,3) + R(3,1)) / S;
        qy = (R(2,3) + R(3,2)) / S;
        qz = 0.25 * S;

    end

end
q = [qx qy qz qw]';
end

4,方向余弦阵的微分

5,四元数微分

详细的推导参看秦永元版惯性导航

 

 

  

 

转载于:https://www.cnblogs.com/lianjiehere/p/8663290.html

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
欧拉角方向余弦四元数和等效旋转矢量都是描述旋转的方式。它们之间的相互转换可以通过数学计算来实现。下面是Python代码实现这些转换的示例: 1. 将欧拉角转换为方向余弦 ``` import numpy as np # 定义欧拉角 roll = np.radians(30) pitch = np.radians(45) yaw = np.radians(60) # 计算方向余弦 R_x = np.array([[1, 0, 0], [0, np.cos(roll), -np.sin(roll)], [0, np.sin(roll), np.cos(roll)]]) R_y = np.array([[np.cos(pitch), 0, np.sin(pitch)], [0, 1, 0], [-np.sin(pitch), 0, np.cos(pitch)]]) R_z = np.array([[np.cos(yaw), -np.sin(yaw), 0], [np.sin(yaw), np.cos(yaw), 0], [0, 0, 1]]) R_xyz = np.dot(R_z, np.dot(R_y, R_x)) ``` 2. 将方向余弦转换为欧拉角 ``` import math # 定义方向余弦 R_xyz = np.array([[0.866, -0.354, 0.354], [0.354, 0.866, -0.354], [0.354, 0.354, 0.866]]) # 计算欧拉角 pitch = -math.asin(R_xyz[2, 0]) roll = math.atan2(R_xyz[2, 1], R_xyz[2, 2]) yaw = math.atan2(R_xyz[1, 0], R_xyz[0, 0]) pitch_deg = math.degrees(pitch) roll_deg = math.degrees(roll) yaw_deg = math.degrees(yaw) ``` 3. 将方向余弦转换为四元数 ``` # 定义方向余弦 R_xyz = np.array([[0.866, -0.354, 0.354], [0.354, 0.866, -0.354], [0.354, 0.354, 0.866]]) # 计算四元数 q_w = math.sqrt(1 + R_xyz[0, 0] + R_xyz[1, 1] + R_xyz[2, 2]) / 2 q_x = (R_xyz[2, 1] - R_xyz[1, 2]) / (4 * q_w) q_y = (R_xyz[0, 2] - R_xyz[2, 0]) / (4 * q_w) q_z = (R_xyz[1, 0] - R_xyz[0, 1]) / (4 * q_w) ``` 4. 将四元数转换为方向余弦 ``` # 定义四元数 q_w = 0.866 q_x = -0.354 q_y = 0.354 q_z = 0.354 # 计算方向余弦 R_xyz = np.array([[1 - 2 * (q_y ** 2 + q_z ** 2), 2 * (q_x * q_y - q_w * q_z), 2 * (q_x * q_z + q_w * q_y)], [2 * (q_x * q_y + q_w * q_z), 1 - 2 * (q_x ** 2 + q_z ** 2), 2 * (q_y * q_z - q_w * q_x)], [2 * (q_x * q_z - q_w * q_y), 2 * (q_y * q_z + q_w * q_x), 1 - 2 * (q_x ** 2 + q_y ** 2)]]) ``` 5. 将四元数转换为等效旋转矢量 ``` # 定义四元数 q_w = 0.866 q_x = -0.354 q_y = 0.354 q_z = 0.354 # 计算等效旋转矢量 theta = 2 * math.acos(q_w) sin_theta = math.sin(theta / 2) v_x = q_x / sin_theta v_y = q_y / sin_theta v_z = q_z / sin_theta ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值