摄影测量浅析(1)---内外方位元素、旋转矩阵、共线方程

本文将详细阐述摄影测量中的一些较为重要的内容。

《摄影测量浅析》为本人在CSDN博客最新发布的综合性摄影测量专业概述,下述内容为第一部分,主要介绍了内外方位元素、Yaw Pitch Roll、旋转矩阵、共线方程等内容

版权声明:

本文部分内容为转载,遵循 CC 4.0 BY-SA 版权协议。

目录

本文将详细阐述摄影测量中的一些较为重要的内容。

一、影像的方位元素

(1)内方位元素

(2)外方位元素

yaw angel(航偏角):

pitch angle(俯仰角):

roll angle(横滚角):

二、摄影测量的共线条件方程

(1)什么是共线方程?

三、空间交会

(1)空间前方交会


一、影像的方位元素

在摄影测量中,我们可以利用影像的内外方位元素,将框标坐标系下的像点逐步转化为大地坐标系上的地面点。

(1)内方位元素

        框标坐标系----->像空间坐标系

内方位元素(x0,y0,-f),请注意,Z方向是-f,f为主距。图中S为摄影中心,x'y'构成的平面为框标坐标系,因为像片必然是在摄影中心的下方,所以这里是-f。x0,y0为像主点偏移像片框标中心的位置。o点为像主点。图中的红色标线构成的坐标系为像空间坐标系。

通常情况下,内方位元素认为是已知的。

如果未知,如何获取内方位元素?相机检校。

内方位元素是确定摄影物镜与像片之间相互位置关系的参数。

如上图所示,内方位元素实际上是为了确定每条摄影光线在像空间坐标系中的方向

m物方点,通过两个角度即可确定摄影光线的方向。

内方位元素作用总结:

(2)外方位元素

像空间坐标系----->物方坐标系

外方位元素是确定摄影瞬间像片在地面直角坐标系中空间位置和姿态的参数。

外方位元素分为角元素和线元素。

对像片而言,外方位元素共有六个:

不同转角系统下的角元素的表示:

(爬虫警告:本文来源CSDN用户CV-X.WANG----CV-X.WANG-CSDN博客

下图为在摄影测量内的转角系统:

一般在无人机摄影测量中,我们通常是将pitch,yaw,roll称为外方位的角元素

Pitch(俯仰角),绕着X轴旋转,对应角元素Omega

Roll(横滚角),绕着Y轴旋转,对应角元素Phi

Yaw(航偏角),绕着Z轴旋转,对应角元素Kappa


其中的yaw/pitch/roll是相对于无人机本身来说的,以无人机为原点,机头方向上下俯仰,机头左右偏航,机身翻滚为Roll。
而Omega,Phi,Kappa为GPS/INS给出的大地测量值。相当于对无人机进行了UTM投影。

yaw angel(航偏角):

pitch angle(俯仰角):

roll angle(横滚角):

二、摄影测量的共线条件方程

(1)旋转矩阵

如图所示,有一点A既位于XYZ坐标系内,又位于xyz坐标系内,那么,现在我们已知A点在xyz坐标系内的坐标为(x,y,z)那么A在XYZ坐标系内的坐标怎么表示?

假设两个坐标间的转换系数如下所示:

上式写成矩阵形式为:

由上图可知,旋转矩阵R为一个正交矩阵!

(2)旋转矩阵的构成

1)利用三个角方位元素构阵

2)利用三个独立的方位余弦构阵

3)利用反对称矩阵的三个参数组成

4)旋转矩阵的一次项近似关系式

(3)什么是共线方程?

在理想情况下,摄影瞬间像点投影中心物点位于同一条直线上,描述这三点共线的数学表达式称之为共线条件方程。

共线方程的目的:建立同一个点在像空间坐标系与地面辅助坐标系中坐标值之间的对应关系。

式(3)即为共线条件方程的一种表达形式。

上图右式便是“用地面点坐标表示像点坐标的共线条件方程”。

总结:

   未完待续、持续更新.....    
 

