Explorar o código

增加各个模块类结构图

zx %!s(int64=5) %!d(string=hai) anos
pai
achega
e750f92208
Modificáronse 4 ficheiros con 531 adicións e 0 borrados
  1. 251 0
      locate/locate_uml.wsd
  2. 79 0
      system_manager/system_uml.wsd
  3. 120 0
      terminor/terminor_uml.wsd
  4. 81 0
      verify/verify_uml.wsd

+ 251 - 0
locate/locate_uml.wsd

@@ -0,0 +1,251 @@
+@startuml
+title 摆扫测量模块类图
+
+class Task_Base
+{
+    +~Task_Base();
+    +virtual Error_manager init();//初始化任务单,初始任务单类型为 UNKONW_TASK
+    +Error_manager update_statu(Task_statu task_statu,std::string statu_information="");//更新任务单
+    +Task_type   get_task_type();//获取任务类型
+    +Task_statu  get_statu();//获取任务单状态
+    +std::string get_statu_information();//获取状态说明
+}
+
+
+class Locate_task
+{
+    +Locate_task();
+    +~Locate_task();
+    //设置测量输入点云()
+    +Error_manager set_locate_cloud(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud);
+    //获取输入点云()
+    +pcl::PointCloud<pcl::PointXYZ>::Ptr get_locate_cloud();
+    //获取测量结果()
+    +Locate_information get_locate_information();
+    //设置测量结果()
+    +Error_manager set_locate_information(Locate_information information);
+    //获取文件存放路径()
+    +std::string get_save_path();
+    //设置文件村昂路径()
+    +Error_manager set_save_path(std::string path);
+
+    -pcl::PointCloud<pcl::PointXYZ>::Ptr         m_locate_cloud_ptr;//测量算法输入点云
+    -Locate_information                          m_locate_information;//测量结果存放结构体
+    -std::string                                 m_save_path;//测量中间文件存放路径
+}
+
+
+
+class Detector 
+{
+    std::shared_ptr<void> detector_gpu_ptr;//yolo测量网络指针
+    std::deque<std::vector<bbox_t>> prev_bbox_vec_deque;
+    const int cur_gpu_id;
+    float nms = .4;
+    bool wait_stream;
+
+    + Detector(std::string cfg_filename, std::string weight_filename, int gpu_id = 0);
+    + ~Detector();
+
+    + std::vector<bbox_t> detect(std::string image_filename, float thresh = 0.2, bool use_mean = false);
+    + std::vector<bbox_t> detect(image_t img, float thresh = 0.2, bool use_mean = false);
+    + image_t load_image(std::string image_filename);
+    + void free_image(image_t m);
+    + int get_net_width() const;
+    + int get_net_height() const;
+    + int get_net_color_depth() const;
+
+    + std::vector<bbox_t> tracking_id(std::vector<bbox_t> cur_bbox_vec, bool const change_history = true,
+                                                int const frames_story = 5, int const max_dist = 40);
+
+    + void *get_cuda_context();
+
+    //+ bool send_json_http(std::vector<bbox_t> cur_bbox_vec, std::vector<std::string> obj_names, int frame_id,
+    //    std::string filename = std::string(), int timeout = 400000, int port = 8070);
+    //重置图像大小,并识别()
+    +std::vector<bbox_t> detect_resized(image_t img, int init_w, int init_h, float thresh = 0.2, bool use_mean = false);
+    
+}
+
+class YoloDetector
+{
+	+YoloDetector(std::string cfg,std::string weights,float minx,float maxx,float miny,float maxy,float freq);
+	+//设置输入点云的边界,识别的时候根据边界投影到图像()
+	+//输入边界的长款比必须是1:1,否则会出现图像扭曲()
+	+//freq:表示多长一个像素点()
+    +Error_manager set_region(float minx, float maxx, float miny, float maxy,float freq);
+	+virtual ~YoloDetector();
+    +//识别函数, 将点云数据转换成图像格式保存,该函数已经过期(第一版算法,点云由两个雷达扫描)
+    +//l:左边雷达扫描数据; r:右边雷达扫描数据()
+    +//save_dir:中间数据保存路径()
+	+Error_manager detect(cv::Mat& l, cv::Mat& r, std::vector<YoloBox>& boxes,std::string save_dir);
+	+//将点云投影成图像, 识别车辆外接矩形框()
+	+Error_manager detect(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_in, std::vector<YoloBox>& boxes, std::string save_dir);
+
+    -//释放图像内存()
+    -void free_img(image_t img);
+    -//opencv图像类型转换成 image_t 格式,并调整大小()
+    -std::shared_ptr<image_t> mat_to_image_resize(cv::Mat mat) const
+    -static std::shared_ptr<image_t> mat_to_image(cv::Mat img_src)
+    -static image_t ipl_to_image(IplImage* src)
+    -static image_t make_empty_image(int w, int h, int c)
+    -static image_t make_image_custom(int w, int h, int c)
+	-Detector*	m_pDetector;
+	-float m_minx;
+	-float m_maxx;
+	-float m_miny;
+	-float m_maxy;
+	-float m_freq;
+}
+
+class PointSifter
+{
+    +//初始化PointSift()
+    +//point_num:pointsift输入点数()
+    +//cls_num:PointSift输出类别数()
+	+PointSifter(int point_num, int cls_num);
+	+~PointSifter();
+	+//加载网络参数()
+	+//meta:tensorflow网络结构定义文件()
+	+//cpkt:tensorflow网络权重()
+	+bool Load(std::string meta, std::string cpkt);
+	+//预测()
+	+//data:输入数据,大小为  输入点数*3()
+	+//output:输出数据,大小为  输入点数*类别数()
+	+bool Predict(float* data, float* output);
+	+//错误原因()
+	+std::string LastError();
+
+	-PointSifter();
+	-std::mutex		m_mutex;
+	-std::string		m_error;
+	-bool			m_bInit;
+	-int				m_point_num;
+	-int				m_cls_num;
+	-void*			m_sess;
+}
+note right of PointSifter
+    sift识别类,导入类
+    负责pointsift网络的加载识别,
+    内部加锁,保证只有一个识别任务占有
+end note
+
+
+class Point_sift_segmentation 
+{
+	+Point_sift_segmentation(int point_size,int cls,float freq,pcl::PointXYZ minp,pcl::PointXYZ maxp);
+    +//设置要识别的点云区域()
+    +Error_manager set_region(pcl::PointXYZ minp, pcl::PointXYZ maxp);
+    +//初始化网络, 加载网络权重()
+	+virtual Error_manager init(std::string graph,std::string cpkt);
+	+//分割函数,输入点云,输出各类的点云,并保存中间文件方便查看识别结果()
+	+//cloud:输入点云()
+	+//clouds:输出分类好的多个点云(附带颜色,红色为杂物,绿色为车,白色为地面)
+	+virtual Error_manager seg(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud,
+	+    std::vector<pcl::PointCloud<pcl::PointXYZRGB>::Ptr>& clouds, std::string save_dir);
+	+virtual ~Point_sift_segmentation();
+
+    -//将点云数据转换到float*()
+    -//cloud:输入点云()
+    -//output:转换结果保存地址,函数内不负责内存的分配与释放()
+	-bool	Create_data(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud, float* output);
+    -//将float*转换成点云()
+    -//output:点云对应的类别,大小为  点数*类别()
+    -//cloud:点云数据(xyz)()
+    -//cloud_seg::输入带颜色的点云()
+	-bool    RecoveryCloud(float* output, float* cloud, std::vector<pcl::PointCloud<pcl::PointXYZRGB>::Ptr>& cloud_seg);
+	-bool	FilterObs(std::vector<pcl::PointCloud<pcl::PointXYZRGB>::Ptr>& cloud_seg, std::string save_dir);
+
+	-float		        m_freq;
+    -pcl::PointXYZ		m_minp;
+    -pcl::PointXYZ		m_maxp;
+
+}
+note bottom of Point_sift_segmentation
+ * 封装PointSift点云分割网络,输入点云,分割出汽车,检验结果
+ * 功能包括将pcl点云数据格式转换成原始数据格式float*
+ * 将识别数据转换成点云数据并用不同颜色区分
+end note
+
+
+class LocateParameter
+{
+    +获取各个配置参数()
+    +序列化配置到文件()
+    +从文件流读取配置()
+}
+note left of LocateParameter
+    测量算法参数配置类
+    格式protobuf,
+    详见locater_parameter.proto文件
+end note
+
+class Locater
+{
+    +ocater();
+    +Locater();
+
+    +/初始化测量算法参数()
+    +Error_manager init(Measure::LocateParameter parameter);
+
+    +/获取测量模块状态(错误码);返回是否能执行任务,以及不能执行任务的原因()
+    +Error_manager get_error();
+
+    +//执行任务,()
+    +//task:测量任务()
+    +//time_out:超时时间,单位秒()
+    +Error_manager execute_task(Task_Base* task,double time_out=5);
+
+    -//测量算法函数()
+    -//cloud_in:输入点云()
+    -//locate_information:测量结果()
+    -//work_dir:中间文件保存路径()
+    -Error_manager locate(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_in,
+
+    -Locate_information& locate_information, std::string work_dir);
+
+    -//yolo定位车辆外接矩形()
+    -//cloud_in:输入点云,定位算法内部不会修改点云内容()
+    -//boxes:定位到的外接box框()
+    -//work_dir:中间文件输出路径()
+    -Error_manager locate_yolo(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_in,
+    -    std::vector<YoloBox>& boxes, std::string work_dir);
+
+    -//根据yolo识别结果, 利用PointSift从场景中分割车辆点云()
+    -//cloud:输入点云()
+    -//boxes:yolo识别结果()
+    -//cloud_target:车辆点云()
+    -//work_dir:中间文件保存路径()
+    -Error_manager locate_sift(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud, std::vector<YoloBox> boxes,
+    -                       pcl::PointCloud<pcl::PointXYZ>::Ptr& cloud_wheel,pcl::PointCloud<pcl::PointXYZ>::Ptr& cloud_car,
+    -                       std::string work_dir);
+
+    -//输入汽车点云,识别轮胎,并计算轴长,宽,中心,旋转角()
+    -Error_manager locate_wheel(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud,float& center_x,float& center_y,float& wheel_base,float& width,float& angle,std::string work_dir);
+    
+    -//根据汽车点云计算车高()
+    -//cloud_car:车辆点云()
+    -Error_manager measure_height(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_car,float& height);
+    
+    -// 保存点云成txt到文件()
+    -static void save_cloud_txt(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud,std::string save_file);
+
+    -Measure::LocateParameter           m_locate_parameter;
+    -Point_sift_segmentation*                mp_point_sift;
+    -YoloDetector*                           mp_yolo_detector;
+    -Cnn3d_segmentation*                     mp_cnn3d;
+
+    -std::mutex						        m_mutex_lock;
+}
+
+
+Locate_task <|-- Task_Base
+YoloDetector <-- Detector
+Point_sift_segmentation <|-- PointSifter
+
+Locater <-- Point_sift_segmentation
+Locater <-- YoloDetector
+Locater <-- LocateParameter
+
+
+@enduml

