wj_lidar_uml.wsd 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. @startuml
  2. title 电子围栏类图
  3. class async_client
  4. {
  5. +Async_Client(boost::asio::io_service &io_service, boost::asio::ip::tcp::endpoint endpoint, fundata_t fundata_, void *p)//构造函数
  6. +bool client_connection_status()//连接状态判断
  7. +bool client_initialize_status()//初始化状态判断
  8. +bool initialize(bool with_reconnection = true)//初始化函数
  9. +bool close()//断开连接
  10. +std::atomic<bool> mb_exit //客户端退出标志
  11. -std::thread *m_connection_check_thread;// 连接状态主动检查线程
  12. }
  13. class wj_716_lidar_protocol
  14. {
  15. +Wj_716_lidar_protocol();// 构造
  16. +~Wj_716_lidar_protocol();// 析构
  17. +Error_manager initialize(wj::wjLidarParams params);//初始化函数
  18. +Error_manager data_process(const char *data, const int reclen);// 数据处理
  19. +Error_manager protocol(const char *data, const int len);// 万集通信协议
  20. +Error_manager on_recv_process(char *data, int len);// 接收消息
  21. +Error_manager check_xor(char *recvbuf, int recvlen);// 消息完整性检查
  22. +bool get_initialize_status();// 获取初始化状态
  23. +Error_manager get_scan_points(pcl::PointCloud<pcl::PointXYZ>::Ptr &cloud_out);// 获取扫描点云
  24. +std::chrono::steady_clock::time_point get_scan_time();// 获取扫描点云更新时间点
  25. }
  26. class wj_lidar_encapsulation
  27. {
  28. +Wj_lidar_encapsulation();// 无参构造函数
  29. +~Wj_lidar_encapsulation();// 析构函数
  30. +Error_manager initialize(wj::wjLidarParams params);// 初始化
  31. +Error_manager get_cloud(pcl::PointCloud<pcl::PointXYZ>::Ptr& cloud, std::chrono::steady_clock::time_point command_time, int timeout_milli=1500);// 外部调用获取点云
  32. +bool get_connection_status();// 获取连接状态
  33. +bool get_initialize_status();// 获取初始化情况
  34. -std::thread* m_client_thread; // 异步读取线程
  35. -Async_Client* mp_client; // 异步客户端句柄
  36. -Wj_716_lidar_protocol* mp_protocol; // 万集雷达协议句柄
  37. }
  38. class wj_lidar_task
  39. {
  40. +virtual Error_manager init(); // 父类继承,初始化函数
  41. +Wj_lidar_Task();// 构造函数
  42. +~Wj_lidar_Task();// 析构
  43. +Error_manager get_command(wj_command &command);// 获取命令
  44. +Error_manager set_command(wj_command command);// 设置测量命令
  45. +Error_manager set_result(wj_measure_result result);// 将测量结果存入该任务单
  46. +Error_manager get_result(wj_measure_result &result);// 将测量结果传出
  47. +bool get_result_flag();// 获取测量结果是否已存入该任务单的指标
  48. }
  49. class Task_Base
  50. {
  51. +~Task_Base();
  52. +virtual Error_manager init();//初始化任务单,初始任务单类型为 UNKONW_TASK
  53. +Error_manager update_statu(Task_statu task_statu,std::string statu_information="");//更新任务单
  54. +Task_type get_task_type();//获取任务类型
  55. +Task_statu get_statu();//获取任务单状态
  56. +std::string get_statu_information();//获取状态说明
  57. }
  58. class plc_data << (S,#FF7700) Singleton >>
  59. {
  60. +static Plc_data *get_instance(std::string ip = "");// 获取plc通信类单例
  61. +void update_data(int state_code, int border_status, int id);// 更新区域状态数据
  62. +static void plc_update_thread(Plc_data *p);// plc更新线程
  63. +bool get_plc_status();// 获取plc实时状态
  64. -std::thread *mp_update_thread; // plc更新线程
  65. -S7PLC m_plc; // S7协议句柄
  66. }
  67. class region_detect
  68. {
  69. +Region_detector(int id, wj::Region region);// 有参构造函数
  70. +~Region_detector();// 析构函数
  71. +Error_manager detect(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_in);// 检测传入点云是否为合法四轮
  72. +Error_manager detect(pcl::PointCloud<pcl::PointXYZ>::Ptr &cloud_in, double &x, double &y, double &c, double &wheelbase, double &width, bool print=true);// 检测传入点云,识别为四类返回中心点、角度、轮距与宽度
  73. +int get_region_id();// 获得区域id
  74. -wj::Region m_region_param; // 区域范围参数
  75. -std::atomic<int> m_region_id; // 区域id
  76. }
  77. class region_worker
  78. {
  79. +Region_worker(int id, wj::Region region, Verify_result* verify_handle);// 有参构造
  80. +~Region_worker();// 析构函数
  81. +void update_cloud(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_in);// 外部调用传入新点云
  82. +static void detect_loop(Region_worker *worker);// 实时检测线程函数
  83. +int get_id();// 获取区域id
  84. +Error_manager get_wheel_result(pcl::PointCloud<pcl::PointXYZ>::Ptr &cloud_in, double &x, double &y, double &c, double &wheelbase, double &width);// 获得中心点、角度等测量数据
  85. -std::thread *m_detect_thread; // 实时检测线程
  86. -Region_detector *m_detector; // 区域检测算法实例
  87. }
  88. note left of fence_controller
  89. ×电子围栏主类,包括各雷达指针、区域指针以及plc指针
  90. ×三个线程,更新线程负责获取各雷达点云,拼接并更新至各区域
  91. ×轮距任务监听线程负责监听从nnxx获取的对特定终端区域计算任务,计算完成后的结果由发送线程以nnxx中间件发送
  92. ×上述轮距计算任务也可以由主程序调用execute_task函数完成
  93. end note
  94. class fence_controller
  95. {
  96. +Fence_controller(Verify_result* verify_handle);// 有参构造函数
  97. +~Fence_controller();// 析构函数
  98. +Error_manager initialize(wj::wjManagerParams params);// 初始化函数
  99. +Error_manager get_current_status();// 获取当前整体状态函数
  100. +Error_manager get_cloud(pcl::PointCloud<pcl::PointXYZ>::Ptr &cloud_out);// 外部获取点云
  101. +bool get_initialize_status();// 获取初始化状态
  102. +Error_manager execute_task(Task_Base* task);// 接收任务单进行阻塞式处理
  103. -std::vector<Wj_lidar_encapsulation *> m_lidars_vector; // 万集雷达实例指针数组
  104. -std::vector<Region_worker *> m_region_workers_vector; // 区域功能实例指针数组
  105. -Plc_data *mp_plc_data; // plc句柄
  106. -std::thread *m_update_thread; // 更新线程
  107. -std::thread *m_wheel_recv_thread; // 轮距计算任务监听线程
  108. -std::thread *m_wheel_send_thread; // 轮距计算结果发送线程
  109. -threadsafe_queue<MsgTask> m_msg_queue; // 轮距计算任务队列
  110. }
  111. class globalmsg << (M,#00FF77) message>>
  112. {
  113. }
  114. class wj_lidar_msg << (M,#00FF77) message>>
  115. {
  116. }
  117. class wj_lidar_conf << (M,#00FF77) message>>
  118. {
  119. }
  120. Task_Base <|-- wj_lidar_task
  121. wj_lidar_encapsulation <-- wj_716_lidar_protocol
  122. wj_lidar_encapsulation <-- async_client
  123. wj_716_lidar_protocol <-- wj_lidar_conf
  124. region_detect <-- wj_lidar_conf
  125. region_worker <-- region_detect
  126. fence_controller <-- plc_data
  127. fence_controller <-- wj_lidar_encapsulation
  128. fence_controller <-- region_worker
  129. fence_controller <-- wj_lidar_task
  130. fence_controller <-- globalmsg
  131. plc_data <-- wj_lidar_msg
  132. @enduml