<think>嗯,用户想在MATLAB里计算欧拉角和旋转矩阵之间的姿态误差。这个问题看起来涉及到旋转矩阵、欧拉角之间的转换,以及如何比较两者的差异。首先,我得回忆一下欧拉角和旋转矩阵的关系。欧拉角有多种表示方式,比如绕不同的轴旋转顺序不同,常见的如ZYX顺序。用户需要确保他们使用的欧拉角顺序是一致的,否则转换可能会有问题。 然后,姿态误差的计算方法可能有几种。比如,可以将两种姿态表示都转换成旋转矩阵,然后计算它们之间的差异。旋转矩阵之间的差异可以通过比较它们的乘积,或者计算相对旋转矩阵,再转换成轴角形式,得到角度误差。或者,也可以将旋转矩阵转换成欧拉角,再直接比较欧拉角的差异,但要注意万向节锁的问题。 根据引用[^2],里面有提到旋转矩阵的转换和分解,可能涉及到如何从旋转矩阵得到欧拉角或者四元数。例如,MATLAB中的函数如eul2rotm和rotm2eul可以帮助在欧拉角和旋转矩阵之间转换。所以,用户需要先确定欧拉角的顺序,然后使用这些函数进行转换。 可能的步骤是:给定两组姿态数据,一组是欧拉角,另一组是旋转矩阵。首先将欧拉角转换为旋转矩阵,或者将给定的旋转矩阵转换为欧拉角,然后计算两者之间的差异。差异可以用旋转矩阵相乘得到相对旋转矩阵,再将其转换为轴角表示,从而得到角度误差。或者,直接计算欧拉角各分量的差值,但这种方法可能在角度接近180度时出现不稳定性。 另外,引用[^1]中提到不同的库可能有不同的旋转顺序或定义,所以用户需要确认MATLAB中的欧拉角定义是否与他们的数据一致。比如,MATLAB默认的欧拉角顺序是ZYX,而其他库可能不同,这可能导致转换错误。 还有,用户可能需要处理四元数,因为四元数和旋转矩阵之间的转换也是常见的。如果误差计算涉及到四元数,可能需要将旋转矩阵转换为四元数,然后计算四元数之间的差异,比如点积来求角度差。 所以,总结步骤可能包括:1. 确定欧拉角的旋转顺序;2. 将欧拉角转换为旋转矩阵,或者将给定的旋转矩阵转换为欧拉角;3. 计算两者之间的相对旋转矩阵;4. 将相对旋转矩阵转换为轴角形式,得到误差角度;5. 或者比较四元数之间的差异。 另外,还要考虑万向节锁对欧拉角转换的影响,这时候直接比较欧拉角可能不准确,使用旋转矩阵或四元数可能更可靠。 用户可能需要具体的代码示例,比如使用rotm2eul将旋转矩阵转换为欧拉角,然后与参考欧拉角相减,但要注意角度范围的问题。或者使用旋转矩阵相乘后的轨迹计算角度差。 现在需要将这些思路整理成一个清晰的步骤,并给出MATLAB代码示例,同时提醒注意事项,如旋转顺序和万向节锁的问题。</think>在MATLAB中计算基于欧拉角和旋转矩阵的姿态误差,需明确旋转顺序和误差定义。以下是具体步骤和代码示例: --- ### **步骤1:定义旋转顺序** MATLAB默认使用ZYX顺序(航偏角、俯仰角、横滚角)。若使用其他顺序(如XYZ),需在函数中显式指定: ```matlab eulOrder = 'ZYX'; % 例如:航空航天领域常用Z-Y-X顺序 ``` --- ### **步骤2:欧拉角与旋转矩阵互转** - **欧拉角→旋转矩阵**: ```matlab eul_deg = [yaw, pitch, roll]; % 单:度 R_eul = eul2rotm(deg2rad(eul_deg), eulOrder); ``` - **旋转矩阵→欧拉角**: ```matlab eul_deg_calculated = rad2deg(rotm2eul(R_matrix, eulOrder)); ``` --- ### **步骤3:计算姿态误差** #### **方法1:通过相对旋转矩阵求角度差** 1. 计算相对旋转矩阵: $$R_{\text{error}} = R_{\text{ref}}^T \cdot R_{\text{measured}}$$ ```matlab R_error = R_ref' * R_measured; % R_ref为参考旋转矩阵 ``` 2. 将相对旋转矩阵转换为轴角形式,提取角度误差: ```matlab [axis, angle] = rotm2axang(R_error); angle_error_rad = angle(end); % 取最后一个元素(可能因四元数对称性重复) angle_error_deg = rad2deg(angle_error_rad); ``` #### **方法2:直接比较欧拉角分量差** ```matlab eul_diff_deg = abs(eul_ref_deg - eul_measured_deg); % 注意处理角度周期跳变(如359°与1°实际差2°) eul_diff_deg = mod(eul_diff_deg + 180, 360) - 180; ``` --- ### **注意事项** 1. **万向节锁问题**:当俯仰角为±90°时,欧拉角表示不唯一,此时建议改用四元数或旋转矩阵计算误差。 2. **旋转顺序一致性**:确保所有转换函数和物理系统的旋转顺序一致,否则会引入错误。 3. **单统一**:MATLAB默认使用弧度,需注意角度与弧度的转换。 --- ### **完整代码示例** ```matlab % 定义参考姿态(欧拉角)和实测旋转矩阵 eul_ref_deg = [30, 15, -5]; % ZYX顺序,单:度 R_measured = eul2rotm(deg2rad([28, 16, -4]), 'ZYX'); % 实测旋转矩阵 % 方法1:相对旋转矩阵求角度差 R_ref = eul2rotm(deg2rad(eul_ref_deg), 'ZYX'); R_error = R_ref' * R_measured; [~, angle_error_rad] = rotm2axang(R_error); fprintf('轴角形式误差: %.2f°\n', rad2deg(angle_error_rad)); % 方法2:欧拉角分量差 eul_measured_deg = rad2deg(rotm2eul(R_measured, 'ZYX')); eul_diff_deg = mod(abs(eul_ref_deg - eul_measured_deg) + 180, 360) - 180; fprintf('欧拉角分量误差: [Yaw=%.2f°, Pitch=%.2f°, Roll=%.2f°]\n', eul_diff_deg); ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值