Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

scansAndPoses

スキャンおよび対応する姿勢を抽出

R2019b 以降

説明

[scans,poses] = scansAndPoses(slamObj) は、lidarSLAM オブジェクトで使用されるスキャンを lidarScan オブジェクトとして返し、さらに slamObj の基となる姿勢グラフでそれらに関連付けられている姿勢 [x y theta] を返します。

[scans,poses] = scansAndPoses(slamObj,nodeIDs) は、特定のノード ID のスキャンと姿勢を返します。ノード ID を取得するには、slamObj の基となる poseGraph オブジェクトでノード ID を確認します。

すべて折りたたむ

lidarSLAM オブジェクトを使用して LIDAR スキャンの追加および比較を繰り返し、ロボットの軌跡の最適化された姿勢グラフを作成します。関連付けられている姿勢およびスキャンから占有マップを取得するには、関数buildMapを使用します。

データの読み込みと SLAM アルゴリズムの設定

lidarScanオブジェクトの cell 配列を読み込みます。この LIDAR スキャンは、ある駐車場で、ClearPath Robotics® 製の Husky® ロボットで収集されました。通常、LIDAR スキャンは高周波数で取得され、個々のスキャンが SLAM に必要なわけではありません。したがって、40 番目、次の 40 番目というようにスキャンを繰り返し選択して、スキャンをダウン サンプリングします。

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

SLAM アルゴリズムを設定するには、LIDAR の範囲、マップの分解能、ループ閉じ込みのしきい値および探索半径を指定します。これらのパラメーターを、実際のロボットと環境に合わせて調整します。次のパラメーターを指定して lidarSLAM オブジェクトを作成します。

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

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

スキャンを繰り返し追加

for ループを使用して、SLAM オブジェクトにスキャンを追加します。オブジェクトでは、スキャン マッチングを使用して、追加された各スキャンを以前に追加されたスキャンと比較します。マップを改善するために、オブジェクトはループ閉じ込みを検出するたびに姿勢グラフを最適化します。スキャン 10 個ごとに、保存された姿勢とスキャンを表示します。

for i = 1:numel(scans)

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

占有マップの表示

すべてのスキャンを SLAM オブジェクトに追加した後、スキャンと姿勢を指定してbuildMapを呼び出すことにより、occupancyMapマップを作成します。SLAM オブジェクトで使用したものと同じマップ分解能および最大範囲を使用します。

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

入力引数

すべて折りたたむ

LIDAR SLAM オブジェクト。lidarSLAM オブジェクトとして指定します。このオブジェクトには、マップの作成に使用される、SLAM アルゴリズム パラメーター、センサー データ、基となる姿勢グラフが格納されています。

姿勢グラフにおけるノード ID。正の整数として指定します。ノードは連続する ID 番号で姿勢グラフに追加されます。ノード ID を取得するには、slamObj の基となる poseGraph オブジェクトでノード ID を確認します。

出力引数

すべて折りたたむ

LIDAR スキャンの読み取り値。lidarScan オブジェクトとして返されます。

各スキャンの姿勢。[x y theta] ベクトルの n 行 3 列の行列として返されます。各行が scans のスキャンに対応する姿勢になります。

拡張機能

バージョン履歴

R2019b で導入