空间后方交会程序

合集下载

空间后方交会的解算

空间后方交会的解算

空间后方交会的解算一. 空间后方交会的目的摄影测量主要利用摄影的方法获取地面的信息,主要是是点位信息,属性信息,因此要对此进行空间定位和建模,并首先确定模型的参数,这就是空间后方交会的目的,用以求出模型外方位元素。

二. 空间后方交会的原理空间后方交会的原理是共线方程。

共线方程是依据相似三角形原理给出的,其形式如下111333222333()()()()()()()()()()()()A S A S A S A S A S A S AS A S A S A S A S A S a X X b Y Y c Z Z x f a X X a Y Y a Z Z a X X b Y Y c Z Z y f a X X a Y Y a Z Z -+-+-=--+-+--+-+-=--+-+-上式成为中心投影的构线方程,我们可以根据几个已知点,来计算方程的参数,一般需要六个方程,或者要三个点,为提高精度,可存在多余观测,然后利用最小二乘求其最小二乘解。

将公式利用泰勒公式线性化,取至一次项,得到其系数矩阵A ;引入改正数(残差)V ,则可将其写成矩阵形式:V AX L =-其中111333222333[,]()()()()()()()()()()()()()()Tx y A S A S A S x A S A S A S A S A S A S y A S A S A S L l l a X X b Y Y c Z Z l x x x fa X X a Y Y a Z Z a X Xb Y Yc Z Z l y y y fa X X a Y Y a Z Z =-+-+-=-=+-+-+--+-+-=-=+-+-+- 则1()T T X A A A L -=X 为外方位元素的近似改正数,由于采用泰勒展开取至一次项,为减少误差,要将的出的值作为近似值进行迭代,知道小于规定的误差三. 空间后方交会解算过程1. 已知条件近似垂直摄影00253.24mmx y 0f ===2. 解算程序流程图MATLAB 程序format long;s1=xlsread('data.xls');%读取数据a1=s1(1:4,1:2);%影像坐标b1=s1(1:4,3:5);%地面摄影测量坐标a2=s1.*10^-3;%影像坐标单位转化j1=a2(1,:)-a2(2,:);j2=j1(1,1)^2+j1(1,2)^2;lengh_a1=sqrt(j2); %相片某一长度j1=b1(1,:)-b1(1,:);j2=j1(1,1)^2+j1(1,2)^2;lengh_b1=sqrt(j2); %地面对应的长度m=lengh_b1/lengh_a1;%求出比例尺n0=0;p0=0;q0=0;x0=mean(b1(:,1));y0=mean(b1(:,2));f=153.24*10^-3;z0=m*f;x001={x0,x0,x0,x0};X0=cell2mat(x001)';y001={y0,y0,y0,y0};Y0=cell2mat(y001)';z001={z0,z0,z0,z0};Z0=cell2mat(z001)';%初始化外方位元素的值aa1=cos(n0)*cos(q0)-sin(n0)*sin(p0)*sin(q0);aa2=-sin(q0)*cos(n0)-sin(n0)*sin(p0)*cos(q0);aa3=-sin(n0)*cos(p0);bb1=sin(q0)*cos(p0);bb2=cos(q0)*cos(p0);bb3=-sin(p0);cc1=sin(n0)*cos(q0)+sin(p0)*cos(n0)*sin(q0);cc2=-sin(n0)*sin(q0)+sin(p0)*cos(q0)*cos(n0);cc3=cos(n0)*cos(p0);%计算改正数XX1=aa1.*(b1(:,1)-X0)+bb1.*(b1(:,2)-Y0)+cc1.*(b1(:,3)-Z0); XX2=aa2.*(b1(:,1)-X0)+bb2.*(b1(:,2)-Y0)+cc2.*(b1(:,3)-Z0); XX3=aa3.*(b1(:,1)-X0)+bb3.*(b1(:,2)-Y0)+cc3.*(b1(:,3)-Z0); lx=a1(:,1)+f.*(XX1./XX3);ly=a1(:,2)+f.*(XX2./XX3);l={lx',ly'};L=cell2mat(l)';%方程系数A=[-3.969*10^-5 0 2.231*10^-5 -0.2 -0.04 -0.06899;0 -3.969*10^-5 1.787*10^-5 -0.04 -0.18 0.08615;-2.88*10^-5 0 1*10^-5 -0.17 0.03 0.08211;0 -2.88*10^-5 -1.54*10^-5 0.03 -0.2 0.0534;-4.14*10^-5 0 4*10^-6 -0.15 -7.4*10^-3 -0.07663;0 -4.14*10^-5 2.07*10^-5 -7.4*10^-3 -0.19 0.01478;-2.89*10^-5 0 -1.98*10^-6 -0.15 -4.4*10^-3 0.06443;0 -2.89*10^-5 -1.22*10^-5 -4.4*10^-3 -0.18 0.01046];%L=[-1.28 3.78 -3.02 -1.45 -4.25 4.98 -4.72 -0.385]'.*10^-2; %第一次迭代X=inv(A'*A)*A'*L;3.结果X=1492.41127406195-554.4015671761941425.68660973544-0.0383847815608609 0.00911624039769785 -0.105416434087641S=1492.41127406195-554.401567176194 1425.68660973544 38436.9616152184 27963.1641162404-0.105416434087641。

空间后方交会程序设计

空间后方交会程序设计

单片空间后方交会程序设计专业:测绘工程班级:测绘101姓名:张雯学号:2010220200512 用C 或VC++语言实现单片后方交汇的计算。

