0

我只想使用 FCL 库进行碰撞检测。

我的第一个对象是机器人,我想使用球形来指定它,第二个对象是使用八叉树来指定世界上的障碍物。

我尝试按照说明创建此检测代码。

如何从 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 网格。我不想使用网格,我想要八叉树和球体作为对象。

  1. 那么我该如何修改呢?
  2. 之后,我应该使用哪个函数来返回碰撞发生的真或假?
  3. 如果我的数据更新了怎么办?我的意思是机器人正在移动,我想不断更新机器人和八叉树的位置?我该怎么做?
  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

首先:这只是部分答案。我不知道整箱,但我一般可以回答问题4。也许其他人回答其他问题。

4)BVH模型的含义是什么?

BVH 是Bounding Volume Hierarchy的缩写。包围体是包围某个模型的点(或三角形)的几何形状。一个简单的例子是 边界框,但还有其他更复杂的例子。

BVH 是许多包围体的树结构:根节点是包含整个模型的 BV。然后模型的点被分成两个不同的子集。对于这些子集中的每一个,都会计算一个新的 BV。这些新的 BV 形成根的子节点。

子节点再次分裂,递归地继续这个过程,直到某个终止标准被满足(例如,节点中的点数小于某个预定义的限制)。该结构的叶节点包含模型的实际点。

现在,这个 BVH 有什么用?

这种结构的目的是减少碰撞检测等任务的计算时间:

让我们假设,我想知道机器人是否与某些障碍物发生碰撞。如果我有机器人模型的 BVH,我首先只检查根包围体是否与障碍物碰撞。

如果它们不碰撞,我立即完成(如果包围体不碰撞,封闭的机器人模型也不能碰撞)。

如果它们确实发生了碰撞,我必须在层次结构中向下检查,检查子 BV 是否与障碍物发生碰撞。如果其中一个发生碰撞,我必须再往下走,递归地检查它的孩子。但是,如果其中一个没有碰撞,我可以剔除挂在该节点上的整个子树,从而节省大量计算。只有当我到达叶节点时,我才必须查看机器人模型的实际点。

例如,可以在Wikipedia上找到更多信息。

但是,我认为 BVH 仅在您的模型是复杂网格时才有用,所以我想您在这里需要一些不同的东西。

于 2015-02-12T09:02:47.477 回答