卫星导航定位课程设计根据观测值公式和卫星导航计算公式得到对应接收机的三维坐标实现文件的批量输入和输出采用循环方式计算卫星位置编写C++程序
#include
//常量定义 const int MAX_SATELLITES = 10; //最大卫星数 const double SPEED_OF_LIGHT = 299792458; //光速 const double EARTH_GRAVITY = 9.80665; //重力加速度 const double EARTH_RADIUS = 6378137; //地球半径 const double PI = 3.141592653589793; //圆周率
//结构体定义 struct Satellite { int id; //卫星编号 double x, y, z; //卫星在空间直角坐标系中的坐标 double t; //信号传播时间 double phi; //接收机到卫星的距离与信号传播时间的比值 };
//函数声明 void readData(Satellite sats[], int &n, string filename); //从文件中读取观测数据 void writeResult(double x, double y, double z, string filename); //将计算结果写入文件 double getDistance(double x1, double y1, double z1, double x2, double y2, double z2); //计算两点之间的距离 double getSatelliteDistance(Satellite sat, double x, double y, double z); //计算接收机到卫星的距离 double getSatelliteClockOffset(double t, double phi); //计算卫星钟差 double getSatellitePosition(double x, double y, double z, Satellite sats[], int n); //计算卫星在空间直角坐标系中的坐标 double getReceiverPosition(Satellite sats[], int n); //计算接收机的坐标
int main() { Satellite sats[MAX_SATELLITES]; //卫星数组 int n; //卫星数 double x, y, z; //接收机坐标
//读取观测数据
readData(sats, n, "input.txt");
//计算接收机坐标
x = getReceiverPosition(sats, n);
//将计算结果写入文件
writeResult(x, y, z, "output.txt");
return 0;
}
//从文件中读取观测数据 void readData(Satellite sats[], int &n, string filename) { ifstream fin(filename); fin >> n; for (int i = 0; i < n; i++) { fin >> sats[i].id >> sats[i].x >> sats[i].y >> sats[i].z >> sats[i].t >> sats[i].phi; } fin.close(); }
//将计算结果写入文件 void writeResult(double x, double y, double z, string filename) { ofstream fout(filename); fout << x << " " << y << " " << z; fout.close(); }
//计算两点之间的距离 double getDistance(double x1, double y1, double z1, double x2, double y2, double z2) { return sqrt(pow(x1 - x2, 2) + pow(y1 - y2, 2) + pow(z1 - z2, 2)); }
//计算接收机到卫星的距离 double getSatelliteDistance(Satellite sat, double x, double y, double z) { double d = getDistance(sat.x, sat.y, sat.z, x, y, z); return d - SPEED_OF_LIGHT * sat.t - getSatelliteClockOffset(sat.t, sat.phi); }
//计算卫星钟差 double getSatelliteClockOffset(double t, double phi) { return SPEED_OF_LIGHT * (phi - 1) * t; }
//计算卫星在空间直角坐标系中的坐标 double getSatellitePosition(double x, double y, double z, Satellite sats[], int n) { double x0 = 0, y0 = 0, z0 = 0; double delta = 1; while (delta > 0.01) { double sum_x = 0, sum_y = 0, sum_z = 0; for (int i = 0; i < n; i++) { double d = getSatelliteDistance(sats[i], x0, y0, z0); sum_x += (sats[i].x - x0) / d; sum_y += (sats[i].y - y0) / d; sum_z += (sats[i].z - z0) / d; } double x1 = x0 + sum_x / n; double y1 = y0 + sum_y / n; double z1 = z0 + sum_z / n; delta = getDistance(x0, y0, z0, x1, y1, z1); x0 = x1; y0 = y1; z0 = z1; } return x0; }
//计算接收机的坐标 double getReceiverPosition(Satellite sats[], int n) { double x0 = 0, y0 = 0, z0 = 0; double delta = 1; while (delta > 0.01) { double sum_x = 0, sum_y = 0, sum_z = 0; for (int i = 0; i < n; i++) { double d = getSatelliteDistance(sats[i], x0, y0, z0); sum_x += (sats[i].x - x0) / d; sum_y += (sats[i].y - y0) / d; sum_z += (sats[i].z - z0) / d; } double x1 = x0 + sum_x / n; double y1 = y0 + sum_y / n; double z1 = z0 + sum_z / n; delta = getDistance(x0, y0, z0, x1, y1, z1); x0 = x1; y0 = y1; z0 = z1; } return x0;
原文地址: http://www.cveoy.top/t/topic/fHM0 著作权归作者所有。请勿转载和采集!