Parcourir la source

1.超哥修改了部分问题;2.目前版本可以直接运行并且发送数据到指定端口,当前占用带宽为59~70Mbps,经过检测在中转段发现的图像标号之间延迟能有5张图以上

kappo il y a 2 mois
Parent
commit
7d340cd21a

+ 16 - 0
.gitignore

@@ -4079,3 +4079,19 @@ build/CMakeFiles/UVC_Demo.dir/AIManager/PPYOLOE.cpp.o
 build/.cmake/api/v1/reply/codemodel-v2-1f670aa76767fb2a485d.json
 build/.cmake/api/v1/reply/index-2025-02-20T07-09-31-0245.json
 build/.cmake/api/v1/reply/target-UVC_Demo-Debug-381338dbd1af2539fdd6.json
+build/CMakeFiles/Makefile2
+build/CMakeFiles/progress.marks
+build/CMakeFiles/UVC_Demo.dir/build.make
+build/CMakeFiles/UVC_Demo.dir/cmake_clean.cmake
+build/CMakeFiles/UVC_Demo.dir/CXX.includecache
+build/CMakeFiles/UVC_Demo.dir/depend.internal
+build/CMakeFiles/UVC_Demo.dir/depend.make
+build/CMakeFiles/UVC_Demo.dir/DependInfo.cmake
+build/CMakeFiles/UVC_Demo.dir/flags.make
+build/CMakeFiles/UVC_Demo.dir/link.txt
+build/CMakeFiles/UVC_Demo.dir/progress.make
+build/CMakeFiles/UVC_Demo.dir/GrpcTransfer/GrpcTransfer.cpp.o
+build/Makefile
+build/.cmake/api/v1/reply/codemodel-v2-ff68604e9c8c7bb92954.json
+build/.cmake/api/v1/reply/index-2025-02-26T08-13-46-0073.json
+build/.cmake/api/v1/reply/target-UVC_Demo-Debug-60a9e96146f2940d6405.json

+ 2 - 1
.vscode/c_cpp_properties.json

@@ -8,7 +8,8 @@
                 "${workspaceFolder}/PublicLibrary/rkmpp/include",
                 "${workspaceFolder}/PublicLibrary/grpc/include",
                 "${workspaceFolder}/PublicLibrary/absl/",
-                "${workspaceFolder}/PublicLibrary/protobuf"
+                "${workspaceFolder}/PublicLibrary/protobuf",
+                "/home/cat/grpcinstall/include"
 
             ],
             "defines": [

+ 5 - 1
.vscode/settings.json

@@ -69,6 +69,10 @@
         "sstream": "cpp",
         "stop_token": "cpp",
         "streambuf": "cpp",
-        "typeinfo": "cpp"
+        "typeinfo": "cpp",
+        "variant": "cpp",
+        "codecvt": "cpp",
+        "forward_list": "cpp",
+        "unordered_set": "cpp"
     }
 }

+ 16 - 2
AIManager/RKNNManager.cpp

@@ -5,6 +5,7 @@
 
 // Image test
 #include "../ImageTest/ImageTest.h"