+ 79 - 0
system_manager/system_uml.wsd

@@ -0,0 +1,79 @@
+@startuml
+title 测量系统主框架结果图
+
+class System_Manager
+{
+    +System_Manager();
+    +~System_Manager();
+    +//初始化各个模块,包括雷达,plc,locater,terminor()
+    +//1,读取运行环境下setting目录下的laser.prototxt,plc.prototxt,locater.prototxt,terminal.prototxt()
+    +//2,根据配置创建雷达,plc,locater,terminal()
+    +Error_manager init();
+    +//读取protobuf 配置文件()
+    +//file:文件()
+    +//parameter:要读取的配置()
+    +static bool read_proto_param(std::string file, ::google::protobuf::Message& parameter);
+
+    -//plc指令回调函数,当plc收到测量指令后,调用此回调函数()
+    -//terminal_id:收到指令的终端编号()
+    -//owner:this指针()
+    -static Error_manager plc_command_callback(int terminal_id,void* owner);
+
+    -std::vector<Laser_base*>                    m_laser_vector;
+    -std::vector<Terminor_Command_Executor*>     m_terminal_vector;
+    -Locater*                                    mp_locater;
+    -Plc_Communicator*                           mp_plc;
+
+    -//结果检验工具
+    -Verify_result*                              mp_verify_result_tool;
+    -///terminoal 配置
+    -Terminal::Terminor_parameter_all            m_terminal_parameter_all;
+    -//万集雷达管理对象
+    -Fence_controller*                           mp_wj_controller;
+
+}
+
+note bottom of Plc_Communicator
+    详见 plc 模块
+end note
+
+note bottom of Verify_result
+    详见 verify 模块
+end note
+
+note bottom of Fence_controller
+    详见 wj_lidar 模块
+end note
+
+note bottom of Locater
+    详见 locate 模块
+end note
+
+note bottom of Laser_base
+    详见 laser 模块
+end note
+
+note bottom of Terminor_parameter_all
+    详见 terminor 模块
+end note
+
+note bottom of Terminor_Command_Executor
+    详见 terminor 模块
+end note
+
+note  left of System_Manager
+    系统管理类
+    负责各个模块配置的读取
+    负责各个模块的创建,运行,释放
+end note 
+
+System_Manager<-- Plc_Communicator
+System_Manager<-- Verify_result
+System_Manager<-- Fence_controller
+System_Manager <-- Locater
+System_Manager<-- Laser_base
+System_Manager<-- Terminor_Command_Executor
+System_Manager<-- Terminor_parameter_all
+
+
+@enduml

