conversion.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. #include "conversion.hpp"
  2. bool Conversion::PackHexPointCloud(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud, unsigned char* data, unsigned int length) {
  3. data[0] = DEFAULT_BEGAIN;
  4. data[1] = length >> 4;
  5. data[2] = length;
  6. data[length - 1] = DEFAULT_END;
  7. for(int i = 0; i < cloud->size(); i++) {
  8. Float2Bytes(cloud->points[i].x, data, 3 + 3 * sizeof(float) * i);
  9. Float2Bytes(cloud->points[i].y, data, 3 + 3 * sizeof(float) * i + 1 * sizeof(float));
  10. Float2Bytes(cloud->points[i].z, data, 3 + 3 * sizeof(float) * i + 2 * sizeof(float));
  11. }
  12. return true;
  13. }
  14. bool Conversion::UnPackHexPointCloud(unsigned char *data, pcl::PointCloud<pcl::PointXYZ>::Ptr cloud) {
  15. if(data[0] != DEFAULT_BEGAIN) {
  16. return false;
  17. }
  18. int size = data[1] << 8 | data[2];
  19. if(data[size - 1] != DEFAULT_END) {
  20. return false;
  21. }
  22. int i = 3;
  23. float number;
  24. pcl::PointXYZ point;
  25. while (data[i] != 0xFF || i < size - 1) {
  26. Bytes2Float(&data[i], &number);
  27. i += sizeof(float);
  28. point.x = number;
  29. Bytes2Float(&data[i], &number);
  30. i += sizeof(float);
  31. point.y = number;
  32. Bytes2Float(&data[i], &number);
  33. i += sizeof(float);
  34. point.z = number;
  35. cloud->points.push_back(point);
  36. }
  37. return true;
  38. }
  39. bool Conversion::PackStringPointCloud(const pcl::PointCloud<pcl::PointXYZ>::Ptr cloud, std::string &data) {
  40. data += "Begain\n";
  41. data += "size:" + std::to_string(cloud->size()) + "\n";
  42. for(int i = 0; i < cloud->size(); i++) {
  43. data += std::to_string(cloud->points[i].x) + " ";
  44. data += std::to_string(cloud->points[i].y) + " ";
  45. data += std::to_string(cloud->points[i].z) + " ";
  46. }
  47. data += "\nend\n";
  48. return true;
  49. }
  50. bool Conversion::UnPackStringPointCloud(const std::string &data, pcl::PointCloud<pcl::PointXYZ>::Ptr cloud) {
  51. std::string str_cloud = data.substr(data.find("\n", data.find("size")) + 1, data.find("end\n") - data.find("\n", data.find("size")) - 2);
  52. std::istringstream cloud_data;
  53. cloud_data.str(str_cloud);
  54. pcl::PointXYZ point;
  55. while (cloud_data >> point.x && cloud_data >> point.y && cloud_data >> point.z) {
  56. cloud->points.push_back(point);
  57. }
  58. return true;
  59. }
  60. bool Conversion::String2Hex(const std::string &cloud, unsigned char* data, unsigned int length) {
  61. std::string str_cloud;
  62. if (cloud.find("Begain") == 0 && cloud.find("end")) {
  63. str_cloud = cloud.substr(cloud.find("\n", cloud.find("size")) + 1, cloud.find("end\n") - cloud.find("\n", cloud.find("size")) - 2);
  64. } else {
  65. str_cloud = cloud;
  66. }
  67. std::istringstream cloud_data;
  68. cloud_data.str(str_cloud);
  69. pcl::PointXYZ point;
  70. int i = 0;
  71. while (cloud_data >> point.x && cloud_data >> point.y && cloud_data >> point.z) {
  72. Float2Bytes(point.x, data, i);
  73. i += sizeof(float);
  74. Float2Bytes(point.y, data, i);
  75. i += sizeof(float);
  76. Float2Bytes(point.z, data, i);
  77. i += sizeof(float);
  78. }
  79. return true;
  80. }
  81. void Conversion::Float2Bytes(float value, unsigned char *bytes, int pos)
  82. {
  83. char *data = (char *)&value;
  84. for (int i = 0; i < 4; i++)
  85. {
  86. bytes[i + pos] = *data++;
  87. }
  88. }
  89. void Conversion::Bytes2Float(unsigned char * bytes, float* number) {
  90. void *data = number;
  91. unsigned char * buf = bytes;
  92. for (int i = 0; i < 4; i++){
  93. // data[i] = buf[i];
  94. *((unsigned char*)data + i) = *(buf + i);
  95. }
  96. }