2 Комити b08007d6b4 ... b09efbaa6a

Аутор SHA1 Порука Датум
  wangyingjie b09efbaa6a 基于tcp的雷达数据解析1 пре 2 месеци
  wangyingjie f33bcb93f8 基于tcp的雷达数据解析 пре 2 месеци

+ 3 - 3
sr71_drive/cmake/ThirdSupport.cmake

@@ -1,6 +1,6 @@
 # 第三方库支持
 
-set(ENABLE_GDAL YES) # gdal支持
-set(ENABLE_PAHO_MQTT YES) # mqtt支持
-
+set(ENABLE_GDAL OFF) # gdal支持
+set(ENABLE_PAHO_MQTT OFF) # mqtt支持
+set(ENABLE_ASIO_SOCKET YES)
 

+ 1 - 1
sr71_drive/core/CMakeLists.txt

@@ -25,4 +25,4 @@ target_link_libraries(${PROJECT_NAME} PUBLIC PkgConfig::libusb)
 
 
 
-target_link_libraries(${PROJECT_NAME} PUBLIC MultiTool)
+target_link_libraries(${PROJECT_NAME} PUBLIC all_in_one)

+ 7 - 0
sr71_drive/core/controlcan.h

@@ -108,6 +108,13 @@ typedef struct _INIT_CONFIG{
 	UCHAR	Mode;
 }VCI_INIT_CONFIG,*PVCI_INIT_CONFIG;
 
+struct CanFrame
+{
+    unsigned int id;
+    unsigned int timestamp;
+    std::vector<unsigned char> data;
+};
+
 #ifdef __cplusplus
 #define EXTERN_C  extern "C"
 #else

+ 18 - 0
sr71_drive/core/radar_obj.h

@@ -13,6 +13,24 @@
 
 #include "project_marco.h"
 
+struct TargetListHeader
+{
+    uint8_t object_num; // 目标数量
+    uint16_t measurement_count; // 循环计数
+    uint8_t interface_version; // CAN接口版本号,默认为0
+};
+
+struct TargetInfo
+{
+    uint8_t id; // 目标ID
+    float distance_long; // 目标纵向距离 (m)
+    float distance_lat; // 目标横向距离 (m)
+    float velocity_long; // 目标纵向速度 (m/s)
+    uint8_t dyn_prop; // 动态属性
+    float velocity_lat; // 目标横向速度 (m/s)
+    float rcs; // RCS
+};
+
 struct RadarData
 {
   unsigned id;

+ 1 - 1
sr71_drive/core/rs71_usb_receiver.cpp

@@ -108,7 +108,7 @@ void RS71UsbReceiver::Stop()
     }
 }
 