+#include "../GrpcTransfer/GrpcTransfer.h"
 
 void RKNNManager::addRknnTask(std::string modelData)
 {
@@ -15,6 +16,13 @@ void RKNNManager::addRknnTask(std::string modelData)
 
 void RKNNManager::taskThread(std::string modelpath)
 {
+    std::string target_str = "192.168.211.20:50051";
+    grpc::ChannelArguments channel_args;
+    channel_args.SetInt(GRPC_ARG_MAX_SEND_MESSAGE_LENGTH, 100 * 1024 * 1024);    // 设置最大发送消息大小为100MB
+    channel_args.SetInt(GRPC_ARG_MAX_RECEIVE_MESSAGE_LENGTH, 100 * 1024 * 1024); // 设置最大接收消息大小为100MB
+
+    MessageServiceClient client(grpc::CreateCustomChannel(target_str, grpc::InsecureChannelCredentials(), channel_args));
+
     PPYOLOE infer;
     if (!infer.initialize(modelpath))
     {
@@ -30,7 +38,7 @@ void RKNNManager::taskThread(std::string modelpath)
     // time test
     ImageTest::HighResolutionTimer timer;
 
-        while (m_threadSwitch)
+    while (m_threadSwitch)
     {
         if (DataManager::getInstance().popData("resized" + std::to_string(index), dataPackage))
         {
@@ -43,7 +51,13 @@ void RKNNManager::taskThread(std::string modelpath)
 
             std::cout << "infer time: " << timer.elapsed_milliseconds() << " ms" << std::endl;
 
-            ImageTest::saveImageFromData((unsigned char *)dataPackage->pResizeData, dataPackage->nResizeWidth, dataPackage->nResizeHeight);
+            // ImageTest::saveImageFromData((unsigned char *)dataPackage->pResizeData, dataPackage->nResizeWidth, dataPackage->nResizeHeight);
+
+            // MessageServiceClient client(grpc::CreateChannel(target_str, grpc::InsecureChannelCredentials()));
+            client.R360SendMessage(dataPackage);
+
+            // MemoryPool<DataPackage> *dataPool = DataManager::getInstance().getDataBuffer<DataPackage>();
+            DataManager::getInstance().releaseDataBuffer<DataPackage>(dataPackage);
 
             continue;
         }

+ 3 - 3
CMakeLists.txt

@@ -9,7 +9,7 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON)
 
 set(TARGET "UVC_Demo")
 
-
+set(CMAKE_GENERATOR "Ninja")
 
 set(CMAKE_CXX_STANDARD_REQUIRED ON)
 set(CMAKE_BUILD_TYPE "Debug")
@@ -25,7 +25,7 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR}/PublicLibrary/libuvc/include)
 include_directories(${CMAKE_SOURCE_DIR}/3rdparty/rga/RK3588/include)
 include_directories(${CMAKE_SOURCE_DIR}/3rdparty/mpp/include)
 include_directories(${CMAKE_SOURCE_DIR}/runtime/RK3588/Linux/librknn_api/include)
-
+include_directories(${GRPC_DIR}/include)
 
 include(common.cmake)
 
@@ -42,7 +42,7 @@ set(MPP_DECODER ${CMAKE_CURRENT_SOURCE_DIR}/MppDecoder/MppDecoder.cpp ${CMAKE_CU
 set(RGA_COLORTRANSFER ${CMAKE_CURRENT_SOURCE_DIR}/RGAColorTransfer/RgaColorTransfer.cpp)
 set(DATA_CONTROL ${CMAKE_CURRENT_SOURCE_DIR}/DataManager/DataManager.cpp ${CMAKE_CURRENT_SOURCE_DIR}/DataManager/DataPipe.h)
 set(AI_SOURCE  ${CMAKE_CURRENT_SOURCE_DIR}/AIManager/beforeProcess.cpp ${CMAKE_CURRENT_SOURCE_DIR}/AIManager/postprocess.cpp ${CMAKE_CURRENT_SOURCE_DIR}/AIManager/RKNNManager.cpp ${CMAKE_CURRENT_SOURCE_DIR}/AIManager/PPYOLOE.cpp)
-set(GRPC_SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/GrpcTransfer/ImageService.pb.cc ${CMAKE_CURRENT_SOURCE_DIR}/GrpcTransfer/ImageService.grpc.pb.cc)
+set(GRPC_SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/GrpcTransfer/ImageService.pb.cc ${CMAKE_CURRENT_SOURCE_DIR}/GrpcTransfer/ImageService.grpc.pb.cc ${CMAKE_CURRENT_SOURCE_DIR}/GrpcTransfer/GrpcTransfer.cpp)
 set(TEST_SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/ImageTest/ImageTest.cpp)
 
 add_executable(${TARGET} ${SOURCES} ${UVC_CONTROL} ${MPP_DECODER} ${RGA_COLORTRANSFER} ${AI_SOURCE} ${DATA_CONTROL} ${GRPC_SOURCE} ${TEST_SOURCE})

+ 14 - 6
DataManager/DataManager.h

@@ -8,8 +8,6 @@
 #include "DataPackage.h" // 假设 DataPackage 类定义在这个头文件中
 #include "../DataBuffer/DataBuffer.h"
 
-#define BUFFER_SIZE 30
-
 class DataManager
 {
 public:
@@ -38,6 +36,9 @@ public:
     template <typename T>
     bool popData(std::string name, T *&data);
 
+    template <typename T>
+    MemoryPool<T> *getDataBuffer();
+
     // get a data buffer from the memory pool
     template <typename T>
     T *acquireDataBuffer();
@@ -99,17 +100,24 @@ bool DataManager::popData(std::string name, T *&data)
 }
 
 template <typename T>
-T *DataManager::acquireDataBuffer()
+MemoryPool<T> *DataManager::getDataBuffer()
 {
     static MemoryPool<T> memoryPool(BUFFER_SIZE, width, height);
-    return memoryPool.acquire();
+    return &memoryPool;
+}
+
+template <typename T>
+T *DataManager::acquireDataBuffer()
+{
+    // static MemoryPool<T> memoryPool(BUFFER_SIZE, width, height);
+    return getDataBuffer<T>()->acquire();
 }
 
 template <typename T>
 void DataManager::releaseDataBuffer(T *buffer)
 {
-    static MemoryPool<T> memoryPool(BUFFER_SIZE, width, height);
-    memoryPool.release(buffer);
+    // static MemoryPool<T> memoryPool(BUFFER_SIZE, width, height);
+    getDataBuffer<T>()->release(buffer);
 }
 
 #endif // DATA_MANAGER_H

+ 7 - 8
DataManager/DataPackage.h

@@ -2,6 +2,7 @@
 #define DATA_PACKAGE_H
 
 #include <iostream>
+#include <string>
 #include <stdexcept>
 #include "../AIManager/inferResult.h"
 
@@ -12,7 +13,7 @@ typedef struct DataPackage
 {
 
     int nDeviceID = 0;
-    void *pJpegData{nullptr};
+    char *pJpegData{nullptr};
     int nJpegSize = 0;
 
     void *pRGBData{nullptr};
@@ -28,6 +29,9 @@ typedef struct DataPackage
     long nTimeStamp = 0.0;
     double dDegree = 0.0;
 
+    // camera id
+    int nCameraID = 0;
+
     // result
     int id = 0;
     int count = 0;
@@ -51,11 +55,7 @@ typedef struct DataPackage
     {
         if (pJpegData == nullptr)
         {
-            pJpegData = new unsigned char[width * height * 3];
-            if (pJpegData == nullptr)
-            {
-                return false;
-            }
+            pJpegData = new char[width * height * 3];
         }
         // if (pRGBData == nullptr)
         // {
@@ -80,8 +80,7 @@ typedef struct DataPackage
     {
         if (pJpegData != nullptr)
         {
-            delete[] (unsigned char *)pJpegData;
-            pJpegData = nullptr;
+            delete[] pJpegData;
         }
         if (pRGBData != nullptr)
         {

+ 1 - 1
DataManager/DataPipe.h

@@ -9,7 +9,7 @@
 #include <functional>
 #include "DataPackage.h"
 
-#define BUFFER_SIZE 15
+#define BUFFER_SIZE 30
 
 template <typename T>
 class DataPipe

+ 34 - 0
GrpcTransfer/GrpcTransfer.cpp

@@ -0,0 +1,34 @@
+#include "GrpcTransfer.h"
+
+void MessageServiceClient::R360SendMessage(DataPackagePtr pkg)
+{
+    ClientContext context;
+    Empty response;
+    std::unique_ptr<grpc::ClientWriter<DataList>> writer(
+        stub_->R360SendMessage(&context, &response));
+
+    DataList dataList;
+    EmbeddedData *embeddedData = dataList.add_data();
+    embeddedData->set_usb_camera_index(pkg->nCameraID);
+    // 填充图片数据(示例中使用字符串模拟)
+    std::string tempImageData(pkg->pJpegData, pkg->nJpegSize);
+    embeddedData->set_image(tempImageData);
+    embeddedData->set_degree(pkg->dDegree);
+
+    for (int i = 0; i < pkg->Result.count; ++i)
+    {
+        // 添加报警信息
+        Alarm *alarm = embeddedData->add_alarm();
+        alarm->set_x(pkg->Result.results[i].box.left);
+        alarm->set_y(pkg->Result.results[i].box.top);
+        alarm->set_w(pkg->Result.results[i].box.right - pkg->Result.results[i].box.left);
+        alarm->set_h(pkg->Result.results[i].box.bottom - pkg->Result.results[i].box.top);
+        alarm->set_score(pkg->Result.results[i].prop);
+        alarm->set_type(R360::AlarmType(pkg->Result.results[i].cls_id)); // 使用枚举值
+    }
+
+    if (!writer->Write(dataList))
+    {
+        std::cerr << "写入消息失败" << std::endl;
+    }
+}

+ 69 - 0
GrpcTransfer/GrpcTransfer.h

@@ -0,0 +1,69 @@
+#include <grpcpp/grpcpp.h>
+#include "../GrpcTransfer/ImageService.grpc.pb.h"
+#include "../DataManager/DataPackage.h"
+
+using grpc::Channel;
+using grpc::ClientContext;
+using grpc::Status;
+using R360::Alarm;
+using R360::DataList;
+using R360::EmbeddedData;
+using R360::Empty;
+using R360::MessageService;
+
+class MessageServiceClient
+{
+public:
+    explicit MessageServiceClient(std::shared_ptr<Channel> channel)
+        : stub_(MessageService::NewStub(channel)) {}
+
+    void R360SendMessage(char *pic)
+    {
+        ClientContext context;
+        Empty response;
+        std::unique_ptr<grpc::ClientWriter<DataList>> writer(
+            stub_->R360SendMessage(&context, &response));
+
+        // 构造第一个DataList消息
+        DataList data_list;
+        EmbeddedData *embeddedData = data_list.add_data();
+        embeddedData->set_usb_camera_index(1);
+        // 填充图片数据(示例中使用字符串模拟)
+        embeddedData->set_image(pic);
+        embeddedData->set_degree(90);
+
+        // 添加报警信息
+        Alarm *alarm = embeddedData->add_alarm();
+        alarm->set_x(100);
+        alarm->set_y(150);
+        alarm->set_w(50);
+        alarm->set_h(50);
+        alarm->set_score(0.95);
+        alarm->set_type(R360::UAV); // 使用枚举值
+
+        if (!writer->Write(data_list))
+        {
+            std::cerr << "写入消息失败" << std::endl;
+        }
+
+        // 如有需要,可发送更多消息...
+        // DataList another_data_list;
+        // writer->Write(another_data_list);
+
+        /*writer->WritesDone();
+        Status status = writer->Finish();
+        if (status.ok())
+        {
+            std::cout << "R360SendMessage RPC 调用成功" << std::endl;
+        }
+        else
+        {
+            std::cout << "R360SendMessage RPC 调用失败: " << status.error_message() << std::endl;
+        }*/
+    }
+
+    void R360SendMessage(DataPackage *pkg);
+
+private:
+    std::unique_ptr<MessageService::Stub> stub_;
+};

+ 8 - 0
GrpcTransfer/TransferManager.h

@@ -0,0 +1,8 @@
+#include "GrpcTransfer.h"
+#include "../DataManager/DataManager.h"
+#include "../DataManager/DataPackage.h"
+
+class TransferManager
+{
+public:
+};

+ 2 - 0
MppDecoder/MppDecoder.cpp

@@ -160,5 +160,7 @@ bool MppDecoder::decodeJpegToRgb(const char *jpegData, size_t jpegSize, unsigned
                 *height = mpp_frame_get_height(Output);
             }
         }
+
+        m_mpi->enqueue(m_ctx, MPP_PORT_OUTPUT, m_task);
     }
 }

+ 9 - 11
UVCGrabber/UVCCallBack.cpp

@@ -29,8 +29,8 @@ void cbSaveToLocal(uvc_frame_t *frame, void *ptr)
   static const char *MJPEG_FILE = ".jpeg";
   char filename[264];
   std::fstream log_file("CallBackLog.txt", std::ios::app);
-
   DataPackagePtr dataPackage = nullptr;
+  // static MemoryPool<DataPackage> dataPool(BUFFER_SIZE, 3840, 2160);
   std::shared_ptr<DataPipe<DataPackage>> pipe;
 
   // std::fstream readImage("./uav1.jpg", std::ios::binary | std::ios::in);
@@ -51,32 +51,30 @@ void cbSaveToLocal(uvc_frame_t *frame, void *ptr)
     fclose(fp);
     break;
   case UVC_COLOR_FORMAT_MJPEG:
+
     if (!g_gpioExplorer->getFailingStatus(index))
     {
-      std::cout << "Pass this wave" << std::endl;
+      // std::cout << "Pass this wave" << std::endl;
       break;
     }
     g_gpioExplorer->resetFailingStatus(index);
 
-    if (jpeg_count[index] / 12 >= 1)
+    if (jpeg_count[index] / 23 >= 1)
       jpeg_group[index]++;
-    jpeg_count[index] = jpeg_count[index] % 12;
-    std::cout << "Current File Device " << index << "  Index : " << jpeg_count[index] << std::endl;
-    sprintf(filename, "./data/%d/%d-%d%s", index, jpeg_group[index], jpeg_count[index]++, MJPEG_FILE);
+    jpeg_count[index] = jpeg_count[index] % 23;
+    std::cout << "Current File Device " << index << " UVC Index : " << jpeg_count[index] << std::endl;
+    // sprintf(filename, "./data/%d/%d-%d%s", index, jpeg_group[index], jpeg_count[index]++, MJPEG_FILE);
 
     dataPackage = DataManager::getInstance().acquireDataBuffer<DataPackage>();
 
-    // readImage.read((char *)dataPackage->pJpegData, fileSize);
-    // dataPackage->nJpegSize = fileSize;
-    // dataPackage->nWidth = 3840;
-    // dataPackage->nHeight = 2160;
-
     memcpy(dataPackage->pJpegData, frame->data, frame->data_bytes);
 
     dataPackage->nJpegSize = frame->data_bytes;
     dataPackage->nWidth = frame->width;
     dataPackage->nHeight = frame->height;
     dataPackage->nTimeStamp = frame->capture_time_finished.tv_sec * 1000 + frame->capture_time_finished.tv_nsec / 1000000;
+    dataPackage->nCameraID = index;
+    dataPackage->dDegree = jpeg_count[index]++;
 
     DataManager::getInstance().pushData<DataPackage>("uvc" + std::to_string(index), dataPackage);
 

+ 8 - 8
gpio_explorer.cpp

@@ -3,9 +3,9 @@
 #include <thread>
 #include <iostream>
 
-int waveLine[5] = {1,1,1,1,0};
+int waveLine[5] = {1, 1, 1, 1, 0};
 
-GPIOExplorer* g_gpioExplorer = nullptr;
+GPIOExplorer *g_gpioExplorer = nullptr;
 
 GPIOExplorer::GPIOExplorer(const char *chipname, int line_offset)
 {
@@ -50,7 +50,7 @@ GPIOExplorer::GPIOExplorer(const char *chipname, int line_offset)
                         std::lock_guard<std::mutex> lock(m_mutex);
                         FailingStatus = 0x07;
                         //std::cout << "Status changed!!" << std::endl;
-                        std::this_thread::sleep_for(std::chrono::milliseconds(100));
+                        std::this_thread::sleep_for(std::chrono::milliseconds(50));
                     }
                     StatusKeep = ret;
                 }
@@ -119,20 +119,20 @@ bool GPIOExplorer::detectZWave()
     }
 
     int i = 0;
-    std::cout << "wave check : ";
+    // std::cout << "wave check : ";
     bool check = true;
     std::list<int>::iterator iter = m_StatusList.begin();
-    while(iter!=m_StatusList.end())
+    while (iter != m_StatusList.end())
     {
-        std::cout << "-" <<*iter;
-        if(*iter != waveLine[i])
+        // std::cout << "-" <<*iter;
+        if (*iter != waveLine[i])
         {
             check = false;
         }
         iter++;
         i++;
     }
-    std::cout <<std::endl;
+    // std::cout <<std::endl;
 
     return check;
 }