瀏覽代碼

add adapi_driver_radar_python.

yuchuli 4 月之前
父節點
當前提交
dce8b94662

+ 73 - 0
src/api/adapi_driver_radar/.gitignore

@@ -0,0 +1,73 @@
+# This file is used to ignore files which are generated
+# ----------------------------------------------------------------------------
+
+*~
+*.autosave
+*.a
+*.core
+*.moc
+*.o
+*.obj
+*.orig
+*.rej
+*.so
+*.so.*
+*_pch.h.cpp
+*_resource.rc
+*.qm
+.#*
+*.*#
+core
+!core/
+tags
+.DS_Store
+.directory
+*.debug
+Makefile*
+*.prl
+*.app
+moc_*.cpp
+ui_*.h
+qrc_*.cpp
+Thumbs.db
+*.res
+*.rc
+/.qmake.cache
+/.qmake.stash
+
+# qtcreator generated files
+*.pro.user*
+
+# xemacs temporary files
+*.flc
+
+# Vim temporary files
+.*.swp
+
+# Visual Studio generated files
+*.ib_pdb_index
+*.idb
+*.ilk
+*.pdb
+*.sln
+*.suo
+*.vcproj
+*vcproj.*.*.user
+*.ncb
+*.sdf
+*.opensdf
+*.vcxproj
+*vcxproj.*
+
+# MinGW generated files
+*.Debug
+*.Release
+
+# Python byte code
+*.pyc
+
+# Binaries
+# --------
+*.dll
+*.exe
+

+ 37 - 0
src/api/adapi_driver_radar/adapi_driver_radar.pro

@@ -0,0 +1,37 @@
+QT -= gui
+
+CONFIG += c++11 console
+CONFIG -= app_bundle
+
+# The following define makes your compiler emit warnings if you use
+# any Qt feature that has been marked deprecated (the exact warnings
+# depend on your compiler). Please consult the documentation of the
+# deprecated API in order to know how to port your code away from it.
+DEFINES += QT_DEPRECATED_WARNINGS
+
+# You can also make your code fail to compile if it uses deprecated APIs.
+# In order to do so, uncomment the following line.
+# You can also select to disable deprecated APIs only up to a certain version of Qt.
+#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
+
+SOURCES += \
+        main.cpp \
+        radarobject.pb.cc \
+        radarobjectarray.pb.cc
+
+# Default rules for deployment.
+qnx: target.path = /tmp/$${TARGET}/bin
+else: unix:!android: target.path = /opt/$${TARGET}/bin
+!isEmpty(target.path): INSTALLS += target
+
+LIBS += -lprotobuf
+
+LIBS += -L$$PWD -lmodulecomm
+
+HEADERS += \
+    modulecomm.h \
+    radarobject.pb.h \
+    radarobjectarray.pb.h
+
+DISTFILES += \
+    radarobject.proto

+ 38 - 0
src/api/adapi_driver_radar/main.cpp

@@ -0,0 +1,38 @@
+#include <QCoreApplication>
+
+#include <iostream>
+#include "modulecomm.h"
+#include "radarobject.pb.h"
+#include "radarobjectarray.pb.h"
+
+static void * gpa;
+
+void Listenradar(const char * strdata,const unsigned int nSize,const unsigned int index,
+               const QDateTime * dt,const char * strmemname)
+{
+    (void)index; (void)dt;  (void)strmemname;
+    iv::radar::radarobjectarray xradararray;
+    if(false == xradararray.ParseFromArray(strdata,nSize))
+    {
+        std::cout<<"Listenradar fail."<<std::endl;
+        return;
+    }
+    std::cout<<"size: "<<xradararray.obj_size()<<std::endl;
+    unsigned int i{0};
+    unsigned int nsize = static_cast<unsigned int>(xradararray.obj_size());
+    for(i=0;i<nsize;i++){
+        iv::radar::radarobject * pradarobj = xradararray.mutable_obj(i);
+        std::cout<<" x: "<<pradarobj->x()<<std::endl;
+    }
+
+}
+
+
+int main(int argc, char *argv[])
+{
+    QCoreApplication a(argc, argv);
+
+    gpa = iv::modulecomm::RegisterRecv("radar",Listenradar);
+
+    return a.exec();
+}

+ 61 - 0
src/api/adapi_driver_radar/radarobject.proto

