dispatch_coordinates.cpp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432
  1. //
  2. // Created by huli on 2021/3/24.
  3. //
  4. #include "dispatch_coordinates.h"
  5. #include "../tool/proto_tool.h"
  6. Dispatch_coordinates::Dispatch_coordinates()
  7. {
  8. mpp_space_lock = nullptr;
  9. m_space_lock_rows = 0;
  10. m_space_lock_columns = 0;
  11. m_space_lock_total = 0;
  12. }
  13. Dispatch_coordinates::~Dispatch_coordinates()
  14. {
  15. dispatch_coordinates_uninit();
  16. }
  17. //初始化 调度的坐标系 模块。如下三选一
  18. Error_manager Dispatch_coordinates::dispatch_coordinates_init()
  19. {
  20. return dispatch_coordinates_init_from_protobuf(DISPATCH_COORDINATES_PARAMETER_PATH);
  21. }
  22. //初始化 调度的坐标系 模块。从文件读取
  23. Error_manager Dispatch_coordinates::dispatch_coordinates_init_from_protobuf(std::string prototxt_path)
  24. {
  25. Dispatch_proto::Dispatch_coordinates_parameter_all t_dispatch_coordinates_parameter_all;
  26. if(! proto_tool::read_proto_param(prototxt_path,t_dispatch_coordinates_parameter_all) )
  27. {
  28. return Error_manager(DISPATCH_COORDINATES_READ_PROTOBUF_ERROR,MINOR_ERROR,
  29. "Dispatch_coordinates read_proto_param failed");
  30. }
  31. return dispatch_coordinates_init_from_protobuf(t_dispatch_coordinates_parameter_all);
  32. }
  33. //初始化 调度的坐标系 模块。从protobuf读取
  34. Error_manager Dispatch_coordinates::dispatch_coordinates_init_from_protobuf(Dispatch_proto::Dispatch_coordinates_parameter_all& dispatch_coordinates_parameter_all)
  35. {
  36. LOG(INFO) << " ---Dispatch_coordinates::dispatch_coordinates_init_from_protobuf() run--- "<< this;
  37. Error_manager t_error;
  38. m_space_lock_rows = dispatch_coordinates_parameter_all.parkspace_number().rows();
  39. m_space_lock_columns = dispatch_coordinates_parameter_all.parkspace_number().columns();
  40. m_space_lock_total = dispatch_coordinates_parameter_all.parkspace_number().total();
  41. m_liftway_width = dispatch_coordinates_parameter_all.parkspace_number().liftway_width();
  42. mpp_space_lock = new space_device*[m_space_lock_rows];
  43. for (int i = 0; i < m_space_lock_rows; ++i)
  44. {
  45. mpp_space_lock[i] = new space_device[m_space_lock_columns];
  46. for (int j = 0; j < m_space_lock_columns; ++j)
  47. {
  48. //注意了, 这里一定要初始化为-1, 因为设备id=0 是有效设备
  49. mpp_space_lock[i][j].m_catcher_id = -1;
  50. mpp_space_lock[i][j].m_carrier_id = -1;
  51. }
  52. }
  53. int size;
  54. size = dispatch_coordinates_parameter_all.packspace_coordinates_parameters_size();
  55. for (int i = 0; i < size; ++i)
  56. {
  57. Point3D_tool::Point3D t_point3d;
  58. int id = dispatch_coordinates_parameter_all.packspace_coordinates_parameters(i).id();
  59. t_point3d.x = dispatch_coordinates_parameter_all.packspace_coordinates_parameters(i).x();
  60. t_point3d.y = dispatch_coordinates_parameter_all.packspace_coordinates_parameters(i).y();
  61. t_point3d.z = dispatch_coordinates_parameter_all.packspace_coordinates_parameters(i).z();
  62. m_packspace_coordinates[id] = t_point3d;
  63. }
  64. size = dispatch_coordinates_parameter_all.passageway_coordinates_parameters_size();
  65. for (int i = 0; i < size; ++i)
  66. {
  67. Point3D_tool::Point3D t_point3d;
  68. int id = dispatch_coordinates_parameter_all.passageway_coordinates_parameters(i).id();
  69. t_point3d.x = dispatch_coordinates_parameter_all.passageway_coordinates_parameters(i).x();
  70. t_point3d.y = dispatch_coordinates_parameter_all.passageway_coordinates_parameters(i).y();
  71. t_point3d.z = dispatch_coordinates_parameter_all.passageway_coordinates_parameters(i).z();
  72. m_passageway_coordinates[id] = t_point3d;
  73. }
  74. size = dispatch_coordinates_parameter_all.carrier_coordinates_parameters_size();
  75. for (int i = 0; i < size; ++i)
  76. {
  77. Point3D_tool::Point3D t_point3d;
  78. int id = dispatch_coordinates_parameter_all.carrier_coordinates_parameters(i).id();
  79. t_point3d.x = dispatch_coordinates_parameter_all.carrier_coordinates_parameters(i).x();
  80. t_point3d.y = dispatch_coordinates_parameter_all.carrier_coordinates_parameters(i).y();
  81. t_point3d.z = dispatch_coordinates_parameter_all.carrier_coordinates_parameters(i).z();
  82. m_carrier_coordinates[id] = t_point3d;
  83. }
  84. size = dispatch_coordinates_parameter_all.catcher_coordinates_parameters_size();
  85. for (int i = 0; i < size; ++i)
  86. {
  87. Point3D_tool::Point3D t_point3d;
  88. int id = dispatch_coordinates_parameter_all.catcher_coordinates_parameters(i).id();
  89. t_point3d.x = dispatch_coordinates_parameter_all.catcher_coordinates_parameters(i).x();
  90. t_point3d.y = dispatch_coordinates_parameter_all.catcher_coordinates_parameters(i).y();
  91. t_point3d.z = dispatch_coordinates_parameter_all.catcher_coordinates_parameters(i).z();
  92. m_catcher_coordinates[id] = t_point3d;
  93. }
  94. m_carrier_box.x_min = dispatch_coordinates_parameter_all.carrier_box_parameters().x_min();
  95. m_carrier_box.x_max = dispatch_coordinates_parameter_all.carrier_box_parameters().x_max();
  96. m_carrier_box.y_min = dispatch_coordinates_parameter_all.carrier_box_parameters().y_min();
  97. m_carrier_box.y_max = dispatch_coordinates_parameter_all.carrier_box_parameters().y_max();
  98. m_carrier_box.z_min = dispatch_coordinates_parameter_all.carrier_box_parameters().z_min();
  99. m_carrier_box.z_max = dispatch_coordinates_parameter_all.carrier_box_parameters().z_max();
  100. m_catcher_box.x_min = dispatch_coordinates_parameter_all.catcher_box_parameters().x_min();
  101. m_catcher_box.x_max = dispatch_coordinates_parameter_all.catcher_box_parameters().x_max();
  102. m_catcher_box.y_min = dispatch_coordinates_parameter_all.catcher_box_parameters().y_min();
  103. m_catcher_box.y_max = dispatch_coordinates_parameter_all.catcher_box_parameters().y_max();
  104. m_catcher_box.z_min = dispatch_coordinates_parameter_all.catcher_box_parameters().z_min();
  105. m_catcher_box.z_max = dispatch_coordinates_parameter_all.catcher_box_parameters().z_max();
  106. m_catcher_b_min = dispatch_coordinates_parameter_all.catcher_b_min();
  107. m_catcher_b_max = dispatch_coordinates_parameter_all.catcher_b_max();
  108. m_catcher_d1_min = dispatch_coordinates_parameter_all.catcher_d1_min();
  109. m_catcher_d1_max = dispatch_coordinates_parameter_all.catcher_d1_max();
  110. m_catcher_d2_min = dispatch_coordinates_parameter_all.catcher_d2_min();
  111. m_catcher_d2_max = dispatch_coordinates_parameter_all.catcher_d2_max();
  112. std::cout << " huli test :::: " << " m_packspace_coordinates.size() = " << m_packspace_coordinates.size() << std::endl;
  113. std::cout << " huli test :::: " << " m_passageway_coordinates.size() = " << m_passageway_coordinates.size() << std::endl;
  114. std::cout << " huli test :::: " << " m_carrier_coordinates.size() = " << m_carrier_coordinates.size() << std::endl;
  115. std::cout << " huli test :::: " << " m_catcher_coordinates.size() = " << m_catcher_coordinates.size() << std::endl;
  116. m_default_wheelbase = dispatch_coordinates_parameter_all.default_wheelbase();
  117. m_catcher_1th_floor_z = dispatch_coordinates_parameter_all.catcher_1th_floor_z();
  118. m_catcher_2th_floor_z = dispatch_coordinates_parameter_all.catcher_2th_floor_z();
  119. m_catcher_3th_floor_z = dispatch_coordinates_parameter_all.catcher_3th_floor_z();
  120. m_catcher_4th_floor_z = dispatch_coordinates_parameter_all.catcher_4th_floor_z();
  121. m_carrier_1th_floor_z = dispatch_coordinates_parameter_all.carrier_1th_floor_z();
  122. m_carrier_2th_floor_z = dispatch_coordinates_parameter_all.carrier_2th_floor_z();
  123. m_carrier_3th_floor_z = dispatch_coordinates_parameter_all.carrier_3th_floor_z();
  124. m_carrier_4th_floor_z = dispatch_coordinates_parameter_all.carrier_4th_floor_z();
  125. m_catcher_d1_d2_distance = dispatch_coordinates_parameter_all.catcher_d1_d2_distance();
  126. m_catcher_wheel_base_limit = dispatch_coordinates_parameter_all.catcher_wheel_base_limit();
  127. m_carrier_y_y1_distance = dispatch_coordinates_parameter_all.carrier_y_y1_distance();
  128. m_carrier_default_y1_back = dispatch_coordinates_parameter_all.carrier_default_y1_back();
  129. m_carrier_default_y1_leave = dispatch_coordinates_parameter_all.carrier_default_y1_leave();
  130. m_carrier_default_y_back = dispatch_coordinates_parameter_all.carrier_default_y_back();
  131. m_carrier_default_y_leave = dispatch_coordinates_parameter_all.carrier_default_y_leave();
  132. m_carrier_default_x_left = dispatch_coordinates_parameter_all.carrier_default_x_left();
  133. m_carrier_default_x_right = dispatch_coordinates_parameter_all.carrier_default_x_right();
  134. m_passageway_terminal_id_min = dispatch_coordinates_parameter_all.passageway_terminal_id_min();
  135. m_passageway_terminal_id_max = dispatch_coordinates_parameter_all.passageway_terminal_id_max();
  136. m_passageway_terminal_number = dispatch_coordinates_parameter_all.passageway_terminal_number();
  137. size = dispatch_coordinates_parameter_all.passageway_functioning_patterns_size();
  138. for (int i = m_passageway_terminal_id_min; i < size; ++i)
  139. {
  140. m_passageway_functioning_pattern_map[i] = (Passageway_functioning_pattern)dispatch_coordinates_parameter_all.passageway_functioning_patterns(i);
  141. }
  142. if ( m_passageway_terminal_number != m_passageway_terminal_id_max - m_passageway_terminal_id_min +1 ||
  143. m_passageway_terminal_number != size)
  144. {
  145. return Error_manager(Error_code::PARAMETER_ERROR, Error_level::MINOR_ERROR,
  146. " Dispatch_coordinates::dispatch_coordinates_init_from_protobuf PARAMRTER ERROR ");
  147. }
  148. m_parkspace_id_min = dispatch_coordinates_parameter_all.parkspace_id_min();
  149. m_parkspace_id_max = dispatch_coordinates_parameter_all.parkspace_id_max();
  150. m_parkspace_id_total = dispatch_coordinates_parameter_all.parkspace_id_total();
  151. m_third_floor_parkspace_id_min = dispatch_coordinates_parameter_all.third_floor_parkspace_id_min();
  152. m_third_floor_parkspace_id_max = dispatch_coordinates_parameter_all.third_floor_parkspace_id_max();
  153. m_third_floor_parkspace_id_total = dispatch_coordinates_parameter_all.third_floor_parkspace_id_total();
  154. m_car_wheel_base_min = dispatch_coordinates_parameter_all.car_wheel_base_min();
  155. m_car_wheel_base_max = dispatch_coordinates_parameter_all.car_wheel_base_max();
  156. return Error_code::SUCCESS;
  157. }
  158. //反初始化
  159. Error_manager Dispatch_coordinates::dispatch_coordinates_uninit()
  160. {
  161. for (int i = 0; i < m_space_lock_rows; ++i)
  162. {
  163. delete [](mpp_space_lock[i]);
  164. }
  165. delete [](mpp_space_lock);
  166. return Error_code::SUCCESS;
  167. }
  168. //获取2点之间的路径长度, 只算x轴和z轴, 只是计算一个大概值
  169. Error_manager Dispatch_coordinates::get_distance(int coordinates_id_1, int coordinates_id_2, Parkspace_path parkspace_path, float & distance)
  170. {
  171. //是否在1楼的标记位,
  172. float t_distance_x = 0;
  173. float t_distance_z = 0;
  174. //检查合法性
  175. if ( m_carrier_coordinates.find(coordinates_id_1) != m_carrier_coordinates.end() &&
  176. m_carrier_coordinates.find(coordinates_id_2) != m_carrier_coordinates.end() )
  177. {
  178. //计算距离
  179. if(coordinates_id_1 == coordinates_id_2)
  180. {
  181. distance = 0;
  182. }
  183. else if ( m_carrier_coordinates[coordinates_id_1].z == m_carrier_coordinates[coordinates_id_2].z )
  184. {
  185. distance = m_carrier_coordinates[coordinates_id_1].x - m_carrier_coordinates[coordinates_id_2].x;
  186. if ( distance<0 )
  187. {
  188. distance = -distance;
  189. }
  190. }
  191. else if ( parkspace_path == Dispatch_coordinates::Parkspace_path::LEFT_PATH )
  192. {
  193. t_distance_x = (m_carrier_coordinates[coordinates_id_1].x - m_carrier_default_x_left) +
  194. (m_carrier_coordinates[coordinates_id_2].x - m_carrier_default_x_left);
  195. t_distance_z = m_carrier_coordinates[coordinates_id_1].z - m_carrier_coordinates[coordinates_id_2].z;
  196. if ( t_distance_z<0 )
  197. {
  198. t_distance_z = -t_distance_z;
  199. }
  200. distance = t_distance_x + t_distance_z;
  201. }
  202. else if ( parkspace_path == Dispatch_coordinates::Parkspace_path::RIGHT_PATH )
  203. {
  204. t_distance_x = (m_carrier_default_x_right - m_carrier_coordinates[coordinates_id_1].x ) +
  205. (m_carrier_default_x_right - m_carrier_coordinates[coordinates_id_2].x );
  206. t_distance_z = m_carrier_coordinates[coordinates_id_1].z - m_carrier_coordinates[coordinates_id_2].z;
  207. if ( t_distance_z<0 )
  208. {
  209. t_distance_z = -t_distance_z;
  210. }
  211. distance = t_distance_x + t_distance_z;
  212. }
  213. else if ( parkspace_path == Dispatch_coordinates::Parkspace_path::TEMPORARY_CACHE_PATH )
  214. {
  215. t_distance_x = m_carrier_coordinates[coordinates_id_1].x - m_carrier_coordinates[coordinates_id_2].x;
  216. if ( t_distance_x<0 )
  217. {
  218. t_distance_x = -t_distance_x;
  219. }
  220. t_distance_z = m_carrier_coordinates[coordinates_id_1].z - m_carrier_coordinates[coordinates_id_2].z;
  221. if ( t_distance_z<0 )
  222. {
  223. t_distance_z = -t_distance_z;
  224. }
  225. distance = t_distance_x + t_distance_z;
  226. }
  227. else
  228. {
  229. return Error_manager(Error_code::DISPATCH_COORDINATES_PATH_ERROR, Error_level::MINOR_ERROR,
  230. " Dispatch_coordinates::get_distance parkspace_path error ");
  231. }
  232. }
  233. else
  234. {
  235. return Error_manager(Error_code::DISPATCH_COORDINATES_ID_ERROR, Error_level::MINOR_ERROR,
  236. " Dispatch_coordinates::get_distance coordinates_id error ");
  237. }
  238. return Error_code::SUCCESS;
  239. }
  240. //把1楼出入口的坐标修正到2楼.
  241. bool Dispatch_coordinates::amend_coordinates_from_1st_floor_to_2nd_floor(int & coordinates_id)
  242. {
  243. if ( coordinates_id >= PASSAGEWAY_ID_BASE+1 && coordinates_id<= PASSAGEWAY_ID_BASE + m_passageway_terminal_id_max-1)
  244. {
  245. coordinates_id = coordinates_id+100; //例如:把 1103 改为 1203
  246. return true;
  247. }
  248. else
  249. {
  250. return false;
  251. }
  252. return false;
  253. }
  254. //选择最近的搬运器, return true:选左边, return false:选右边
  255. bool Dispatch_coordinates::choice_nearest_carrier(int dispatch_source, int coordinates_id_1, int coordinates_id_2)
  256. {
  257. Error_manager t_error;
  258. //选最近的搬运器
  259. float t_distance_left = 0;
  260. t_error = get_distance(dispatch_source, coordinates_id_1, Dispatch_coordinates::Parkspace_path::LEFT_PATH, t_distance_left );
  261. if ( t_error != Error_code::SUCCESS )
  262. {
  263. LOG(INFO) << " Dispatch_manager::resource_allocation() m_process_pickup_list error = "<< t_error.to_string() << " " << this;
  264. }
  265. float t_distance_right = 0;
  266. t_error = get_distance(dispatch_source, coordinates_id_2, Dispatch_coordinates::Parkspace_path::RIGHT_PATH, t_distance_right );
  267. if ( t_error != Error_code::SUCCESS )
  268. {
  269. LOG(INFO) << " Dispatch_manager::resource_allocation() m_process_pickup_list error = "<< t_error.to_string() << " " << this;
  270. }
  271. if ( t_distance_left <= t_distance_right )
  272. {
  273. return true;
  274. }
  275. else
  276. {
  277. return false;
  278. }
  279. }
  280. //判断取车的路径
  281. Dispatch_coordinates::Parkspace_path Dispatch_coordinates::get_pickup_path(int dispatch_source, int dispatch_destination)
  282. {
  283. if ( dispatch_source >= 0 && dispatch_source <= 165 &&
  284. dispatch_destination >= 1100 && dispatch_destination <= 1107)
  285. {
  286. if ( dispatch_source >= 19 && dispatch_source <= 27 )
  287. {
  288. if ( dispatch_destination >= 1101 && dispatch_destination <= 1106 )
  289. {
  290. return Dispatch_coordinates::Parkspace_path::THIRD_FLOOR_PATH;
  291. }
  292. else
  293. {
  294. return Dispatch_coordinates::Parkspace_path::UNKNOW_PATH;
  295. }
  296. }
  297. else
  298. {
  299. int t_columns = dispatch_source % 15;
  300. if ( (t_columns ==1 && t_columns == 2 && t_columns ==3) ||
  301. (dispatch_source >= 34 && dispatch_source <= 37) )
  302. {
  303. if ( dispatch_destination >= 1100 && dispatch_destination <= 1106 )
  304. {
  305. return Dispatch_coordinates::Parkspace_path::LEFT_PATH;
  306. }
  307. else
  308. {
  309. return Dispatch_coordinates::Parkspace_path::UNKNOW_PATH;
  310. }
  311. }
  312. else if ( (t_columns ==13 && t_columns == 14 && t_columns ==0) ||
  313. (dispatch_source >= 38 && dispatch_source <= 42) )
  314. {
  315. if ( dispatch_destination >= 1101 && dispatch_destination <= 1107 )
  316. {
  317. return Dispatch_coordinates::Parkspace_path::RIGHT_PATH;
  318. }
  319. else
  320. {
  321. return Dispatch_coordinates::Parkspace_path::UNKNOW_PATH;
  322. }
  323. }
  324. else
  325. {
  326. if ( dispatch_destination >= 1101 && dispatch_destination <= 1106 )
  327. {
  328. return Dispatch_coordinates::Parkspace_path::DOUBLE_PATH;
  329. }
  330. else if ( dispatch_destination == 1100 )
  331. {
  332. return Dispatch_coordinates::Parkspace_path::LEFT_PATH;
  333. }
  334. else if ( dispatch_destination == 1107 )
  335. {
  336. return Dispatch_coordinates::Parkspace_path::RIGHT_PATH;
  337. }
  338. else
  339. {
  340. return Dispatch_coordinates::Parkspace_path::UNKNOW_PATH;
  341. }
  342. }
  343. }
  344. }
  345. else
  346. {
  347. return Dispatch_coordinates::Parkspace_path::UNKNOW_PATH;
  348. }
  349. return Dispatch_coordinates::Parkspace_path::UNKNOW_PATH;
  350. }
  351. //检查停车位和取车位, 判断是否能改道
  352. bool Dispatch_coordinates::is_able_redirect(int pickup_parkspace_id, int store_parkspace_id)
  353. {
  354. return true;
  355. }
  356. void Dispatch_coordinates::set_space_lock(int space_rows, int space_columns, int catcher_id, int carrier_id)
  357. {
  358. std::unique_lock<std::mutex> t_lock(m_lock);
  359. mpp_space_lock[space_rows][space_columns].m_catcher_id = catcher_id;
  360. mpp_space_lock[space_rows][space_columns].m_carrier_id = carrier_id;
  361. }
  362. void Dispatch_coordinates::set_space_lock_for_catcher(int space_rows, int space_columns, int catcher_id)
  363. {
  364. std::unique_lock<std::mutex> t_lock(m_lock);
  365. mpp_space_lock[space_rows][space_columns].m_catcher_id = catcher_id;
  366. }
  367. void Dispatch_coordinates::set_space_lock_for_carrier(int space_rows, int space_columns, int carrier_id)
  368. {
  369. std::unique_lock<std::mutex> t_lock(m_lock);
  370. mpp_space_lock[space_rows][space_columns].m_carrier_id = carrier_id;
  371. }
  372. void Dispatch_coordinates::set_space_lock(int space_id, int catcher_id, int carrier_id)
  373. {
  374. int space_rows = (space_id-1) / m_space_lock_columns;
  375. int space_columns = (space_id-1) % m_space_lock_columns;
  376. set_space_lock(space_rows, space_columns, catcher_id, carrier_id);
  377. }
  378. void Dispatch_coordinates::set_space_lock_for_catcher(int space_id, int catcher_id)
  379. {
  380. int space_rows = (space_id-1) / m_space_lock_columns;
  381. int space_columns = (space_id-1) % m_space_lock_columns;
  382. set_space_lock_for_catcher(space_rows, space_columns, catcher_id);
  383. }
  384. void Dispatch_coordinates::set_space_lock_for_carrier(int space_id, int carrier_id)
  385. {
  386. int space_rows = (space_id-1) / m_space_lock_columns;
  387. int space_columns = (space_id-1) % m_space_lock_columns;
  388. set_space_lock_for_carrier(space_rows, space_columns, carrier_id);
  389. }