ここには多くの背景があります。質問まで下にスクロールしてください
SLAMは線形最小二乗問題からどれだけ離れているかで説明されているマップ結合アルゴリズムを試しています。具体的には、式(36)。私が書いたコードは、ランドマーク位置の2番目のマップの値を常に取るようです。私の質問は、私はテキストを正しく理解しているか、または何らかのエラーを犯しているかです。数式を理解し、コードがそれをどのように実装するかを示しながら、数式を説明します。2つのローカルマップを結合するという単純なケースを実行しようとしています。
論文(36)によると、2つのローカルマップをを最小化状態ベクトルが見つかります。
2つのローカルマップとに展開しました。
私が理解しているように、サブマップはグローバルマップの統合観測と見なすことができるため、はサブマップに関連付けられたノイズです(サブマップの作成に使用したEKFのプロセスノイズではなく、異なる場合があります)。
ベクトルは、最初のマップのポーズ、2番目のマップのポーズ、および両方のマップのランドマークの和集合です。
関数は次のとおりです。
以下の私の評価が正しいとは思いません。
最初の2つの要素は、前のマップの参照フレームでのロボットのポーズです。たとえば、マップ1の場合、ポーズは初期フレームにます。マップ2の場合は、マップ1のフレームになります。
次の要素グループは、マップ1とマップ2に共通するもので、マップ1の参照フレームに変換されます。
最後の行は、最初のマップのフレーム内のマップ2に固有の機能です。
私のmatlab実装は次のとおりです。
function [G, fval, output, exitflag] = join_maps(m1, m2)
    x = [m2(1:3);m2];
    [G,fval,exitflag,output] = fminunc(@(x) fitness(x, m1, m2), x, options);
end
function G = fitness(X, m1, m2)
    m1_f = m1(6:3:end);
    m2_f = m2(6:3:end);
    common = intersect(m1_f, m2_f);
    P = eye(size(m1, 1)) * .002;
    r = X(1:2);
    a = X(3);
    X_join = (m1 - H(X, common));
    Y_join = (m2 - H(X, common));
    G = (X_join' * inv(P) * X_join) + (Y_join' * inv(P) * Y_join);
end
function H_j = H(X, com)
    a0 = X(3);
    H_j = zeros(size(X(4:end)));
    H_j(1:3) = X(4:6);
    Y = X(1:2);
    len = length(X(7:end));
    for i = 7:3:len
        id = X(i + 2);
        if find(com == id)
            H_j(i:i+1) = R(a0) * (X(i:i+1) - Y);
            H_j(i+2) = id;
        else  % new lmk
            H_j(i:i+2) = X(i:i+2);
        end
    end
end
function A = R(a)
    A = [cos(a) -sin(a); 
         sin(a)  cos(a)];
end
上記のフィットネス関数の最小値を見つけるために最適化ツールボックスを使用しています。フィットネス関数自体はかなり単純だと思います。関数Hは、上記のベクトルHを返します。
結果は: 2つのベクトルでjoin_mapsを実行すると
map_1 = [3.7054;1.0577;-1.9404; %robot x, y, angle
      2.5305;-1.0739;81.0000]; % landmark x, y, id
map_2 = [3.7054;1.0577;-1.9404;
         2.3402;-1.1463;81.0000]; % note the slightly different x,y
[G,fv,output,exitflag] = join_maps(map_1, map_2)
出力は次のとおりです。
Warning: Gradient must be provided for trust-region algorithm;
  using line-search algorithm instead. 
> In fminunc at 341
  In join_maps at 7
Local minimum found.
Optimization completed because the size of the gradient is less than
the default value of the function tolerance.
<stopping criteria details>
Local minimum possible.
fminunc stopped because it cannot decrease the objective function
along the current search direction.
<stopping criteria details>
G = 
      3.7054
      1.0577
     -1.9404
      3.7054
      1.0577
     -1.9404
      2.3402
     -1.1463
      81.0000
 fv =
     1.3136e+07
  output = 
     iterations: 1
      funcCount: 520
       stepsize: 1.0491e-16
  firstorderopt: 1.6200e+05
      algorithm: 'medium-scale: Quasi-Newton line search'
        message: [1x362 char]
  exitflag =
   5
質問:
私のプログラムは、マップ2がマップ参加関数の最小値であることを示しています。最小値はマップ1とマップ2の間のどこかにあるようです。問題はマトリックスHにあると確信しています。何が問題なのですか?