@@ -0,0 +1,61 @@
+syntax = "proto2";
+
+package iv.radar;
+
+message radarobject
+{
+  required double x = 1; //直角坐标位置,右为正,米
+  required double y = 2; //直角坐标位置,前为正,米
+  required double vx = 3; //直角坐标速度,右为正,米每秒
+  required double vy = 4; //直角坐标速度,前为正,米每秒
+  required double vel = 5; //速度标量,始终为正,米每秒
+  required bool bValid = 6; //数据可信标志
+
+  // Delphi ESR
+  optional double Range =7; //极坐标下距离
+  optional double Range_Rate =8; //纵向速度,极坐标,远离为正,米每秒
+  optional double Range_Accel =9; //纵向加速度,极坐标,远离为正,米每二次方秒
+  optional double Angle =10; //位置角度,极坐标,顺时针正,正前为0,度
+  optional double Width =11; //宽度,米,分辨率0.5米
+  optional bool Grouping_Changed =12; //组别变化
+  optional bool Oncoming =13; //相向移动
+  optional double Lat_Rate =14; //横向速度,极坐标,逆时针正,米每秒
+  optional int32 Med_Range_Mode =15; //目标被追踪模式,0无追踪,1中距雷达追踪,2长距雷达追踪,3中、长距追踪
+  optional int32 Track_Status =16; //追踪状态,0无目标,1新的目标,2新的更新过的目标,3更新过的目标,4平稳运动的目标,5渐融的目标,6不可信的平稳运动目标,7新的平稳运动目标
+  optional bool Bridge_Object =17; //桥梁标志
+  optional bool Moving =18; //运动
+  optional bool Fast_Movable =19; //快速运动
+  optional bool Slow_Movable =20; //慢速运动
+  optional int32 Power =21; //信号反射强度,单位dB
+  optional int32 Detect_Valid_Level = 22;//srr目标置信度
+  optional bool Detect_Status = 23;//srr目标检测状态,为1目标有效,置信度有意义
+
+  // Continental ARS408/SRR308
+  optional int32 ID =24;
+  optional int32 Dynamic_Property =25; //动态属性 0运动 1静止 2来向 3静止候选 4未知 5横穿静止 6横穿运动 7停止(运动过)
+  optional double RCS_RadarCrossSection =26; //目标对电波的散射面积
+  optional double DistLong_RMS =27; //纵向距离标准差 即真值=纵向距离+/-标准差 SRR308不可用
+  optional double DistLat_RMS =28; //横向距离标准差 SRR308不可用
+  optional double VrelLong_RMS =29; //纵向速度标准差 SRR308不可用
+  optional double VrelLat_RMS =30; //横向速度标准差 SRR308不可用
+
+  optional double Cluster_Pdh0 =31; //Cluster目标虚警概率
+  optional int32 Cluster_AmbigState =32; //多普勒径向速度解模糊状态 >=3时 cluster相对可信 SRR308不可用
+  optional int32 Cluster_InvalidState =33; //Cluster目标有效性状态 1、2、3、5、6、7、D、E无效,其他的是有效目标但可能有属性缺陷 308不可用
+  optional int32 Cluster_PropertiesBitfield =34; //SRR308专属 目标状态属性字段 需要按位解析 0x0为无属性 bit0静态 bit1动态 bit2模糊的 bit4近场波束扫描到的 bit6护栏后的目标
+  optional int32 Cluster_InvalidReasonBitfield =35; //SRR308专属 目标无效原因字段 需要按位解析 0x0表示有效目标 bit1低RCS动态 bit2低RCS静态 bit3速度不可信 bit4距离不可信 bit5目标是多径虚影
+
+  optional double Object_ArelLatRMS =36; //横向相对加速度标准差
+  optional double Object_ArelLongRMS =37; //纵向相对加速度标准差
+  optional double Object_OrientationRMS =38; //航向角标准差
+  optional int32 Object_MeasureState =39; //测量状态 0被删除的目标 1新创建的 2测量到的 3预测出的 4并如其他聚类的 5从聚类中分离出的
+  optional double Object_ProbOfExist =40; //目标存在概率
+  optional double Object_ArelLong =41; //纵向加速度
+  optional double Object_ArelLat =42; //横向加速度
+  optional double Object_OrientationAngle =43; //航向角
+  optional int32 Object_Class =44; //目标类别 0point 1car 2truck 3pedestrian 4motorcycle 5bicycle 6wide/wall 7reserved
+  optional double Object_Length =45; //目标长度
+  optional double Object_Width =46; //目标宽度
+};
+
+

