buildMap
Créer une carte d'occupation à partir d'analyses lidar
Description
crée une carte map
= buildMap(scans
,poses
,mapResolution
,maxRange
)occupancyMap
en insérant le lidar scans
au poses
donné. Spécifiez la résolution de la carte résultante, mapResolution
, et la portée maximale du capteur lidar, maxRange
.
Exemples
La fonction buildMap
prend en compte les lectures d'analyse lidar et les poses associées pour créer une grille d'occupation en tant qu'objets lidarScan
et les poses [x y theta]
associées pour créer une occupancyMap
.
Analyse de charge et estimations de pose collectées à partir de capteurs sur un robot dans un parking. Les données collectées sont corrélées à l'aide d'un algorithme lidarSLAM
, qui effectue une correspondance de scan pour associer les scans et ajuster les poses sur la trajectoire complète du robot. Vérifiez que les scans et les poses ont la même longueur.
load scansAndPoses.mat
length(scans) == length(poses)
ans = logical
1
Construisez la carte. Spécifiez les scans et les poses dans la fonction buildMap
et incluez la résolution de carte souhaitée (10 cellules par mètre) et la portée maximale du lidar (19,2 mètres). Chaque analyse est ajoutée aux poses associées et les valeurs de probabilité dans la grille d'occupation sont mises à jour.
occMap = buildMap(scans,poses,10,19.2);
figure
show(occMap)
title('Occupancy Map of Garage')
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
Analyses Lidar utilisées pour créer la carte, spécifiées sous la forme d'un cell array d'objets lidarScan
.
Poses d'analyses lidar, spécifiées sous la forme d'une matrice n-by-3. Chaque ligne est un vecteur [x y theta]
représentant la xy-position et angle d'orientation d'un scan.
Résolution de la carte de sortie occupancyMap
, spécifiée sous la forme d'un entier positif en cellules par mètre.
Portée maximale du capteur lidar, spécifiée sous forme de scalaire positif en mètres. Les points du scans
en dehors de cette plage sont ignorés.
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 : ['MapWidth',10]
Largeur de la grille d'occupation, spécifiée comme une paire séparée par des virgules composée de 'MapWidth'
et d'un scalaire positif. Si cette valeur n'est pas spécifiée, la carte est automatiquement mise à l'échelle pour s'adapter à tous les balayages laser.
Grille de hauteur d'occupation, spécifiée comme une paire séparée par des virgules composée de 'MapHeight'
et d'un scalaire positif. Si cette valeur n'est pas spécifiée, la carte est automatiquement mise à l'échelle pour s'adapter à tous les balayages laser.
Arguments de sortie
Carte d'occupation, renvoyée sous forme d'objet occupancyMap
.
Historique des versions
Introduit dans R2019b
Voir aussi
Fonctions
Classes
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Sélectionner un site web
Choisissez un site web pour accéder au contenu traduit dans votre langue (lorsqu'il est disponible) et voir les événements et les offres locales. D’après votre position, nous vous recommandons de sélectionner la région suivante : .
Vous pouvez également sélectionner un site web dans la liste suivante :
Comment optimiser les performances du site
Pour optimiser les performances du site, sélectionnez la région Chine (en chinois ou en anglais). Les sites de MathWorks pour les autres pays ne sont pas optimisés pour les visites provenant de votre région.
Amériques
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)