我正在构建一个bin-picking演示,我需要在由激光扫描仪生成的点云与机器人的末端执行器之间进行碰撞检查。
我打算用fcl(柔性碰撞库)和pcl(点云库)来完成这项工作。但是fcl的示例或教程非常有限。我在他们的github页面的fcl源代码中阅读了该演示,并编写了代码示例,但我做对了。以下是我编写的代码:
#include <iostream>
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <pcl/io/ply_io.h>
#include <fcl/geometry/bvh/BVH_model.h>
#include <fcl/narrowphase/collision.h>
int main(int argc, char **argv)
{
pcl::PointCloud<pcl::PointXYZ>::Ptr obj1_cloud(new pcl::PointCloud<pcl::PointXYZ>());
pcl::PointCloud<pcl::PointXYZ>::Ptr obj2_cloud(new pcl::PointCloud<pcl::PointXYZ>());
pcl::PLYReader ply_reader;
ply_reader.read(argv[1], *obj1_cloud);
ply_reader.read(argv[2], *obj2_cloud);
std::shared_ptr<fcl::BVHModel<fcl::AABB<double>>> model1(new fcl::BVHModel<fcl::AABB<double>>);
std::shared_ptr<fcl::BVHModel<fcl::AABB<double>>> model2(new fcl::BVHModel<fcl::AABB<double>>);
model1->beginModel();
for (int i = 0; i < obj1_cloud->points.size(); i++)
{
fcl::Vector3d point;
point(0) = obj1_cloud->points[i].x;
point(1) = obj1_cloud->points[i].y;
point(2) = obj1_cloud->points[i].z;
model1->addVertex(point);
}
model1->endModel();
model1->computeLocalAABB();
model2->beginModel();
for (int i = 0; i < obj2_cloud->points.size(); i++)
{
fcl::Vector3d point;
point(0) = obj2_cloud->points[i].x;
point(1) = obj2_cloud->points[i].y;
point(2) = obj2_cloud->points[i].z;
model2->addVertex(point);
}
model2->endModel();
model2->computeLocalAABB();
fcl::Transform3<double> pose1 = fcl::Transform3<double>::Identity();
fcl::Transform3<double> pose2 = fcl::Transform3<double>::Identity();
fcl::CollisionRequest<double> collision_request;
collision_request.gjk_solver_type = fcl::GJKSolverType::GST_INDEP;
fcl::CollisionResult<double> collision_result;
fcl::detail::MeshCollisionTraversalNode<fcl::AABB<double>> traveral_node;
if (!fcl::detail::initialize(traveral_node, *model1, pose1, *model2, pose2, collision_request, collision_result))
std::cout << "initialize error" << std::endl;
fcl::detail::collide(&traveral_node);
}
这段代码可以通过编译,但是在运行时总是给我错误。
“初始化错误 细分错误”
任何人都可以帮助我解决问题吗?谢谢您的帮助!
答案 0 :(得分:0)
fcl
源代码MeshCollisionTraversalNode
的 AFAIK应该用于BVHModel
为ModelType
的{{1}}。在程序中,您仅将点云中的所有顶点添加到BVH_MODEL_TRIANGLES
,因此其BVHModel
为ModelType
,不符合BVH_MODEL_POINTCLOUD
的要求。>
我认为您有两种解决问题的方法:
一种方法是在点云上运行三角剖分(请参阅:http://pointclouds.org/documentation/tutorials/greedy_projection.php),并构造MeshCollisionTraversalNode
中的BVHModel
。如果从BVH_MODEL_TRIANGLES
生成的网格模型是凹形的,则可能还需要在碰撞检测之前使用凸形分解。
另一种方法是使用八叉树作为点云的表示形式。您可以参考the answer了解更多详情。