Main Content

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

matchScans

Estimer la pose entre deux scans laser

Depuis R2019b

Description

exemple

pose = matchScans(currScan,refScan) trouve la pose relative entre une référence lidarScan et un objet lidarScan actuel en utilisant la transformation des distributions normales (NDT).

exemple

pose = matchScans(currRanges,currAngles,refRanges,refAngles) trouve la pose relative entre deux balayages laser spécifiés sous forme de plages et d'angles.

[pose,stats] = matchScans(___) renvoie des statistiques supplémentaires sur le résultat de l'analyse en utilisant les arguments d'entrée précédents.

[___] = matchScans(___,Name,Value) spécifie les options supplémentaires spécifiées par un ou plusieurs arguments de paire Name,Value .

Exemples

réduire tout

Créez une analyse lidar de référence à l'aide de lidarScan. Spécifiez les plages et les angles sous forme de vecteurs.

refRanges = 5*ones(1,300);
refAngles = linspace(-pi/2,pi/2,300); 
refScan = lidarScan(refRanges,refAngles);

À l'aide de la fonction transformScan (Robotics System Toolbox) , générez une deuxième analyse lidar à un décalage x,y de (0.5,0.2).

currScan = transformScan(refScan,[0.5 0.2 0]);

Faites correspondre le scan de référence et le deuxième scan pour estimer la différence de pose entre eux.

pose = matchScans(currScan,refScan);

Utilisez la fonction transformScan pour aligner les scans en transformant le deuxième scan dans le cadre du premier scan en utilisant la différence de pose relative. Tracez à la fois les numérisations originales et les numérisations alignées.

currScan2 = transformScan(currScan,pose);

subplot(2,1,1);
hold on
plot(currScan)
plot(refScan)
title('Original Scans')
hold off

subplot(2,1,2);
hold on
plot(currScan2)
plot(refScan)
title('Aligned Scans')
xlim([0 5])
hold off

Figure contains 2 axes objects. Axes object 1 with title Original Scans, xlabel X, ylabel Y contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 2 with title Aligned Scans, xlabel X, ylabel Y contains 2 objects of type line. One or more of the lines displays its values using only markers

Cet exemple utilise l'algorithme de résolution 'fminunc' pour effectuer la correspondance d'analyse. Cet algorithme de solveur nécessite une licence Optimization Toolbox™ .

Spécifiez un balayage laser de référence sous forme de plages et d'angles.

refRanges = 5*ones(1,300);
refAngles = linspace(-pi/2,pi/2,300);

À l'aide de la fonction transformScan (Robotics System Toolbox) , générez un deuxième balayage laser à un décalage x,y de (0.5,0.2).

[currRanges,currAngles] = transformScan(refRanges,refAngles,[0.5 0.2 0]);

Faites correspondre le scan de référence et le deuxième scan pour estimer la différence de pose entre eux.

pose = matchScans(currRanges,currAngles,refRanges,refAngles,'SolverAlgorithm','fminunc');

Améliorez l'estimation en donnant une estimation de pose initiale.

pose = matchScans(currRanges,currAngles,refRanges,refAngles,...
                  'SolverAlgorithm','fminunc','InitialPose',[-0.4 -0.1 0]);

Utilisez la fonction transformScan pour aligner les scans en transformant le deuxième scan dans le cadre du premier scan en utilisant la différence de pose relative. Tracez à la fois les numérisations originales et les numérisations alignées.

[currRanges2,currAngles2] = transformScan(currRanges,currAngles,pose);

[x1, y1] = pol2cart(refAngles,refRanges);
[x2, y2] = pol2cart(currAngles,currRanges);
[x3, y3] = pol2cart(currAngles2,currRanges2);

subplot(1,2,1)
plot(x1,y1,'o',x2,y2,'*r')
title('Original Scans')
subplot(1,2,2)
plot(x1,y1,'o',x3,y3,'*r')
title('Aligned Scans')

Figure contains 2 axes objects. Axes object 1 with title Original Scans contains 2 objects of type line. One or more of the lines displays its values using only markers Axes object 2 with title Aligned Scans contains 2 objects of type line. One or more of the lines displays its values using only markers

Arguments d'entrée

réduire tout

Lectures actuelles de l'analyse lidar, spécifiées comme objet lidarScan .

Votre analyse lidar peut contenir des valeurs Inf et NaN , mais l'algorithme les ignore.

Lectures d'analyse lidar de référence, spécifiées comme objet lidarScan .

Votre analyse lidar peut contenir des valeurs Inf et NaN , mais l'algorithme les ignore.

