123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279 |
- //
- // Created by zx on 2023/11/24.
- //
- #include "communication_manager.h"
- Error_manager CommunicationManager::Init(const CommunicationManagerConfig &config) {
- m_config = config;
- if (config.grpc_enable()) {
- m_grpc_server = new StreamRpcServer;
- m_grpc_server->Listenning(config.grpc_server_ip(), 9876);
- }
- if (config.rabbitmq_enable()) {
- std::string file_path = ETC_PATH PROJECT_NAME + config.rabbitmq_config_file();
- RabbitmqCommunicationTof3D::get_instance_pointer()->rabbitmq_init_from_protobuf(file_path);
- }
- if (config.mqtt_enable()) {
- std::string file_path = ETC_PATH PROJECT_NAME + config.mqtt_config_file();
- Tof3DMqttAsyncClient::iter()->init(file_path);
- }
- // offset.CopyFrom(config.offset());
- // out_info.CopyFrom(config.outof());
- condition = new Thread_condition();
- run_t = new std::thread(&CommunicationManager::run, this);
- condition->notify_all(true);
- return {};
- }
- void CommunicationManager::run() {
- auto t_start_time = std::chrono::steady_clock::now();
- std::chrono::duration<double> cost = std::chrono::steady_clock::now() - t_start_time;
- while (condition->is_alive()) {
- condition->wait();
- cost = std::chrono::steady_clock::now() - t_start_time;
- std::this_thread::sleep_for(std::chrono::milliseconds(100 - std::min<int>(99, cost.count() * 1000)));
- t_start_time = std::chrono::steady_clock::now();
- if (condition->is_alive()) {
- if (++heart > 999) {
- heart = 0;
- }
- DetectManager::DetectResult detect_measure_info;
- MeasureStatu measure_status = getMeasureData(detect_measure_info);
- 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);
- 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);
- if (m_config.grpc_enable()) {
- sendGrpcData(measure_status, detect_measure_info);
- }
- if (m_config.rabbitmq_enable()) {
- sendRabbitmqData(measure_status, detect_measure_info);
- }
- }
- }
- }
- MeasureStatu CommunicationManager::getMeasureData(DetectManager::DetectResult &detect_measure_info) {
- // 设备状态
- if (DeviceTof3D::iter()->getDeviceStatus() != SUCCESS) {
- return MeasureStatu::Lidar_Disconnect;
- }
- return DetectManager::iter()->getMeasureResult(detect_measure_info);
- }
- Error_manager CommunicationManager::sendGrpcData(const MeasureStatu &measure_statu, DetectManager::DetectResult &measure_result) {
- // 保存grpc数据中间块
- TransitData::MeasureInfo grpc_measure_info;
- grpc_measure_info.x = measure_result.car.wheels_center_x;
- grpc_measure_info.y = measure_result.car.wheels_center_y;
- grpc_measure_info.transx = measure_result.car.uniform_x;
- grpc_measure_info.transy = measure_result.car.uniform_y;
- grpc_measure_info.theta = measure_result.car.theta;
- grpc_measure_info.width = measure_result.car.wheel_width;
- grpc_measure_info.wheelbase = measure_result.car.wheel_base;
- grpc_measure_info.ftheta = measure_result.car.front_wheels_theta;
- addOffset(measure_result);
- grpc_measure_info.border_plc = outOfRangeDetection(measure_statu, measure_result, true);
- grpc_measure_info.border_display = outOfRangeDetection(measure_statu, measure_result, false);
- removeOffset(measure_result);
- grpc_measure_info.error.append("heart: " + std::to_string(heart));
- TransitData::get_instance_pointer()->setMeasureInfo(grpc_measure_info);
- return Error_manager();
- }
- Error_manager CommunicationManager::sendMqttData(const MeasureStatu &measure_statu, DetectManager::DetectResult &measure_result) {
- return Error_manager();
- }
- Error_manager CommunicationManager::sendRabbitmqData(const MeasureStatu &measure_statu, DetectManager::DetectResult &measure_result) {
- // 发送rabbitmq消息
- measure_info info;
- measure_buffer rabbit_measure_info;
- info.set_ground_status(measure_statu);
- // 如果地面雷达状态已经被修改过,直接返回
- if (info.ground_status() == MeasureStatu::Measure_OK || info.ground_status() == MeasureStatu::Measure_Border) {
- addOffset(measure_result);
- auto out_of_statu = outOfRangeDetection(measure_statu, measure_result, true);
- if (out_of_statu != Range_status::Range_correct) {
- info.set_border_statu(out_of_statu);
- info.set_ground_status(MeasureStatu::Measure_Border);
- }
- info.set_cx(measure_result.car.uniform_x);
- info.set_cy(measure_result.car.uniform_y);
- info.set_theta(-measure_result.car.theta * 180.0 / M_PI);
- info.set_length(0);
- info.set_width(measure_result.car.wheel_width);
- info.set_wheelbase(measure_result.car.wheel_base);
- info.set_front_theta(measure_result.car.front_wheels_theta * 180.0 / M_PI);
- if (DetectManager::iter()->carMoveStatus() == FAILED) {
- info.set_motion_statu(1); // 静止3秒
- info.set_is_stop(1);
- } else {
- info.set_motion_statu(0); // 运动
- info.set_is_stop(0);
- }
- info.set_move_distance(measure_result.car.forward_dis);
- }
- rabbit_measure_info.mutable_measure_info_to_plc_forward()->CopyFrom(info);
- rabbit_measure_info.mutable_measure_info_to_plc_reverse()->CopyFrom(info);
- rabbit_measure_info.mutable_measure_info_to_terminal()->CopyFrom(info);
- if (info.ground_status() == MeasureStatu::Measure_OK || info.ground_status() == MeasureStatu::Measure_Border) {
- auto out_of_statu = outOfRangeDetection(measure_statu, measure_result, false);
- if (out_of_statu != Range_status::Range_correct) {
- rabbit_measure_info.mutable_measure_info_to_terminal()->set_border_statu(out_of_statu);
- rabbit_measure_info.mutable_measure_info_to_terminal()->set_ground_status(MeasureStatu::Measure_Border);
- }
- }
- RabbitmqCommunicationTof3D::get_instance_pointer()->encapsulate_status_msg(rabbit_measure_info.DebugString(), 0);
- return {};
- }
- Range_status CommunicationManager::outOfRangeDetection(const MeasureStatu &measure_statu, DetectManager::DetectResult &measure_result, bool isPlc) {
- // 测量给出超界,说明车辆未到达指定区域,需要前进
- if (measure_statu == MeasureStatu::Measure_Border) {
- return Range_status::Range_back;
- }
- if (measure_statu != MeasureStatu::Measure_OK && measure_statu != MeasureStatu::Measure_Border) {
- return Range_status::Range_correct;
- }
- outOfRangeInfo out_info = isPlc ? m_config.plc_out_info() : m_config.display_out_info();
- // 车位位于y负方向, 判断后轮超界情况, 4.80是搬运器大Y的运动极限, 2.7是同侧两个小y夹持杆中心距离
- // 判断车辆轴距超界情况
- if (measure_result.car.wheel_base < out_info.car_min_wheelbase() || // 轴距过小
- measure_result.car.wheel_base > out_info.car_max_wheelbase()) { // 轴距过长
- last_range_statu |= Range_status::Range_car_wheelbase;
- } else if (measure_result.car.wheel_base > out_info.car_min_wheelbase() + 0.01 && // 轴距过小
- measure_result.car.wheel_base < out_info.car_max_wheelbase() - 0.01) {
- last_range_statu &= (~Range_status::Range_car_wheelbase);
- }
- if (last_range_statu & Range_status::Range_car_wheelbase) {
- return Range_status::Range_car_wheelbase;
- }
- // 判断车辆宽度超界情况
- if (measure_result.car.wheel_width < out_info.car_min_width() || // 车宽过窄
- measure_result.car.wheel_width > out_info.car_max_width()) { // 车宽过宽
- last_range_statu |= Range_status::Range_car_width; // 车辆超宽
- } else if (measure_result.car.wheel_width > out_info.car_min_width() + 0.01 && // 车宽过窄
- measure_result.car.wheel_width < out_info.car_max_width() - 0.01) {
- last_range_statu &= (~Range_status::Range_car_width);
- }
- if (last_range_statu & Range_status::Range_car_width) {
- return Range_status::Range_car_width;
- }
- // 判断车辆旋转角超界情况
- float theta = -measure_result.car.theta * 180 / M_PI;
- if (theta < out_info.turnplate_angle_limit_min_clockwise()) {
- last_range_statu |= Range_status::Range_angle_clock;
- last_range_statu &= (~Range_status::Range_angle_anti_clock);
- } else if (theta > out_info.turnplate_angle_limit_max_clockwise()) {
- last_range_statu |= Range_status::Range_angle_anti_clock;
- last_range_statu &= (~Range_status::Range_angle_clock);
- } else if (theta > out_info.turnplate_angle_limit_min_clockwise() &&
- theta < out_info.turnplate_angle_limit_max_clockwise()) {
- last_range_statu &= (~Range_status::Range_angle_clock);
- last_range_statu &= (~Range_status::Range_angle_anti_clock);
- }
- if (last_range_statu & Range_status::Range_angle_clock) {
- return Range_status::Range_angle_clock;
- }
- if (last_range_statu & Range_status::Range_angle_anti_clock) {
- return Range_status::Range_angle_anti_clock;
- }
- // 方向盘调正
- float front_wheels_theta = measure_result.car.front_wheels_theta * 180 / M_PI;
- DLOG(INFO) << "front_wheels_theta " << front_wheels_theta;
- if (fabs(front_wheels_theta) > 10) {
- last_range_statu |= Range_status::Range_steering_wheel_nozero;
- } else if (fabs(front_wheels_theta) < 7) {
- last_range_statu &= (~Range_status::Range_steering_wheel_nozero);
- }
- if (last_range_statu & Range_status::Range_steering_wheel_nozero) {
- return Range_status::Range_steering_wheel_nozero;
- }
- // 左右超界
- if (measure_result.car.uniform_x < out_info.border_minx()) {
- last_range_statu |= Range_status::Range_left;
- last_range_statu &= (~Range_status::Range_right);
- } else if (measure_result.car.uniform_x > out_info.border_maxx()) {
- last_range_statu |= Range_status::Range_right;
- last_range_statu &= (~Range_status::Range_left);
- } else if (measure_result.car.uniform_x > out_info.border_minx() + 0.01 &&
- measure_result.car.uniform_x < out_info.border_maxx() - 0.01) {
- last_range_statu &= (~Range_status::Range_left);
- last_range_statu &= (~Range_status::Range_right);
- }
- if (last_range_statu & Range_status::Range_left) {
- return Range_status::Range_left;
- }
- if (last_range_statu & Range_status::Range_right) {
- return Range_status::Range_right;
- }
- // 后超界
- double t_center_y = fabs(measure_result.car.uniform_y);
- DLOG(INFO) << t_center_y - 4.80 + 0.5 * (measure_result.car.wheel_base - 2.7) << " " << out_info.plc_border_maxy();
- DLOG(INFO) << t_center_y - 4.80 - 0.5 * (measure_result.car.wheel_base - 2.7) << " " << out_info.plc_border_miny();
- if (t_center_y - 4.80 + 0.5 * (measure_result.car.wheel_base - 2.7) > out_info.plc_border_maxy() || // 前轮无法抱到
- t_center_y - 4.80 - 0.5 * (measure_result.car.wheel_base - 2.7) > out_info.plc_border_miny()) { // 后轮无法抱到
- last_range_statu |= Range_status::Range_back; // 后超界
- } else if (t_center_y - 4.80 + 0.5 * (measure_result.car.wheel_base - 2.7) < out_info.plc_border_maxy() - 0.010 && // 前轮无法抱到
- t_center_y - 4.80 - 0.5 * (measure_result.car.wheel_base - 2.7) < out_info.plc_border_miny() - 0.010) {
- last_range_statu &= (~Range_status::Range_back);
- }
- if (last_range_statu & Range_status::Range_back) {
- // 前进距离
- 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)),
- (t_center_y - 4.80 - 0.5 * (measure_result.car.wheel_base - 2.7) - (out_info.plc_border_miny() - 0.010)));
- return Range_status::Range_back;
- }
- return Range_status::Range_correct;
- }
- Error_manager CommunicationManager::addOffset(DetectManager::DetectResult &measure_result) {
- auto offset = m_config.offset();
- measure_result.car.uniform_x += offset.x();
- measure_result.car.wheels_center_x += offset.x();
- measure_result.car.uniform_y += offset.y();
- measure_result.car.wheels_center_y += offset.y();
- measure_result.car.wheel_base += offset.wheelbase();
- measure_result.car.theta += offset.theta();
- measure_result.car.width += offset.width();
- measure_result.car.wheel_width += offset.width();
- return {};
- }
- Error_manager CommunicationManager::removeOffset(DetectManager::DetectResult &measure_result) {
- auto offset = m_config.offset();
- measure_result.car.uniform_x -= offset.x();
- measure_result.car.wheels_center_x -= offset.x();
- measure_result.car.uniform_y -= offset.y();
- measure_result.car.wheels_center_y -= offset.y();
- measure_result.car.wheel_base -= offset.wheelbase();
- measure_result.car.theta -= offset.theta();
- measure_result.car.width -= offset.width();
- measure_result.car.wheel_width -= offset.width();
- return {};
- }
|