Main Content

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

buildMap

Créer une carte d'occupation à partir d'analyses lidar

Depuis R2019b

Description

exemple

map = buildMap(scans,poses,mapResolution,maxRange) crée une carte 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

réduire tout

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

Figure contains an axes object. The axes object with title Occupancy Map of Garage, xlabel X [meters], ylabel Y [meters] contains an object of type image.

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

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

réduire tout

Carte d'occupation, renvoyée sous forme d'objet occupancyMap .

Historique des versions

Introduit dans R2019b