rslidar_mqtt_async.cpp 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. /**
  2. * @project ALG_WHeelData
  3. * @brief 从mqtt服务器获取点云数据并进行处理,仅给外部一个获取数据的接口。
  4. * @author lz
  5. * @data 2023/4/21
  6. **/
  7. #include "rslidar_mqtt_async.h"
  8. bool CloudDataMqttAsync::init() {
  9. m_message_arrived_callback_ = CloudDataArrived;
  10. MqttAsyncClient::init_from_proto(MQTT_CONFIG_PATH);
  11. return true;
  12. }
  13. int CloudDataMqttAsync::CloudDataArrived(MqttAsyncClient *client, char *topicName, int topicLen,
  14. MQTTAsync_message *message) {
  15. std::string topic = topicName;
  16. DLOG(INFO) << "received message from topic : " << topic << ".";
  17. auto *m_client = dynamic_cast<CloudDataMqttAsync *>(client);
  18. m_client->insertCloudData(topic, (unsigned char *) message->payload, message->payloadlen);
  19. return true;
  20. }
  21. bool CloudDataMqttAsync::getCloudData(const std::string &topic, pcl::PointCloud<pcl::PointXYZ>::Ptr &cloud) {
  22. std::lock_guard<std::mutex> lck(m_cloud_mutex);
  23. // 检测时间戳是否超时
  24. auto iter_time = m_cloud_time_stamp_map.find(topic);
  25. if (iter_time == m_cloud_time_stamp_map.end()) {
  26. return false;
  27. }
  28. std::chrono::duration<double> diff = std::chrono::steady_clock::now() - iter_time->second;
  29. if (diff.count() > 1) {
  30. LOG(WARNING) << "cloud not update, please re-check lidar mqtt statu.";
  31. return false;
  32. }
  33. // 检测点云数据是否存在
  34. auto iter = m_full_clouds_map.find(topic);
  35. if (iter == m_full_clouds_map.end()) {
  36. LOG(WARNING) << "find topic " << topic << " in m_cloud_map error, please re-check save data code.";
  37. return false;
  38. }
  39. for (auto &point: iter->second->points) {
  40. cloud->emplace_back(point.x, point.y, point.z);
  41. }
  42. return true;
  43. }
  44. bool CloudDataMqttAsync::getCloudData(const std::string &topic, pcl::PointCloud<pcl::PointXYZI>::Ptr &cloud) {
  45. std::lock_guard<std::mutex> lck(m_cloud_mutex);
  46. // 检测时间戳是否超时
  47. auto iter_time = m_cloud_time_stamp_map.find(topic);
  48. if (iter_time == m_cloud_time_stamp_map.end()) {
  49. return false;
  50. }
  51. std::chrono::duration<double> diff = std::chrono::steady_clock::now() - iter_time->second;
  52. if (diff.count() > 1) {
  53. LOG(WARNING) << "cloud not update, please re-check lidar mqtt statu.";
  54. return false;
  55. }
  56. // 检测点云数据是否存在
  57. auto iter = m_full_clouds_map.find(topic);
  58. if (iter == m_full_clouds_map.end()) {
  59. LOG(WARNING) << "find topic " << topic << " in m_cloud_map error, please re-check save data code.";
  60. return false;
  61. }
  62. // 获取点云输据
  63. pcl::PointXYZI pt;
  64. for (auto &point: iter->second->points) {
  65. pt.x = point.x;
  66. pt.y = point.y;
  67. pt.z = point.z;
  68. pt.intensity = point.intensity;
  69. cloud->emplace_back(pt);
  70. }
  71. return true;
  72. }
  73. bool CloudDataMqttAsync::getCloudData(const std::string &topic, pcl::PointCloud<pcl::PointRPRY>::Ptr &cloud) {
  74. std::lock_guard<std::mutex> lck(m_cloud_mutex);
  75. // 检测时间戳是否超时
  76. auto iter_time = m_cloud_time_stamp_map.find(topic);
  77. if (iter_time == m_cloud_time_stamp_map.end()) {
  78. return false;
  79. }
  80. std::chrono::duration<double> diff = std::chrono::steady_clock::now() - iter_time->second;
  81. if (diff.count() > 1) {
  82. LOG(WARNING) << "cloud not update, please re-check lidar mqtt statu.";
  83. return false;
  84. }
  85. // 检测点云数据是否存在
  86. auto iter = m_full_clouds_map.find(topic);
  87. if (iter == m_full_clouds_map.end()) {
  88. LOG(WARNING) << "find topic " << topic << " in m_cloud_map error, please re-check save data code.";
  89. return false;
  90. }
  91. pcl::PointRPRY pt;
  92. for (auto &point: iter->second->points) {
  93. pt.pitch = point.pitch;
  94. pt.yaw = point.yaw;
  95. pt.roll = point.roll;
  96. pt.r = point.r;
  97. cloud->emplace_back(pt);
  98. }
  99. return true;
  100. }
  101. bool CloudDataMqttAsync::getCloudData(const std::string &topic, pcl::PointCloud<pcl::PointALL>::Ptr &cloud) {
  102. std::lock_guard<std::mutex> lck(m_cloud_mutex);
  103. // 检测时间戳是否超时
  104. auto iter_time = m_cloud_time_stamp_map.find(topic);
  105. if (iter_time == m_cloud_time_stamp_map.end()) {
  106. return false;
  107. }
  108. std::chrono::duration<double> diff = std::chrono::steady_clock::now() - iter_time->second;
  109. if (diff.count() > 3) {
  110. }
  111. if (diff.count() > 1) {
  112. LOG(WARNING) << "cloud not update, please re-check lidar mqtt statu.";
  113. return false;
  114. }
  115. // 检测点云数据是否存在
  116. auto iter = m_full_clouds_map.find(topic);
  117. if (iter == m_full_clouds_map.end()) {
  118. LOG(WARNING) << "find topic " << topic << " in m_cloud_map error, please re-check save data code.";
  119. return false;
  120. }
  121. cloud->insert(cloud->end(), iter->second->points.begin(), iter->second->points.end());
  122. return true;
  123. }
  124. bool CloudDataMqttAsync::insertCloudData(std::string &topic, unsigned char *cloud_data, int size) {
  125. pcl::PointCloud<pcl::PointALL>::Ptr clouds(new pcl::PointCloud<pcl::PointALL>);
  126. // 解压数据,获得点云
  127. m_unpacket->unpacket((unsigned char *) cloud_data, size, clouds);
  128. std::lock_guard<std::mutex> lck(m_cloud_mutex);
  129. auto iter_full_cloud = m_full_clouds_map.find(topic);
  130. if (iter_full_cloud == m_full_clouds_map.end()) {
  131. m_full_clouds_map.insert(
  132. std::pair<std::string, pcl::PointCloud<pcl::PointALL>::Ptr>(topic, new pcl::PointCloud<pcl::PointALL>));
  133. iter_full_cloud = m_full_clouds_map.find(topic);
  134. }
  135. auto iter_cloud_time_stamp = m_cloud_time_stamp_map.find(topic);
  136. if (iter_cloud_time_stamp == m_cloud_time_stamp_map.end()) {
  137. m_cloud_time_stamp_map.insert(
  138. std::pair<std::string, std::chrono::steady_clock::time_point>(topic, std::chrono::steady_clock::now()));
  139. iter_cloud_time_stamp = m_cloud_time_stamp_map.find(topic);
  140. }
  141. iter_full_cloud->second->swap(*clouds);
  142. iter_cloud_time_stamp->second = std::chrono::steady_clock::now();
  143. return true;
  144. }