• Aucun résultat trouvé

Solveur linéaire

Dans le document SLAM temporel à contraintes multiples (Page 106-109)

Implémentation de LMA

6.3.1 Solveur linéaire

La bibliothèque LMA utilise deux méthodes pour la résolution du système d’équations linéaires : une méthode dense basée sur l’algorithme de Cholesky, et une méthode éparse par blocs avec l’algo-rithme du gradient conjugué préconditionné noté PCG. La méthode de Cholesky utilisée dans LMA est un appel direct de l’implémentation disponible dans la bibliothèque Eigen et ne sera donc pas présentée ici. Les algorithmes du PCG et du complément de Schur implicite ont été implémentés en utilisant une représentation éparse par blocs et sont présentés dans les sections suivantes. Les mé-thodes de résolution de systèmes linéaires utilisables par LMA, résumées par le tableau 6.2, sont les suivantes :

— DENSE : Cholesky dense, — SPARSE : PCG éparse,

— DENSE_SCHUR : complément de Schur avec Cholesky dense, — SPARSE_SCHUR : complément de Schur avec PCG éparse,

— IMPLICITE_SCHUR : complément de Schur implicite avec PCG éparse,

Une étude de complexité entre les algorithmes de Cholesky et de PCG a été réalisée par Lébraly [86].

Gradient conjugué préconditionné

Le PCG est une méthode, décrite par l’algorithme 4, particulièrement adaptée à la résolution de systèmes d’équations avec un nombre important d’inconnues [97]. Il s’agit d’un algorithme itératif

pour la résolution de systèmes linéaires de la forme Ax = b où la matrice A est symétrique définie positive, x est le vecteur colonne des inconnues, et b est le vecteur colonne contenant les résidus. Le PCG minimise la fonction g(x) = 12xTAx− bTx. A chaque itération k une direction de descente pk+1 est choisie comme une combinaison linéaire entre la direction précédente pk et la direction du gradient de g telles que les directions soient conjuguées : pTk+1Apk = 0. L’utilisation d’une matrice de préconditionnement permet d’accélérer la convergence : plus la matrice de préconditionnement est proche de A−1, plus la convergence de la méthode est rapide. Agarwal et al. présentent plusieurs stratégies pour générer une matrice de préconditionnement efficace [98,99], toutefois cela n’a d’intérêt que si le temps nécessaire au calcul du préconditionneur est faible par rapport au temps total de la résolution. En pratique, nous utilisons le préconditionneur de Jacobi [100] correspondant aux blocs diagonaux inversés de la matrice de Schur.

L’algorithme du PCG est considéré plus rapide que les autres méthodes car en pratique, peu d’itérations sont effectuées. La solution obtenue est donc approximative. Toutefois, on sait que l’algo-rithme de Levenberg-Marquardt approxime la matrice hessienne par JTJ . Ainsi, il n’est pas pertinent de rechercher la solution exacte de l’itération courante (car il s’agit de la solution d’un problème ap-proximé). L’intérêt est de passer rapidement à l’itération suivante afin de mettre à jour les paramètres et les directions de descente pour converger rapidement vers la solution. Il a été montré par Jeong et al. [100] que le PCG est la méthode offrant le meilleur compromis entre temps de calcul et consommation mémoire pour des méthodes d’AF impliquant plusieurs centaines de poses.

Complément de Schur Implicite

On a vu dans la section3.15que l’utilisation du complément de Schur consiste à calculer (dans un premier temps) ΔC en résolvant le système d’équations linéaires de la forme Ax = b suivant :

(U− W V−1WTC = C − W V−1P (6.8) Toutefois, le calcul de la matrice de Schur S = (U − W V−1WT) nécessite d’effectuer un produit matrice par matrice : (W V−1)WT. Or, la complexité d’un produit matriciel est de θ(N3). Ainsi, avec un nombre de paramètres important, le calcul de S devient extrêmement coûteux en temps de calcul et en consommation mémoire. Dans les cas où N est grand, il est avantageux d’utiliser la méthode du complément de Schur implicite qui, combinée avec l’algorithme du PCG, permet de résoudre les équations normales sans calculer explicitement S. Pour cela, il faut remarquer que, dans le PCG décrit par l’algorithme 4, la matrice de Schur (notée A dans l’algorithme du PCG) n’est utilisée que pour faire un produit matrice par vecteur noté Apk. En développant Apk, que l’on note ici par le vecteur Sp = S× p avec S la matrice de Schur et p un vecteur colonne, on obtient :

Sp = (U− W V−1WT)p (6.9)

En développant l’équation, le calcul de Sp se ramène à la soustraction de deux vecteurs colonne sans qu’aucun produit matrice par matrice n’ait été effectué :

Sp = U p'()* v0=U p − W V−1 W' () *Tp v1=WTp ' () * v2=V−1v1 ' () * v3=W v2 ' () * Sp=v0−v3 (6.10)

La complexité du calcul de Spdépend alors des multiples produits matrice par vecteur, elle est donc de l’ordre de θ(N2), tandis que la complexité du calcul de S est de θ(N3). L’utilisation du complément de Schur implicite permet donc en théorie une réduction de la complexité du problème. Toutefois,

A chaque itération de Levenberg-Marquardt, il est nécessaire de mettre à jour les paramètres en utilisant le résultat Δ issu de la résolution des équations normales. Pour chaque type de paramètre, la dimension de l’incrément correspond aux ddl. du type de paramètre. Le plus souvent, la mise à jour des paramètres est triviale. Par exemple, à un point 3D correspond 3 ddl. donc la mise à jour de ce type de paramètre consiste à incrémenter les coordonnées du point 3D avec les 3 incréments calculés par le solveur. Mais il existe plusieurs manières de mettre à jour une matrice de rotation à partir de 3 incréments, par exemple avec les angles d’Euler, les quaternions ou la paramétrisation axes angles. Ainsi, les méthodes de mise à jour des paramètres doivent être définies pour chaque type, par exemple pour le type Pose :

void apply_increment(Pose& pose, double increment[6]) {

... }

Pour le calcul de dérivée numérique, il est possible de spécialiser l’application d’incréments infinitési-maux sur certains degrés de liberté, déterminés par l’indice I, en particulier :

template<int I>

void apply_small_increment(Pose& pose, double increment, Int<I>) {

...// increment sur le parametre I }

Cette surcharge optionnelle rend possible l’application de rotations infinitésimales utilisées avec la représentation exponentielle locale (cf. 1.4) qui sont plus rapides à calculer.

6.4 Fonctionnalités

On présente dans cette section différentes fonctionnalités de la bibliothèque :

— les calculs effectués lors de la résolution des équations normales sont génériques sur le type matriciel. Dans la version actuelle, deux bibliothèques matricielles sont supportées : Eigen3 et Toon4,

— le calcul des dérivées peut être fait de manière numérique, analytique (à définir par l’utilisateur) ou en utilisant une méthode de calcul de dérivées automatique,

— un support pour les M-estimateurs (présentés brièvement dans la section 3.2.2) est également inclu pour simplifier la gestion des valeurs aberrantes mais ne sera pas présenté ici.

3. eigen.tuxfamily.org/ 4. github.com/edrosten/TooN

Dans le document SLAM temporel à contraintes multiples (Page 106-109)