Main Content

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

addScan

Ajouter une analyse à la carte lidar SLAM

Depuis R2019b

Description

addScan(slamObj,currScan) ajoute une analyse lidar, currScan, à l'objet lidar SLAM, slamObj. La fonction utilise la correspondance de scan pour corréler ce scan au plus récent, puis l'ajoute au graphique de pose défini dans slamObj. Si l'analyse est acceptée, addScan détecte les fermetures de boucle et optimise en fonction des paramètres de slamObj.

exemple

addScan(slamObj,currScan,relPoseEst) spécifie également une pose relative par rapport à la dernière pose d'analyse lidar dans slamObj. Cette pose relative améliore la correspondance du scan.

Remarque

L'entrée relPoseEst est ignorée lorsque la propriété ScanRegistrationMethod de l'objet lidarSLAM est définie sur 'PhaseCorrelation'.

[isAccepted,loopClosureInfo,optimInfo] = addScan(___) affiche des informations détaillées sur l'ajout de l'analyse à l'objet SLAM. isAccepted indique si l'analyse est ajoutée ou rejetée. loopClosureInfo et optimInfo indiquent si une fermeture de boucle est détectée ou si le graphique de pose est optimisé.

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')

Arguments d'entrée

réduire tout

Objet Lidar SLAM, spécifié comme objet lidarSLAM . L'objet contient les paramètres de l'algorithme SLAM, les données du capteur et le graphique de pose sous-jacent utilisé pour créer la carte.

Lecture de l'analyse Lidar, spécifiée comme objet lidarScan . Cette analyse est corrélée à l'analyse la plus récente dans slamObj à l'aide de la correspondance d'analyse.

Estimation de pose relative de l'analyse, spécifiée comme vecteur [x y theta] . Cette pose relative améliore la correspondance de numérisation.

Arguments de sortie

réduire tout

Indique si l'analyse est acceptée, renvoyée sous la forme true ou false. Si la pose relative entre les analyses est inférieure à la propriété MovementThreshold de slamObj, l'analyse est rejetée. Par défaut, toutes les analyses sont acceptées.

Détails de fermeture de boucle, renvoyés sous forme de structure avec ces champs :

  • EdgeIDs –– ID des arêtes nouvellement connectées dans le graphe de pose, renvoyés sous forme de vecteur.

  • Edges –– Bords de fermeture de boucle nouvellement ajoutés, renvoyés sous la forme d'une matrice n-par-2 d'ID de nœud que chaque bord connecte.

  • Scores –– Scores d'arêtes nouvellement connectées dans le graphique de pose renvoyés par la correspondance de numérisation, renvoyés sous forme de vecteur.

Remarque

Si la propriété LoopClosureAutoRollback est définie sur true dans slamObj, les bords de fermeture de boucle peuvent être supprimés du graphique de pose. Cette propriété rejette les fermetures de boucles si l'erreur résiduelle change radicalement après l'optimisation. Par conséquent, certains des ID de bord répertoriés dans cette structure peuvent ne pas exister dans le graphique de pose réel.

Détails de l'optimisation du graphique de pose, renvoyés sous forme de structure avec ces champs :

  • IsPerformed –– Booléen indiquant si l'optimisation est effectuée lors de l'ajout de cette analyse. Les performances d'optimisation dépendent de la propriété OptimizationInterval dans slamObj.

  • IsAccepted –– Booléen indiquant si l'optimisation a été acceptée en fonction de ResidualError.

  • ResidualError –– Erreur associée à l'optimisation, renvoyée sous forme de scalaire.

  • LoopClosureRemoved –– Liste des ID des arêtes de fermeture de boucle supprimées lors de l'optimisation, renvoyées sous forme de vecteur.

Capacités étendues

Historique des versions

Introduit dans R2019b