communication_manager.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. //
  2. // Created by zx on 2023/11/24.
  3. //
  4. #include "communication_manager.h"
  5. Error_manager CommunicationManager::Init(const CommunicationManagerConfig &config) {
  6. m_config = config;
  7. if (config.grpc_enable()) {
  8. m_grpc_server = new StreamRpcServer;
  9. m_grpc_server->Listenning(config.grpc_server_ip(), 9876);
  10. }
  11. if (config.rabbitmq_enable()) {
  12. std::string file_path = ETC_PATH PROJECT_NAME + config.rabbitmq_config_file();
  13. RabbitmqCommunicationTof3D::get_instance_pointer()->rabbitmq_init_from_protobuf(file_path);
  14. }
  15. if (config.mqtt_enable()) {
  16. std::string file_path = ETC_PATH PROJECT_NAME + config.mqtt_config_file();
  17. Tof3DMqttAsyncClient::iter()->init(file_path);
  18. }
  19. // offset.CopyFrom(config.offset());
  20. // out_info.CopyFrom(config.outof());
  21. condition = new Thread_condition();
  22. run_t = new std::thread(&CommunicationManager::run, this);
  23. condition->notify_all(true);
  24. return {};
  25. }
  26. void CommunicationManager::run() {
  27. auto t_start_time = std::chrono::steady_clock::now();
  28. std::chrono::duration<double> cost = std::chrono::steady_clock::now() - t_start_time;
  29. while (condition->is_alive()) {
  30. condition->wait();
  31. cost = std::chrono::steady_clock::now() - t_start_time;
  32. std::this_thread::sleep_for(std::chrono::milliseconds(100 - std::min<int>(99, cost.count() * 1000)));
  33. t_start_time = std::chrono::steady_clock::now();
  34. if (condition->is_alive()) {
  35. if (++heart > 999) {
  36. heart = 0;
  37. }
  38. DetectManager::DetectResult detect_measure_info;
  39. MeasureStatu measure_status = getMeasureData(detect_measure_info);
  40. detect_measure_info.car.uniform_x = detect_measure_info.car.wheels_center_x * cos(detect_measure_info.car.theta) - detect_measure_info.car.wheels_center_y * sin(detect_measure_info.car.theta);
  41. detect_measure_info.car.uniform_y = detect_measure_info.car.wheels_center_x * sin(detect_measure_info.car.theta) + detect_measure_info.car.wheels_center_y * cos(detect_measure_info.car.theta);
  42. if (m_config.grpc_enable()) {
  43. sendGrpcData(measure_status, detect_measure_info);
  44. }
  45. if (m_config.rabbitmq_enable()) {
  46. sendRabbitmqData(measure_status, detect_measure_info);
  47. }
  48. }
  49. }
  50. }
  51. MeasureStatu CommunicationManager::getMeasureData(DetectManager::DetectResult &detect_measure_info) {
  52. // 设备状态
  53. if (DeviceTof3D::iter()->getDeviceStatus() != SUCCESS) {
  54. return MeasureStatu::Lidar_Disconnect;
  55. }
  56. return DetectManager::iter()->getMeasureResult(detect_measure_info);
  57. }
  58. Error_manager CommunicationManager::sendGrpcData(const MeasureStatu &measure_statu, DetectManager::DetectResult &measure_result) {
  59. // 保存grpc数据中间块
  60. TransitData::MeasureInfo grpc_measure_info;
  61. grpc_measure_info.x = measure_result.car.wheels_center_x;
  62. grpc_measure_info.y = measure_result.car.wheels_center_y;
  63. grpc_measure_info.transx = measure_result.car.uniform_x;
  64. grpc_measure_info.transy = measure_result.car.uniform_y;
  65. grpc_measure_info.theta = measure_result.car.theta;
  66. grpc_measure_info.width = measure_result.car.wheel_width;
  67. grpc_measure_info.wheelbase = measure_result.car.wheel_base;
  68. grpc_measure_info.ftheta = measure_result.car.front_wheels_theta;
  69. addOffset(measure_result);
  70. grpc_measure_info.border_plc = outOfRangeDetection(measure_statu, measure_result, true);
  71. grpc_measure_info.border_display = outOfRangeDetection(measure_statu, measure_result, false);
  72. removeOffset(measure_result);
  73. grpc_measure_info.error.append("heart: " + std::to_string(heart));
  74. TransitData::get_instance_pointer()->setMeasureInfo(grpc_measure_info);
  75. return Error_manager();
  76. }
  77. Error_manager CommunicationManager::sendMqttData(const MeasureStatu &measure_statu, DetectManager::DetectResult &measure_result) {
  78. return Error_manager();
  79. }
  80. Error_manager CommunicationManager::sendRabbitmqData(const MeasureStatu &measure_statu, DetectManager::DetectResult &measure_result) {
  81. // 发送rabbitmq消息
  82. measure_info info;
  83. measure_buffer rabbit_measure_info;
  84. info.set_ground_status(measure_statu);
  85. // 如果地面雷达状态已经被修改过,直接返回
  86. if (info.ground_status() == MeasureStatu::Measure_OK || info.ground_status() == MeasureStatu::Measure_Border) {
  87. addOffset(measure_result);
  88. auto out_of_statu = outOfRangeDetection(measure_statu, measure_result, true);
  89. if (out_of_statu != Range_status::Range_correct) {
  90. info.set_border_statu(out_of_statu);
  91. info.set_ground_status(MeasureStatu::Measure_Border);
  92. }
  93. info.set_cx(measure_result.car.uniform_x);
  94. info.set_cy(measure_result.car.uniform_y);
  95. info.set_theta(-measure_result.car.theta * 180.0 / M_PI);
  96. info.set_length(0);
  97. info.set_width(measure_result.car.wheel_width);
  98. info.set_wheelbase(measure_result.car.wheel_base);
  99. info.set_front_theta(measure_result.car.front_wheels_theta * 180.0 / M_PI);
  100. if (DetectManager::iter()->carMoveStatus() == FAILED) {
  101. info.set_motion_statu(1); // 静止3秒
  102. info.set_is_stop(1);
  103. } else {
  104. info.set_motion_statu(0); // 运动
  105. info.set_is_stop(0);
  106. }
  107. info.set_move_distance(measure_result.car.forward_dis);
  108. }
  109. rabbit_measure_info.mutable_measure_info_to_plc_forward()->CopyFrom(info);
  110. rabbit_measure_info.mutable_measure_info_to_plc_reverse()->CopyFrom(info);
  111. rabbit_measure_info.mutable_measure_info_to_terminal()->CopyFrom(info);
  112. if (info.ground_status() == MeasureStatu::Measure_OK || info.ground_status() == MeasureStatu::Measure_Border) {
  113. auto out_of_statu = outOfRangeDetection(measure_statu, measure_result, false);
  114. if (out_of_statu != Range_status::Range_correct) {
  115. rabbit_measure_info.mutable_measure_info_to_terminal()->set_border_statu(out_of_statu);
  116. rabbit_measure_info.mutable_measure_info_to_terminal()->set_ground_status(MeasureStatu::Measure_Border);
  117. }
  118. }
  119. RabbitmqCommunicationTof3D::get_instance_pointer()->encapsulate_status_msg(rabbit_measure_info.DebugString(), 0);
  120. return {};
  121. }
  122. Range_status CommunicationManager::outOfRangeDetection(const MeasureStatu &measure_statu, DetectManager::DetectResult &measure_result, bool isPlc) {
  123. // 测量给出超界,说明车辆未到达指定区域,需要前进
  124. if (measure_statu == MeasureStatu::Measure_Border) {
  125. return Range_status::Range_back;
  126. }
  127. if (measure_statu != MeasureStatu::Measure_OK && measure_statu != MeasureStatu::Measure_Border) {
  128. return Range_status::Range_correct;
  129. }
  130. outOfRangeInfo out_info = isPlc ? m_config.plc_out_info() : m_config.display_out_info();
  131. // 车位位于y负方向, 判断后轮超界情况, 4.80是搬运器大Y的运动极限, 2.7是同侧两个小y夹持杆中心距离
  132. // 判断车辆轴距超界情况
  133. if (measure_result.car.wheel_base < out_info.car_min_wheelbase() || // 轴距过小
  134. measure_result.car.wheel_base > out_info.car_max_wheelbase()) { // 轴距过长
  135. last_range_statu |= Range_status::Range_car_wheelbase;
  136. } else if (measure_result.car.wheel_base > out_info.car_min_wheelbase() + 0.01 && // 轴距过小
  137. measure_result.car.wheel_base < out_info.car_max_wheelbase() - 0.01) {
  138. last_range_statu &= (~Range_status::Range_car_wheelbase);
  139. }
  140. if (last_range_statu & Range_status::Range_car_wheelbase) {
  141. return Range_status::Range_car_wheelbase;
  142. }
  143. // 判断车辆宽度超界情况
  144. if (measure_result.car.wheel_width < out_info.car_min_width() || // 车宽过窄
  145. measure_result.car.wheel_width > out_info.car_max_width()) { // 车宽过宽
  146. last_range_statu |= Range_status::Range_car_width; // 车辆超宽
  147. } else if (measure_result.car.wheel_width > out_info.car_min_width() + 0.01 && // 车宽过窄
  148. measure_result.car.wheel_width < out_info.car_max_width() - 0.01) {
  149. last_range_statu &= (~Range_status::Range_car_width);
  150. }
  151. if (last_range_statu & Range_status::Range_car_width) {
  152. return Range_status::Range_car_width;
  153. }
  154. // 判断车辆旋转角超界情况
  155. float theta = -measure_result.car.theta * 180 / M_PI;
  156. if (theta < out_info.turnplate_angle_limit_min_clockwise()) {
  157. last_range_statu |= Range_status::Range_angle_clock;
  158. last_range_statu &= (~Range_status::Range_angle_anti_clock);
  159. } else if (theta > out_info.turnplate_angle_limit_max_clockwise()) {
  160. last_range_statu |= Range_status::Range_angle_anti_clock;
  161. last_range_statu &= (~Range_status::Range_angle_clock);
  162. } else if (theta > out_info.turnplate_angle_limit_min_clockwise() &&
  163. theta < out_info.turnplate_angle_limit_max_clockwise()) {
  164. last_range_statu &= (~Range_status::Range_angle_clock);
  165. last_range_statu &= (~Range_status::Range_angle_anti_clock);
  166. }
  167. if (last_range_statu & Range_status::Range_angle_clock) {
  168. return Range_status::Range_angle_clock;
  169. }
  170. if (last_range_statu & Range_status::Range_angle_anti_clock) {
  171. return Range_status::Range_angle_anti_clock;
  172. }
  173. // 方向盘调正
  174. float front_wheels_theta = measure_result.car.front_wheels_theta * 180 / M_PI;
  175. DLOG(INFO) << "front_wheels_theta " << front_wheels_theta;
  176. if (fabs(front_wheels_theta) > 10) {
  177. last_range_statu |= Range_status::Range_steering_wheel_nozero;
  178. } else if (fabs(front_wheels_theta) < 7) {
  179. last_range_statu &= (~Range_status::Range_steering_wheel_nozero);
  180. }
  181. if (last_range_statu & Range_status::Range_steering_wheel_nozero) {
  182. return Range_status::Range_steering_wheel_nozero;
  183. }
  184. // 左右超界
  185. if (measure_result.car.uniform_x < out_info.border_minx()) {
  186. last_range_statu |= Range_status::Range_left;
  187. last_range_statu &= (~Range_status::Range_right);
  188. } else if (measure_result.car.uniform_x > out_info.border_maxx()) {
  189. last_range_statu |= Range_status::Range_right;
  190. last_range_statu &= (~Range_status::Range_left);
  191. } else if (measure_result.car.uniform_x > out_info.border_minx() + 0.01 &&
  192. measure_result.car.uniform_x < out_info.border_maxx() - 0.01) {
  193. last_range_statu &= (~Range_status::Range_left);
  194. last_range_statu &= (~Range_status::Range_right);
  195. }
  196. if (last_range_statu & Range_status::Range_left) {
  197. return Range_status::Range_left;
  198. }
  199. if (last_range_statu & Range_status::Range_right) {
  200. return Range_status::Range_right;
  201. }
  202. // 后超界
  203. double t_center_y = fabs(measure_result.car.uniform_y);
  204. DLOG(INFO) << t_center_y - 4.80 + 0.5 * (measure_result.car.wheel_base - 2.7) << " " << out_info.plc_border_maxy();
  205. DLOG(INFO) << t_center_y - 4.80 - 0.5 * (measure_result.car.wheel_base - 2.7) << " " << out_info.plc_border_miny();
  206. if (t_center_y - 4.80 + 0.5 * (measure_result.car.wheel_base - 2.7) > out_info.plc_border_maxy() || // 前轮无法抱到
  207. t_center_y - 4.80 - 0.5 * (measure_result.car.wheel_base - 2.7) > out_info.plc_border_miny()) { // 后轮无法抱到
  208. last_range_statu |= Range_status::Range_back; // 后超界
  209. } else if (t_center_y - 4.80 + 0.5 * (measure_result.car.wheel_base - 2.7) < out_info.plc_border_maxy() - 0.010 && // 前轮无法抱到
  210. t_center_y - 4.80 - 0.5 * (measure_result.car.wheel_base - 2.7) < out_info.plc_border_miny() - 0.010) {
  211. last_range_statu &= (~Range_status::Range_back);
  212. }
  213. if (last_range_statu & Range_status::Range_back) {
  214. // 前进距离
  215. measure_result.car.forward_dis = MAX((t_center_y - 4.80 + 0.5 * (measure_result.car.wheel_base - 2.7) - (out_info.plc_border_maxy() - 0.010)),
  216. (t_center_y - 4.80 - 0.5 * (measure_result.car.wheel_base - 2.7) - (out_info.plc_border_miny() - 0.010)));
  217. return Range_status::Range_back;
  218. }
  219. return Range_status::Range_correct;
  220. }
  221. Error_manager CommunicationManager::addOffset(DetectManager::DetectResult &measure_result) {
  222. auto offset = m_config.offset();
  223. measure_result.car.uniform_x += offset.x();
  224. measure_result.car.wheels_center_x += offset.x();
  225. measure_result.car.uniform_y += offset.y();
  226. measure_result.car.wheels_center_y += offset.y();
  227. measure_result.car.wheel_base += offset.wheelbase();
  228. measure_result.car.theta += offset.theta();
  229. measure_result.car.width += offset.width();
  230. measure_result.car.wheel_width += offset.width();
  231. return {};
  232. }
  233. Error_manager CommunicationManager::removeOffset(DetectManager::DetectResult &measure_result) {
  234. auto offset = m_config.offset();
  235. measure_result.car.uniform_x -= offset.x();
  236. measure_result.car.wheels_center_x -= offset.x();
  237. measure_result.car.uniform_y -= offset.y();
  238. measure_result.car.wheels_center_y -= offset.y();
  239. measure_result.car.wheel_base -= offset.wheelbase();
  240. measure_result.car.theta -= offset.theta();
  241. measure_result.car.width -= offset.width();
  242. measure_result.car.wheel_width -= offset.width();
  243. return {};
  244. }