以单幅影像为基础,从该影象所覆盖地面范围内若干控制点的已知地面坐标和相应点的像坐标量测值出发,根据共线条件方程,求解该影象在航空摄影时刻的像片外方位元素Xs ,Ys ,Zs,ф,ω,κ.共线条件方程如下:x-x0=-f*[a1(X-Xs)+b1(Y-Ys)+c1(Z-Zs)]/[a3(X-Xs)+b3(Y-Ys)+c3(Z-Zs)] y-y0=-f*[a2(X-Xs)+b2(Y-Ys)+c2(Z-Zs)]/[a3(X-Xs)+b3(Y-Ys)+c3(Z-Zs)] x,y 为像点的像平面坐标;x0,y0,f 为影像的外方位元素;Xs,Ys,Zs 为摄站点的物方空间坐标;X,Y,Z 为物方点的物方空间坐标;输入原始数据归算像点坐标x,,y 计算和确定初值X s 0, Y s 0, Z s 0, φ0,ω0,κ0 组成旋转矩阵R 计算(x ),(y )和l x ,l y 逐点组成误差方程并法化 所有点完否? 解法方程,求未知数改正数 计算改正后外方位元素未知数改正数<限差否?整理并输出计算结果正常输出迭代次数小于限差否? 输出中间结果和出错信息4个地面控制点的地面坐标及其对应像点的像片坐标:结果输出:已知条件:像点坐标x,y:-53.4 82.21-14.78 -76.6310.46 64.43153.24 -86.15地点坐标Xa,Ya,Za:37631.1 31324.5 728.6939101 24935 2386.540426.5 30319.8 757.31-68.99 36589.4 25273.3摄影比例尺:1:50000内方位元素:x0=y0=0 f=153.24mm计算结果:旋转矩阵:0.997709 0.0675334 0.00398399-0.0675254 0.997715 -0.00211178-0.0041175 0.00183792 0.99999像点坐标位:(单位:mm)-86.15 -68.99-53.41 82.21-14.78 -76.6310.47 64.43外方位元素:Xs=39795.435 精度为:1.1254813Ys=27476.479 精度为:1.2437625Zs=7572.6929 精度为:0.48380521q=-0.0039840098 精度为:0.00018182003 w=0.0021117837 精度为:0.00015959235 k=-0.067576934 精度为:7.2440432e-005 迭代次数:4Press any key to continue。

单像空间后方交会

单像空间后方交会
坐标轴与像平面坐标轴平行。
像空间辅助坐标系(u,v,w)
坐标原点位于S,但坐标轴不一定与像平 面坐标轴平行,按需要定义。
像空坐标系与像空辅助坐标系之关系
物方坐标系
地面测量坐标系(Xt,Yt,Zt)
义。
地面摄影测量坐标系(X,Y,Z,)
原点位于地面某一已知点,坐标轴按需要定
地面测量坐标系与摄影测量坐标系之关系
确定像片相对S 的位置。 --焦距 --像主点 在像平面坐标系中 的坐标 例
外方位元素
1、确定S在物方空 间坐标系中位置的元 素(直线元素)。 Xs,Ys,Zs 例 Xs=1140.2m Ys=2003.5m Zs=1035.7m
பைடு நூலகம்2、确定像片在
物方空间坐标系中 位置的元素(角 元素)。 1) 角元素
像方坐标系与物方 坐标系之关系
共线方程线性化:
前式具体化:
即有
'
2
'
2
(5-9a)具体化:
写成

