c - 实现 TDOA 三边测量 Fang 算法的问题

标签 c algebra trilateration

我一直在关注this paper (特别是有关 Fang 方法的部分),试图使用 TDOA technique 来解决三边测量问题。 。

我希望有Fang/TDOA经验的人可以向我伸出援助之手。由于某种原因,我的实现将错误的根返回到最终的二次方。这是我到目前为止编写的代码:

#include <stdio.h>
#include <math.h>

struct Point {
    double x;
    double y;
};

inline double sqr(double n) {
    return n * n;
}

// r1 and r2 are the TDOA of the sound impulse to p1 and p2, respectively
void fang(double r1, double r2) {
    // transmitter coords
    Point tx = {0.7, -0.1};

    // receiver coordinates
    Point p0 = {0, 0};
    Point p1 = {1.7320508075688772, 0};
    Point p2 = {0.8660254037844388, 1.5};

    // linear coefficients
    double g = ((r2 * (p1.x/r1)) - p2.x) / p2.y;
    double h = (sqr(p2.x) + sqr(p2.y) - sqr(r2) + r2 * r1 * sqr(1 - (p1.x / r1))) / (2 * p2.y);

    // quadratic coefficents
    double d = -(1 - sqr(p1.x / r1) + sqr(g));
    double e = p1.x * (1 - sqr(p1.x / r1)) - (2 * g * h);
    double f = (sqr(r1) / 4) * sqr(1 - sqr(p1.x / r1)) - sqr(h);

    double result_x = (-e - sqrt(sqr(e) - (4 * d * f))) / (2 * d);
}

int main() {
    // these values have been calculated a-priori, from the known transmitter coords
    double r1 = 0.32977743096231715;
    double r2 = 0.90148404145971694;
    fang(r1, r2);
}

最终我希望 x_result 等于发射器的 x 坐标 (tx.x == 0.7),但令人沮丧的是结果是 ≈ 0.237.

我的确切问题的轮廓(及其解决方案,两条双曲线相交的地方)可以在下图中以几何方式查看:

TDOA graph

任何帮助将不胜感激!

最佳答案

本文给出了使用 Fang 方法计算 h 的结果:

Calculation for <code>h</code>

您的代码错误地计算了整个 (1 - (p1.x/r1)) 表达式的平方,而不仅仅是 (p1.x/r1) 部分。此外,您使用了错误的值(p2p1),而不是正确的值(p3p2) 。要修复此问题,只需将 h 更改为:

double h = (sqr(p3.x) + sqr(p3.y) - sqr(r3) + r3 * r2 * (1 - sqr(p2.x / r2))) / (2 * p3.y);

关于c - 实现 TDOA 三边测量 Fang 算法的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58228533/

相关文章:

使用 OpenCV 将图像文档转换为黑白

floating-point - 相等的加法性质对 float 有效吗?

python - 如何计算每个帖子的 xyz 位置和时间差的多边定位?

c - C 变量在底层包含哪些信息?

c - 打开文件时出现错误

无需绘图即可找到多项式的最大值/最小值的算法

algorithm - 计算 1^X + 2^X + ... + N^X mod 1000000007

ios - 使用iBeacons进行双边

javascript - Javascript 中的 3D 三边测量

c - 写入和打印两个字符串交替组合时出现段错误?