main.cpp 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. #include "project_marco.h"
  2. #include "rs71_usb_receiver.h"
  3. struct TargetListHeader
  4. {
  5. uint8_t object_num; // 目标数量
  6. uint16_t measurement_count; // 循环计数
  7. uint8_t interface_version; // CAN接口版本号,默认为0
  8. };
  9. struct TargetInfo
  10. {
  11. uint8_t id; // 目标ID
  12. float distance_long; // 目标纵向距离 (m)
  13. float distance_lat; // 目标横向距离 (m)
  14. float velocity_long; // 目标纵向速度 (m/s)
  15. uint8_t dyn_prop; // 动态属性
  16. float velocity_lat; // 目标横向速度 (m/s)
  17. float rcs; // RCS
  18. };
  19. int main()
  20. {
  21. RS71UsbReceiver dev(3, 0, 0x1, 0x1c00); // 参数依次为 DevType, DevIdx, ChMask, Baud
  22. if (!dev.Open())
  23. return -1;
  24. if (!dev.Start())
  25. return -1;
  26. while (true)
  27. {
  28. std::vector<RS71UsbReceiver::CanFrame> data = dev.GetReceivedData(0); // 获取第0路CAN数据
  29. printf("Frame Count: %zu\n", data.size());
  30. for (const auto &frame: data)
  31. {
  32. // 测试打印查看 -------
  33. printf("ID: 0x%X TimeStamp: %u Data:", frame.id, frame.timestamp);
  34. for (auto byte: frame.data)
  35. {
  36. printf(" %02X", byte);
  37. }
  38. printf("\n");
  39. // 测试打印查看 -------
  40. // 解析数据
  41. if (frame.id == 0x60B && frame.data.size() >= 8)
  42. {
  43. TargetInfo target;
  44. // 目标ID (字节0)
  45. target.id = frame.data[0];
  46. // 目标纵向距离
  47. target.distance_long = (frame.data[1] * 32 + (frame.data[2] >> 3)) * 0.1 - 500;
  48. // 目标横向距离
  49. target.distance_lat = ((frame.data[2] & 0x07) * 256 + frame.data[3]) * 0.1 - 102.3;
  50. // 目标纵向速度
  51. target.velocity_long = (frame.data[4] * 4 + (frame.data[5] >> 6)) * 0.25 - 128;
  52. // 目标横向速度
  53. target.velocity_lat = ((frame.data[5] & 0x3F) * 8 + (frame.data[6] >> 5)) * 0.25 - 64;
  54. // 动态属性
  55. target.dyn_prop = (frame.data[6] & 0x07);
  56. // RCS
  57. target.rcs = (frame.data[7] * 0.5) - 64;
  58. // 打印结果
  59. printf("Target ID: %u\n", target.id);
  60. printf("Distance Longitudinal: %.2fm\n", target.distance_long);
  61. printf("Distance Lateral: %.2fm\n", target.distance_lat);
  62. printf("Velocity Longitudinal: %.2fm/s\n", target.velocity_long);
  63. printf("Dynamic Property: %u\n", target.dyn_prop);
  64. printf("Velocity Lateral: %.2fm/s\n", target.velocity_lat);
  65. printf("RCS: %.2fdB㎡\n", target.rcs);
  66. // 计算目标径向距离和角度
  67. float radial_distance = sqrt(
  68. target.distance_long * target.distance_long + target.distance_lat * target.distance_lat);
  69. float theta = atan2(target.distance_lat, target.distance_long) * 180 / M_PI; // 转换为度数
  70. printf("Radial Distance: %.2fm\n", radial_distance);
  71. printf("Angle (θ): %.2f°\n", theta);
  72. // 计算目标速度
  73. float velocity = target.velocity_long * cos(theta * M_PI / 180) + target.velocity_lat * sin(
  74. theta * M_PI / 180);
  75. printf("Velocity: %.2fm/s\n", velocity);
  76. } else if (frame.id == 0x60A)
  77. {
  78. std::cout << "-------------" << std::endl;
  79. TargetListHeader header;
  80. // 解析目标数量
  81. header.object_num = frame.data[0];
  82. printf("Object Number: %d\n", header.object_num);
  83. // 解析循环计数
  84. header.measurement_count = (static_cast<uint16_t>(frame.data[3]) << 8) | frame.data[2];
  85. printf("Measurement Count: %d\n", header.measurement_count);
  86. // // 解析CAN接口版本号
  87. // header.interface_version = (frame.data[4] >> 4) & 0x0F;
  88. // printf("Interface Version: %d\n", header.interface_version);
  89. }
  90. }
  91. std::this_thread::sleep_for(std::chrono::microseconds(20));
  92. }
  93. dev.Stop();
  94. dev.Close();
  95. return 0;
  96. }