+ 91 - 0
src/api/adapi_driver_radar_python/PyModuleCommModule.py

@@ -0,0 +1,91 @@
+
+import threading  
+import time  
+
+import modulecommpython
+import numpy as np  
+
+
+modulelock = threading.Lock()  
+nThread = 0
+  
+class PyModuleComm:  
+    def __init__(self,strname):  
+        # 初始化代码...  
+        print("name: ",strname)
+        self.strmemname = strname
+        self.mbRegister = False
+        global nThread
+        nThread = nThread+1
+        self.mnMode = 0
+        print("nThread = ",nThread)
+        self.obj = modulecommpython.get_ca_object()
+        pass  
+
+    def RegisterRecv(self,call):
+        if self.mbRegister:
+            print(" Have register, can't register other.")
+            return
+        print("Register: ",self.strmemname)
+        self.mpcall = call
+        self.mbRegister = True
+        self.mbRun = True
+        self.mpthread = threading.Thread(target=self.threadrecvdata, args=(self.strmemname,))  
+        self.mpthread.start()
+        print("complete create thread.")
+        self.mnMode = 1
+        self.obj.RegisterRecv(self.strmemname)
+
+    def RegiseterSend(self,nSize,nPacCount):
+        if self.mbRegister:
+            print(" Have register, can't register other.")
+            return
+        print("Register: ",self.strmemname)
+        self.mnsize = nSize
+        self.mnPacCount = nPacCount
+        self.mbRegister = True
+        self.mnMode = 2
+        self.obj.RegisterSend(self.strmemname,nSize,nPacCount)
+    
+    def SendData(self,arr,nsendsize):      
+    #    nrealsize = np.zeros(1, dtype=np.int32)  
+        nrtn = self.obj.SendData(arr,nsendsize)
+  
+    def threadrecvdata(self, arg):  
+        # 这个函数将被线程执行  
+ #       print(f"线程开始执行,参数是 {arg}")  
+        nBuffSize = int(1000)
+        arr = np.zeros(nBuffSize,dtype=np.int8)
+        recvtime = np.zeros(1,dtype=np.int64)
+        nrealsize = np.zeros(1,dtype=np.int32)
+        while self.mbRun:
+            nrtn = self.obj.RecvData(arr,nBuffSize,nrealsize,recvtime)
+            if nrtn > 0:
+                self.mpcall(arr,nrtn,recvtime)
+            else:
+                pass
+            if nrtn < 0:
+                nBuffSize = int(nrealsize[0] * 2)
+                arr = np.zeros(nBuffSize,dtype=np.int8)
+            else:
+                time.sleep(0.001)
+            
+        print("threadrecvdata complete.")
+
+    def stop_thread(self):
+        self.mbRun = False
+        self.mpthread.join()
+  
+    def start_thread(self, arg):  
+        # 创建线程对象,target参数指向要在线程中运行的函数  
+        self.mbRun = True
+        self.mpthread = threading.Thread(target=self.my_function, args=(arg,))  
+          
+        # 启动线程  
+        self.mpthread.start()  
+          
+        # 可以在这里添加其他代码,主线程会继续执行  
+        print("主线程继续执行...")  
+  
+        # 如果需要等待线程结束,可以调用 join() 方法  
+        # thread.join()  

+ 2 - 0
src/api/adapi_driver_radar_python/Readme.md

@@ -0,0 +1,2 @@
+protoc *.proto -I=./ --python_out=./
+

+ 40 - 0
src/api/adapi_driver_radar_python/pythonradar.py