+ 120 - 0
terminor/terminor_uml.wsd

@@ -0,0 +1,120 @@
+@startuml
+title 终端指令执行模块
+
+class Terminor_Command_Executor
+{
+    + * 构造函数()
+    + * parameter:该终端指令配置参数(待定)
+    +Terminor_Command_Executor(Terminal::Terminor_parameter parameter);
+    +~Terminor_Command_Executor();
+ 
+    + * 获取终端进度状态()
+    +TerminorStatu get_terminor_statu();
+  
+    + * 执行扫描,测量任务,阻塞知道任务完成或超时(单位秒)()
+    + * 函数体只检测指令是否能执行,并启动线程执行指令,不等待指令完成.()
+    + *lasers:需要启动的雷达()
+    + * wj_lidar:万集雷达测量模块()
+    + * plc:上传结果工具()
+    + * locater:测量算法对象()
+    + * verify_tool:结果检验工具,当该参数为NULL时,测量结果不作检验()
+    + * 返回指令是否启动成功()
+    +Error_manager execute_command(std::vector<Laser_base*> lasers,Fence_controller* wj_lidar,Plc_Communicator* plc,Locater* locater,Verify_result* verify_tool,float timeout=15);
+    
+    + * 强制正在执行的中断指令()
+    +Error_manager force_stop_command();
+ 
+    + * 设置保存文件的root路径()
+    + * 执行指令时会在此路径下,生成日期文件夹,格式为:/root_path/year/month/day/YYYYMMDD-HHMMSS文件夹()
+    +void set_save_root_path(std::string root);
+
+    -static void thread_command_working(Terminor_Command_Executor* terminor);
+
+    - * 执行指令流程函数()
+    - * 扫描()
+    - * 测量,保存测量结果到成员变量()
+    -Error_manager scanning_measuring();
+    
+    - * 执行上传plc任务()
+    - * plc终端编号从1开始()
+    
+    -Error_manager post_measure_information();
+    
+    - * 根据长宽,角度,生成cv::RotateRect()
+    -static cv::RotatedRect create_rotate_rect(float length,float width,float angle,float x,float y);
+    
+    -TerminorStatu               m_terminor_statu;
+    -//指令流程线程
+    -std::thread*                mp_command_thread;
+    -//
+    -std::mutex                  m_mutex_lock;
+    -//保存输入进来的雷达指针
+    -std::vector<Laser_base*>    mp_laser_vector;
+    -//万集雷达测量模块
+    -Fence_controller*           mp_wj_lidar;
+    -//plc
+    -Plc_Communicator*           mp_plc;
+    -//locater*
+    -Locater*                    mp_locater;
+    -//配置参数
+    -Terminal::Terminor_parameter    m_terminor_parameter;
+    -//本次指令超时时间 单位秒
+    -float                       m_timeout_second;
+    -//强制退出标示
+    -bool                        mb_force_quit;
+    -//保存当前指令测量结果
+    -Locate_information          m_measure_information;
+    -//保存文件的root目录
+    -std::string                 m_save_root_path;
+    -//检验结果工具
+    -Verify_result*              mp_verify_tool;
+
+}
+note left of Terminor_Command_Executor
+    * 终端指令执行类,
+    * 执行指令,
+    * 监控指令执行进度
+    * 输入雷达数组,plc对象,测量算法对象,执行扫描测量任务
+    * 检验测量结果合法性
+end note
+
+
+class Terminor_parameter
+{
+    +获取配置参数()
+    +从文件流获取配置()
+}
+note bottom of Terminor_parameter
+    * 终端配置类,protobuf格式
+    * 
+end note
+
+
+note bottom of Fence_controller
+    * 电子围栏雷达测量模块
+    * 详见 wj_lidar 模块
+end note
+
+note bottom of Locater
+    * 摆扫/大疆 雷达测量模块
+    * 详见 locate 模块
+end note
+
+note bottom of Plc_Communicator
+    * plc 通讯模块
+    * 详见 plc 模块
+end note
+
+note bottom of Verify_result
+    * verify : 测量结果检验模块
+    * 详见 verify 模块
+end note
+
+Terminor_Command_Executor <-- Terminor_parameter
+Terminor_Command_Executor <-- Fence_controller
+Terminor_Command_Executor <-- Locater
+Terminor_Command_Executor <-- Plc_Communicator
+Terminor_Command_Executor <-- Verify_result
+
+
+@enduml

