我只想使用FCL库进行碰撞检测。
我的第一个目标是机器人,我想用球体的形状来指定它,其次,用八叉树来描述世界上的障碍物。
我试着按照指令来创建这个检测代码。
如何从ROS中的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的API?
很抱歉有这么长的问题,但是我第一次使用FCL,我对它一无所知。
发布于 2015-02-12 09:02:47
首先,这只是一个部分的答案。我不知道FCL,但我一般可以回答问题4,也许其他人会回答其他问题。
4) BVH模型的含义是什么?
BVH是包围卷层次结构的缩写。包围体积是一种几何形状,包括某些模型的点(或三角形)。一个简单的例子是一个边框,但是还有其他的,更复杂的。
BVH是一个包含多个边界卷的树结构:根节点是包围整个模型的BV。然后将模型中的点分解为两个不同的子集。对于这些子集中的每一个,计算新的BV。这些新的BV形成根的子节点。
子节点再次被分割,递归地继续这个过程,直到某个终止条件被完全填充(例如,一个节点中的点数小于某个预定义的限制)。该结构的叶节点包含模型的实际点。
这个BVH有什么好处?
这种结构的目的是减少碰撞检测等任务的计算时间:
假设,我想知道,机器人是否与障碍物相撞。如果我有一个机器人模型的BVH,我首先只检查根边界体积是否与障碍物碰撞。
如果它们不碰撞,我立即完成(如果包围体积不碰撞,封闭的机器人模型也不能碰撞)。
如果他们真的碰撞了,我必须下降到等级,看看孩子的BVs是否与障碍碰撞。如果其中一个碰撞,我必须进一步下去,递归检查它的孩子。但是,如果其中一个没有碰撞,我可以剔除挂在这个节点上的整个子树,从而节省大量的计算。只有当我到达一个叶节点时,我才能看到机器人模型的实际点。
例如,可以在维基百科上找到更多的信息。
--但是,我认为,只有当模型是复杂的网格时,BVH才是有用的,所以我想这里需要一些不同的东西。
https://stackoverflow.com/questions/28453952
复制相似问题