@@ -0,0 +1,40 @@
+import modulecommpython
+import numpy as np  
+import time
+import sys  
+import radarobject_pb2
+import radarobjectarray_pb2
+
+from PyModuleCommModule import PyModuleComm
+
+time_radararray = 0
+msg_radararray = radarobjectarray_pb2.radarobjectarray()
+
+def radararray_callback(arr : np,nsize,time):  
+    global msg_radararray
+    global time_radararray
+    sub_arr = arr[0:nsize]
+    databytes = sub_arr.tobytes()
+    msg = radarobjectarray_pb2.radarobjectarray()
+    msg.ParseFromString(databytes)
+    msg_radararray = msg
+    time_radararray = time
+ #   print("lon: ",msg.lon)
+
+def main():  
+
+    mc = PyModuleComm("radar")
+    mc.RegisterRecv(radararray_callback)
+
+    try:
+        while True:
+            time.sleep(0.05)  # 模拟程序正在工作
+    except KeyboardInterrupt:
+        print("\n捕获到 Ctrl+C,程序正在退出...")
+        mc.stop_thread()
+    finally:
+        print("程序退出完成。")
+  
+# 调用main函数  
+if __name__ == "__main__":  
+    main()

+ 61 - 0
src/api/adapi_driver_radar_python/radarobject.proto

@@ -0,0 +1,61 @@
+syntax = "proto2";
+
+package iv.radar;
+
+message radarobject
+{
+  required double x = 1; //直角坐标位置,右为正,米
+  required double y = 2; //直角坐标位置,前为正,米
+  required double vx = 3; //直角坐标速度,右为正,米每秒
+  required double vy = 4; //直角坐标速度,前为正,米每秒
+  required double vel = 5; //速度标量,始终为正,米每秒
+  required bool bValid = 6; //数据可信标志
+
+  // Delphi ESR
+  optional double Range =7; //极坐标下距离
+  optional double Range_Rate =8; //纵向速度,极坐标,远离为正,米每秒
+  optional double Range_Accel =9; //纵向加速度,极坐标,远离为正,米每二次方秒
+  optional double Angle =10; //位置角度,极坐标,顺时针正,正前为0,度
+  optional double Width =11; //宽度,米,分辨率0.5米
+  optional bool Grouping_Changed =12; //组别变化
+  optional bool Oncoming =13; //相向移动
+  optional double Lat_Rate =14; //横向速度,极坐标,逆时针正,米每秒
+  optional int32 Med_Range_Mode =15; //目标被追踪模式,0无追踪,1中距雷达追踪,2长距雷达追踪,3中、长距追踪
+  optional int32 Track_Status =16; //追踪状态,0无目标,1新的目标,2新的更新过的目标,3更新过的目标,4平稳运动的目标,5渐融的目标,6不可信的平稳运动目标,7新的平稳运动目标
+  optional bool Bridge_Object =17; //桥梁标志
+  optional bool Moving =18; //运动
+  optional bool Fast_Movable =19; //快速运动
+  optional bool Slow_Movable =20; //慢速运动
+  optional int32 Power =21; //信号反射强度,单位dB
+  optional int32 Detect_Valid_Level = 22;//srr目标置信度
+  optional bool Detect_Status = 23;//srr目标检测状态,为1目标有效,置信度有意义
+
+  // Continental ARS408/SRR308
+  optional int32 ID =24;
+  optional int32 Dynamic_Property =25; //动态属性 0运动 1静止 2来向 3静止候选 4未知 5横穿静止 6横穿运动 7停止(运动过)
+  optional double RCS_RadarCrossSection =26; //目标对电波的散射面积
+  optional double DistLong_RMS =27; //纵向距离标准差 即真值=纵向距离+/-标准差 SRR308不可用
+  optional double DistLat_RMS =28; //横向距离标准差 SRR308不可用
+  optional double VrelLong_RMS =29; //纵向速度标准差 SRR308不可用
+  optional double VrelLat_RMS =30; //横向速度标准差 SRR308不可用
+
+  optional double Cluster_Pdh0 =31; //Cluster目标虚警概率
+  optional int32 Cluster_AmbigState =32; //多普勒径向速度解模糊状态 >=3时 cluster相对可信 SRR308不可用
+  optional int32 Cluster_InvalidState =33; //Cluster目标有效性状态 1、2、3、5、6、7、D、E无效,其他的是有效目标但可能有属性缺陷 308不可用
+  optional int32 Cluster_PropertiesBitfield =34; //SRR308专属 目标状态属性字段 需要按位解析 0x0为无属性 bit0静态 bit1动态 bit2模糊的 bit4近场波束扫描到的 bit6护栏后的目标
+  optional int32 Cluster_InvalidReasonBitfield =35; //SRR308专属 目标无效原因字段 需要按位解析 0x0表示有效目标 bit1低RCS动态 bit2低RCS静态 bit3速度不可信 bit4距离不可信 bit5目标是多径虚影
+
+  optional double Object_ArelLatRMS =36; //横向相对加速度标准差
+  optional double Object_ArelLongRMS =37; //纵向相对加速度标准差
+  optional double Object_OrientationRMS =38; //航向角标准差
+  optional int32 Object_MeasureState =39; //测量状态 0被删除的目标 1新创建的 2测量到的 3预测出的 4并如其他聚类的 5从聚类中分离出的
+  optional double Object_ProbOfExist =40; //目标存在概率
+  optional double Object_ArelLong =41; //纵向加速度
+  optional double Object_ArelLat =42; //横向加速度
+  optional double Object_OrientationAngle =43; //航向角
+  optional int32 Object_Class =44; //目标类别 0point 1car 2truck 3pedestrian 4motorcycle 5bicycle 6wide/wall 7reserved
+  optional double Object_Length =45; //目标长度
+  optional double Object_Width =46; //目标宽度
+};
+
+

