[PYTHON] Simulation der Flugbahnschätzung mit graphbasiertem SLAM

1. Zuallererst

Laut "Probability Robotics" [^ 1] ist SLAM grob in __ Online-SLAM__ </ font> und __ Offline-SLAM__ </ font> 2 unterteilt Es wird in zwei Methoden eingeteilt. __ Online SLAM__ </ font> bedeutet, dass die hintere Wahrscheinlichkeit der Karte und der Haltung zu jedem Zeitpunkt berechnet wird.

\begin{align}
    p(\ x_t,\ m\ |\ z_{1:t},\ u_{1:t}\ ) \tag{1.1}\\
\end{align}

Wie Sie der Formel $ (1.1) $ entnehmen können, hat Online-SLAM </ font> die neueste Einstellung zu früheren Beobachtungen und steuert nur $ x_t $ __ __ Wird berechnet. Online-SLAM </ font> ist ein __ Echtzeitalgorithmus __, mit dem die neuesten Einstellungen nacheinander berechnet werden. Der von mir zuvor erstellte Algorithmus zur Schätzung der Selbstposition durch den erweiterten Kalman-Filter [^ 2] und den Partikelfilter [^ 3] entspricht diesem Online-SLAM </ font>.

Andererseits wird in __ Offline-SLAM__ </ font> (manchmal als complete SLAM bezeichnet) nicht nur die letzte Haltung $ x_t $, sondern die gesamte Flugbahn des Roboters $ x_ {1 Die hintere Wahrscheinlichkeit wird berechnet für: t} $.

\begin{align}
    p(\ x_{1:t},\ m\ |\ z_{1:t},\ u_{1:t}\ ) \tag{1.2}\\
\end{align}

Offline-SLAM </ font> ist batch-Algorithmus, da die Berechnung zu einem bestimmten Zeitpunkt ausgeführt wird.

2 Graph-Based SLAM Der Mainstream von SLAM ist heutzutage Offline-SLAM mit Grafiken, und Offline-SLAM mit Grafiken wird allgemein als Graph-Based SLAM [^ 4] bezeichnet. Dieses Mal möchte ich diesen graphbasierten SLAM in Python implementieren und seine Funktion überprüfen. Bei der Implementierung wird auf "Ein Tutorial zu graphbasiertem SLAM [^ 5]" und "Erläuterung von graphbasiertem SLAM [^ 6]" verwiesen.

3 Roboterhaltung und Bewegungsmodell

Das Haltungs- und Bewegungsmodell des Roboters gilt für "Kapitel 5 Roboterbewegung" im Buch "Probabilistische Robotik" [^ 1]. Weitere Informationen finden Sie im Buch. Daher wird hier eine kurze Erklärung gegeben. Zunächst wird die Roboterhaltung $ \ boldsymbol {x} $ zu einem diskreten Zeitpunkt $ t $ wie folgt definiert.

\begin{align}
    \boldsymbol{x}_{t} =
       \begin{bmatrix}
        x_{t} \\
        y_{t} \\
        \theta_{t} \\
       \end{bmatrix} \tag{3.1}\\
\end{align}

Zum Zeitpunkt $ t $ erhält der Roboter __ Übersetzungsgeschwindigkeiten $ v_ {t} $ __ und __ Rotationsgeschwindigkeiten $ \ omega_ {t} $ __ und zum Zeitpunkt $ t '$ Haltung $ \ boldsymbol x_ { Es wird angenommen, dass t '} $ erhalten wird. In der realen Umgebung weisen die Übersetzungsgeschwindigkeit $ v_ {t} $ __ und die Rotationsgeschwindigkeit $ \ omega_ {t} $ __ jedoch Rauschen auf, sodass sie durch die folgenden Formeln ausgedrückt werden können.

