0

私が何を問いかけているのかを人々が理解できるようにするために、私はそれを完全に言い換えることにしました。これで解決することを願っています。

私は 1 秒の速度で GPS データ (緯度/経度) を収集しています。このデータは 100% 正確ではない可能性があり、時折 (1 つ以上) マークから大きく外れているデータポイントがあることを理解した上で、かなり正確なコースを決定するために外れ値ポイントを削除する最も適切な方法と、車の速度?この車両は、時速 0 ~ 60 マイルの範囲で、通常は直線で移動できますが、急な方向転換 (加重値?) が発生しやすい場合もあります。

混乱を招いたこと、さらにはすでに配布された提案を理解できなかったことをお詫び申し上げます。

4

2 に答える 2

1

十分なデータがないため、問題の形式が正しくないようです。したがって、GPS は位置を収集しています。これらは基本的に座標の集まりです。そして、あなたは「それらが正しいか」、「それをより正確にする方法」を尋ねています。明らかに、そのためにはより多くのデータが必要です。

ロボット工学では、典型的な「別のデータ」は、他のセンサー (IMU - 慣性測定ユニット、実際には加速度計) またはオドメトリー (モーターへのコマンド) からのデータです。これらの両方から、ロボットは「まっすぐ進んでいる」ことを認識し、左右への逸脱を修正できます。あるいは、コンピューター ビジョン アルゴリズムを使用して「ランドマーク」 (木や角など) を追跡します。これにより、ロボットの動きに関する適切な情報も得られます。あなたはそれらのどれも持っていません。

あなたが持っているのは、車の物理モデルです。あなたは時速 60 マイルで車が 90 度回転する可能性がないことを知っています (それが、車がどのように振る舞うべきかを自然に知っているので、この問題があなたにとって不適当に思えない理由です)。この制約は、追加のセンサー情報ほど適切ではありませんが、そうすべきです。非線形最小二乗法またはカルマン フィルターを同様に使用できます。

私はカルマン フィルターの大ファンではないので、その実装方法については説明しません。

NLS を使用すると、車の位置がグラフとして表示されます (プロットと混同しないでください)。車の各位置が頂点です。隣接する 2 つの頂点 (「前と現在の位置」に対応) は、「車の運動の法則」の制約 (エッジ) によってリンクされています。各頂点には、単項エッジである GPS 位置制約もあります。

この種のグラフは疎行列で表されます。これはヤコビ行列 (またはヘッセ行列) であり、値は特定のシステム状態 (すべての頂点の位置) での制約に関する頂点の派生に対応します。次の位置が追加されるため、各ステップで行列のサイズが大きくなります。ソリューションの複雑さを低く維持するために、古い位置を削除して、最後の N ステップのみを保持できます。各ステップで、物理的制約を評価し (速度と回転率を計算し、それが妥当かどうかを確認します)、ヤコビ行列/ヘッセ行列とエラー ベクトル (GPS 修正/物理的制約からの現在のベクトル位置の差のベクトル) を計算する必要があります。モーション)。次に、このシステム (dx = ヤコビアン / エラー) を解き、頂点位置の差であるベクトル dx を生成します。それを頂点に追加するだけで、そこにいます。それは本質的にガウス・ニュートンアルゴリズムです。

これを実装するのは簡単なことではありません。SLAM++iSAMGTSAMg2oなど、この種のグラフの問題を効率的に解決するライブラリがあります。問題は、物理的妥当性制約がそこに実装されていないため (GPS 制約も実装されていませんが、それは単なる減算であるため)、これらのどれもそのままでは機能しないことです。独自の頂点/エッジ タイプを実装する必要があります。

もっとシンプルなものを使うことをお勧めします。GPS が教えてくれることの違いを取り、ウィンドウ化された中央値を計算し、最後の測定値が中央値から離れすぎていないかどうかを確認してください。遠すぎる場合 (実験して、どのしきい値が機能するかを確認する必要があります)、速度/コースの計算にその測定値を使用しないでください (ただし、中央値の計算には使用し続けます)。それはかなり正確で、あなたの目的には問題ありません。

測定データをテキスト ファイルとしてアップロードし、ブロック周辺を運転したときの緯度 / 経度 / タイムスタンプが含まれている場合、それを処理するコードの記述について確認できます。

于 2014-02-19T09:28:08.627 に答える
1

標準アルゴリズムadjacent_differenceは、反復子の範囲内の各要素間の差を生成します。したがって、5 つの要素がある場合、4 つの違いが生じます。

使用する標準ライブラリは次のとおりです。

#include <vector>
#include <iostream>
#include <iterator>
#include <algorithm>
#include <numeric>

GPS クラスがどのようになるかわかりません。私はそれが一次元であると仮定します:

class Position
{
public:
    Position() :
    m_position(0)
    {
    }

    Position(int position) :
    m_position(position)
    {
    }

    Position operator-(const Position& other) const
    {
        return Position(m_position - other.m_position);
    }
    operator int() const
    {
        return m_position;
    }
private:
    int m_position;
};

Position abs_sum(const Position& lhs, const Position& rhs)
{
    return Position(abs(int(lhs)) + abs(int(rhs)));
}

それを一緒に入れて:

int main()
{
    using namespace std; // for brevity - don't really do this in your code

    vector<Position> positions;
    positions.push_back(Position(13));
    positions.push_back(Position(23));
    positions.push_back(Position(17));
    positions.push_back(Position(19));

    vector<Position> displacements;

    adjacent_difference(positions.begin(), positions.end(),
                        back_inserter(displacements));

    cout << "Displacements: ";
    copy(displacements.begin(), displacements.end(),
         ostream_iterator<int>(cout, ", "));

    cout << endl;

    int distance = accumulate(displacements.begin(), displacements.end(),
                              0, abs_sum);
    cout << "Total: " << distance << endl;

    return 0;
}

出力:

Displacements: 13, 10, -6, 2, 
Total: 31
于 2012-04-10T20:54:15.793 に答える