Ограничение PCL ICP выводится из 6dof только в 3dof Переводы - PullRequest
0 голосов
/ 01 марта 2020

Я хотел бы реализовать pcl icp для 2 наборов pointcloud. Однако проблема возникла, когда я хотел бы добавить некоторые ограничения, чтобы зафиксировать ось вращения в трехмерном пространстве. Я понял, что могу ограничить его 3dof (1 вращением и 2 переводами) следующим образом: https://github.com/PointCloudLibrary/pcl/blob/master/tools/icp2d.cpp

Однако, если бы я хотел сделать пользовательские ограничения для некоторых специфических c dof , Является ли это возможным?? (например, удалить все 3-осевые вращения)

P / s: это можно сделать с помощью pcl::registration::TransformationEstimationLM, который может быть еще более icp.setTransformationEstimation (te)?

1 Ответ

0 голосов
/ 20 марта 2020

В связи с этим мне удалось ограничить его наличием собственного WrapPoingRigid6D.h, который является модификацией <pcl/registration/warp_point_rigid_6d.h>

Модификация выглядит следующим образом:

  void 
  setParam (const VectorX & p) override
  {
    assert (p.rows () == this->getDimension ());

    // Copy the rotation and translation components
    transform_matrix_.setZero ();
    transform_matrix_.setIdentity ();   
    transform_matrix_ (0, 3) = p[0];
    transform_matrix_ (1, 3) = p[1];
    transform_matrix_ (2, 3) = p[2];
  }

После создав свой собственный WarpPointRigid3DTrans, передайте его в pcl icp:

  WarpPointRigid3DTrans<pcl::PointXYZ, pcl::PointXYZ>::Ptr warp_fcn 
    (new camera_lib::WarpPointRigid3DTrans<pcl::PointXYZ, pcl::PointXYZ>);
  pcl::registration::TransformationEstimationLM<pcl::PointXYZ, pcl::PointXYZ>::Ptr te 
    (new pcl::registration::TransformationEstimationLM<pcl::PointXYZ, pcl::PointXYZ>);
  te->setWarpFunction (warp_fcn);
  icp.setTransformationEstimation (te);

Это будет работать по мере необходимости. Таким образом, есть свой собственный wrappointrigid для удовлетворения ваших потребностей. Ура! * * 1013

...