rslidar_driver.h 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. #pragma once
  2. #include <iostream>
  3. #include <thread>
  4. #include <mutex>
  5. #include <chrono>
  6. #include <functional>
  7. #include <Eigen/Core>
  8. #include <Eigen/Geometry>
  9. #include <pcl/point_types.h>
  10. #include <pcl/point_cloud.h>
  11. #include <deque>
  12. #include <glog/logging.h>
  13. #include "rs_driver/api/lidar_driver.hpp"
  14. #include "rs_driver/driver/decoder/decoder_factory.hpp"
  15. #include "pcl/common/transforms.h"
  16. #ifdef ENABLE_PCL_POINTCLOUD
  17. #include <rs_driver/msg/pcl_point_cloud_msg.hpp>
  18. #else
  19. #include "rs_driver/msg/point_cloud_msg.hpp"
  20. #endif
  21. #include "error_code/error_code.hpp"
  22. #include "rslidar_mqtt_async.h"
  23. #include <opencv2/opencv.hpp>
  24. using namespace robosense::lidar;
  25. typedef PointXYZIRT PointT;
  26. typedef PointCloudT<PointT> PointCloudMsg;
  27. typedef int (*ArrivedCloudPoint)(std::shared_ptr<PointCloudMsg> msg);
  28. class RslidarDevice {
  29. public:
  30. // rslidar status
  31. enum RSLIDAR_STATUS {
  32. E_UNKNOWN = 0, //未知
  33. E_READY = 1, //正常待机
  34. E_DISCONNECT = 2, //断连
  35. E_BUSY = 3, //工作正忙
  36. E_FAULT = 10, //故障
  37. };
  38. public:
  39. // 无参构造函数
  40. RslidarDevice();
  41. // 析构函数
  42. ~RslidarDevice();
  43. // 初始化
  44. Error_manager init();
  45. Error_manager init(RSDriverParam &param);
  46. Error_manager uninit();
  47. Error_manager get_last_cloud(std::vector<uint8_t> &data);
  48. bool updateRSTransformParam(RSTransformParam &transform_param);
  49. //判断是否为待机,如果已经准备好,则可以执行任务。
  50. bool is_ready();
  51. RSLIDAR_STATUS status();
  52. int id();
  53. private:
  54. void update_status();
  55. std::shared_ptr<PointCloudMsg> driverGetPointCloudFromCallerCallback(void);
  56. void driverReturnPointCloudToCallerCallback(std::shared_ptr<PointCloudMsg> msg);
  57. void exceptionCallback(const Error &code);
  58. void packetCallback(const Packet &pkt);
  59. static void decoderexceptionCallback(const Error &code) {};
  60. static void decoderCallback(uint16_t v_c, double v_b) {};
  61. protected:
  62. // 测试变量
  63. std::thread *mp_cloud_handle_thread;
  64. double m_timestamp;
  65. //状态
  66. RSLIDAR_STATUS m_rs_lidar_device_status; //设备状态
  67. RSLIDAR_STATUS m_rs_protocol_status;
  68. // 雷达配置
  69. RSDriverParam m_lidar_params;
  70. LidarDriver<PointCloudMsg> m_lidar_driver; ///< Declare the driver object
  71. // // 空点云缓存
  72. SyncQueue<std::shared_ptr<PointCloudMsg>> free_cloud_queue;
  73. SyncQueue<std::shared_ptr<PointCloudMsg>> stuffed_cloud_queue;
  74. std::mutex m_cloud_mutex;
  75. // 完整可获取点云
  76. std::vector<PointT> m_ring_cloud;
  77. // 获取点云时间
  78. std::chrono::steady_clock::time_point m_capture_time;
  79. // 点云内参齐次矩阵
  80. Eigen::Matrix4d m_calib_matrix;
  81. std::deque<std::vector<unsigned char>> m_lidar_data;
  82. std::vector<unsigned char> m_tmp_data;
  83. std::string m_topic;
  84. std::shared_ptr<robosense::lidar::Decoder<PointCloudMsg>> m_decoder_ptr_;
  85. std::shared_ptr<PointCloudMsg> m_point_cloud_ = std::make_shared<PointCloudMsg>();
  86. };