0

衝突検出のみに FCL ライブラリを使用したい。

私の最初のオブジェクトは、球体の形状を使用して指定したいロボットであり、2 つ目は octree を使用して世界の障害物です。

この検出コードを作成するために、指示に従ってみました。

ROS wiki の API から次の情報を入力するにはどうすればよいですか?

// set mesh triangles and vertice indices
std::vector<Vec3f> vertices;  
std::vector<Triangle> triangles;
// code to set the vertices and triangles
 ...
// BVHModel is a template class for mesh geometry, for default OBBRSS     template is used
typedef BVHModel<OBBRSS>* Model;
Model* model = new Model();
// add the mesh data into the BVHModel structure
model->beginModel();
model->addSubModel(vertices, triangles);
model->endModel();

この API では三角形を使用していますが、私が知る限り、三角形は 3D メッシュにのみ使用されます。私はメッシュを使いたくありません。オブジェクトとして octree と sphere が必要です。

  1. では、どうすればそれを変更できますか?
  2. あと、衝突したことを真偽で返すには、どの関数を使えばいいでしょうか?
  3. データが更新された場合はどうなりますか? ロボットが動いていて、ロボットと octree の位置を更新し続けたいということですか? どうすればそれを実行できますか?
  4. BVH モデルの意味は何ですか?

例を探したところ、次のことがわかりました。

Sphere s1(10);
Box s2(5, 5, 5);
Transform3f transform;
Transform3f identity;
CollisionRequest request;
CollisionResult result;
bool res;
res = (collide(&s1, Transform3f(), &s2, Transform3f(), request, result) > 0);
std::cout << "res" << res << std::endl;

出力は「res1」でした

「1」とはどういう意味ですか? 衝突ということですか?そして、ここでの物理的な衝突の意味は何ですか? オブジェクトの位置はどこですか?なぜこれが ROS wiki の API に従っていないのですか?

長い質問で申し訳ありませんが、私は初めて FCL を使用し、それについて何も知りません。

4

1 に答える 1

1

まず第一に、これは部分的な回答にすぎません。私は FCL を知りませんが、質問 4 には概ね答えることができます。

4) BVH モデルの意味は何ですか?

BVH はBounding Volume Hierarchyの略です。バウンディング ボリュームは、モデルのポイント (または三角形) を囲む幾何学的形状です。簡単な例は バウンディング ボックスですが、他にももっと複雑なものがあります。

BVH は、多くのバウンディング ボリュームのツリー構造です。ルート ノードは、モデル全体を囲む BV です。次に、モデルのポイントが 2 つの異なるサブセットに分割されます。これらのサブセットごとに、新しい BV が計算されます。これらの新しい BV は、ルートの子ノードを形成します。

子ノードは再び分割され、終了基準が満たされるまでこのプロセスが再帰的に続行されます (たとえば、ノード内のポイントの数が事前定義された制限よりも少なくなります)。この構造体のリーフ ノードには、モデルの実際のポイントが含まれています。

では、この BVH は何に役立つのでしょうか。

この構造の目的は、衝突検出などのタスクで計算時間を短縮することです。

ロボットが何らかの障害物に衝突したかどうかを知りたいとしましょう。ロボット モデルの BVH がある場合、最初はルート バウンディング ボリュームが障害物と衝突するかどうかのみを確認します。

それらが衝突しない場合は、すぐに終了します (バウンディング ボリュームが衝突しない場合、囲まれたロボット モデルも衝突できません)。

衝突する場合は、階層を下って、子 BV が障害物と衝突するかどうかを確認する必要があります。そのうちの 1 つが衝突した場合は、さらに下に移動して、その子を再帰的にチェックする必要があります。ただし、そのうちの 1 つが衝突しない場合は、このノードにぶら下がっているサブツリー全体を削除して、多くの計算を節約できます。リーフ ノードに到達した場合にのみ、ロボット モデルの実際のポイントを確認する必要があります。

詳細については、たとえばWikipediaを参照してください。

ただし、BVH はモデルが複雑なメッシュの場合にのみ役立つと思います。そのため、ここでは別のものが必要になると思います。

于 2015-02-12T09:02:47.477 に答える