\begin{align}
    \begin{bmatrix}
        x_{t'} \\
        y_{t'} \\
        \theta_{t'} \\
    \end{bmatrix}
    = 
    \begin{bmatrix}
        x_{t} \\
        y_{t} \\
        \theta_{t} \\
    \end{bmatrix}
    +
    \begin{bmatrix}
        -\frac{v_{t}}{\omega_{t}}sin\theta_{t}
           + \frac{v_{t}}{\omega_{t}}sin(\theta_{t}+\omega_{t}\Delta t) \\
        \frac{v_{t}}{\omega_{t}}cos\theta_{t}
           - \frac{v_{t}}{\omega_{t}}cos(\theta_{t}+\omega_{t}\Delta t) \\        
        \omega_{t}\Delta t + \gamma_{t}\Delta t \\
    \end{bmatrix}

    \tag{3.2}\\
\end{align}

Jedoch,

\begin{align}
    \begin{bmatrix}
        v_{t} \\
        \omega_{t} \\
        \gamma_{t} \\
    \end{bmatrix}
    = 
    \begin{bmatrix}
        v^\ast_{t} \\
        \omega^\ast_{t} \\
        0 \\
    \end{bmatrix}
    +
    \begin{bmatrix}
        \varepsilon_{\alpha_1 {v_{t}^\ast}^2 + {\alpha_2 \omega_{t}^\ast}^2} \\
        \varepsilon_{\alpha_3 {v_{t}^\ast}^2 + {\alpha_4 \omega_{t}^\ast}^2} \\
        \varepsilon_{\alpha_5 {v_{t}^\ast}^2 + {\alpha_6 \omega_{t}^\ast}^2} \\
    \end{bmatrix}

    \tag{3.3}\\
\end{align}

Ist. Hier repräsentieren $ v_ {t} ^ \ ast $ und $ \ omega_ {t} ^ \ ast $ die wahren Werte der Translationsgeschwindigkeit bzw. der Rotationsgeschwindigkeit. Außerdem steht $ \ varepsilon $ für Rauschen, und $ \ alpha_1 $ bis $ \ alpha_6 $ sind roboterspezifische Rauschparameter. Hier bedeutet $ \ varepsilon_b $ eine Fehlervariable mit einem Mittelwert von Null und einer Standardabweichung von $ b $.

3.1 Definition des Koordinatensystems

Bei der Implementierung von graphbasiertem SLAM werden die folgenden drei Koordinatensysteme definiert.

__ Weltkoordinatensystem __

Ein Koordinatensystem, das auf einem bestimmten Punkt in der Welt basiert. Stationäre Orientierungspunkte bewegen sich im Weltkoordinatensystem grundsätzlich nicht. world_system.png

__Roboterkoordinatensystem __

Ein Koordinatensystem basierend auf einem bestimmten Punkt auf dem Roboter. Der Referenzpunkt bewegt sich mit dem Roboter. Daher bewegt sich die stationäre Landmarke, wenn sich der Roboter bewegt. Außerdem werden in diesem Roboterkoordinatensystem grundsätzlich Orientierungspunkte beobachtet. robot_system.png

4 Landmark-Beobachtungsmodell

Für das Orientierungspunkt-Beobachtungsmodell wird "2.2 Beobachtung" in "Erklärung des graphbasierten SLAM [^ 6]" angewendet. Bitte beziehen Sie sich darauf. Daher wird hier eine kurze Beschreibung gegeben. Durch Beobachten des Orientierungspunkts $ L_c $ im Roboterkoordinatensystem zu einem diskreten Zeitpunkt $ t $ wird angenommen, dass Informationen zu den folgenden drei Orientierungspunkten erhalten werden können.

  • Abstand zum Orientierungspunkt $ L_c $: $ d_ {c, t} $
  • Richtung, in der der Orientierungspunkt $ L_c $ beobachtet wurde: $ \ varphi_ {c, t} $ --Landmark $ L_c $ Richtung, in die Sie blicken: $ \ psi_ {c, t} $

observation.png

Die Formel lautet wie folgt.

\begin{align}
    \begin{bmatrix}
        d_{c,t} \\
        \varphi_{c,t} \\
        \psi_{c,t} \\
    \end{bmatrix}
    = 
    \begin{bmatrix}
        d^\ast_{c,t} \\
        \varphi^\ast_{c,t} \\
        \psi^\ast_{c,t} \\
    \end{bmatrix}
    +
    \begin{bmatrix}
        \varepsilon_{\beta_1 {d^\ast_{c,t}}^2} \\
        \varepsilon_{\beta_2} \\
        \varepsilon_{\beta_3} \\
    \end{bmatrix}

    \tag{4.1}\\
\end{align}

$ d ^ \ ast_ {c, t} $, $ \ varphi ^ \ ast_ {c, t} $, $ \ psi ^ \ ast_ {c, t} $ repräsentieren die wahren Werte von $ \ beta_1 $ $ \ Beta_3 $ ist ein roboterspezifischer Geräuschparameter.

5 Graphbasiertes SLAM-Problem

5.1 Relative Haltungsberechnung des Roboters

Betrachten Sie zur Lösung des Problems ein Diagramm mit Knoten (Eckpunkten) und Kanten (Kanten). Die Knoten entsprechen jeweils der Haltung des Roboters, und die Kante wird zwischen zwei Knoten festgelegt, die dieselbe Landmarke beobachten.

rel_pose.png

Zu diesem Zeitpunkt ist ersichtlich, dass es die folgenden zwei Methoden zum Berechnen der relativen Haltung des Roboters zu jedem Zeitpunkt gibt. ① Unterschied in der geschätzten Roboterhaltung zwischen den Knoten zu jedem Zeitpunkt: $ \ Delta \ boldsymbol x_ {t, t '} $

Dies kann durch einfaches Berechnen des Einstellungsunterschieds erfolgen.

\begin{align}
    \Delta \boldsymbol{x}_{t,t'} = \boldsymbol{x}_{t'} - \boldsymbol{x}_t
    \tag{5.1}\\
\end{align}
② Beobachtungsvektor zu jedem Zeitpunkt, zu dem derselbe Orientierungspunkt beobachtet wurde: $ \ Delta \ boldsymbol x ^ {L} _ {c, t, t '} $

Die folgende Abbildung zeigt das Ergebnis der Umwandlung einer Landmarke in ein Koordinatensystem basierend auf der Landmarke basierend auf dem Beobachtungsergebnis.

robot_system.png

Aus dieser Figur wird die relative Haltung des Roboters in Bezug auf die Landmarke $ \ boldsymbol x ^ L_ {c} $ durch die folgende Formel ausgedrückt.

\begin{align}
    \boldsymbol{x}^L_{c}
    = 
    \begin{bmatrix}
        x^L_{c} \\
        y^L_{c} \\
        \theta^L_{c} \\
    \end{bmatrix}
    = 
    \begin{bmatrix}
        d_{c} \, cos \left( \pi + \varphi_{c} - \psi_{c} \right) \\
        d_{c} \, sin \left( \pi + \varphi_{c} - \psi_{c} \right) \\
        \frac{\pi}{2} - \psi_{c} \\
    \end{bmatrix}

    \tag{5.2}\\
\end{align}

Dies wird für die Zeit $ t $ und $ t '$ berechnet und die Differenz wird berechnet.

\begin{align}
    \Delta \boldsymbol{x}^{L}_{c,t,t'} = \boldsymbol{x}^L_{c,t'} - \boldsymbol{x}^L_{c,t}
    \tag{5.3}\\
\end{align}

Betrachten Sie nun den Unterschied zwischen $ \ Delta \ boldsymbol x_ {t, t '} $ und $ \ Delta \ boldsymbol x ^ L_ {c, t, t'} $.

\begin{align}
    \boldsymbol{e}_{c,t,t'} = \Delta \boldsymbol{x}_{t,t'} - \Delta \boldsymbol{x}^L_{c,t,t'}   \tag{5.4}\\
\end{align}

$ \ Delta \ boldsymbol x_ {t, t '} $ wenn dieser Fehler $ \ boldsymbol e_ {c, t, t'} $ Null ist, dh $ \ boldsymbol x_ {t} $ und $ \ boldsymbol x_ { Es kann gesagt werden, dass t '} $ die optimale geschätzte Haltung ist. Da jedoch jede Kante einen Fehler enthält und jeder Knoten auch anderen Kanten zugeordnet ist, ist es unwahrscheinlich, dass alle Fehler $ \ boldsymbol e_ {c, t, t '} $ Null sind. Es ist unmöglich. Daher ist es notwendig, eine Berechnungsmethode für die geschätzte Haltung in Betracht zu ziehen, bei der alle Fehler $ \ boldsymbol e_ {c, t, t '} $ als optimal bezeichnet werden können.

5.2 Berechnung der Informationsmatrix

Das Berechnungsmodell der Informationsmatrix finden Sie unter "3.1.2 $ \ Sigma_ {c, t, t '}, \ Omega_ {c, t, t'} $ Berechnung" in "Erläuterung des graphbasierten SLAM [^ 6]". Es wird angewendet, bitte beziehen Sie sich darauf. Daher wird hier eine kurze Beschreibung gegeben.

\begin{align}
    \boldsymbol{\Sigma}_{c,t}
    = 
    \begin{bmatrix}
        \left(\beta_1 d^\ast_{c,t}\right)^2 & 0 & 0 \\
        0 & \left(d^\ast_{c,t} \ sin \beta_2\right)^2 & 0 \\
        0 & 0 & {\beta_2}^2 + {\beta_3}^2 \\
    \end{bmatrix}

    \tag{5.5}\\
\end{align}

Als nächstes konvertieren Sie $ \ boldsymbol \ Sigma_ {c, t} $ und $ \ boldsymbol \ Sigma_ {c, t '} $, die im Messkoordinatensystem berechnet wurden, in das Weltkoordinatensystem. Die folgende Rotationsmatrix wird für die Konvertierung verwendet.

\begin{align}
    \boldsymbol{R}_{c,t}
    = 
    \begin{bmatrix}
        c & -s & 0 \\
        s & c & 0 \\
        0 & 0 & 1 \\
    \end{bmatrix}

    \tag{5.6}\\
\end{align}

Jedoch,

\begin{align}
    c = cos(\theta_t + \varphi_t)       \tag{5.7}\\
    s = sin(\theta_t + \varphi_t)       \tag{5.8}\\
\end{align}

Ist.

  • Das Vorzeichen der Formel $ (10) $ und "s" in "Erläuterung des graphbasierten SLAM [^ 6]" in der Referenz ist unterschiedlich. Ich habe eine positive Richtung gegen den Uhrzeigersinn, aber hatten die Referenzen eine positive Richtung im Uhrzeigersinn?

Schließlich sind die Kovarianzmatrix $ \ boldsymbol \ Sigma_ {c, t, t '} $ und die Informationsmatrix $ \ boldsymbol \ Omega_ {c, t, t'} $ im Weltkoordinatensystem wie folgt.

\begin{align}
    \boldsymbol{\Sigma}_{c,t,t'} &= \boldsymbol{R}_{c,t}\,\boldsymbol{\Sigma}_{c,t}\,\boldsymbol{R}_{c,t}^T
                     + \boldsymbol{R}_{c,t'}\,\boldsymbol{\Sigma}_{c,t'}\,\boldsymbol{R}_{c,t'}^T   \tag{5.9}\\
    \boldsymbol{\Omega}_{c,t,t'} &= \boldsymbol{\Sigma}_{c,t,t'}^{-1}    \tag{5.10}\\
\end{align}

5.3 Optimierungsmethode

Es ist schließlich das Optimierungsproblem, das den Kern des Hauptthemas bildet. Zunächst erstellt der Roboter alle Paare von zwei Kanten der jeweils erhaltenen Beobachtungsergebnisse. Die Menge aller Paare sei $ \ mathcal {C} $ und definiere eine Bewertungsfunktion, um die Summe der quadratischen Fehler zu ermitteln.

\begin{align}
    \boldsymbol{F}(\boldsymbol{x}) = \displaystyle \sum_{ \boldsymbol{e}_{c,t,t'} 
       \in \mathcal{C} }^{  } \ \underbrace{\boldsymbol{e}_{c,t,t'}^T \, \boldsymbol{\Omega}_{c,t,t'} \, \boldsymbol{e}_{c,t,t'}}_{\boldsymbol{F}_{t,t'}}   \tag{5.11}\\
\end{align}

Das ultimative Ziel ist es, $ \ hat {\ boldsymbol {x}} $ zu finden, das $ \ boldsymbol {F} (\ boldsymbol {x}) $ in dieser obigen Gleichung minimiert.

Die Gauß-Newton-Methode und die Levenberg-Marquardt-Methode werden im Allgemeinen als Annäherungsmethode zum Ermitteln des Mindestwerts $ \ hat {\ boldsymbol {x}} $ verwendet. Für die Gauß-Newton-Methode und die Levenberg-Marquardt-Methode können die folgenden Websites hilfreich sein. Schauen Sie also bitte vorbei, wenn Sie interessiert sind.

Dieses Mal werden wir es mit der Gauß-Newton-Methode auf die gleiche Weise lösen wie "Ein Tutorial zu graphbasiertem SLAM [^ 5]".

Zuallererst $ \ boldsymbol F_ {c, t, t '} $ und $ \ boldsymbol x_ {t'} $, $ \ Delta \ boldsymbol x_ {t} $, $ \ Delta \ boldsymbol x_ {t ' } $ Betrachten Sie den Fall der Änderung. Als Ausdruck ausgedrückt

\begin{align}
    \boldsymbol{e}_{c}(\boldsymbol{x}_{t} + \Delta\boldsymbol{x}_{t},\,\boldsymbol{x}_{t'} + \Delta\boldsymbol{x}_{t'}) 
      \ &=\ \boldsymbol{e}_{c}(\boldsymbol{x}_{t,t'}+\Delta\boldsymbol{x}) \tag{5.12}\\
      \ &\simeq\ \boldsymbol{e}_{c,t,t'} + 
         \left.\frac{\partial \boldsymbol{e}_{c,t,t'}}
                    {\partial \boldsymbol{x}}
         \right|_{\boldsymbol{x}=\boldsymbol{x}_{t,t'}}\Delta\boldsymbol{x}
   \tag{5.13}
\end{align}

Es wird ausgedrückt als. Die Jacobi-Matrix verwendet jedoch $ \ boldsymbol {J} _c $

\boldsymbol{J}_{c,t,t'} = \left.\frac{\partial \boldsymbol{e}_{c,t,t'}}{\partial\boldsymbol{x}}\right|_{\boldsymbol{x}=\boldsymbol{x}_{t,t'}}   \tag{5.14}

Es wird ausgedrückt als. Deshalb,

\begin{align}
    \boldsymbol{F}(\boldsymbol{x}+\Delta\boldsymbol{x}) &= \sum_{ \boldsymbol{e}_{c,t,t'} \in \mathcal{C} } \boldsymbol{F}(\boldsymbol{x}_{t,t'}+\Delta\boldsymbol{x})   \tag{5.15}\\
   &\simeq \sum_{ \boldsymbol{e}_{c,t,t'} \in \mathcal{C} } \ 
      (\boldsymbol{e}_{c,t,t'} + \boldsymbol{J}_{c,t,t'}\Delta{\boldsymbol{x}} )^T
      \, \boldsymbol{\Omega}_{c,t,t'} \,
      (\boldsymbol{e}_{c,t,t'} + \boldsymbol{J}_{c,t,t'}\Delta{\boldsymbol{x}} )   \tag{5.16}\\
   &= \sum_{ \boldsymbol{e}_{c,t,t'} \in \mathcal{C} } \ 
      \underbrace{\boldsymbol{e}_{c,t,t'}^T \boldsymbol{\Omega}_{c,t,t'} \boldsymbol{e}_{c,t,t'}}_{c_{c,t,t'}}
     + 2 \, \underbrace{\boldsymbol{e}_{c,t,t'}^T \boldsymbol{\Omega}_{c,t,t'} \boldsymbol{J}_{c,t,t'}}_{\boldsymbol{b}_{c,t,t'}} \Delta{\boldsymbol{x}} + \Delta{\boldsymbol{x}}^T \underbrace{\boldsymbol{J}_{c,t,t'}^T \boldsymbol{\Omega}_{c,t,t'} \boldsymbol{J}_{c,t,t'}}_{\boldsymbol{H}_{c,t,t'}}\Delta{\boldsymbol{x}}   \tag{5.17}\\

   &= \sum_{ \boldsymbol{e}_{c,t,t'} \in \mathcal{C} } \ 
      c_{c,t,t'} + 2 \, \boldsymbol{b}_{c,t,t'} \Delta{\boldsymbol{x}}
     + \Delta{\boldsymbol{x}}^T \boldsymbol{H}_{c,t,t'}\Delta{\boldsymbol{x}}   \tag{5.18}\\

   &= \underbrace{\sum_{ \boldsymbol{e}_{c,t,t'} \in \mathcal{C} } c_{c,t,t'}}_{\boldsymbol{c}}
     + 2 \underbrace{\left(\sum_{ \boldsymbol{e}_{c,t,t'} \in \mathcal{C} } \, \boldsymbol{b}_{c,t,t'} \right)}_{\boldsymbol{b}} \Delta{\boldsymbol{x}} 
     + \Delta{\boldsymbol{x}}^T \underbrace{\left( \sum_{ \boldsymbol{e}_{c,t,t'} \in \mathcal{C} }  \boldsymbol{H}_{c,t,t'} \right)}_{\boldsymbol{H}} \Delta{\boldsymbol{x}}   \tag{5.19}\\

   &= \boldsymbol{c}
    + 2 \boldsymbol{b} \Delta{\boldsymbol{x}}
    + \Delta{\boldsymbol{x}}^T \boldsymbol{H} \Delta{\boldsymbol{x}}   \tag{5.20}\\
\end{align}

$ \ Boldsymbol {c} $ im Ausdruck $ (5.20) $ ist eine Konstante. Wenn der Variationspunkt der Formel $ (5.20) $ berechnet wird,

\begin{align}
   2 \boldsymbol{b} + 2 \boldsymbol{H} \Delta{\boldsymbol{x}} = 0   \tag{5.21}\\
\end{align}

Daher ist $ \ Delta \ boldsymbol {x} $

\begin{align}
   \Delta{\boldsymbol{x}} = -\boldsymbol{H}^{-1} \boldsymbol{b}   \tag{5.22}\\
\end{align}

Wird sein. Aktualisieren Sie $ \ boldsymbol {x} $ mit dem berechneten $ \ Delta \ boldsymbol {x} $.

\begin{align}
   \boldsymbol{x} \leftarrow \boldsymbol{x}+\Delta \boldsymbol{x}   \tag{5.23}\\
\end{align}

Berechnen Sie $ \ boldsymbol {F} (\ boldsymbol {x}) $ der Formel $ (5.11) $ mit dem aktualisierten $ \ boldsymbol {x} $ und der Formel $ (5.12) $, bis das Berechnungsergebnis ausreichend klein ist. Wiederholen Sie die Berechnung von. Sei $ \ boldsymbol {x} $, wenn das Berechnungsergebnis ausreichend klein ist, die optimale Lösung $ \ hat {\ boldsymbol {x}} $.

6 Implementierung

Ich habe Graph-Based SLAM in Python implementiert. Das Skript wird auf GitHub veröffentlicht. ・ GitHub --graph_based_slam.py

Das Ergebnis der Ausführung des Skripts ist wie folgt. (Klicken Sie auf das Bild, um zu YouTube zu springen.) extended_kalman_filter

  • Detaillierte Erklärungen werden später hinzugefügt.

7 Endlich

Ich habe versucht, Graph-Based SLAM zu implementieren, was in letzter Zeit sehr beliebt ist, aber ehrlich gesagt war es schwierig, diesen Artikel zu implementieren und zu schreiben. Manchmal hat es nicht funktioniert, aber ich bin froh, dass ich es geschafft habe, es so zum Laufen zu bringen, wie ich es beabsichtigt hatte. Es ist immer noch ein dünner Artikel, aber ich werde ihn hier veröffentlichen. Ich denke, es gibt viele Stellen, an denen die Erklärung unzureichend ist, aber wenn Sie darauf hinweisen können, werde ich sie hinzufügen. Darüber hinaus war der Kommentar von Herrn Ueda bei der Umsetzung sehr hilfreich.

  • "Erklärung des graphbasierten SLAM [^ 6]"

Als nächstes möchte ich SLAM auf dem eigentlichen Computer ausführen ♪

Verweise

[^ 1]: "Probability Robotics (Premium Books Version)", My Navi Publishing, 2005. [^ 2]: Visualisierung der Selbstpositionsschätzungsoperation durch erweiterten Kalman-Filter [^ 3]: Visualisierung der Selbstpositionsschätzungsoperation durch Partikelfilter [^ 4]: Masahiro Tomono: Umwelterkennung mobiler Roboter - Kartenkonstruktion und Selbstpositionsschätzung