Main Content

Cette page a été traduite par traduction automatique. Cliquez ici pour voir la dernière version en anglais.

lidarSLAM

Effectuer la localisation et la cartographie à l'aide d'analyses lidar

Depuis R2019b

Description

La classe lidarSLAM effectue une localisation et une cartographie simultanées (SLAM) pour les entrées des capteurs de balayage lidar. L'algorithme SLAM prend en compte les analyses lidar et les attache à un nœud dans un graphique de pose sous-jacent. L'algorithme corrèle ensuite les analyses à l'aide de la correspondance d'analyses. Il recherche également les fermetures de boucles, où les analyses chevauchent des régions précédemment cartographiées, et optimise les poses de nœuds dans le graphique de poses.

Création

Description

slamObj = lidarSLAM crée un objet lidar SLAM. La taille par défaut de la carte d'occupation est de 20 cellules par mètre. La portée maximale de chaque scan lidar est de 8 mètres.

exemple

slamObj = lidarSLAM(mapResolution,maxLidarRange) crée un objet SLAM lidar et définit les propriétés MapResolution et MaxLidarRange en fonction des entrées.

slamObj = lidarSLAM(mapResolution,maxLidarRange,maxNumScans) spécifie la limite supérieure du nombre d'analyses acceptées autorisées lors de la génération de code. maxNumScans est un entier positif. Cette limite d'analyse n'est requise que lors de la génération de code.

Propriétés

développer tout

Graphique de pose sous-jacent qui connecte les analyses, spécifié comme objet poseGraph . L'ajout de scans à lidarSLAM met à jour ce graphique de pose. Lorsque des fermetures de boucle sont trouvées, le graphique de pose est optimisé à l'aide de OptimizationFcn.

Résolution de la carte de la grille d'occupation, spécifiée sous forme d'entier positif en cellules par mètre. Spécifiez la résolution de la carte lors de la construction.

Portée maximale du capteur lidar, spécifiée sous forme de scalaire positif en mètres. Spécifiez la portée maximale lors de la construction.

Fonction d'optimisation du graphique de pose, spécifiée comme handle de fonction. Par défaut, l'algorithme appelle la fonction optimizePoseGraph . Pour spécifier votre propre méthode d'optimisation, la classe nécessite que la signature de la fonction soit :

[updatedPose,stat] = myOptimizationFcn(poseGraph)
poseGraph est un objet poseGraph . updatedPose est un vecteur n-par 3 de poses [x y theta] répertoriées dans l'ordre séquentiel des ID de nœud. stat est une structure contenant un champ ResidualError comme scalaire positif. Utilisez la structure stat pour inclure d'autres informations pertinentes pour votre optimisation.

Seuil sur le score de l'algorithme de correspondance d'analyse pour accepter les fermetures de boucles, spécifié comme un scalaire positif. Des seuils plus élevés correspondent à une meilleure correspondance, mais les scores varient en fonction des données des capteurs.

Rayon de recherche pour la détection de fermeture de boucle, spécifié sous forme de scalaire positif. L'augmentation de ce rayon affecte les performances en augmentant le temps de recherche. Ajustez cette distance en fonction de votre environnement et de la trajectoire attendue du véhicule.

Nombre de tentatives de recherche de fermetures de boucle, spécifié sous forme d'entier positif. L'augmentation du nombre de tentatives affecte les performances en augmentant le temps de recherche.

Autoriser la restauration automatique des fermetures de boucles ajoutées, spécifiées comme true ou false. L'objet SLAM suit l'erreur résiduelle renvoyée par le OptimizationFcn. S'il détecte un changement soudain dans l'erreur résiduelle et que cette propriété est true, il rejette (annule) la fermeture de la boucle.

Nombre de fermetures de boucle acceptées pour déclencher l'optimisation, spécifié sous forme d'entier positif. Par défaut, le PoseGraph est optimisé à chaque fois que lidarSLAM ajoute une fermeture de boucle.

Changement de pose minimum requis pour traiter les numérisations, spécifié comme vecteur [translation rotation] . Un changement de pose relatif pour une analyse nouvellement ajoutée est calculé comme [x y theta]. Si la translation en xy-position ou rotation de theta dépasse ces seuils, l'objet lidarSLAM accepte le scan et ajoute une pose est ajouté au PoseGraph.

Méthode d'enregistrement de numérisation, spécifiée comme vecteur de caractères.

