单向后方交会实验报告C.doc
14页单向前方交会实验报告C++ 实验报告 班级:测绘一班 学号: 目录 一、计算原理 ......................................... 3 二、算法流程 ......................................... 4 三、源程序 ........................................... 5 四、计算结果 ........................................ 13 五、结果分析 ........................................ 13 六、心得体会 ........................................ 13 一、计算原理 条件 摄影机主距f=153.24mm,x0=0.01mm,y0=0.02mm, 像片比例尺为1:40000,有四对点的像点坐标与相应的地面坐标如下表 以单像空间前方交会方法,求解该像片的外方位元素 二、算法流程 〔1〕获取数据。
从航摄资料中差取平均航高与摄影机主距;获取控制点的地面测量坐标并转换为地面摄影坐标 〔2〕量测控制点的像点坐标并作系统误差改正 〔3〕确定未知数的初始值在竖直摄影且地面控制点大体对称分布的情况下,按如下方法确定初始值,即 X0SX?,Yn0SY?,Zn0 S?mf?1?Z n ?0??0??0?0 〔4〕用三个角元素的初始值按下式,计算各个方向余弦值,组成旋转矩阵R a1?cos?cos??sin?sin?sin?a2??cos?sin??sin?sin?cos?a3??sin?cos?b1?cos?sin?b2?cos?cos? b3??sin? c1?sin?cos??cos?sin?sin?c2??sin?sin? ?cos?sin?cos?c3?cos?cos? 〔5〕逐点计算像点坐标的近似值利用未知数的近似值和控制点的地面坐标;带入共线方程式,逐点近似像点坐标的近似值〔x〕、〔y〕 〔6〕逐点计算误差方程式的系数和常数项,组成误差方程式 〔7〕计算法方程的系数矩阵ATA和常数项ALL,组成法方程式 〔8〕 解法方程,求得外方位元素的改正数dXS、dYS、dZS、d?、d?、d?。
〔9〕用前次迭代取得的近似值,加本次迭代的改正数,计算外方位元素的新值 KK?1KKK?1K XS?XS?dXS,YSK?YSK?1?dYSK,ZS?ZS?dZS ?K??K?1?d?K,?K??K?1?d?K,?K??K?1?d?K 〔10〕将求得的外方位元素改正数与规定的限差比拟,假设小于限差,那么迭代结束 负责用新的近似值重复〔4〕-〔9〕,直到满足要求为止 用共线方程进行空间前方交会的程序框如下图 否 二.源程序 //2021113214 徐福辉 #include<iostream> #include<fstream> #include<iomanip> using namespace std; const int n = 6; void inverse(double c[n][n]); template<typename T1, typename T2>void transpose(T1*mat1, T2*mat2, int a, int b); template<typename T1, typename T2>void multi(T1*mat1, T2*mat2, T2 * result, int a, int b, int c); int main() { double x[4][2] = { -0.08616, -0.06897, -0.05341, 0.08223, -0.01479, -0.07661, 0.01045, 0.06445 }; double X[4][3] = { 36589.41, 25273.32, 2195.17, 37631.08, 31324.51, 728.69, 39100.97, 24934.98, 2386.50, 40426.54, 30319.81, 757.31 }; int i, j, m = 1;//n为迭代次数 double X0[6] = { 0 };//设定未知数(XS,YS,ZS, ψ,ω,κ)初始值 double a = 1 / 40000.0;//像片比例尺为1:40000 double R[3][3] = { 0 };//初始化旋转矩阵R double dayue_x[8] = { 0 };//用于存放像点估计值 = 0; j<2; j++) { cout << fixed; if (j == 0) { cout << "x" << i + 1 << "= " << setw(10) << x[i][j] << ""; } else { cout << "y" << i + 1 << "= " << setw(10) << x[i][j] << endl; } } cout << "地面四个点的坐标为:\n"; for (i = 0; i<4; i++) for (j = 0; j<3; j++) { if (j == 0) { cout << "X" << i + 1 << "= " << X[i][j] << ""; } else if (j == 1) { cout << "Y" << i + 1 << "= " << X[i][j] << ""; } else { cout << "Z" << i + 1; cout << "= "; cout << X[i][j] << endl; } } cout << endl; for (j = 0; j<3; j++) for (i = 0; i<4; i++) sumXYZ[j] += X[i][j]; for (i = 0; i<2; i++) X0[i] = sumXYZ[i] / 4;//X0,Y0初始化 X0[i] = 1 / a*f + sumXYZ[2] / 4.0;//Z0初始化 do{ R[0][0] = cos(X0[3])*cos(X0[5]) - sin(X0[3])*sin(X0[4])*sin(X0[5]); R[0][1] = -cos(X0[3])*sin(X0[5]) - sin(X0[3])*sin(X0[4])*cos(X0[5]); R[0][2] = -sin(X0[3])*cos(X0[4]); R[1][0] = cos(X0[4])*sin(X0[5]); R[1][1] = cos(X0[4])*cos(X0[5]); R[1][2] = -sin(X0[4]); R[2][0] = sin(X0[3])*cos(X0[5]) + cos(X0[3])*sin(X0[4])*sin(X0[5]); R[2][1] = -sin(X0[3])*sin(X0[5]) + cos(X0[3])*sin(X0[4])*cos(X0[5]); R[2][2] = cos(X0[3])*cos(X0[4]); //第一个像点的估计值,其坐标位于X[0][0],X[0][1],X[0][2] dayue_x[0] = -f*(R[0][0] * (X[0][0] - X0[0]) + R[1][0] * (X[0][1] - X0[1]) + R[2][0] * (X[0][2] - X0[2])) / (R[0][2] * (X[0][0] - X0[0]) + R[1][2] * (X[0][1] - X0[1]) + R[2][2] * (X[0][2] - X0[2])); dayue_x[1] = -f*(R[0][1] * (X[0][0] - X0[0]) + R[1][1] * (X[0][1] - X0[1]) + R[2][1] * (X[0][2] - X0[2])) / (R[0][2] * (X[0][0] - X0[0]) + R[1][2] * (X[0][1] - X0[1]) + R[2][2] * (X[0][2] - X0[2])); //第二个像点的估计值,其坐标位于X[1][0],X[1][1],X[1][2] dayue_x[2] = -f*(R[0][0] * (X[1][0] - X0[0]) + R[1][0] * (X[1][1] - X0[1]) + R[2][0] * (X[1][2] - X0[2])) / (R[0][2] * (X[1][0] - X0[0]) + R[1][2] * (X[1][1] - X0[1]) + R[2][2] * (X[1][2] - X0[2])); dayue_x[3] = -f*(R[0][1] * (X[1][0] - X0[0]) + R[1][1] * (X[1][1] - X0[1]) + R[2][1] * (X[1][2] - X0[2])) / (R[0][2] * (X[1][0] - X0[0]) + R[1][2] * (X[1][1] - X0[1]) + R[2][2] * (X[1][2] - X0[2])); //第三个像点的估计值,其坐标位于X[2][0],X[2][1],X[2][2] dayue_x[4] = -f*(R[0][0] * (X[2][0] - X0[0]) + R[1][0] * (X[2][1] - X0[1]) + R[2][0] * (X[2][2] - X0[2])) / (R[0][2] * (X[2][0] - X0[0]) + R[1][2] * (X[2][1] - X0[1]) + R[2][2] * (X[2][2] - X0[2])); dayue_x[5] = -f*(R[0][1] * (X[2][0] - X0[0]) + R[1][1] * (X[2][1] - X0[1]) + R[2][1] * (X[2][2] - X0[2])) / (R[0][2] * (X[2][0] - X0[0]) + R[1][2] * (X[2][1] - X0[1]) + R[2][2] * (X[2][2] - X0[2])); //第四个像点的估计值,其坐标位于X[3][0],X[3][1],。