Plages de balayage laser actuelles, spécifiées sous forme de vecteur. Les portées sont données sous forme de distances aux objets mesurés à partir du capteur laser.

Vos plages de balayage laser peuvent contenir des valeurs Inf et NaN , mais l'algorithme les ignore.

Angles de balayage laser actuels, spécifiés sous forme de vecteur en radians. Les angles sont donnés comme orientations des mesures de plage correspondantes.

Plages de balayage laser de référence, spécifiées sous forme de vecteur en mètres. Les portées sont données sous forme de distances aux objets mesurés à partir du capteur laser.

Vos plages de balayage laser peuvent contenir des valeurs Inf et NaN , mais l'algorithme les ignore.

Angles de balayage laser de référence, spécifiés sous forme de vecteur en radians. Les angles sont donnés comme orientations des mesures de plage correspondantes.

Arguments nom-valeur

Spécifiez des paires d'arguments facultatives sous la forme Name1=Value1,...,NameN=ValueN, où Name est le nom de l'argument et Value est la valeur correspondante. Les arguments nom-valeur doivent apparaître après les autres arguments, mais l'ordre des paires n'a pas d'importance.

Avant R2021a, utilisez des virgules pour séparer chaque nom et valeur, et mettez Name entre guillemets.

Exemple : "InitialPose",[1 1 pi/2]

Algorithme d'optimisation, spécifié comme "trust-region" ou "fminunc". L'utilisation de "fminunc" nécessite une licence Optimization Toolbox™ .

Estimation initiale de la pose actuelle par rapport au balayage laser de référence, spécifiée comme la paire séparée par des virgules composée de "InitialPose" et d'un vecteur [x y theta] . [x y] est la translation en mètres et theta est la rotation en radians.

Longueur d'un côté de cellule en mètres, spécifiée comme la paire séparée par des virgules composée de "CellSize" et d'un scalaire numérique. matchScans utilise la taille de la cellule pour discrétiser l'espace pour l'algorithme NDT.

Le réglage de la taille des cellules est important pour une utilisation correcte de l'algorithme CND. La taille optimale des cellules dépend des analyses d'entrée et de l'environnement de votre robot. Des cellules de plus grande taille peuvent conduire à une correspondance moins précise avec des zones mal échantillonnées. Des cellules de plus petite taille nécessitent plus de mémoire et moins de variations entre les analyses ultérieures. Le bruit du capteur influence également l'algorithme avec des cellules de plus petite taille. Le choix d'une taille de cellule appropriée dépend de l'échelle de votre environnement et des données d'entrée.

Nombre maximum d'itérations, spécifié sous la forme d'une paire séparée par des virgules composée de "MaxIterations" et d'un entier scalaire. Un plus grand nombre d'itérations permet d'obtenir des estimations de pose plus précises, mais au prix d'un temps d'exécution plus long.

Limite inférieure de la modification du score NDT, spécifiée comme la paire séparée par des virgules composée de "ScoreTolerance" et d'un scalaire numérique. Le score NDT est stocké dans le champ Score de la structure de sortie stats . Entre les itérations, si le score change moins que cette tolérance, l’algorithme converge vers une solution. Une tolérance plus petite permet d'obtenir des estimations de pose plus précises, mais nécessite un temps d'exécution plus long.

Arguments de sortie

réduire tout

Pose du scan actuel par rapport au scan de référence, renvoyé sous la forme [x y theta], où [x y] est la translation en mètres et theta est la rotation en radians.

Analysez les statistiques de correspondance, renvoyées sous forme de structure avec les champs suivants :

  • Score — Scalaire numérique représentant le score NDT lors de l'exécution de la correspondance de numérisation. Ce score est une estimation de la probabilité que le balayage actuel transformé corresponde au balayage de référence. Score est toujours non négatif. Des scores plus élevés indiquent une meilleure correspondance.

  • Hessian — Matrice 3 par 3 représentant le Hessian de la fonction de coût NDT à la solution pose donnée. Le Hessian est utilisé comme indicateur de l’incertitude associée à l’estimation de la pose.

Références

[1] Biber, P., and W. Strasser. "The Normal Distributions Transform: A New Approach to Laser Scan Matching." Intelligent Robots and Systems Proceedings. 2003.

[2] Magnusson, Martin. "The Three-Dimensional Normal-Distributions Transform -- an Efficient Representation for Registration, Surface Analysis, and Loop Detection." PhD Dissertation. Örebro University, School of Science and Technology, 2009.

Capacités étendues

Historique des versions

Introduit dans R2019b