三边测量(2D)算法实现

我正在尝试在二维空间中实现三边测量过程。相关的维基百科文章在这里:三边测量

我在这个网站上找到了一个很好的问题,算法解释得很清楚:人工智能

总之,我尝试用C++实现这个算法。不幸的是,我遇到了一些问题……让我们看看我的实现。这只是一个函数:前三个输入是向量,每个向量代表一个具有X,Y坐标的二维点。其他输入变量(r1,r2,r3)代表每个点的距离/半径。

#include <iostream>#include <fstream>#include <sstream>#include <math.h> #include <vector>using namespace std;std::vector<double> trilateration(double point1[], double point2[], double point3[], double r1, double r2, double r3) {    std::vector<double> resultPose;    //从点1到点2的方向上的单位向量    double p2p1Distance = pow(pow(point2[0]-point1[0],2) + pow(point2[1]-point1[1],2),0.5);    double exx = (point2[0]-point1[0])/p2p1Distance;    double exy = (point2[1]-point1[1])/p2p1Distance;    //x分量的符号大小    double ix = exx*(point3[0]-point1[0]);    double iy = exy*(point3[1]-point1[1]);    //y方向上的单位向量     double eyx = (point3[0]-point1[0]-ix*exx)/pow(pow(point3[0]-point1[0]-ix*exx,2) + pow(point3[1]-point1[1]-iy*exy,2),0.5);    double eyy = (point3[1]-point1[1]-iy*exy)/pow(pow(point3[0]-point1[0]-ix*exx,2) + pow(point3[1]-point1[1]-iy*exy,2),0.5);    //y分量的符号大小    double jx = eyx*(point3[0]-point1[0]);    double jy = eyy*(point3[1]-point1[1]);    //坐标    double x = (pow(r1,2) - pow(r2,2) + pow(p2p1Distance,2))/ (2 * p2p1Distance);    double y = (pow(r1,2) - pow(r3,2) + pow(iy,2) + pow(jy,2))/2*jy - ix*x/jx;    //结果坐标    double finalX = point1[0]+ x*exx + y*eyx;    double finalY = point1[1]+ x*exy + y*eyy;    resultPose.push_back(finalX);    resultPose.push_back(finalY);    return resultPose;}

如我所述,我遵循了这篇文章。我认为问题出在计算y坐标的部分。我对最后计算finalX, finalY的部分也不确定…

我的主函数如下:

int main(int argc, char* argv[]){    std::vector<double> finalPose;    double p1[] = {4.0,4.0};    double p2[] = {9.0,7.0};    double p3[] = {9.0,1.0};    double r1,r2,r3;    r1 = 4;    r2 = 3;    r3 = 3.25;    finalPose = trilateration(p1,p2,p3,r1,r2,r3);    cout<<"X:::  "<<finalPose[0]<<endl;    cout<<"Y:::  "<<finalPose[1]<<endl;     //x = 8, y = 4.1}

结果应该接近X~8和Y~4.1,但我得到的X = 13.5542和Y=-5.09038

所以我的问题和疑问是:我在计算x和y的过程中遇到了问题。我认为我可以解决到x的算法,之后在计算y时遇到了问题。

y的计算如下:y = (r12 – r32 + i2 + j2) / 2j – ix / j

我不知道在这里应该使用哪个i和j,因为我有两个i(ix,iy)和两个j(jx,jy)。如你所见,我使用了iy和jy,但在行尾由于与x相乘,我使用了ix。提前感谢!


回答:

链接的SO回答中,有点不清楚,并且可能不正确的是,ij的值是标量值,并且计算方式与其他向量量略有不同。更明确地说,你应该有:

i = ex · (P3 – P1) = exx (P3x – P1x) + exy (P3y – P1y) = ix + iy

j = ey · (P3 – P1) = eyx (P3x – P1x) + eyy (P3y – P1y) = jx + jy

请注意,·在这里是两个向量的点积。因此,在你的代码中不应该有ixiyjxjy

另外,在你计算y时,你应该将/2*j的分母改为:

 / (2*j)

否则你是在乘以j而不是除以。进行这些更改后,我得到的结果是[7.05, 5.74],这更接近你期望的值。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注