/* * @Description: velodyne多线雷达管理类 * @Author: yct * @Date: 2021-07-23 16:37:33 * @LastEditTime: 2021-07-28 16:10:45 * @LastEditors: yct */ #ifndef VELODYNE_MANAGER_HH #define VELODYNE_MANAGER_HH #include #include #include "../tool/singleton.h" #include "../error_code/error_code.h" #include "./velodyne_driver/velodyne_lidar_device.h" #include "./ground_region.h" #include "velodyne_config.pb.h" #include "velodyne_manager_task.h" class Velodyne_manager : public Singleton { // 子类必须把父类设定为友元函数,这样父类才能使用子类的私有构造函数。 friend class Singleton; //万集管理任务超时时间1000ms, #define VELODYNE_MANAGER_EXECUTE_TIMEOUT_MS 1000 //万集配置参数的默认路径 #define VELODYNE_MANAGER_PARAMETER_PATH "../setting/velodyne_manager.prototxt" //雷达管理的状态 enum Velodyne_manager_status { E_UNKNOWN = 0, //未知 E_READY = 1, //准备,待机 E_BUSY = 2, //工作正忙 E_ISSUED_SCAN = 3, //下发任务, 获取点云 E_WAIT_SCAN = 4, //等待任务, 扫描点云 E_ISSUED_DETECT = 5, //下发任务, 算法预测 E_WAIT_DETECT = 6, //等待任务, 算法预测 E_FAULT = 10, //故障 }; public: // 必须关闭拷贝构造和赋值构造,只能通过 get_instance 函数来进行操作唯一的实例。 Velodyne_manager(const Velodyne_manager &) = delete; Velodyne_manager &operator=(const Velodyne_manager &) = delete; ~Velodyne_manager() = default; //初始化 雷达 管理模块。如下三选一 Error_manager velodyne_manager_init(); //初始化 雷达 管理模块。从文件读取 Error_manager velodyne_manager_init_from_protobuf(std::string prototxt_path); //初始化 雷达 管理模块。从protobuf读取 Error_manager velodyne_manager_init_from_protobuf(velodyne::velodyneManagerParams & velodyne_parameters); // 反初始化 Error_manager Velodyne_manager_uninit(); //对外的接口函数,负责接受并处理任务单, Error_manager execute_task(Task_Base* p_velodyne_manager_task); //结束任务单,里面会根据任务的故障等级修正雷达管理模块的状态和任务单的状态 Error_manager end_task(); //取消任务单,由发送方提前取消任务单 Error_manager cancel_task(Task_Base* p_velodyne_manager_task); //检查雷达状态,是否正常运行 Error_manager check_status(); //判断是否为待机,如果已经准备好,则可以执行任务。 bool is_ready(); public://get or set member variable Velodyne_manager_status get_status() { return m_velodyne_manager_status; } std::map &get_velodyne_lidar_device_map() { return m_velodyne_lidar_device_map; } std::map &get_ground_region_map() { return m_ground_region_map; } protected://member functions //自动收集点云的线程函数 void collect_cloud_thread_fun(); //开始自动预测的算法线程 Error_manager start_auto_detect(); //关闭自动预测的算法线程 Error_manager stop_auto_detect(); //执行外界任务的执行函数 void execute_thread_fun(); private: // 父类的构造函数必须保护,子类的构造函数必须私有。 Velodyne_manager() = default; Velodyne_manager_status m_velodyne_manager_status; //velodyne管理状态 std::map m_velodyne_lidar_device_map; // velodyne雷达实例指针数组, 内存由本类管理 std::map m_ground_region_map; // 区域功能实例指针数组, 内存由本类管理 //velodyne雷达的自动功能, 定时收集所有点云, 然后通知detect去计算车轮信息. std::mutex m_cloud_collection_mutex; // 点云更新互斥锁 pcl::PointCloud::Ptr mp_cloud_collection; //扫描点的点云集合, 内存由本类管理 std::chrono::system_clock::time_point m_cloud_updata_time; //扫描点的更新时间. std::thread* mp_collect_cloud_thread; //收集点云的线程指针,内存由本类管理 Thread_condition m_collect_cloud_condition; //收集点云的条件变量 //任务执行线程 std::thread* mp_execute_thread; //执行的线程指针,内存由本类管理 Thread_condition m_execute_condition; //执行的条件变量 Velodyne_manager_task* mp_velodyne_manager_task; //velodyne管理模块的任务单的指针,内存由发送方管理。 }; #endif // !VELODYNE_MANAGER_HH