综合上述推导,有共线方程的线性形式:
式中
二.解算中的具体公式
利用(a)式解求外方位元素时,有6个未知数,须用像 片及地面3个点的3对已知的(X,Y,Z)、(x,y)组6个 方程.实用中为提高精度常取多余点多余观测,为此要按 最小二乘平差计算.则平差算式如下:
分)
单像空间后方交会(第五章部
根据单张航测像片上一定数量的已 知点(像片坐标和地面坐标已知),计算该 像片的外方位元素(摄影中心S的坐标 Xs,Ys,Zs,像片的角元素 ).
知道外方位 元素,可用来恢 复像片在摄影时 的空间位置,重 建像片与被摄地 面之间的相互关 系
内方位元素
( X1 , Y1 , Z1 )

后方交会法流程

后方交会法流程

后方交会法流程后方交会法呀,这可有点小意思呢。

后方交会法是一种在测量里挺有用的方法哦。

咱先说一下啥是后方交会法的基本原理吧。

它就是通过在未知点上设站,然后观测三个或者更多的已知控制点,根据这些观测数据来计算出这个未知点的坐标。

这就好比你在一个陌生的地方,你能看到周围几个你认识的标志性建筑,然后根据你看这些建筑的角度啊之类的信息,就能知道自己在啥位置啦。

那它的具体操作流程是啥样的呢?一、前期准备工作。

咱们得先准备好测量仪器呀,像全站仪这些,这就像是战士上战场要带好武器一样重要。

而且要保证仪器的状态良好,要是仪器出了问题,那后面测量出来的数据可就不准啦。

同时呢,还要拿到那些已知控制点的坐标资料,这可是关键的参考信息,没有这些,就像没了地图的旅行者,完全不知道方向呢。

二、设站。

把全站仪安置在这个未知点上,这个未知点的选择也有点小讲究哦。

要选择一个视野开阔的地方,这样才能很好地观测到那些已知控制点。

要是周围都是遮挡物,那可就没法好好测量啦。

在设站的时候呢,要把仪器调平,这一步可不能马虎,如果仪器没有调平,就像盖房子没有打好地基,后面的数据肯定是错得离谱。

三、观测已知控制点。

接下来就是观测那些已知控制点啦。

要仔细地测量每个控制点的水平角和垂直角之类的数据。

测量的时候要认真哦,多测几次取个平均值就更好啦,这样可以减少误差。

就像你做数学题,多检查几遍答案就更准确啦。

而且观测的时候要按照一定的顺序,这样不容易乱,也方便后面整理数据。

四、数据记录与整理。

把观测到的数据认真地记录下来,这可关系到最后的计算结果呢。

要是记录错了一个数字,那就像做饭放错了盐一样,整个味道就不对啦。

记录完之后呢,要检查一下有没有遗漏或者错误的地方。

然后根据这些数据开始计算未知点的坐标啦。

这个计算过程可能有点复杂,不过现在有很多软件可以帮助我们计算,但是咱也得知道计算的原理呀,不能完全依赖软件。

五、精度检查。

计算出坐标之后呢,可不能就这么完事儿了。

单像空间后方交会程序《JAVA版》

单像空间后方交会程序《JAVA版》

10. 将求得的外方位元素改正数与规定的限差比较,若小于限差,则迭代结束。否则用新的近似值重 复 4~9 满足要求为止。 11. 由误差方程的计算式:
0 vx a11X s a12 Ys a13Z s a14 a15 a16 x x 0 v y a21X s a22 Ys a23Z s a24 a25 a26 y y
1. Java 程序 以下第一部分为主程序
import java.util.*; import java.math.*;
5. 逐点计算像点坐标的近似值。利用未知数的近似值和控制点的地面坐标,带入以下共线方程式,
x f y f a1 ( X A X S ) b1 (YA YS ) c1 ( Z A Z S ) a3 ( X A X S ) b3 (YA YS ) c3 ( Z A Z S ) a2 ( X A X S ) b2 (YA YS ) c2 ( Z A Z S ) a3 ( X A X S ) b3 (YA YS ) c3 ( Z A Z S )
以单像空间后方交会方法,求解该像片的外方位元素。 二、 计算原理
1. 获取已知数据。从航摄资料中查取平均航高与摄影机主距;获取控制点的地面测量坐标并转换为 地面摄测坐标。 2. 测量控制点的像点坐标并作系统误差改正。 3. 确定未知数的初始值。 在竖直摄影且地面控制点大体对称分布的情况下, 按如下方法确定初始值, 即
其他项类似可得。
x2 ) f2
y2 ) f2
由常数项计算公式:
a ( X X S ) b1 (Yi YS ) c1 ( Z i Z S ) xi f 1 i a3 ( X i X S ) b3 (Yi YS ) c3 ( Z i Z S ) lxi Li l yi y f a2 ( X i X S ) b2 (Yi YS ) c2 ( Z i Z S ) i a3 ( X i X S ) b3 (Yi YS ) c3 ( Z i Z S ) (i 1, 2,3, 4)

编写单片空间后方交会程序实习一

编写单片空间后方交会程序实习一

实验一 编写单片空间后方交会程序
一、实验目的
用程序设计语言(Visual C++或者C 语言、matlab 语言)编写一个完整的单片空间后方交会程序,通过对提供的试验数据进行计算,输出像片的外方位元素并评定精度。

本实验的目的在于让学生深入理解单片空间后方交会的原理,体会在有多余观测情况下,用最小二乘平差方法编程实现解求影像外方位元素的过程。

通过上机调试程序加强动手能力的培养,通过对实验结果的分析,增强学生综合运用所学知识解决实际问题的能力。

二、实验内容与要求
利用一定数量的地面控制点,根据共线条件方程求解像片外方位元素。

三、实验原理
根据摄影过程的几何反转原理。

四、实验数据准备
﹡ 已知航摄仪的内方位元素0,24.15300===y x mm f (摄影比例尺为1:50000); ﹡ 4个地面控制点的地面坐标及其对应像点的像片坐标:
1.每人必须独立上机操作;
2.实验前认真复习单片空间后方交会的有关内容。

六、实验报告
原理、实验步骤及程序框图
上机调试程序并打印结果。

摄影测量学空间后方交会实验报告

摄影测量学空间后方交会实验报告

摄影测量学实验报告实验一、单像空间后方交会学院:建测学院班级:测绘082姓名:肖澎学号: 15一.实验目的1.深入了解单像空间后方交会的计算过程;2.加强空间后方交会基本公式和误差方程式,法线方程式的记忆;3.通过上机调试程序加强动手能力的培养。

二.实验原理以单幅影像为基础,从该影像所覆盖地面范围内若干控制点和相应点的像坐标量测值出发,根据共线条件方程,求解该影像在航空摄影时刻的相片外方位元素。

三.实验内容1.程序图框图2.实验数据(1)已知航摄仪内方位元素f=153.24mm,Xo=Yo=0。

