002四元数与姿态解算学习备忘

关于四元数转为姿态阵,今天看到一篇文档写的非常清楚明白,特将主要内容摘录下来。


以下为摘录的文档内容:
这里写图片描述
这里写图片描述
推导过程很机械,也很简单,建议推导一下,这样才会对此有更深刻的印象。


以上表述了从地理坐标系到载体坐标系的过程,惯导中需要将数据从载体坐标系换算到地理坐标系进行解算,此时的姿态矩阵即为上述矩阵的转置,即利用四元数将空间矢量从载体坐标系(b)转换到地理坐标系(n)的姿态矩阵为:

Cnb=q20+q21q22q232(q1q2+q0q3)2(q1q3q0q2)2(q1q2q0q3)q20q21+q22q232(q2q3+q0q1)2(q1q3+q0q2)2(q2q3q0q1)q20q21q22+q23 C b n = [ q 0 2 + q 1 2 − q 2 2 − q 3 2 2 ( q 1 q 2 − q 0 q 3 ) 2 ( q 1 q 3 + q 0 q 2 ) 2 ( q 1 q 2 + q 0 q 3 ) q 0 2 − q 1 2 + q 2 2 − q 3 2 2 ( q 2 q 3 − q 0 q 1 ) 2 ( q 1 q 3 − q 0 q 2 ) 2 ( q 2 q 3 + q 0 q 1 ) q 0 2 − q 1 2 − q 2 2 + q 3 2 ]

上述摘录内容虽然易懂,但是表述过于简略,更详细的表述请参考其他文献,例如 003备忘补充之惯性导航基本原理(刘保中)—9.1方向余弦与方向余弦矩阵中的附件第64页(四元数与方向余弦的关系)。

最后附上原文四元数微分方程的推导

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
抱歉,由于四元数姿态解算涉及到具体的应用场景和算法,因此无法提供通用的 MATLAB 代码。建议根据具体的需求和算法,自行编写相应的代码。以下是一个使用基于四元数姿态解算的例子,仅供参考: ```matlab % 姿态解算例子 % 系统模型:IMU + GPS % 使用四元数解算姿态 % 采用卡尔曼滤波进行数据融合 % 初始化 dt = 0.01; % 采样周期 g = 9.8; % 重力加速度 q = [1; 0; 0; 0]; % 初始四元数 P = eye(4); % 初始协方差矩阵 Q = diag([0.1, 0.1, 0.1, 0.1]); % 过程噪声 R = diag([0.5, 0.5, 0.5]); % 观测噪声 % 加载数据 load imu_data.mat % IMU数据 load gps_data.mat % GPS数据 % 数据融合 N = length(imu_data); attitude = zeros(N, 3); % 存储姿态 for i = 1:N % 读取IMU数据 gyro = imu_data(i, 1:3); % 角速度 accel = imu_data(i, 4:6); % 加速度 % 计算四元数增量 omega = gyro - q(2:4)' * gyro * q(2:4); dq = [1; omega * dt / 2] .* q; % 估计姿态 q = q + dq; q = q / norm(q); % 归一化 % 计算卡尔曼滤波增益 H = [2 * q(3), -2 * q(2), 2 * q(1); -2 * q(4), -2 * q(1), -2 * q(2); -2 * q(1), 2 * q(4), -2 * q(3)]; K = P * H' * inv(H * P * H' + R); % 读取GPS数据 if ~isempty(find(gps_data(:, 1) == i, 1)) % GPS有数据 pos = gps_data(find(gps_data(:, 1) == i), 2:4); % 位置 % 更新姿态 z = [atan2(2 * (q(1) * q(2) + q(3) * q(4)), 1 - 2 * (q(2)^2 + q(3)^2)); asin(2 * (q(1) * q(3) - q(2) * q(4))); atan2(2 * (q(1) * q(4) + q(2) * q(3)), 1 - 2 * (q(3)^2 + q(4)^2))]; y = pos' - z; q = q + K * y; q = q / norm(q); % 归一化 P = (eye(4) - K * H) * P; end % 计算欧拉角 attitude(i, :) = [atan2(2*(q(1)*q(2)+q(3)*q(4)), 1-2*(q(2)^2+q(3)^2)); asin(2*(q(1)*q(3)-q(2)*q(4))); atan2(2*(q(1)*q(4)+q(2)*q(3)), 1-2*(q(3)^2+q(4)^2))]; end % 显示姿态 figure; plot(attitude(:, 1), 'r'); % 横滚角 hold on; plot(attitude(:, 2), 'g'); % 俯仰角 plot(attitude(:, 3), 'b'); % 偏航角 legend('Roll', 'Pitch', 'Yaw'); xlabel('Time (s)'); ylabel('Angle (rad)'); title('Attitude'); ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值