main.cpp 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. /**
  2. * @project Project
  3. * @brief TODO: add a brief
  4. * @author lz
  5. * @data 2023/6/24
  6. **/
  7. #include <iostream>
  8. #include <string>
  9. #include <pcl/io/ply_io.h>
  10. #include <pcl/point_types.h>
  11. #include <pcl/registration/icp.h>
  12. #include <pcl/visualization/pcl_visualizer.h>
  13. #include <pcl/console/time.h>
  14. #include <vector>
  15. #include <omp.h>
  16. #include <map>
  17. #include "rslidar_mqtt_async.h"
  18. using namespace std;
  19. typedef pcl::PointXYZ PointT;
  20. typedef pcl::PointCloud<PointT> PointCloudT;
  21. bool next_iteration = false;
  22. void print4x4Matrix(const Eigen::Matrix4d &matrix) {
  23. printf("Rotation matrix :\n");
  24. printf(" | %6.6f %6.6f %6.6f | \n", matrix(0, 0), matrix(0, 1), matrix(0, 2));
  25. printf("R = | %6.6f %6.6f %6.6f | \n", matrix(1, 0), matrix(1, 1), matrix(1, 2));
  26. printf(" | %6.6f %6.6f %6.6f | \n", matrix(2, 0), matrix(2, 1), matrix(2, 2));
  27. printf("Translation vector :\n");
  28. printf("t = < %6.6f, %6.6f, %6.6f >\n\n", matrix(0, 3), matrix(1, 3), matrix(2, 3));
  29. }
  30. void keyboardEventOccurred(const pcl::visualization::KeyboardEvent &event, void *nothing) {
  31. if (event.getKeySym() == "space" && event.keyDown())
  32. next_iteration = true;
  33. }
  34. void findcorrespondences(pcl::PointCloud<pcl::PointXYZ>::Ptr &source, pcl::PointCloud<pcl::PointXYZ>::Ptr &target,
  35. pcl::PointCloud<pcl::PointXYZ>::Ptr &P, pcl::PointCloud<pcl::PointXYZ>::Ptr &Q) {
  36. P->clear();
  37. Q->clear();
  38. pcl::KdTreeFLANN<pcl::PointXYZ> kdtree;
  39. kdtree.setInputCloud(target);
  40. //#pragma omp parallel for num_threads(200)
  41. for (int i = 0; i < source->points.size(); i++) {
  42. vector<int> indx;
  43. vector<float> dists;
  44. kdtree.nearestKSearch(source->points[i], 1, indx, dists);
  45. if (dists[0] < 0.02) {
  46. P->push_back(source->points[i]);
  47. Q->push_back(target->points[indx[0]]);
  48. }
  49. }
  50. }
  51. Eigen::Matrix<double, 4, 4> findRT(pcl::PointCloud<pcl::PointXYZ>::Ptr &P, pcl::PointCloud<pcl::PointXYZ>::Ptr &Q) {
  52. int n = P->points.size();
  53. Eigen::Matrix<double, 3, Eigen::Dynamic> matrixP(3, n), matrixQ(3, n);
  54. for (int i = 0; i < n; i++) {
  55. matrixP(0, i) = P->points[i].x;
  56. matrixP(1, i) = P->points[i].y;
  57. matrixP(2, i) = P->points[i].z;
  58. matrixQ(0, i) = Q->points[i].x;
  59. matrixQ(1, i) = Q->points[i].y;
  60. matrixQ(2, i) = Q->points[i].z;
  61. }
  62. Eigen::Matrix4d RT = Eigen::umeyama(matrixP, matrixQ);
  63. print4x4Matrix(RT);
  64. return RT;
  65. }
  66. void myICP(pcl::PointCloud<pcl::PointXYZ>::Ptr &source, pcl::PointCloud<pcl::PointXYZ>::Ptr &target,
  67. Eigen::Matrix<double, 4, 4> &RT) {
  68. pcl::PointCloud<pcl::PointXYZ>::Ptr P(new pcl::PointCloud<pcl::PointXYZ>);
  69. pcl::PointCloud<pcl::PointXYZ>::Ptr Q(new pcl::PointCloud<pcl::PointXYZ>);
  70. pcl::visualization::PCLVisualizer viewer("viewer");
  71. pcl::visualization::PointCloudColorHandlerCustom<PointT> cloud_source(source, 255, 0, 0), cloud_target(target, 255,
  72. 255, 255);
  73. viewer.addPointCloud(source, cloud_source, "source");
  74. viewer.addPointCloud(target, cloud_target, "target");
  75. viewer.registerKeyboardCallback(&keyboardEventOccurred, (void *) nullptr);
  76. while (!viewer.wasStopped()) {
  77. viewer.spinOnce();
  78. if (next_iteration) {
  79. findcorrespondences(source, target, P, Q);
  80. RT = findRT(P, Q);
  81. pcl::transformPointCloud(*source, *source, RT);
  82. viewer.updatePointCloud(source, cloud_source, "source");
  83. }
  84. next_iteration = false;
  85. }
  86. }
  87. int main() {
  88. CloudDataMqttAsync mqtt_client;
  89. mqtt_client.init();
  90. std::map<std::string, pcl::PointCloud<pcl::PointXYZ>::Ptr> cloud_map;
  91. cloud_map.insert(std::pair<std::string, pcl::PointCloud<pcl::PointXYZ>::Ptr>("rslidar/6311",
  92. new pcl::PointCloud<pcl::PointXYZ>));
  93. cloud_map.insert(std::pair<std::string, pcl::PointCloud<pcl::PointXYZ>::Ptr>("rslidar/6312",
  94. new pcl::PointCloud<pcl::PointXYZ>));
  95. cloud_map.insert(std::pair<std::string, pcl::PointCloud<pcl::PointXYZ>::Ptr>("rslidar/6313",
  96. new pcl::PointCloud<pcl::PointXYZ>));
  97. cloud_map.insert(std::pair<std::string, pcl::PointCloud<pcl::PointXYZ>::Ptr>("rslidar/6314",
  98. new pcl::PointCloud<pcl::PointXYZ>));
  99. cloud_map.insert(std::pair<std::string, pcl::PointCloud<pcl::PointXYZ>::Ptr>("rslidar/6315",
  100. new pcl::PointCloud<pcl::PointXYZ>));
  101. cloud_map.insert(std::pair<std::string, pcl::PointCloud<pcl::PointXYZ>::Ptr>("rslidar/6316",
  102. new pcl::PointCloud<pcl::PointXYZ>));
  103. std::map<std::string, Eigen::Matrix<double, 4, 4>> rt_map;
  104. rt_map.insert(std::pair<std::string, Eigen::Matrix<double, 4, 4>>("rslidar/6311", Eigen::Matrix<double, 4, 4>()));
  105. rt_map.insert(std::pair<std::string, Eigen::Matrix<double, 4, 4>>("rslidar/6312", Eigen::Matrix<double, 4, 4>()));
  106. rt_map.insert(std::pair<std::string, Eigen::Matrix<double, 4, 4>>("rslidar/6313", Eigen::Matrix<double, 4, 4>()));
  107. rt_map.insert(std::pair<std::string, Eigen::Matrix<double, 4, 4>>("rslidar/6314", Eigen::Matrix<double, 4, 4>()));
  108. rt_map.insert(std::pair<std::string, Eigen::Matrix<double, 4, 4>>("rslidar/6315", Eigen::Matrix<double, 4, 4>()));
  109. rt_map.insert(std::pair<std::string, Eigen::Matrix<double, 4, 4>>("rslidar/6316", Eigen::Matrix<double, 4, 4>()));
  110. bool run = true;
  111. while (run) {
  112. for (auto &iter: cloud_map) {
  113. mqtt_client.getCloudData(iter.first, iter.second);
  114. }
  115. if (cloud_map.find("rslidar/6314")->second->empty()) {
  116. continue;
  117. }
  118. if (!cloud_map.find("rslidar/6311")->second->empty()) {
  119. myICP(cloud_map.find("rslidar/6314")->second, cloud_map.find("rslidar/6311")->second,
  120. rt_map.find("rslidar/6311")->second);
  121. }
  122. break;
  123. if (!cloud_map.find("rslidar/6312")->second->empty()) {
  124. myICP(cloud_map.find("rslidar/6314")->second, cloud_map.find("rslidar/6312")->second,
  125. rt_map.find("rslidar/6312")->second);
  126. }
  127. if (!cloud_map.find("rslidar/6313")->second->empty()) {
  128. myICP(cloud_map.find("rslidar/6314")->second, cloud_map.find("rslidar/6313")->second,
  129. rt_map.find("rslidar/6313")->second);
  130. }
  131. if (!cloud_map.find("rslidar/6314")->second->empty()) {
  132. myICP(cloud_map.find("rslidar/6314")->second, cloud_map.find("rslidar/6314")->second,
  133. rt_map.find("rslidar/6314")->second);
  134. }
  135. if (!cloud_map.find("rslidar/6315")->second->empty()) {
  136. myICP(cloud_map.find("rslidar/6314")->second, cloud_map.find("rslidar/6315")->second,
  137. rt_map.find("rslidar/6315")->second);
  138. }
  139. if (!cloud_map.find("rslidar/6316")->second->empty()) {
  140. myICP(cloud_map.find("rslidar/6314")->second, cloud_map.find("rslidar/6316")->second,
  141. rt_map.find("rslidar/6316")->second);
  142. }
  143. run = false;
  144. }
  145. }