使用完整和八叉树对象,使用FCL遵循ROS wiki的API进行碰撞检测

时间:2015-02-11 12:06:12

标签: collision-detection collision ros octree fcl

我想仅使用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中,他们使用三角形,据我所知,三角形仅用于三维网格。我不想使用网格,我想要八叉树和球体作为对象。

  1. 那我怎么修改呢?
  2. 之后,我应该使用哪个函数来返回碰撞发生的真或假?
  3. 如果我的数据更新了怎么办?我的意思是机器人正在移动,我想继续更新机器人和八叉树的位置?我该怎么做?
  4. BVH模型的含义是什么?
  5. 我找了一些例子,发现了以下内容:

    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,我对此一无所知。

1 个答案:

答案 0 :(得分:1)

首先:这只是部分答案。 我不知道FCL,但我一般可以回答问题4.也许有人回答了问题 其他要点。

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

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

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

子节点再次被拆分,递归地继续这个过程直到某些节点 终止标准已满(例如,节点中的点数较少 超过一些预定义的限制)。 此结构的叶节点包含模型的实际点。

现在,这个BVH的优点是什么?

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

让我们假设,我想知道,如果机器人碰到了一些障碍物。如果我有 对于机器人模型的BVH,我首先只检查根部的边界体积 碰撞障碍。

如果它们没有碰撞,我立即完成(如果边界体积确实如此 没有碰撞,封闭的机器人模型也不会碰撞。)

如果他们确实发生了碰撞,我必须进入层次结构,检查是否存在 儿童BV与障碍物碰撞。如果其中一个发生碰撞,我必须离开 进一步向下,递归检查其孩子。但是,如果其中一个确实如此 没有碰撞,我可以剔除挂在这个节点上的整个子树,节省了很多 计算 只有当我到达叶子节点时,我才能看到机器人的实际点 模型。

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

但是,我认为,如果你的模型是复杂的网格,BVH只是有用的, 所以我猜你在这里需要不同的东西。