/* * Locate_manager 雷达定位管理模块 * * */ #ifndef LOCATER_H #define LOCATER_H #include "locate_manager_task.h" #include "locate_parameter.pb.h" #include "../error_code/error_code.h" #include "../tool/singleton.h" #include "../tool/thread_condition.h" #include "point_sift_segmentation.h" #include "cnn3d_segmentation.h" #define LOCATE_PARAMETER_PATH "../setting/locate.prototxt" class Locate_manager:public Singleton { // 子类必须把父类设定为友元函数,这样父类才能使用子类的私有构造函数。 friend class Singleton; public: //定位管理模块的工作状态 enum Locate_manager_status {//default LOCATE_MANAGER_UNKNOW = 0 LOCATE_MANAGER_UNKNOW = 0, //未知 LOCATE_MANAGER_READY = 1, //准备,待机 LOCATE_MANAGER_SIFT = 2, //sift点云筛选, 将车身和轮胎的点剥离出来 LOCATE_MANAGER_CAR = 3, //通过车身 计算汽车的定位信息. LOCATE_MANAGER_WHEEL = 4, //通过车轮 计算汽车的定位信息. LOCATE_MANAGER_FAULT = 5, //故障 }; private: // 父类的构造函数必须保护,子类的构造函数必须私有。 Locate_manager(); public: // 必须关闭拷贝构造和赋值构造,只能通过 get_instance 函数来进行操作唯一的实例。 Locate_manager(const Locate_manager&)=delete; Locate_manager& operator =(const Locate_manager&)= delete; ~Locate_manager(); public: //API 对外接口 //初始化 定位 管理模块。如下三选一 Error_manager Locate_manager_init(); //初始化 定位 管理模块。从文件读取 Error_manager Locate_manager_init_from_protobuf(std::string prototxt_path); //初始化 定位 管理模块。从protobuf读取 Error_manager Locate_manager_init_from_protobuf(Measure::LocateParameter& locate_parameters); //反初始化 定位 管理模块。 Error_manager Locate_manager_uninit(); //对外的接口函数,负责接受并处理任务单, //input:p_locate_task 定位任务单,基类的指针,指向子类的实例,(多态) Error_manager execute_task(Task_Base* p_locate_task); //检查状态,是否正常运行 Error_manager check_status(); //结束任务单,里面会根据任务的故障等级修正雷达管理模块的状态和任务单的状态 Error_manager end_task(); //取消任务单,由发送方提前取消任务单 Error_manager cancel_task(); //判断是否为待机,如果已经准备好,则可以执行任务。 bool is_ready(); public://get and set Locate_manager_status get_locate_manager_status(); protected: //mp_locate_manager_thread 线程执行函数, //thread_work 内部线程负责locate定位分析整车的信息,并且回收汇总雷达的数据 void thread_work(); //定位筛选,将输入点云map拆分为车轮和车身的map.(数据可以直接从locate_manager内部获取) Error_manager locate_manager_sift(); //定位筛选,对具体的点云进行操作,分离出车轮和车身. //input::cloud输入点云 //output::cloud_wheel输出车轮点云 //output::cloud_car输出车身点云 //work_dir:中间文件保存路径 Error_manager locate_sift(pcl::PointCloud::Ptr p_cloud_in, pcl::PointCloud::Ptr& p_cloud_wheel,pcl::PointCloud::Ptr& p_cloud_car, bool save_flag, std::string work_dir); //计算汽车的长宽高 Error_manager locate_manager_locate_car(); //根据汽车点云计算汽车的边界 Error_manager locate_car(pcl::PointCloud::Ptr cloud_car,pcl::PointXYZRGB& point3d_min, pcl::PointXYZRGB& point3d_max); //计算汽车的车轮信息 Error_manager locate_manager_locate_wheel(); //保存点云成txt到文件 static void save_cloud_txt(pcl::PointCloud::Ptr cloud,std::string save_file); private: Measure::LocateParameter m_locate_parameter; //定位模块的配置参数 Point_sift_segmentation* mp_point_sift; //定位模块的点筛选分割, 内存本类管理 Cnn3d_segmentation* mp_cnn3d; //定位模块的cnn3d分割, 内存本类管理 Locate_manager_status m_locate_manager_status; //定位管理的工作状态 std::atomic m_locate_manager_working_flag; //定位管理的工作使能标志位 std::thread* mp_locate_manager_thread; //定位管理的线程指针,内存由本类管理 Thread_condition m_locate_manager_condition; //定位管理的条件变量 //雷达管理的任务单指针,实际内存由发送方控制管理,//接受任务后,指向新的任务单 Locate_manager_task * mp_locate_manager_task; //定位管理任务单的指针,内存由发送方管理。 Locate_information* mp_locate_information; //测量结果 整车的定位信息,,内存由发送方管理。 std::atomic m_save_flag; //保存文件的使能标志位 std::string m_save_path; //保存文件的保存路径 //中间缓存, std::map::Ptr> m_cloud_wheel_map; //车轮的点云map,(4个轮胎) std::map::Ptr> m_cloud_car_map; //车身的点云map }; #endif //LOCATER_H