wheel_detector.h 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. #pragma once
  2. #include "thread/singleton.h"
  3. #include <algorithm>
  4. #include <pcl/point_cloud.h>
  5. #include <pcl/point_types.h>
  6. #include <pcl/filters/passthrough.h>
  7. #include <pcl/filters/statistical_outlier_removal.h>
  8. #include <pcl/common/transforms.h>
  9. #include <pcl/visualization/pcl_visualizer.h>
  10. #include "pcl/point3D_tool.h"
  11. class WheelCeresDetector : public Singleton<WheelCeresDetector> {
  12. friend class Singleton<WheelCeresDetector>;
  13. public:
  14. struct WheelDetectResult {
  15. bool haveCloud = false;
  16. bool segmentOk = false;
  17. bool detectOk = false;
  18. pcl::PointXYZ center;
  19. float confidence = 0;
  20. float theta = 0;
  21. float loss = 0;
  22. void reset() {
  23. haveCloud = false;
  24. segmentOk = false;
  25. detectOk = false;
  26. center.x = 0;
  27. center.y = 0;
  28. center.z = 0;
  29. confidence = 0;
  30. theta = 0;
  31. loss = 0;
  32. }
  33. std::string info() {
  34. char str[512];
  35. sprintf(str, "x: %.3f, y: %.3f, z: %.3f, theta: %.3f loss: %.3f conf: %.3f\n",
  36. center.x, center.y, center.z, theta, loss, confidence);
  37. return str;
  38. }
  39. };
  40. WheelCeresDetector &operator=(const WheelCeresDetector &) = delete;
  41. ~WheelCeresDetector() override = default;
  42. // 单轮检测
  43. bool detect(pcl::PointCloud<pcl::PointXYZ>::Ptr in_cloud_ptr, pcl::PointCloud<pcl::PointXYZ>::Ptr out_cloud_ptr,
  44. WheelDetectResult &result, bool left_model);
  45. bool detect(pcl::PointCloud<pcl::PointXYZ>::Ptr left_in_cloud, pcl::PointCloud<pcl::PointXYZ>::Ptr left_out_cloud,
  46. WheelDetectResult &left_result,
  47. pcl::PointCloud<pcl::PointXYZ>::Ptr right_in_cloud, pcl::PointCloud<pcl::PointXYZ>::Ptr right_out_cloud,
  48. WheelDetectResult &right_result);
  49. bool detect(std::vector<pcl::PointCloud<pcl::PointXYZ>::Ptr> vct_wheels_cloud,
  50. pcl::PointCloud<pcl::PointXYZ>::Ptr left_out_cloud,
  51. WheelCeresDetector::WheelDetectResult *wheels_result);
  52. protected:
  53. // 父类的构造函数必须保护,子类的构造函数必须私有。
  54. WheelCeresDetector() = default;
  55. private:
  56. std::vector<float> singleWheelModel();
  57. std::vector<float> singleLeftWheelModel();
  58. std::vector<float> singleRightWheelModel();
  59. void doubleWheelModel( std::vector<float>& linel,std::vector<float>& liner);
  60. private:
  61. std::vector<double> line_;
  62. };