限差0.1秒(2)已知4对点的影像坐标和地面坐标:3.实验程序using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace ConsoleApplication3{class Program{static void Main(){//输入比例尺,主距,参与平参点的个数Console.WriteLine("请输入比例尺分母m:\r");string m1 = Console.ReadLine();double m = (double)Convert.ToSingle(m1);Console.WriteLine("请输入主距f:\r");string f1 = Console.ReadLine();double f = (double)Convert.ToSingle(f1);Console.WriteLine("请输入参与平差控制点的个数n:\r");string n1 = Console.ReadLine();int n = (int)Convert.ToSingle(n1);//像点坐标的输入代码double[] arr1 = new double[2 * n];//1.像点x坐标的输入for (int i = 0; i < n; i++){Console.WriteLine("请输入已进行系统误差改正的像点坐标的x{0}值:\r", i+1);string u = Console.ReadLine();for (int j = 0; j < n; j += 2){arr1[j] = (double)Convert.ToSingle(u);}}//2.像点y坐标的输入for (int i = 0; i < n; i++){Console.WriteLine("请输入已进行系统误差改正的像点坐标的y{0}值:\r", i+1);string v = Console.ReadLine();for (int j = 1; j < n; j += 2){arr1[j] = (double)Convert.ToSingle(v);}}//控制点的坐标输入代码double[,] arr2 = new double[n, 3];//1.控制点X坐标的输入for (int j = 0; j < n; j++){Console.WriteLine("请输入控制点在地面摄影测量坐标系的坐标的X{0}值:\r", j+1);string u = Console.ReadLine();arr2[j , 0] = (double)Convert.ToSingle(u);}//2.控制点Y坐标的输入for (int k = 0; k < n; k++){Console.WriteLine("请输入控制点在地面摄影测量坐标系的坐标的Y{0}值:\r", k+1);string v = Console.ReadLine();arr2[k , 1] = (double)Convert.ToSingle(v);}//3.控制点Z坐标的输入for (int p =0; p < n; p++){Console.WriteLine("请输入控制点在地面摄影测量坐标系的坐标的Z{0}值:\r", p+1);string w = Console.ReadLine();arr2[p , 2] = (double)Convert.ToSingle(w);}//确定外方位元素的初始值//1.确定Xs的初始值:double Xs0 = 0;double sumx = 0;for (int j = 0; j < n; j++){double h = arr2[j, 0];sumx += h;}Xs0 = sumx / n;//2.确定Ys的初始值:double Ys0 = 0;double sumy = 0;for (int j = 0; j < n; j++){double h = arr2[j, 1];sumy += h;}Ys0 = sumy / n;//3.确定Zs的初始值:double Zs0 = 0;double sumz = 0;for (int j = 0; j <= n - 1; j++){double h = arr2[j, 2];sumz += h;}Zs0 = sumz / n;doubleΦ0 = 0;doubleΨ0 = 0;double K0 = 0;Console.WriteLine("Xs0,Ys0,Zs0,Φ0,Ψ0,K0的值分别是:{0},{1},{2},{3},{4},{5}", Xs0, Ys0, Zs0, 0, 0, 0);//用三个角元素的初始值按(3-4-5)计算各方向余弦值,组成旋转矩阵,此时的旋转矩阵为单位矩阵I:double[,] arr3 = new double[3, 3];for (int i = 0; i < 3; i++)arr3[i, i] = 1;}double a1 = arr3[0, 0]; double a2 = arr3[0, 1]; double a3 = arr3[0, 2];double b1 = arr3[1, 0]; double b2 = arr3[1, 1]; double b3 = arr3[1, 2];double c1 = arr3[2, 0]; double c2 = arr3[2, 1]; double c3 = arr3[2, 2];/*利用线元素的初始值和控制点的地面坐标,代入共线方程(3-5-2),* 逐点计算像点坐标的近似值*///1.定义存放像点近似值的数组double[] arr4 = new double[2 * n];//----------近似值矩阵//2.逐点像点坐标计算近似值//a.计算像点的x坐标近似值(x)for (int i = 0; i < 2 * n; i += 2){for (int j = 0; j < n; j++){arr4[i] = -f * (a1 * (arr2[j, 0] - Xs0) + b1 * (arr2[j, 1] - Ys0) + c1 * (arr2[j, 2] - Zs0)) / (a3 * (arr2[j, 0] - Xs0) + b3 * (arr2[j, 1] - Ys0) + c3 * (arr2[j, 2] - Zs0)); }}//b.计算像点的y坐标近似值(y)for (int i = 1; i < 2 * n; i += 2){for (int j = 0; j < n; j++){arr4[i] = -f * (a2 * (arr2[j, 0] - Xs0) + b2 * (arr2[j, 1] - Ys0) + c2 * (arr2[j, 2] - Zs0)) / (a3 * (arr2[j, 0] - Xs0) + b3 * (arr2[j, 1] - Ys0) + c3 * (arr2[j, 2] - Zs0)); }}//逐点计算误差方程式的系数和常数项,组成误差方程:double[,] arr5 = new double[2 * n, 6]; //------------系数矩阵(A)//1.计算dXs的系数for (int i = 0; i < 2 * n; i += 2){arr5[i, 0] = -1 / m; //-f/H == -1/m}//2.计算dYs的系数for (int i = 1; i < 2 * n; i += 2){arr5[i, 1] = -1 / m; //-f/H == -1/m}//3.a.计算误差方程式Vx中dZs的系数for (int i = 0; i < 2 * n; i += 2)arr5[i, 2] = -arr1[i] / m * f;}//3.b.计算误差方程式Vy中dZs的系数for (int i = 1; i < 2 * n; i += 2){arr5[i, 2] = -arr1[i] / m * f;}//4.a.计算误差方程式Vx中dΦ的系数for (int i = 0; i < 2 * n; i += 2){arr5[i, 3] = -f * (1 + arr1[i] * arr1[i] / f * f);}//4.a.计算误差方程式Vy中dΦ的系数for (int i = 1; i < 2 * n; i += 2){arr5[i, 3] = -arr1[i - 1] * arr1[i] / f;}//5.a.计算误差方程式Vx中dΨ的系数for (int i = 0; i < 2 * n; i += 2){arr5[i, 4] = -arr1[i] * arr1[i + 1] / f;}//5.b.计算误差方程式Vy中dΨ的系数for (int i = 1; i < 2 * n; i += 2){arr5[i, 4] = -f * (1 + arr1[i] * arr1[i] / f * f);}//6.a.计算误差方程式Vx中dk的系数for (int i = 0; i < 2 * n; i += 2){arr5[i, 5] = arr1[i + 1];}//6.b.计算误差方程式Vy中dk的系数for (int i = 1; i < 2 * n; i += 2){arr5[i, 5] = -arr1[i - 1];}//定义外方位元素组成的数组double[] arr6 = new double[6];//--------------------外方位元素改正数矩阵(X)//定义常数项元素组成的数组double[] arr7 = new double[2 * n];//-----------------常数矩阵(L)//计算lx的值for (int i = 0; i < 2 * n; i += 2)arr7[i] = arr1[i] - arr4[i]; //将近似值矩阵的元素代入}//计算ly的值for (int i = 1; i <= 2 * (n - 1); i += 2){arr7[i] = arr1[i] - arr4[i]; //将近似值矩阵的元素代入}/* 对于所有像点的坐标观测值,一般认为是等精度量测,所以权阵P为单位阵.所以X=(ATA)-1ATL *///1.计算ATdouble[,] arr5T = new double[6, 2 * n];for (int i = 0; i < 6; i++){for (int j = 0; j < 2 * n; j++){arr5T[i, j] = arr5[j, i];}}//A的转置与A的乘积,存放在arr5AA中double[,] arr5AA = new double[6, 6];for (int i = 0; i < 6; i++){for (int j = 0; j < 6; j++){arr5AA[i, j] = 0;for (int l = 0; l < 2 * n; l++){arr5AA[i, j] += arr5T[i, l] * arr5[l, j];}}}nijuzhen(arr5AA);//arr5AA经过求逆后变成原矩阵的逆矩阵//arr5AA * arr5T存在arr5AARATdouble[,] arr5AARAT = new double[6, 2 * n];for (int i = 0; i < 6; i++){for (int j = 0; j < 2 * n; j++){arr5AARAT[i, j] = 0;for (int p = 0; p < 6; p++){arr5AARAT[i, j] += arr5AA[i, p] * arr5T[p, j];}}}//计算arr5AARAT x L,存在arrX中double[] arrX = new double[6];for (int i = 0; i < 6; i++){for (int j = 0; j < 1; j++){arrX[i] = 0;for (int vv = 0; vv < 6; vv++){arrX[i] += arr5AARAT[i, vv] * arr7[vv];}}}//计算外方位元素值double Xs, Ys, Zs, Φ, Ψ, K;Xs = Xs0 + arrX[0];Ys = Ys0 + arrX[1];Zs = Zs0 + arrX[2];Φ = Φ0 + arrX[3];Ψ = Ψ0 + arrX[4];K = K0 + arrX[5];for (int i = 0; i <= 2; i++){Xs += arrX[0];Ys += arrX[1];Zs += arrX[2];Φ += arrX[3];Ψ += arrX[4];K += arrX[5];}Console.WriteLine("Xs,Ys,Zs,Φ,Ψ,K的值分别是:{0},{1},{2},{3},{4},{5}", Xs0, Ys0, Zs0, Φ, Ψ, K);Console.Read();}//求arr5AA的逆矩public static double[,] nijuzhen(double[,] a) {double[,] B = new double[6, 6];int i, j, k;int row = 0;int col = 0;double max, temp;int[] p = new int[6];for (i = 0; i < 6; i++){p[i] = i;B[i, i] = 1;}for (k = 0; k < 6; k++){//找主元max = 0; row = col = i;for (i = k; i < 6; i++){for (j = k; j < 6; j++){temp = Math.Abs(a[i, j]);if (max < temp){max = temp;row = i;col = j;}}}//交换行列,将主元调整到k行k列上if (row != k){for (j = 0; j < 6; j++){temp = a[row, j];a[row, j] = a[k, j];a[k, j] = temp;temp = B[row, j];B[row, j] = B[k, j];B[k, j] = temp;i = p[row]; p[row] = p[k]; p[k] = i; }if (col != k){for (i = 0; i < 6; i++){temp = a[i, col];a[i, col] = a[i, k];a[i, k] = temp;}}//处理for (j = k + 1; j < 6; j++){a[k, j] /= a[k, k];}for (j = 0; j < 6; j++){B[k, j] /= a[k, k];a[k, k] = 1;}for (j = k + 1; j < 6; j++){for (i = 0; j < k; i++){a[i, j] -= a[i, k] * a[k, j];}for (i = k + 1; i < 6; i++){a[i, j] -= a[i, k] * a[k, j];}}for (j = 0; j < 6; j++){for (i = 0; i < k; i++){B[i, j] -= a[i, k] * B[k, j];}for (i = k + 1; i < 6; i++){B[i, j] -= a[i, k] * B[k, j];}for (i = 0; i < 6; i++) {a[i, k] = 0;a[k, k] = 1;}}//恢复行列次序for (j = 0; j < 6; j++){for (i = 0; i < 6; i++) {a[p[i], j] = B[i, j]; }}for (i = 0; i < 6; i++){for (j = 0; j < 6; j++) {a[i, j] = a[i, j];}}return a;}4.实验结果四.实验总结此次实验让我深入了解单像空间后方交会的计算过程,加强了对空间后方交会基本公式和误差方程式,法线方程式的记忆。

单片空间后方交会matlab程序

单片空间后方交会matlab程序

单片空间后方交会matlab程序f=0.15;fai=0;omi=0;ka=0;Xd=[5083.205,5780.02,5210.879,5909.264];Yd=[5852.099,5906.365,4258.446,4314.283];Zd=[527.925,571.549,461.81,455.484];%以上为输入gcp1到gcp4的地面坐标xx=[-0.07393,-0.005252,-0.079122,-0.009887];yx=[0.078705,0.078184,-0.078879,-0.080089];%右片像点坐标Xs=(5083.205+5780.02+5210.879+5909.264)/4;Ys=(5852.099+5906.365+4258.446+4314.283)/4;Sx=sqrt((xx(2)-xx(1))^2+(yx(2)-yx(1))^2);Sd=sqrt((Xd(2)-Xd(1))^2+(Yd(2)-Yd(1))^2);m=Sd/SxZs=m*f+1/4*(Zd(1)+Zd(2)+Zd(3)+Zd(4));X=[1;1;1;1;1;1];while 1a1=cos(fai)*cos(ka)-sin(fai)*sin(omi)*sin(ka);a2=-cos(fai)*sin(ka)-sin(fai)*sin(omi)*cos(ka);a3=-sin(fai)*cos(omi);b1=cos(omi)*sin(ka);b2=cos(omi)*cos(ka);b3=-sin(omi);c1=sin(fai)*cos(ka)+cos(fai)*sin(omi)*sin(ka);c2=-sin(fai)*sin(ka)+cos(fai)*sin(omi)*cos(ka);c3=cos(fai)*cos(omi);R=[a1,b1,c1;a2,b2,c2;a3,b3,c3]for n=1:1:4s1=[Xd(n)-Xs,Yd(n)-Ys,Zd(n)-Zs]';X_(n)=[a1,b1,c1]*s1;Y_(n)=[a2,b2,c2]*s1;Z_(n)=[a3,b3,c3]*s1;x(n)=-f*X_(n)/Z_(n);y(n)=-f*Y_(n)/Z_(n);end%以上循环用于求解像空间坐标x(1),y(1)到x(4),y(4)for p=1:1:4a11(p)=1/Z_(p)*(a1*f+a3*x(p));a12(p)=1/Z_(p)*(b1*f+b3*x(p)); a13(p)=1/Z_(p)*(c1*f+c3*x(p));a21(p)=1/Z_(p)*(a2*f+a3*y(p));a22(p)=1/Z_(p)*(b2*f+b3*y(p)); a23(p)=1/Z_(p)*(c2*f+c3*y(p));a14(p)=y(p)*sin(omi)-(x(p)/f*(x(p)*cos(ka)-y(p)*sin(ka))+f*cos(ka))*cos(omi);a15(p)=-f*sin(ka)-x(p)/f*(x(p)*sin(ka)+y(p)*cos(ka)); %计算A 矩阵a16(p)=y(p);a24(p)=-x(p)*sin(omi)-(y(p)/f*(x(p)*cos(ka)-y(p)*sin(ka))-f*sin(ka))*cos(omi);a25(p)=-f*cos(ka)-y(p)/f*(x(p)*sin(ka)+y(p)*cos(ka));a26(p)=-x(p) ;%右片endA=[a11(1),a12(1),a13(1),a14(1),a15(1),a16(1);a21(1),a22(1),a2 3(1),a24(1),a25(1),a26(1);a11(2),a12(2),a13(2),a14(2),a15(2),a16(2 );a21(2),a22(2),a23(2),a24(2),a25(2),a26(2);a11(3),a12(3),a13(3),a1 4(3),a15(3),a16(3);a21(3),a22(3),a23(3),a24(3),a25(3),a26(3);a11(4 ),a12(4),a13(4),a14(4),a15(4),a16(4);a21(4),a22(4),a23(4),a24(4),a2 5(4),a26(4)]lx=xx-x;ly=yx-y;%右片L=[lx(1),ly(1),lx(2),ly(2),lx(3),ly(3),lx(4),ly(4)]'X=inv(A'*A)*A'*Ldx=X(1,1);dy=X(2,1);dz=X(3,1);df=X(4,1);do=X(5,1);dk=X(6,1 );Xs=Xs+dx;Ys=dy+Ys ;Zs=dz+Zs;fai=fai+df;omi=omi+do;ka=ka+dk;if all(abs(X)<0.0003)break;endendV=A*X-LXs=Xs+dxYs=dy+YsZs=dz+Zsfai=fai+dfomi=omi+doka=ka+dkVV=0;for n=1:8VV=VV+V(n,1)*V(n,1);endQii=inv(A'*A)m0=sqrt(VV/2)mi=m0*sqrt(Qii)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一. 实验目的: 掌握摄影测量空间后方交会的原理,利用计算机编程语言实现空间后方交会外方位元素的解算。

二. 仪器用具及已知数据文件: 计算机windows xp 系统,编程软件(VISUAL C++6.0),地面控制点在摄影测量坐标系中的坐标及其像点坐标文件shuju.txt 。

三. 实验内容:单张影像的空间后方交会:利用已知地面控制点数据及相应像点坐标根据共线方程反求影像的外方位元素。

数学模型:共线条件方程式: )(3)(3)(3)(1)(1)(1Zs Z c Ys Y b Xs X a Zs Z c Ys Y b Xs X a f x -+-+--+-+--= )(3)(3)(3)(2)(2)(2Zs Z c Ys Y b Xs X a Zs Z c Ys Y b Xs X a f y -+-+--+-+--= 求解过程: (1)获取已知数据。

从航摄资料中查取平均航高与摄影机主距;获取控制点的地面测量坐标并转换为地面摄影测量坐标。

(2)量测控制点的像点坐标并做系统改正。

(3)确定未知数的初始值。

在竖直摄影且地面控制点大致分布均匀的情况下,按如下方法确定初始值,即: n X X S ∑=0,n Y Y S ∑=0,n Z mf Z S ∑=0 φ =ω=κ=0 式中;m 为摄影比例尺分母;n 为控制点个数。

(4)用三个角元素的初始值,计算个方向余弦,组成旋转矩阵R 。

(5)逐点计算像点坐标的近似值。

利用未知数的近似值和控制点的地面坐标代入共线方程式,逐点计算像点坐标的近似值(x )、(y )。

(6)逐点计算误差方程式的系数和常数项,组成误差方程式。

(7)计算法方程的系数矩阵A A T 和常数项l A T ,组成法方程式。

(8)解法方程,求得外方位元素的改正数dXs ,S dY ,s dZ ,d φ,d ω,d κ。

(9)用前次迭代取得的近似值,加本次迭代的改正数,计算外方位元素的新值。

(10)将求得的外方位元素改正数与规定的限差比较,若小于限差则迭代结束。

否则用新的近似值重复(4)~(9),直到满足要求为止。

四.实验结果:程序的源代码如下所示:#include<stdio.h>#include<stdlib.h>#include<malloc.h>#include<math.h>#include<conio.h>#define N 4void turn(double *A,double A2[],int m,int n) //计算矩阵的转置{int i,j;for(i=0;i<m;i++)for(j=0;j<n;j++)A2[j*m+i]=A[i*n+j];}void mulAB(double *A,double *B,double *C,int am,int an,int bm,int bn) //计算两矩阵相乘{int i,j,l,u;if(an!=bm){printf("error!cannot do the multiplication.\n");return;}for(i=0;i<am;i++)for(j=0;j<bn;j++){u=i*bn+j;C[u]=0.0;for(l=0;l<an;l++)C[u]+=A[i*an+l]*B[l*bn+j];}return;}double *inv(double *a,int n) //计算矩阵的逆,本程序的难点{ //采用高斯-约旦-全选主元法int *is,*js,i,j,k,l,u,v;double d,p;is=(int*)malloc(n*sizeof(int));js=(int*)malloc(n*sizeof(int));{d=0.0;for (i=k;i<n;i++)for (j=k;j<n;j++){ l=i*n+j;p=fabs(a[l]);if (p>d){d=p;is[k]=i;js[k]=j;}}if (d+1.0==1.0){ free(is);free(js);printf("error not inv\n");return NULL;}if (is[k]!=k)for (j=0;j<n;j++){ u=k*n+j;v=is[k]*n+j;p=a[u];a[u]=a[v];a[v]=p;}if (js[k]!=k)for (i=0;i<n;i++){ u=i*n+k;v=i*n+js[k];p=a[u];a[u]=a[v];a[v]=p;}l=k*n+k;a[l]=1.0/a[l];for (j=0;j<n;j++)if (j!=k){u=k*n+j;a[u]=a[u]*a[l];}if (i!=k)for (j=0;j<n;j++)if (j!=k){ u=i*n+j;a[u]=a[u]-a[i*n+k]*a[k*n+j];}for (i=0;i<n;i++)if (i!=k){ u=i*n+k;a[u]=-a[u]*a[l];}}for (k=n-1;k>=0;k--){ if (js[k]!=k)for (j=0;j<=n-1;j++){ u=k*n+j;v=js[k]*n+j;p=a[u];a[u]=a[v];a[v]=p;}if (is[k]!=k)for (i=0;i<n;i++){ u=i*n+k;v=i*n+is[k];p=a[u];a[u]=a[v];a[v]=p;}}free(is);free(js);return a;}void printmatrix(double M[],int m,int n) //矩阵的输出{int i,j;for(i=0;i<m;i++){for(j=0;j<n;j++)printf("%.5f",M[i*n+j]);printf("\n");}printf("\n");}main() //主函数,空间后方交会的计算{FILE *fp; //定义一个文件指针fpint m,i,j=0;double f,t,w,k,S1=0.0,S2=0.0,S3=0.0,x[N],y[N],x0[N],y0[N],X[N],Y[N],Z[N],Xs0,Ys0,Zs0;double a[3],b[3],c[3],A[2*N*6],AT[6*2*N],ATA[6*6],*ATA_=NULL,l[2*N],ATl[6],V[6];if((fp=fopen("e:\\shuju.txt","r"))==NULL) //使fp指向被打开的shuju.txt文件{ //并判断文件是否打开成功printf("\nerror on open shuju.txt\n");getch();exit(1);}for(i=0;i<N;i++)fscanf(fp,"%lf%lf%lf%lf%lf",&x[i],&y[i],&X[i],&Y[i],&Z[i]); //将文件中的数据赋给主函数定义的变量printf("原始数据:\n");printf("x\t\ty\t\t\X\t\tY\t\tZ\t\t\n"); //输出文件中的原始数据for(i=0;i<N;i++)printf("%lf %lf %lf %lf %lf\n",x[i],y[i],X[i],Y[i],Z[i]);printf("\n请输入摄影机主距和摄影比例尺分母;f,m:");scanf("%lf,%lf",&f,&m); //输入f,mf=f/1000.0;for(i=0;i<N;i++){x[i]/=1000.0;y[i]/=1000.0;S1+=X[i];S2+=Y[i];S3+=Z[i];}Xs0=S1/N;Ys0=S2/N; //计算外方位元素的初始值Zs0=m*f+S3/N;t=0.0;w=0.0;k=0.0;while(j<3){printf("---------------------------------第%d次计算------------------------------\n",j+1);a[0]=cos(t)*cos(k)-sin(t)*sin(w)*sin(k);a[1]=-cos(t)*sin(k)-sin(t)*sin(w)*cos(k);a[2]=-sin(t)*cos(w);b[0]=cos(w)*sin(k);b[1]=cos(w)*cos(k); //计算旋转矩阵b[2]=-sin(w);c[0]=sin(t)*cos(k)+cos(t)*sin(w)*sin(k);c[1]=-sin(t)*sin(k)+cos(t)*sin(w)*cos(k);c[2]=cos(t)*cos(w);for(i=0;i<N;i++){x0[i]=-f*(a[0]*(X[i]-Xs0)+b[0]*(Y[i]-Ys0)+c[0]*(Z[i]-Zs0))/(a[2]*(X[i]-Xs0)+b[2]*(Y[i]-Y s0)+c[2]*(Z[i]-Zs0)); //计算像点坐标近似值y0[i]=-f*(a[1]*(X[i]-Xs0)+b[1]*(Y[i]-Ys0)+c[1]*(Z[i]-Zs0))/(a[2]*(X[i]-Xs0)+b[2]*(Y[i]-Y s0)+c[2]*(Z[i]-Zs0));G[i]=a[2]*(X[i]-Xs0)+b[2]*(Y[i]-Ys0)+c[2]*(Z[i]-Zs0);}for(i=0;i<N;i++){A[i*12+0]=(a[0]*f+a[2]*x[i])/G[i];A[i*12+1]=(b[0]*f+b[2]*x[i])/G[i];A[i*12+2]=(c[0]*f+c[2]*x[i])/G[i];A[i*12+3]=y[i]*sin(w)-(x[i]*(x[i]*cos(k)-y[i]*sin(k))/f+f*cos(k))*cos(w); //计算误差方程的系数阵以及lA[i*12+4]=-f*sin(k)-x[i]*(x[i]*sin(k)+y[i]*cos(k))/f;A[i*12+5]=y[i];A[i*12+6]=(a[1]*f+a[2]*y[i])/G[i];A[i*12+7]=(b[1]*f+b[2]*y[i])/G[i];A[i*12+8]=(c[1]*f+c[2]*y[i])/G[i];A[i*12+9]=-x[i]*sin(w)-(y[i]*(x[i]*cos(k)-y[i]*sin(k))/f-f*sin(k))*cos(w);A[i*12+10]=-f*cos(k)-y[i]*(x[i]*sin(k)+y[i]*cos(k))/f;A[i*12+11]=-x[i];l[i*2+0]=x[i]-x0[i];l[i*2+1]=y[i]-y0[i];}// printf("output matrix: A\n");// printmatrix(A,2*N,6);// printf("output matrix: l\n");// printmatrix(l,2*N,1);turn(A,AT,2*N,6);// printf("output matrix: AT\n");// printmatrix(AT,6,2*N);mulAB(AT,A,A TA,6,2*N,2*N,6); //间接平差法计算外方位元素,中间计算的矩阵可以根据需要// printf("output matrix: ATA\n"); //选择性的输出,这里将其屏蔽,为了在打印输出结果的时候// printmatrix(ATA,6,6); //节约资源ATA_=inv(ATA,6);// printf("output matrix: ATA_\n");// printmatrix(ATA_,6,6);mulAB(AT,l,A Tl,6,2*N,2*N,1);// printf("outpit matrinx: ATl\n");// printmatrix(ATl,6,1);mulAB(ATA_,ATl,V,6,6,6,1);// printf("output matrix: V\n");// printmatrix(V,6,1);Xs0+=V[0];Ys0+=V[1];Zs0+=V[2];t+=V[3];w+=V[4];k+=V[5];printf("第%d次计算的外方位元素为:\n",++j);printf("Xs=%.5lf,Ys=%.5lf,Zs=%.5lf,t=%.5lf,w=%.5lf,k=%.5lf\n",Xs0,Ys0,Zs0,t,w,k);}printf("\n外方位元素为:\n");printf("Xs=%.5lf,Ys=%.5lf,Zs=%.5lf,t=%.5lf,w=%.5lf,k=%.5lf\n",Xs0,Ys0,Zs0,t,w,k);fclose(fp);}程序运行的结果为:五.实验总结:通过这次的实验我学到了很多的东西,通过编程加深了对摄影测量空间后方交会相关知识的理解。

相关文档
最新文档