Remarque

Image Processing Toolbox™ est requis pour utiliser la méthode de corrélation de phase.

Plage de recherche translationnelle de correspondance incrémentielle, spécifiée sous la forme d'un vecteur à deux éléments de la forme [x y] en mètres. Cette propriété n'est applicable que lorsque la propriété ScanRegistrationMethod est définie sur 'BranchAndBound'.

Ces valeurs définissent la fenêtre de recherche autour de l'estimation de traduction initiale spécifiée dans l'argument relPoseEst de la fonction addScan . Définissez la valeur de cette propriété sur la traduction maximale attendue entre des analyses consécutives acceptées.

Cette propriété est similaire à l'argument de paire nom-valeur 'TranslationSearchRange' dans la fonction matchScansGrid .

Plage de recherche de rotation de correspondance incrémentielle, spécifiée comme scalaire positif en radians. Cette propriété n'est applicable que lorsque la propriété ScanRegistrationMethod est définie sur 'BranchAndBound'.

Ces valeurs définissent la fenêtre de recherche autour de l'estimation de rotation initiale spécifiée dans l'argument relPoseEst de la fonction addScan . Définissez la valeur de cette propriété sur la rotation maximale attendue entre des analyses consécutives acceptées.

Cette propriété est similaire à l'argument de paire nom-valeur 'RotationSearchRange' dans la fonction matchScansGrid .

Fonctions d'objet

addScanAjouter une analyse à la carte lidar SLAM
copyCopier l'objet SLAM lidar
removeLoopClosures Remove loop closures from pose graph
scansAndPoses Extract scans and corresponding poses
showScans de tracé et poses de robots

Exemples

réduire tout

Utilisez un objet lidarSLAM pour ajouter et comparer de manière itérative des analyses lidar et créer un graphique de pose optimisé de la trajectoire du robot. Pour obtenir une carte d'occupation à partir des poses et scans associés, utilisez la fonction buildMap .

Charger des données et configurer l'algorithme SLAM

Chargez un cell array d'objets lidarScan . Les scans lidar ont été collectés dans un parking sur un robot Husky® de ClearPath Robotics®. En règle générale, les analyses lidar sont effectuées à haute fréquence et chaque analyse n'est pas nécessaire pour le SLAM. Par conséquent, sous-échantillonnez les analyses en sélectionnant uniquement toutes les 40 analyses.

load garage_fl1_southend.mat scans
scans = scans(1:40:end);

Pour configurer l'algorithme SLAM, spécifiez la plage lidar, la résolution de la carte, le seuil de fermeture de boucle et le rayon de recherche. Ajustez ces paramètres pour votre robot et votre environnement spécifiques. Créez l'objet lidarSLAM avec ces paramètres.

maxRange = 19.2; % meters
resolution = 10; % cells per meter

slamObj = lidarSLAM(resolution,maxRange);
slamObj.LoopClosureThreshold = 360;
slamObj.LoopClosureSearchRadius = 8;

Ajouter des analyses de manière itérative

À l'aide d'une boucle for , ajoutez des analyses à l'objet SLAM. L'objet utilise la correspondance d'analyse pour comparer chaque analyse ajoutée à celles ajoutées précédemment. Pour améliorer la carte, l'objet optimise le graphique de pose chaque fois qu'il détecte une fermeture de boucle. Tous les 10 scans, affichez les poses et les scans stockés.

for i = 1:numel(scans)

    addScan(slamObj,scans{i});
    
    if rem(i,10) == 0
        show(slamObj);
    end
end

Voir la carte d'occupation

Après avoir ajouté tous les scans à l'objet SLAM, créez une carte occupancyMap en appelant buildMap avec les scans et les poses. Utilisez la même résolution de carte et la même portée maximale que celles utilisées avec l'objet SLAM.

[scansSLAM,poses] = scansAndPoses(slamObj);
occMap = buildMap(scansSLAM,poses,resolution,maxRange);
figure
show(occMap)
title('Occupancy Map of Garage')

En savoir plus

développer tout

Références

[1] Hess, Wolfgang, Damon Kohler, Holger Rapp, and Daniel Andor. "Real-Time Loop Closure in 2D LIDAR SLAM." 2016 IEEE International Conference on Robotics and Automation (ICRA). 2016.

Capacités étendues

Historique des versions

Introduit dans R2019b