使用 2D 多点定位对非相交距离进行位置估计

计算科学 matlab 最优控制
2021-12-21 05:43:47

我正在尝试估计一个点的位置P在 Matlab 中。我有n已知位置的接入点 (AP) (n>2) 以及到该点的距离P从每个 AP。这些距离都有距离误差。如果来自已知节点的圆圈相交,我知道如何使用多点测量来解决这个问题,但它们不会。

距离是根据 RSSI 测量值(接收到的信号强度指示)计算得出的,并且可能会被加权(如果 RSSI 高,则权重更大)。

请参阅下面的代码。请注意,我没有对 RSSI 测量值进行加权。我正在创建一个错误函数,其中xpyp是该点的未知坐标。xy是 AP 的已知坐标。我想总结所有错误并找到xpyp最小化误差函数,但不确定如何在 Matlab 中执行此操作。

    for n=1:N           % N - number of APs
        d(n)=getDistance(rssi(n),tx,2);
        err=@(px,py) sqrt((x(n)-px).^2+(y(n)-py).^2)-d(n);
    end
    err=sum(err);    % this doesn't work obviously
    x0 = [xp_true(k),yp_true(k)];
    out= fminunc(err,x0);
    xp(k,sample)=out(1);
    yp(k,sample)=out(2);
1个回答

您描述的问题是非线性最小二乘问题的一个示例。您可以在此处找到解决此类问题的 MATLAB 函数的文档以及描述数学和数值方法的几个参考资料:lsqnonlin

最小二乘问题背后的想法是,您拥有的数据点(您的案例中的接入点位置和距离)比未知数(您的案例中未知点的 x 和 y 位置)更多。

解决这个问题的简单 MATLAB 代码是

  % function to calculate the error in distance between point and access point
  % x, y, and d are known vectors of length > 2
  fun = @(xyp) distResidual(xyp, x, y, d);
  xy0 = [0 0]; % initial guess at the point's x and y location
  xy = lsqnonlin(fun, xy0)

其中x, yd是访问点集合到该点的已知 x、y 和距离向量。distResidual函数的定义是

function F=distResidual(xy, x, y, d)
    F = (x-xy(1)).^2 + (y-xy(2)).^2 - d.^2;
  end