-std::vector<RS71UsbReceiver::CanFrame> RS71UsbReceiver::GetReceivedData(unsigned channel)
+std::vector<CanFrame> RS71UsbReceiver::GetReceivedData(unsigned channel)
 {
     if (channel >= 4)
     {

+ 1 - 8
sr71_drive/core/rs71_usb_receiver.h

@@ -51,14 +51,7 @@ public:
     bool Start();
 
     void Stop();
-
-    struct CanFrame
-    {
-        unsigned int id;
-        unsigned int timestamp;
-        std::vector<unsigned char> data;
-    };
-
+    
     std::vector<CanFrame> GetReceivedData(unsigned channel);
 
 private:

+ 5 - 2
sr71_drive/src/CMakeLists.txt

@@ -2,8 +2,11 @@ cmake_minimum_required (VERSION 3.15)
 
 project(RS71_test CXX)
 
-add_executable(${PROJECT_NAME}  "main.cpp" )
-target_link_libraries(${PROJECT_NAME} PUBLIC core_lib)
+add_executable(RS71_usb  "main_usb.cpp" )
+target_link_libraries(RS71_usb PUBLIC core_lib)
+
+add_executable(RS71_socket  "main_socket.cpp" )
+target_link_libraries(RS71_socket PUBLIC core_lib)
 
 
 add_executable(test_1  "test_1.cpp" )

+ 135 - 0
sr71_drive/src/main_socket.cpp

@@ -0,0 +1,135 @@
+/**
+ ******************************************************************************
+ * @file           : main_socket.cpp
+ * @author         : wangyingjie
+ * @brief          : None
+ * @attention      : None
+ * @date           : 2025/7/1
+ ******************************************************************************
+ */
+
+#include "network/socket/studio_tcp_client.h"
+#include "controlcan.h"
+#include "radar_obj.h"
+
+/////////////////// tcp client ///////////////////
+
+// 自定义的接收数据处理函数
+void on_message_received_client(const std::string& msg)
+{
+    int msg_size = msg.size();
+    // std::cout << "Received size: " << std::dec << msg_size << " bytes :";
+    // for (unsigned char c : msg)
+    // {
+    //     // 以两位16进制格式输出每个字符
+    //     // std::cout << std::setw(2) << std::setfill('0') << std::hex << (int)c << " ";  // 小写
+    //     std::cout << "\t" << std::setw(2) << std::setfill('0') << std::hex << std::uppercase << (int)c << " ";
+    // }
+    //
+    if (msg_size != 10)
+    {
+        return;
+    }
+    CanFrame frame;
+    frame.id = (msg[0] << 8) | msg[1];
+    frame.data = {msg[2], msg[3], msg[4], msg[5], msg[6], msg[7], msg[8], msg[9]};
+    // 测试打印查看 -------
+    // printf("ID: 0x%X TimeStamp: %u Data:", frame.id, frame.timestamp);
+    // for (auto byte: frame.data)
+    // {
+    //     printf(" %02X", byte);
+    // }
+    // printf("\n");
+    // 测试打印查看 -------
+    if (frame.id == 0x60B && frame.data.size() >= 8)
+    {
+        TargetInfo target;
+        // 目标ID (字节0)
+        target.id = frame.data[0];
+        // 目标纵向距离 Y
+        target.distance_long = (frame.data[1] * 32 + (frame.data[2] >> 3)) * 0.1 - 500;
+        // 目标横向距离 X
+        target.distance_lat = ((frame.data[2] & 0x07) * 256 + frame.data[3]) * 0.1 - 102.3;
+        // 目标纵向速度
+        target.velocity_long = (frame.data[4] * 4 + (frame.data[5] >> 6)) * 0.25 - 128;
+        // 目标横向速度
+        target.velocity_lat = ((frame.data[5] & 0x3F) * 8 + (frame.data[6] >> 5)) * 0.25 - 64;
+        // 动态属性
+        target.dyn_prop = (frame.data[6] & 0x07);
+        // RCS 雷达截面积
+        target.rcs = (frame.data[7] * 0.5) - 64;
+
+        printf("    ID: %u\t 纵向距离 Y: %.2fm\t 横向距离 X: %.2fm \t 纵向速度: %.2fm/s \t 横向速度: %.2fm/s \t 动态属性: %u \t RCS: %.2fdB㎡\n",
+               target.id,
+               target.distance_long,
+               target.distance_lat,
+               target.velocity_long,
+               target.velocity_lat,
+               target.dyn_prop,
+               target.rcs);
+
+        // // 计算目标径向距离和角度
+        // float radial_distance = sqrt(target.distance_long * target.distance_long + target.distance_lat * target.distance_lat);
+        // float theta = atan2(target.distance_lat, target.distance_long) * 180 / M_PI; // 转换为度数
+        // // 计算目标速度
+        // float velocity = target.velocity_long * cos(theta * M_PI / 180) + target.velocity_lat * sin(theta * M_PI / 180);
+        // printf("    径向距离 : %.2fm\t 角度: %.2f°\t 速度: %.2fm/s\t\n", radial_distance, theta, velocity);
+        // float x_ = target.distance_lat;
+        // float y_ = target.distance_long;
+        // float z_ = 0;
+        // printf("    x: %.2f\t y: %.2f\t z: %.2f\t\n", x_, y_, z_);
+    }
+    else if (frame.id == 0x60A)
+    {
+        std::cout << "----------------------" << std::endl;
+        TargetListHeader header;
+
+        // 解析目标数量
+        header.object_num = frame.data[0];
+        header.measurement_count = (static_cast<uint16_t>(frame.data[3]) << 8) | frame.data[2];
+        printf("    目标数量: %d\t, 循环计数: %d\t\n", header.object_num, header.measurement_count);
+
+        // // 解析CAN接口版本号
+        // header.interface_version = (frame.data[4] >> 4) & 0x0F;
+        // printf("Interface Version: %d\n", header.interface_version);
+    }
+}
+
+int main()
+{
+    // 创建客户端,默认缓冲区大小 (4KB)
+    // studio_tcp client("192.168.1.2", "8087");
+    studio_tcp_client client("192.168.3.20", "8087", 20);
+
+    // 设置接收数据的回调函数
+    client.set_message_handler(on_message_received_client);
+
+    // 启动客户端
+    client.start();
+
+    std::this_thread::sleep_for(std::chrono::seconds(1));
+
+    // // 发送一些测试消息
+    // while (true)
+    // {
+    //     std::string input;
+    //     std::cout << "Enter message to send (or 'exit'): ";
+    //     std::getline(std::cin, input);
+    //
+    //     if (input == "exit")
+    //         break;
+    //
+    //     client.send(input);
+    // }
+    // 一秒发送一个心跳 1~100
+    int count = 0;
+    while (true)
+    {
+        count = count % 100 + 1;
+        client.send(std::to_string(count));
+        std::this_thread::sleep_for(std::chrono::seconds(1));
+    }
+
+    client.stop();
+    return 0;
+}

+ 2 - 19
sr71_drive/src/main.cpp → sr71_drive/src/main_usb.cpp

@@ -1,23 +1,6 @@
 #include "project_marco.h"
 #include "rs71_usb_receiver.h"
-
-struct TargetListHeader
-{
-    uint8_t object_num; // 目标数量
-    uint16_t measurement_count; // 循环计数
-    uint8_t interface_version; // CAN接口版本号,默认为0
-};
-
-struct TargetInfo
-{
-    uint8_t id; // 目标ID
-    float distance_long; // 目标纵向距离 (m)
-    float distance_lat; // 目标横向距离 (m)
-    float velocity_long; // 目标纵向速度 (m/s)
-    uint8_t dyn_prop; // 动态属性
-    float velocity_lat; // 目标横向速度 (m/s)
-    float rcs; // RCS
-};
+#include "radar_obj.h"
 
 int main()
 {
@@ -31,7 +14,7 @@ int main()
 
     while (true)
     {
-        std::vector<RS71UsbReceiver::CanFrame> data = dev.GetReceivedData(0); // 获取第0路CAN数据
+        std::vector<CanFrame> data = dev.GetReceivedData(0); // 获取第0路CAN数据
         printf("Frame Count: %zu\n", data.size());
         for (const auto &frame: data)
         {