Main Content

checkCollision

2 つのジオメトリが衝突しているかどうかをチェック

R2019b 以降

説明

collisionStatus = checkCollision(geom1,geom2) は、2 つの凸ジオメトリ geom1 および geom2 間の衝突ステータスを返します。2 つのジオメトリが指定された姿勢で衝突している場合、collisionStatus1 になります。関数で衝突が見つからない場合、collisionStatus0 になります。

[collisionStatus,sepdist,witnesspts] = checkCollision(geom1,geom2) は、2 つのジオメトリ間に衝突が見つからない場合に各ジオメトリの最小距離 sepdist と監視点 witnesspts を返します。

すべて折りたたむ

この例では、2 つの衝突ジオメトリの衝突ステータスをチェックする方法を説明します。

ボックス型の衝突ジオメトリを作成します。

bx = collisionBox(1,2,3);

円柱型の衝突ジオメトリを作成します。

cy = collisionCylinder(3,1);

円柱を "x" 軸に沿って 2 平行移動します。

T = trvec2tform([2 0 0]);
cy.Pose = T;

2 つのジオメトリをプロットします。

show(cy)
hold on
show(bx)
xlim([-5 5])
ylim([-5 5])
zlim([-5 5])
hold off

Figure contains an axes object. The axes object with xlabel X, ylabel Y contains 2 objects of type patch.

衝突ステータスをチェックします。ステータスがプロットと一貫していることを確認します。

[areIntersecting,dist,witnessPoints] = checkCollision(bx,cy)
areIntersecting = 1
dist = NaN
witnessPoints = 3×2

   NaN   NaN
   NaN   NaN
   NaN   NaN

ボックスを "x" 軸に沿って 3、"z" 軸を下に 4 平行移動します。ボックスと円柱が衝突していないことを確認します。

T = trvec2tform([0 3 -4]);
bx.Pose = T;
[areIntersecting,dist,witnessPoints] = checkCollision(bx,cy)
areIntersecting = 0
dist = 2
witnessPoints = 3×2

    0.4286    0.4286
    2.0000    2.0000
   -2.5000   -0.5000

ボックス、円柱、および 2 つのジオメトリの間の最小距離を表す線分をプロットします。

show(cy)
hold on
show(bx)
wp = witnessPoints;
plot3([wp(1,1) wp(1,2)], [wp(2,1) wp(2,2)], [wp(3,1) wp(3,2)], 'bo-')
xlim([-5 5])
ylim([-5 5])
zlim([-5 5])
hold off

Figure contains an axes object. The axes object with xlabel X, ylabel Y contains 3 objects of type patch, line.

2 つの衝突カプセルを作成します。一方の中心を原点に合わせ、もう一方のカプセルの姿勢を原点から "y" 軸に沿って 3 メートル離れた位置に設定します。カプセルを表示します。

cc1 = collisionCapsule(1,4);
cc2 = collisionCapsule(1,4);
cc2.Pose = trvec2tform([0 3 0]);
show(cc1);
hold on
show(cc2);
axis auto
hold off

Figure contains an axes object. The axes object with xlabel X, ylabel Y contains 2 objects of type patch.

2 つの衝突カプセル間の衝突をチェックします。視覚的に衝突していないため、関数から実数値の分離距離と監視点が返されるはずです。分離距離と監視点を表示します。

[isColliding,separationDist,witnessPts] = checkCollision(cc1,cc2);
disp("Separation Distance: " + num2str(separationDist))
Separation Distance: 1
disp("Capsule 1 Witness Point (X Y Z): " + num2str(witnessPts(:,1)'))
Capsule 1 Witness Point (X Y Z): 0  1 -2
disp("Capsule 2 Witness Point (X Y Z): " + num2str(witnessPts(:,2)'))
Capsule 2 Witness Point (X Y Z): 0  2 -2

2 つ目のカプセルを "z" 軸に対して 90 度回転します。

cc2.Pose(1:3,1:3) = eul2rotm([0 0 pi/2]);
show(cc1);
hold on
show(cc2);
axis auto

Figure contains an axes object. The axes object with xlabel X, ylabel Y contains 2 objects of type patch.

カプセル間の衝突をもう一度チェックします。衝突しているため、関数から分離距離と監視点が NaN として返されます。

[isColliding,separationDist,witnessPts] = checkCollision(cc1,cc2);
disp("Separation Distance: " + num2str(separationDist))
Separation Distance: NaN
disp("Capsule 1 Witness Point (X Y Z): " + num2str(witnessPts(:,1)'))
Capsule 1 Witness Point (X Y Z): NaN  NaN  NaN
disp("Capsule 2 Witness Point (X Y Z): " + num2str(witnessPts(:,2)'))
Capsule 2 Witness Point (X Y Z): NaN  NaN  NaN

入力引数

すべて折りたたむ

1 つ目の衝突ジオメトリ。次のいずれかの衝突ジオメトリ オブジェクトとして指定します。

衝突ジオメトリ。次のいずれかの衝突ジオメトリ オブジェクトとして指定します。

出力引数

すべて折りたたむ

衝突ステータス。0 または 1 として返されます。2 つのジオメトリが衝突している場合、collisionStatus1 になります。そうでない場合、値は 0 になります。

データ型: double

2 つの衝突ジオメトリ間の最小距離。実数として返されます。監視点 witnesspts を結ぶ線分によって、2 つのジオメトリ間の最小距離が決まります。2 つのジオメトリが衝突している場合、sepdistNaN になります。

データ型: double

各ジオメトリの監視点。3 行 2 列の行列として返されます。各列は、対応するジオメトリ geom1 または geom2 の監視点の位置です。2 つの監視点を結ぶ線分の長さは septdist です。2 つのジオメトリが衝突している場合、witnesspts のすべての要素が NaN になります。

データ型: double

制限

  • 最小距離が 10-5 m 未満の場合、衝突チェックの結果は信頼性が低くなります。

参照

[1] Gilbert, E.G., D.W. Johnson, and S.S. Keerthi. "A fast procedure for computing the distance between complex objects in three-dimensional space." IEEE Journal on Robotics and Automation 4, no. 2 (April 1988): 193–203. https://doi.org/10.1109/56.2083.

拡張機能

C/C++ コード生成
MATLAB® Coder™ を使用して C および C++ コードを生成します。

バージョン履歴

R2019b で導入