编写一个大地测量里坐标转换求七参数的代码,整个代码没有报错但运行不了,显示将一个无效参数传递给了将无效参数视为严重错误的函数,完整代码如下,请大佬指点
#include <iostream>
#include<Eigen/Dense>
#include<fstream>
#include<cmath>
#include<vector>
using namespace std;
using namespace Eigen;
struct Point//定义一个Point结构体用于储存三位点
{
string name;
double x;
double y;
double z;
};
struct Parameters//定义转换参数结构体
{
double dx;//x平移参数
double dy;//y平移参数
double dz;//z平移参数
double rx;//x旋转参数
double ry;//y旋转参数
double rz;//z旋转参数
double dk;//尺度因子
};
std::vector<Point>readCoordinates(const string& filename)
{
std::vector<Point>coordinates;//从文件读取坐标数据并储存在容器中
ifstream file(filename);
if (!file.is_open())
{
cerr << "Failed to open file:" << filename << endl;
return coordinates;
}
string name;
double x, y, z;
while (file >> name>>x >> y >> z)
{
Point point = { name,x,y,z };
coordinates.push_back(point);
}
file.close();
return coordinates;
}
//估计七参数的值
Parameters estimateParameters(const std::vector<Point>& origin, const std::vector<Point>& target)
{
Parameters params = {};
vector<Point> L ;
for (int i = 0; i <= origin.size(); i++)
{
L[i].x = target[i].x - origin[i].x;
L[i].y = target[i].y - origin[i].y;
L[i].z = target[i].z - origin[i].z;
}
//检查输入坐标数量是否相同
if (origin.size() != target.size())
{
cerr << "Error:The number of origin and target coordinates does not match" << endl;
return params;
}
//计算坐标平均值
double originXMean = 0;
double originYMean = 0;
double originZMean = 0;
double targetXMean = 0;
double targetYMean = 0;
double targetZMean = 0;
/*for (int i = 0; i < origin.size() - 2; ++i)
{
originXMean += origin[i].x;
originYMean += origin[i].y;
originZMean += origin[i].z;
targetXMean += target[i].x;
targetYMean += target[i].y;
targetXMean += target[i].z;
}*/
MatrixXd B((origin.size() - 2) * 3, 7);
VectorXd N((origin.size() - 2) * 3);
//通过循环初始化B矩阵和N矩阵
for (size_t i = 0; i <= origin.size() - 2;i++)
{
B.row(i * 3) << 1.0, 0.0, 0.0, 0.0, -origin[i].z, origin[i].y, origin[i].x;
B.row(i * 3 + 1) << 0.0, 1.0, 0.0, origin[i].z, 0.0, -origin[i].x, origin[i].z;
B.row(i * 3 + 2) << 0.0, 0.0, 1.0, -origin[i].y, origin[i].x, 0.0, origin[i].z;
N.row(i * 3) << L[i].x;
N.row(i * 3 + 1) << L[i].y;
N.row(i * 3 + 2) << L[i].z;
}
//最小二乘法求解七参数
VectorXd parameters = (B.transpose() * B).inverse() * B.transpose() * N;
//解析七参数
params.dx = parameters(0);
params.dy = parameters(1);
params.dz = parameters(2);
params.rx = parameters(3);
params.ry = parameters(4);
params.rz = parameters(5);
params.dk = parameters(6);
return params;
}
int main()
{
string originFilename = "XYZ_origin_2.xyz";
string targetFilename = "XYZ_target_2.xyz";
vector<Point>originCoordinates = readCoordinates(originFilename);
vector<Point>targetCoordinates = readCoordinates(targetFilename);
Parameters params = estimateParameters(originCoordinates, targetCoordinates);
std::cout << "Estimated Parameters:" << std::endl;
std::cout << "dx: " << params.dx << std::endl;
std::cout << "dy: " << params.dy << std::endl;
std::cout << "dz: " << params.dz << std::endl;
std::cout << "w: " << params.rx << std::endl;
std::cout << "p: " << params.ry << std::endl;
std::cout << "r: " << params.rz << std::endl;
std::cout << "scale: " << params.dk << std::endl;
return 0;
}