+ 81 - 0
verify/verify_uml.wsd

@@ -0,0 +1,81 @@
+@startuml
+title 测量结果检验模块
+
+
+class Railing
+{
+
+    + * 构造函数()
+    + * a,b,c代表栏杆所在直线方程, ax+by+c=0()
+    + * width:表示栏杆的宽()
+    +Railing(float a,float b,float c,float width);
+    + * 检验结果框,是否会与栏杆冲突()
+    +Error_manager verify(cv::RotatedRect rotate_rect);
+
+    -float m_a;
+    -float m_b;
+    -float m_c;
+    -float m_width;
+}
+note left of Railing
+    栏杆检验类
+    检验测量结果是否碰撞栏杆
+    栏杆信息包括:栏杆斜角,宽度
+end note
+
+class Terminal_region_limit
+{
+    +Terminal_region_limit(Railing* left_railing,Railing* right_railing);
+  
+    + * 检验是否碰撞左右栏杆,()
+    + * 返回结果:左边碰撞,右边碰撞,左右都碰撞,正确()
+    +Error_manager verify(cv::RotatedRect rect);
+
+    -//左边栏杆
+    -Railing*                     mp_left_railing;
+    -//右边栏杆
+    -Railing*                     mp_right_railing;
+}
+note left of Terminal_region_limit
+    硬件场地检验类
+    检验测量结果是否满足现场安全要求
+end note
+
+class Verify_result
+{
+    + * 构造函数
+    + * parameter:硬件限制配置参数
+    +Verify_result(Hardware_limit::Hardware_parameter parameter);
+
+    + * 检验硬件限制
+    + * rotate_rect:待检验的旋转矩形
+    + * height:输入高度
+    + * verify_vertex:只检验中心点,不检验顶角
+    +Error_manager verify(cv::RotatedRect rotate_rect,float height,bool verify_vertex=true);
+
+    + * 检验硬件限制
+    + * rotate_rect:待检验的旋转矩形
+    + * height:输入高度
+    + * terminal_id:终端编号,终端对应的左右栏杆号为: id,id+1
+    + * code:返回超界状态(前后左右,按位或运算)
+    + * 主要用于电子围栏,检验栏杆及前后
+    +Error_manager verify(cv::RotatedRect rotate_rect,int terminal_id,int& code);
+
+    -Hardware_limit::Hardware_parameter          m_hardware_parameter;
+}
+note left of Verify_result
+    测量结果检测器
+    根据现场硬件要求
+    检验测量结果是否合法(安全性)
+end note
+
+note left of Hardware_parameter
+    硬件配置类
+    配置现场硬件参数
+    包括 前后左右超界范围,栏杆参数等
+end note 
+Terminal_region_limit --> Railing
+Verify_result --> Terminal_region_limit
+Verify_result --> Hardware_parameter
+
+@enduml