rs_device_bridge.hpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. #ifndef RS_DEVICE_BRIDGE_HH
  2. #define RS_DEVICE_BRIDGE_HH
  3. /*
  4. * @Author: yct 18202736439@163.com
  5. * @Date: 2023-01-12 14:31:29
  6. * @LastEditors: yct 18202736439@163.com
  7. * @LastEditTime: 2023-01-12 15:14:54
  8. * @FilePath: /puai_wj_2021/velodyne_lidar/velodyne_driver/rs_device_bridge.h
  9. * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  10. */
  11. #include "rslidar_mqtt_async.h"
  12. #include "velodyne_driver/velodyne_lidar_device.h"
  13. class RS_device_bridge : public Velodyne_lidar_device {
  14. public:
  15. // 无参构造函数
  16. RS_device_bridge() {}
  17. // 析构函数
  18. ~RS_device_bridge() {}
  19. // 初始化
  20. Error_manager init(velodyne::velodyneLidarParams params) {
  21. m_lidar_id = params.lidar_id();
  22. return Error_code::SUCCESS;
  23. }
  24. // 反初始化
  25. Error_manager uninit() {
  26. delete m_rs_lidar;
  27. m_rs_lidar = nullptr;
  28. return Error_code::SUCCESS;
  29. }
  30. // 检查雷达状态,是否正常运行
  31. Error_manager check_status() {
  32. if (m_rs_lidar->isConnected()) {
  33. return Error_code::SUCCESS;
  34. }
  35. return Error_code::FAILED;
  36. }
  37. // 判断是否为待机,如果已经准备好,则可以执行任务。
  38. bool is_ready() {
  39. return m_rs_lidar->isConnected();
  40. }
  41. int get_lidar_id() {
  42. return m_lidar_id;
  43. }
  44. //外部调用获取新的点云, 获取指令时间之后的点云, 如果没有就会等待点云刷新, 直到超时, (内置while)
  45. Error_manager get_new_cloud_and_wait(std::mutex *p_mutex, pcl::PointCloud<pcl::PointXYZ>::Ptr p_cloud,
  46. std::chrono::steady_clock::time_point command_time, int timeout_ms = 1500) {
  47. m_rs_lidar->getCloudData("rslidar/" + std::to_string(m_lidar_id), p_cloud);
  48. if (p_cloud->empty()) {
  49. return Error_code::VELODYNE_LIDAR_DEVICE_NO_CLOUD;
  50. }
  51. return Error_code::SUCCESS;
  52. }
  53. //外部调用获取当前点云, 获取指令时间之后的点云, 如果没有就会报错, 不会等待
  54. // 注意!!!当前最新点云未成环,或许缺失数据
  55. Error_manager get_current_cloud(std::mutex *p_mutex, pcl::PointCloud<pcl::PointXYZ>::Ptr p_cloud,
  56. std::chrono::steady_clock::time_point command_time) {
  57. m_rs_lidar->getCloudData("rslidar/" + std::to_string(m_lidar_id), p_cloud);
  58. if (p_cloud->empty()) {
  59. return Error_code::VELODYNE_LIDAR_DEVICE_NO_CLOUD;
  60. }
  61. return Error_code::SUCCESS;
  62. }
  63. //外部调用获取最新的点云, 如果没有就会报错, 不会等待
  64. Error_manager get_last_cloud(std::mutex *p_mutex, pcl::PointCloud<pcl::PointXYZ>::Ptr p_cloud,
  65. std::chrono::steady_clock::time_point command_time) {
  66. m_rs_lidar->getCloudData("rslidar/" + std::to_string(m_lidar_id), p_cloud);
  67. if (p_cloud->empty()) {
  68. return Error_code::VELODYNE_LIDAR_DEVICE_NO_CLOUD;
  69. }
  70. return Error_code::SUCCESS;
  71. }
  72. //外部调用获取最新的点云, 获取指令时间往前一个周期内的点云, 如果没有就会报错, 不会等待
  73. //注:函数内部不加锁, 由外部统一加锁.
  74. Error_manager get_last_cloud(pcl::PointCloud<pcl::PointXYZ>::Ptr p_cloud,
  75. std::chrono::steady_clock::time_point command_time) {
  76. m_rs_lidar->getCloudData("rslidar/" + std::to_string(m_lidar_id), p_cloud);
  77. if (p_cloud->empty()) {
  78. return Error_code::VELODYNE_LIDAR_DEVICE_NO_CLOUD;
  79. }
  80. return Error_code::SUCCESS;
  81. }
  82. public:
  83. // TODO
  84. Velodyne_lidar_device_status get_status() {
  85. if (m_rs_lidar->isConnected() && m_rs_lidar->isTopicLoss("rslidar/" + std::to_string(m_lidar_id))) {
  86. return Velodyne_lidar_device_status(E_READY);
  87. }
  88. return Velodyne_lidar_device_status(E_DISCONNECT);
  89. }
  90. void updata_status() {}
  91. protected:
  92. protected:
  93. CloudDataMqttAsync *m_rs_lidar = CloudDataMqttAsync::instance();
  94. int m_lidar_id;
  95. };
  96. #endif