+ 51 - 0
src/api/adapi_driver_radar_python/radarobjectarray.proto

@@ -0,0 +1,51 @@
+
+syntax = "proto2";
+
+package iv.radar;
+
+import "radarobject.proto";
+
+message radarobjectarray
+{
+  repeated radarobject obj = 1;
+  optional int64 mstime = 2;
+
+  //Delphi ESR
+  optional int32 ACC_Sta_Obj_ID =3; //路线上自适应巡航静态或相对靠近目标推荐id
+  optional int32 ACC_Mov_Obj_ID =4; //路线上自适应巡航动态或可动目标推荐id
+  optional int32 CMbB_Sta_Obj_ID =5; //路线上刹车减缓碰撞静态目标推荐id
+  optional int32 CMbB_Mov_Obj_ID =6; //路线上刹车减缓碰撞动态目标推荐id
+  optional int32 FCW_Sta_Obj_ID =7; //路线上前碰撞预警静态目标推荐id
+  optional int32 FCW_Mov_Obj_ID =8; //路线上前碰撞预警动态目标推荐id
+  optional bool Grating_Lobe_Det =9; //acc目标为栅瓣目标,可能并非路线上最近物体,需谨慎判断
+  optional bool Truck_Target_Det =10; //acc目标是卡车类,可能并非路线上的最近物体,需谨慎判断
+
+  optional int32 Water_Spray_Target_ID = 11; //最近的溅水目标,该目标可能是虚影(雨雪),也可能是实物(车轮溅水)
+  optional double Filtered_XOHP_ACC_CIPV = 12; //路线上最近ACC目标的滤波后的在主车驶路线上的横向偏移,单位米
+  optional int32 Path_ID_ACC_2 = 13; //路线上第二近ACC目标id
+  optional int32 Path_ID_ACC_3 = 14; //路线上第三近ACC目标id
+
+  optional bool Internal_Error = 15; //雷达内部错误标志,0为正常
+  optional bool Range_Perf_Error = 16; //雷达受遮挡错误标志,0为正常
+  optional bool Overheat_Error = 17; //雷达过热标志,0为正常
+
+  optional double Valid_LR_Range =18; //长距雷达可信距离
+  optional double Valid_LR_Range_Rate =19; //长距雷达可信速度
+  optional double Valid_LR_Angle = 20; //长距雷达可信角度
+  optional double Valid_LR_Power =21; //长距雷达可信目标反射强度
+
+  optional double Valid_MR_Range =22; //中距雷达可信距离
+  optional double Valid_MR_Range_Rate =23; //中距雷达可信速度
+  optional double Valid_MR_Angle = 24; //中距雷达可信角度
+  optional double Valid_MR_Power =25; //中距雷达可信目标反射强度
+  
+  //Continental ARS408/SRR308
+  optional bool Persistent_Error =26; //持续性错误标志,重启无法恢复
+  optional bool Interference_Error =27; //检测到干扰
+  optional bool Temperature_Error =28; //温度过高过低报警
+  optional bool Temporary_Error =29; //临时错误,重启可消除
+  optional bool Voltage_Error =30; //电压异常
+  optional bool Speed_Loss =31; //车速信息丢失
+  optional bool Yaw_Rate_Loss =32; //航向角速度信息丢失
+  optional string Radar_Version =33; //版本号  
+};