我想仅使用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中,他们使用三角形,据我所知,三角形仅用于三维网格。我不想使用网格,我想要八叉树和球体作为对象。
我找了一些例子,发现了以下内容:
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,我对此一无所知。
答案 0 :(得分:1)
首先:这只是部分答案。 我不知道FCL,但我一般可以回答问题4.也许有人回答了问题 其他要点。
BVH是 Bounding Volume Hierarchy 的缩写。边界体积是几何的 包围某些模型的点(或三角形)的形状。一个简单的例子是 边界框,但还有其他更复杂的。
BVH是许多边界体积的树结构: 根节点是包围整个模型的BV。然后点了 模型分为两个不同的子集。对于这些子集中的每一个,新的BV是 计算。这些新的BV构成了根的子节点。
子节点再次被拆分,递归地继续这个过程直到某些节点 终止标准已满(例如,节点中的点数较少 超过一些预定义的限制)。 此结构的叶节点包含模型的实际点。
现在,这个BVH的优点是什么?
这个结构的目的是减少任务中的计算时间 碰撞检测:
让我们假设,我想知道,如果机器人碰到了一些障碍物。如果我有 对于机器人模型的BVH,我首先只检查根部的边界体积 碰撞障碍。
如果它们没有碰撞,我立即完成(如果边界体积确实如此 没有碰撞,封闭的机器人模型也不会碰撞。)
如果他们确实发生了碰撞,我必须进入层次结构,检查是否存在 儿童BV与障碍物碰撞。如果其中一个发生碰撞,我必须离开 进一步向下,递归检查其孩子。但是,如果其中一个确实如此 没有碰撞,我可以剔除挂在这个节点上的整个子树,节省了很多 计算 只有当我到达叶子节点时,我才能看到机器人的实际点 模型。
例如,可以在Wikipedia上找到更多信息。
但是,我认为,如果你的模型是复杂的网格,BVH只是有用的, 所以我猜你在这里需要不同的东西。