dispatch_manager.h 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. //
  2. // Created by huli on 2020/7/20.
  3. //
  4. #ifndef NNXX_TESTS_DISPATCH_MANAGER_H
  5. #define NNXX_TESTS_DISPATCH_MANAGER_H
  6. #include "../error_code/error_code.h"
  7. #include "../communication/communication_message.h"
  8. #include "../system/system_communication.h"
  9. #include "../tool/singleton.h"
  10. #include "../tool/thread_condition.h"
  11. #include "../tool/TaskQueue/TQFactory.h"
  12. #include "../tool/TaskQueue/BaseTask.h"
  13. #include "../dispatch/carrier.h"
  14. #include "../dispatch/catcher.h"
  15. #include "../dispatch/passageway.h"
  16. #include "../dispatch/dispatch_process.h"
  17. #include <vector>
  18. #include <glog/logging.h>
  19. #include <atomic>
  20. //lacate测量结果结构体, 整车的信息,
  21. typedef struct Locate_information
  22. {
  23. float locate_x; //整车的中心点x值, 四轮的中心
  24. float locate_y; //整车的中心点y值, 四轮的中心
  25. float locate_angle; //整车的旋转角, 四轮的旋转角
  26. float locate_length; //整车的长度, 用于规避碰撞
  27. float locate_width; //整车的宽度, 用于规避碰撞
  28. float locate_height; //整车的高度, 用于规避碰撞
  29. float locate_wheel_base; //整车的轮距, 前后轮的距离, 用于机器人或agv的抓车
  30. float locate_wheel_width; //整车的轮距, 左右轮的距离, 用于机器人或agv的抓车
  31. bool locate_correct; //整车的校准标记位
  32. //注:理论上, 车宽和左右轮距应该是一样的, 但是实际上车宽比左右轮距略大,
  33. }Locate_information;
  34. //调度管理模块
  35. class Dispatch_manager:public Singleton<Dispatch_manager>
  36. {
  37. // 子类必须把父类设定为友元函数,这样父类才能使用子类的私有构造函数。
  38. friend class Singleton<Dispatch_manager>;
  39. public:
  40. //调度设备参数
  41. #define DISPATCH_DEVICE_PARAMETER_PATH "../setting/dispatch_device.prototxt"
  42. //存车任务数量的限制, 大于等于限则, 则使用缓存位, 默认5个
  43. #define DISPATCH_MANAHER_STORE_LIST_SIZE_LIMIT 5
  44. //调度管理 的状态
  45. enum Dispatch_manager_status
  46. {
  47. E_DISPATCH_MANAGER_UNKNOW = 0, //未知
  48. E_DISPATCH_MANAGER_READY = 1, //准备,待机
  49. E_DISPATCH_MANAGER_STORE = 2, //正在存车
  50. E_DISPATCH_MANAGER_PICKUP = 3, //正在取车
  51. E_DISPATCH_MANAGER_FAULT = 100, //故障
  52. };
  53. //调度方向, 停车取车
  54. enum Dispatch_motion_direction
  55. {
  56. E_STORE_CAR =0, //停车, 出入口 -> 停车位
  57. E_PICKUP_CAR =1, //取车, 停车位 -> 出入口
  58. };
  59. private:
  60. // 父类的构造函数必须保护,子类的构造函数必须私有。
  61. Dispatch_manager();
  62. public:
  63. //必须关闭拷贝构造和赋值构造,只能通过 get_instance 函数来进行操作唯一的实例。
  64. Dispatch_manager(const Dispatch_manager& other) = delete;
  65. Dispatch_manager& operator =(const Dispatch_manager& other) = delete;
  66. ~Dispatch_manager();
  67. public://API functions
  68. //调度管理 初始化
  69. Error_manager dispatch_manager_init(int dispatch_manager_id);
  70. Error_manager dispatch_manager_init();
  71. //初始化 调度管理 模块。从文件读取
  72. Error_manager dispatch_manager_init_from_protobuf(std::string prototxt_path);
  73. //初始化 调度管理 模块。从protobuf读取
  74. Error_manager dispatch_manager_init_from_protobuf(Dispatch_proto::Dispatch_device_parameter_all& dispatch_device_parameter_all);
  75. //调度管理 反初始化
  76. Error_manager dispatch_manager_uninit();
  77. //调度管理 设备复位
  78. Error_manager dispatch_manager_device_reset();
  79. //对外的接口函数,负责接受并处理任务单,
  80. Error_manager execute_task(Dispatch_manager::Dispatch_motion_direction dispatch_motion_direction);
  81. //检查能否执行消息指令
  82. Error_manager check_execute_msg(Communication_message* p_msg);
  83. //检查状态
  84. Error_manager check_status();
  85. //调度模块 //执行搬运请求(主控->调度管理)
  86. Error_manager execute_for_dispatch_request_msg(message::Dispatch_request_msg &dispatch_request_msg);
  87. //调度模块 答复数据异常
  88. Error_manager send_dispatch_response_msg_with_error(message::Dispatch_request_msg &dispatch_request_msg, Error_manager error);
  89. //调度模块 //调度总规划的答复(调度算法->调度管理)
  90. Error_manager execute_for_dispatch_plan_response_msg(message::Dispatch_plan_response_msg &dispatch_plan_response_msg);
  91. //调度模块 //调度控制的任务请求(调度算法->调度管理)
  92. Error_manager execute_for_dispatch_control_request_msg(message::Dispatch_control_request_msg &dispatch_control_request_msg);
  93. //定时发送 调度管理的状态
  94. Error_manager encapsulate_send_dispatch_manager_status();
  95. //在流程的map 里面释放指定的流程
  96. Error_manager release_dispatch_process(std::string command_key);
  97. public://get or set member variable
  98. Dispatch_manager_status get_dispatch_manager_status();
  99. int get_dispatch_manager_id();
  100. void set_dispatch_manager_id(int dispatch_id);
  101. protected:
  102. //资源分配
  103. void resource_allocation();
  104. public://member variable
  105. Dispatch_manager_status m_dispatch_manager_status; //调度管理 的状态
  106. int m_dispatch_manager_id; //调度模块的id, (楚天项目就是单元号, 0~2)
  107. //流程控制
  108. std::mutex m_lock; //线程池的锁, 增删流程时要加锁.
  109. tq::IQueue* m_process_thread_queue; //指令流程线程池, 管理线程内存, 负责启动和回收线程内存资源,不负责控制流程.
  110. //流程管理, 注释
  111. std::map<std::string, Dispatch_process*> m_key_to_dispatch_process_store_map; //存车流程的map 注释
  112. std::map<std::string, Dispatch_process*> m_key_to_dispatch_process_pickup_map; //取车流程的map 注释
  113. //流程的list, 按照创建顺序排序, 先来后到, 停车和停车不能插队, 但是停车和取车可以插队.
  114. std::list<Dispatch_process*> m_process_store_list; //存车流程的list, 内存由线程池管理
  115. std::list<Dispatch_process*> m_process_pickup_list; //取车流程的list, 内存由线程池管理
  116. //硬件资源
  117. int m_catcher_size; //抓车器的数量, 默认1个
  118. std::map<int, std::shared_ptr<Dispatch_device_base>> m_catcher_map; //抓车器的对象实例,内存由本类管理
  119. int m_carrier_size; //搬运器的数量, 默认3个
  120. std::map<int, std::shared_ptr<Dispatch_device_base>> m_carrier_map; //搬运器的对象实例,内存由本类管理
  121. int m_passageway_size; //通道口的数量, 默认7个
  122. std::map<int, std::shared_ptr<Dispatch_device_base>> m_passageway_map; //通道口的对象实例,内存由本类管理
  123. //调度总管理的线程, 负责资源分配
  124. std::thread* m_dispatch_manager_thread; //调度总管理的线程, 总控全局, 控制每个流程的先后顺序, 并合理的分配资源.
  125. Thread_condition m_dispatch_manager_condition; //调度总管理的条件变量, 总控全局, 控制每个流程的先后顺序, 并合理的分配资源.
  126. private:
  127. };
  128. #endif //NNXX_TESTS_DISPATCH_MANAGER_H