shuttler_verifier.cpp 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. //
  2. // Created by zx on 2021/8/6.
  3. //
  4. #include "shuttler_verifier.h"
  5. shuttler_verifier::shuttler_verifier()
  6. {
  7. }
  8. shuttler_verifier::~shuttler_verifier()
  9. {
  10. }
  11. shuttler_verifier& shuttler_verifier::operator=(const shuttler_verifier& shutter)
  12. {
  13. m_plane=shutter.m_plane;
  14. m_maxd=shutter.m_maxd;
  15. m_mind=shutter.m_mind;
  16. }
  17. void shuttler_verifier::set_condition(Eigen::Vector4f plane, float maxd, float mind)
  18. {
  19. m_plane=plane;
  20. m_maxd=maxd;
  21. m_mind=mind;
  22. }
  23. Error_manager shuttler_verifier::verify(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud)
  24. {
  25. for(int i=0;i<cloud->size();++i)
  26. {
  27. if(pointInRectangle(cloud->points[i]))
  28. return FAILED;
  29. }
  30. return SUCCESS;
  31. }
  32. bool shuttler_verifier::pointInRectangle(pcl::PointXYZ point)
  33. {
  34. float a=m_plane[0];
  35. float b=m_plane[1];
  36. float c=m_plane[2];
  37. float d=m_plane[3];
  38. //计算点到该平面的距离
  39. float D=(a*point.x+b*point.y+c*point.z+d)/sqrt(a*a+b*b+c*c);
  40. if(D>m_mind && D<m_maxd)
  41. return true;
  42. return false;
  43. }
  44. void shuttler_verifier::create_plane(pcl::visualization::PCLVisualizer& viewer)
  45. {
  46. static int count=0;
  47. char name[64]={0};
  48. sprintf(name,"plane_%d",count++);
  49. float a=m_plane[0],b=m_plane[1],c=m_plane[2],d=m_plane[3];
  50. float x=3,z=0.5;
  51. float y=(-d-a*x-c*z)/b;
  52. float rz=atan2(a,b);
  53. float ry=atan2(a,c);
  54. float rx=atan2(c,b);
  55. Eigen::Vector3f center(x,y,z);
  56. float ea[] = {rx,ry,rz};
  57. Eigen::Quaternionf quaternion = Eigen::AngleAxisf(ea[0], Eigen::Vector3f::UnitX()) *
  58. Eigen::AngleAxisf(ea[1], Eigen::Vector3f::UnitY()) *
  59. Eigen::AngleAxisf(ea[2], Eigen::Vector3f::UnitZ());
  60. viewer.addCube(center, quaternion, 6, 0.04, 1, name);
  61. viewer.setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 1, 0.5, 0, name);
  62. viewer.setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_OPACITY, 0.3, name);
  63. }