LivoxLaser.h 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. #ifndef __LIVOX_MID_40_LIDAR__H
  2. #define __LIVOX_MID_40_LIDAR__H
  3. #include "Laser.h"
  4. #include "livox_def.h"
  5. #include "livox_sdk.h"
  6. #include <map>
  7. #define DEFAULT_HANDLE 255
  8. //大疆livox雷达,从Laser_base继承。
  9. class CLivoxLaser :public Laser_base
  10. {
  11. public:
  12. //雷达设备状态,livox管理底层sdk,后台线程的工作状态
  13. typedef enum
  14. {
  15. K_DEVICE_STATE_DISCONNECT = 0, //雷达设备状态 断开连接
  16. K_DEVICE_STATE_CONNECT = 1, //雷达设备状态 连接正常
  17. K_DEVICE_STATE_SAMPLING = 2, //雷达设备状态 正在扫描
  18. K_DEVICE_STATE_FAULT = 3, //雷达设备状态 故障
  19. } DeviceState;
  20. //雷达设备信息,
  21. typedef struct
  22. {
  23. uint8_t handle; //雷达控制句柄
  24. DeviceState device_state; //雷达设备状态
  25. DeviceInfo info; //雷达基本信息
  26. } DeviceItem;
  27. public:
  28. CLivoxLaser() = delete;
  29. CLivoxLaser(const CLivoxLaser& other) = delete;
  30. //唯一的构造函数,按照设备名称和雷达参数来创建实例。
  31. //input:id: 雷达设备的id,(唯一索引)
  32. //input:laser_param:雷达的参数,
  33. //注:利用protobuf创建 laser_parameter 类,然后从文件读取参数
  34. CLivoxLaser(int id, Laser_proto::laser_parameter laser_param);
  35. ~CLivoxLaser();
  36. //雷达链接设备,为3个线程添加线程执行函数。
  37. virtual Error_manager connect_laser();
  38. //雷达断开链接,释放3个线程
  39. virtual Error_manager disconnect_laser();
  40. //对外的接口函数,负责接受并处理任务单,
  41. //input:p_laser_task 雷达任务单,基类的指针,指向子类的实例,(多态)
  42. //注:这个函数为虚函数,实际的处理任务的代码由子类重载并实现。
  43. virtual Error_manager execute_task(Task_Base* p_laser_task);
  44. //检查雷达状态,是否正常运行
  45. virtual Error_manager check_status();
  46. //雷达的启动接口函数, 让雷达进行扫描,一般需要子类重载,不同的雷达开始方式不同。
  47. virtual Error_manager start_scan();
  48. //雷达的停止接口函数, 让雷达停止扫描,一般需要子类重载,不同的雷达结束方式不同。
  49. virtual Error_manager stop_scan();
  50. //结束任务单,stop之后,要检查线程状态和数据结果,然后才能 end_task
  51. virtual Error_manager end_task();
  52. //取消任务单,由发送方提前取消任务单
  53. virtual Error_manager cancel_task();
  54. //判断雷达状态是否为待机,如果已经准备好,则可以执行任务。
  55. //子类重载 is_ready(),里面增加livox sdk后台线程状态的判断。
  56. virtual bool is_ready();
  57. //判断是否扫描完成
  58. virtual bool is_scan_complete();
  59. //往数据缓存里面添加雷达数据,
  60. virtual Error_manager push_livox_data(Binary_buf* p_binary_buf);
  61. //雷达帧数计数增加
  62. virtual Error_manager add_livox_frame(int add_count);
  63. public://set and get
  64. void set_livox_device(uint8_t handle, DeviceState device_state = K_DEVICE_STATE_DISCONNECT, DeviceInfo info = DeviceInfo() );
  65. void set_handle(uint8_t handle);
  66. void set_device_state(DeviceState device_state);
  67. CLivoxLaser::DeviceState get_device_state();
  68. void set_device_info(DeviceInfo info);
  69. protected:
  70. //接受二进制消息的功能函数,并将其存入 m_queue_laser_data, 每次只转化一个CBinaryData,
  71. // 纯虚函数,必须由子类重载,
  72. virtual Error_manager receive_buf_to_queue();
  73. //将二进制消息转化为三维点云的功能函数,并将其存入 任务单 , 每次只转化一个CBinaryData,
  74. // 纯虚函数,必须由子类重载,
  75. virtual Error_manager transform_buf_to_points();
  76. protected:
  77. DeviceItem m_livox_device;//雷达设备信息,handle在这里面.
  78. unsigned int m_frame_count;//扫描当前帧数
  79. unsigned int m_frame_maxnum;//扫描最大帧数
  80. Thread_safe_queue<Binary_buf*> m_queue_livox_data;//雷达数据
  81. //注意了:雷达每帧数据都包含很多个三维点.
  82. //例如 livox雷达,每帧数据对应一个Binary_buf.对应100个三维点.
  83. //1000帧就是十万个三维点.
  84. };
  85. #endif