|
@@ -371,7 +371,7 @@ Error_manager Ground_region::detect(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud, d
|
|
|
cloud_cut->push_back(pt);
|
|
|
}
|
|
|
}
|
|
|
- if(cloud_cut->size() <= 0)
|
|
|
+ if(cloud_cut->empty())
|
|
|
{
|
|
|
// 更新过滤点
|
|
|
m_filtered_cloud_mutex.lock();
|
|
@@ -386,7 +386,7 @@ Error_manager Ground_region::detect(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud, d
|
|
|
vox.setLeafSize(0.02f, 0.02f, 0.02f); //设置滤波时创建的体素体积为1cm的立方体
|
|
|
vox.filter(*cloud_clean); //执行滤波处理,存储输出
|
|
|
// cloud_filtered = cloud_clean;
|
|
|
- if (cloud_clean->size() == 0){
|
|
|
+ if (cloud_clean->empty()){
|
|
|
// 更新过滤点
|
|
|
m_filtered_cloud_mutex.lock();
|
|
|
mp_cloud_filtered->clear();
|
|
@@ -737,22 +737,22 @@ int Ground_region::outOfRangeDetection(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud
|
|
|
//plc坐标,1 3 5入口x为-1.8左右, 2 4 6入口为1.8左右
|
|
|
//要求x取值范围,1650~2150左右
|
|
|
float t_center_x = cx + m_region.plc_offsetx();
|
|
|
- if(t_center_x < m_region.border_minx()-0.000)
|
|
|
+ if(t_center_x < m_region.plc_out_of_region().border_minx()-0.000)
|
|
|
{
|
|
|
m_range_status_last |= Range_status::Range_left;
|
|
|
}
|
|
|
- else if(t_center_x > m_region.border_minx()+0.010)
|
|
|
+ else if(t_center_x > m_region.plc_out_of_region().border_minx()+0.010)
|
|
|
{
|
|
|
int t = Range_status::Range_left;
|
|
|
m_range_status_last &= (~t);
|
|
|
}
|
|
|
//else m_range_status_last no change
|
|
|
|
|
|
- if(t_center_x > m_region.border_maxx()+0.000)
|
|
|
+ if(t_center_x > m_region.plc_out_of_region().border_maxx()+0.000)
|
|
|
{
|
|
|
m_range_status_last |= Range_status::Range_right;
|
|
|
}
|
|
|
- else if(t_center_x < m_region.border_maxx()-0.010)
|
|
|
+ else if(t_center_x < m_region.plc_out_of_region().border_maxx()-0.010)
|
|
|
{
|
|
|
int t = Range_status::Range_right;
|
|
|
m_range_status_last &= (~t);
|
|
@@ -851,55 +851,39 @@ int Ground_region::outOfRangeDetection(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud
|
|
|
// LOG(WARNING) << m_range_status_last;
|
|
|
// 车位位于y负方向,判断后轮超界情况
|
|
|
double t_center_y = 0.0 - (car_uniform_center.y() + m_region.plc_offsety()); // 汽车中心y, 参照plc坐标,并且进行偏移, 绝对值。结果大约为 5~6左右
|
|
|
- if( t_center_y - 4.88 + 0.5*(measure_result.car_wheel_base - 2.7) < m_region.plc_border_maxy()-0.000 &&
|
|
|
- t_center_y - 4.88 - 0.5*(measure_result.car_wheel_base - 2.7) < m_region.plc_border_miny()-0.000 )
|
|
|
+ if( t_center_y - 4.88 + 0.5*(measure_result.car_wheel_base - 2.7) < m_region.plc_out_of_region().plc_border_maxy()-0.000 &&
|
|
|
+ t_center_y - 4.88 - 0.5*(measure_result.car_wheel_base - 2.7) < m_region.plc_out_of_region().plc_border_miny()-0.000 )
|
|
|
{
|
|
|
int t = Range_status::Range_back;
|
|
|
m_range_status_last &= (~t);
|
|
|
}
|
|
|
- else if( t_center_y - 4.88 + 0.5*(measure_result.car_wheel_base - 2.7) > m_region.plc_border_maxy()+0.010 ||
|
|
|
- t_center_y - 4.88 - 0.5*(measure_result.car_wheel_base - 2.7) > m_region.plc_border_miny()+0.010 )
|
|
|
+ else if( t_center_y - 4.88 + 0.5*(measure_result.car_wheel_base - 2.7) > m_region.plc_out_of_region().plc_border_maxy()+0.010 ||
|
|
|
+ t_center_y - 4.88 - 0.5*(measure_result.car_wheel_base - 2.7) > m_region.plc_out_of_region().plc_border_miny()+0.010 )
|
|
|
{
|
|
|
m_range_status_last |= Range_status::Range_back;
|
|
|
}
|
|
|
|
|
|
-// LOG(WARNING) << "********************************************************************************************************";
|
|
|
-// LOG(WARNING) << "t_center_y" << " " << t_center_y;
|
|
|
-// LOG(WARNING) << "measure_result.uniform_car_y" << " " << measure_result.uniform_car_y;
|
|
|
-// LOG(WARNING) << "car_uniform_center.y()" << " " << car_uniform_center.y();
|
|
|
-// LOG(WARNING) << "m_region.plc_offsety()" << " " << m_region.plc_offsety();
|
|
|
-// LOG(WARNING) << "measure_result.car_wheel_base" << " " << measure_result.car_wheel_base;
|
|
|
-// LOG(WARNING) << "m_region.plc_border_maxy()" << " " << m_region.plc_border_maxy();
|
|
|
-// LOG(WARNING) << "m_region.plc_border_miny()" << " " << m_region.plc_border_miny();
|
|
|
-// LOG(WARNING) << "m_range_status_last" << " " << m_range_status_last;
|
|
|
-// LOG(WARNING) << "--------------------------------------------------------------------------------------------------";
|
|
|
-
|
|
|
- //else m_range_status_last no change
|
|
|
- // LOG(WARNING) << m_range_status_last;
|
|
|
-
|
|
|
// 判断车辆宽度超界情况
|
|
|
- if (measure_result.car_wheel_width < m_region.car_min_width()-0.000 ||
|
|
|
- measure_result.car_wheel_width > m_region.car_max_width()+0.000)
|
|
|
+ if (measure_result.car_wheel_width < m_region.plc_out_of_region().car_min_width()-0.000 ||
|
|
|
+ measure_result.car_wheel_width > m_region.plc_out_of_region().car_max_width()+0.000)
|
|
|
{
|
|
|
m_range_status_last |= Range_status::Range_car_width;
|
|
|
}
|
|
|
- else if (measure_result.car_wheel_width > m_region.car_min_width()+0.010 &&
|
|
|
- measure_result.car_wheel_width < m_region.car_max_width()-0.010)
|
|
|
+ else if (measure_result.car_wheel_width > m_region.plc_out_of_region().car_min_width()+0.010 &&
|
|
|
+ measure_result.car_wheel_width < m_region.plc_out_of_region().car_max_width()-0.010)
|
|
|
{
|
|
|
int t = Range_status::Range_car_width;
|
|
|
m_range_status_last &= (~t);
|
|
|
}
|
|
|
- //else m_range_status_last no change
|
|
|
- // LOG(WARNING) << m_range_status_last;
|
|
|
|
|
|
// 判断车辆轴距超界情况
|
|
|
- if (measure_result.car_wheel_base < m_region.car_min_wheelbase()-0.000 ||
|
|
|
- measure_result.car_wheel_base > m_region.car_max_wheelbase()+0.000)
|
|
|
+ if (measure_result.car_wheel_base < m_region.plc_out_of_region().car_min_wheelbase()-0.000 ||
|
|
|
+ measure_result.car_wheel_base > m_region.plc_out_of_region().car_max_wheelbase()+0.000)
|
|
|
{
|
|
|
m_range_status_last |= Range_status::Range_car_wheelbase;
|
|
|
}
|
|
|
- else if (measure_result.car_wheel_base > m_region.car_min_wheelbase()+0.010 ||
|
|
|
- measure_result.car_wheel_base < m_region.car_max_wheelbase()-0.010)
|
|
|
+ else if (measure_result.car_wheel_base > m_region.plc_out_of_region().car_min_wheelbase()+0.010 ||
|
|
|
+ measure_result.car_wheel_base < m_region.plc_out_of_region().car_max_wheelbase()-0.010)
|
|
|
{
|
|
|
int t = Range_status::Range_car_wheelbase;
|
|
|
m_range_status_last &= (~t);
|
|
@@ -944,6 +928,101 @@ int Ground_region::outOfRangeDetection(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
+int Ground_region::outOfTerminalRangeDetection(Common_data::Car_wheel_information &measure_result, const velodyne::OutOfRegion &outOfRegion) {
|
|
|
+ Eigen::Vector2d car_uniform_center(measure_result.uniform_car_x, measure_result.uniform_car_y);
|
|
|
+
|
|
|
+ int t_range_status_last = Range_status::Range_correct;
|
|
|
+ // LOG(WARNING) << m_range_status_last;
|
|
|
+ // 车位位于y负方向,判断后轮超界情况
|
|
|
+ double t_center_y = 0.0 - (car_uniform_center.y() + m_region.plc_offsety()); // 汽车中心y, 参照plc坐标,并且进行偏移, 绝对值。结果大约为 5~6左右
|
|
|
+ if( t_center_y - 4.88 + 0.5*(measure_result.car_wheel_base - 2.7) < outOfRegion.plc_border_maxy()-0.000 &&
|
|
|
+ t_center_y - 4.88 - 0.5*(measure_result.car_wheel_base - 2.7) < outOfRegion.plc_border_miny()-0.000 )
|
|
|
+ {
|
|
|
+ int t = Range_status::Range_back;
|
|
|
+ t_range_status_last &= (~t);
|
|
|
+ }
|
|
|
+ else if( t_center_y - 4.88 + 0.5*(measure_result.car_wheel_base - 2.7) > outOfRegion.plc_border_maxy()+0.010 ||
|
|
|
+ t_center_y - 4.88 - 0.5*(measure_result.car_wheel_base - 2.7) > outOfRegion.plc_border_miny()+0.010 )
|
|
|
+ {
|
|
|
+ t_range_status_last |= Range_status::Range_back;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 判断车辆宽度超界情况
|
|
|
+ if (measure_result.car_wheel_width < outOfRegion.car_min_width()-0.000 ||
|
|
|
+ measure_result.car_wheel_width > outOfRegion.car_max_width()+0.000)
|
|
|
+ {
|
|
|
+ t_range_status_last |= Range_status::Range_car_width;
|
|
|
+ }
|
|
|
+ else if (measure_result.car_wheel_width > outOfRegion.car_min_width()+0.010 &&
|
|
|
+ measure_result.car_wheel_width < outOfRegion.car_max_width()-0.010)
|
|
|
+ {
|
|
|
+ int t = Range_status::Range_car_width;
|
|
|
+ t_range_status_last &= (~t);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 判断车辆轴距超界情况
|
|
|
+ if (measure_result.car_wheel_base < outOfRegion.car_min_wheelbase()-0.000 ||
|
|
|
+ measure_result.car_wheel_base > outOfRegion.car_max_wheelbase()+0.000)
|
|
|
+ {
|
|
|
+ t_range_status_last |= Range_status::Range_car_wheelbase;
|
|
|
+ }
|
|
|
+ else if (measure_result.car_wheel_base > outOfRegion.car_min_wheelbase()+0.010 ||
|
|
|
+ measure_result.car_wheel_base < outOfRegion.car_max_wheelbase()-0.010)
|
|
|
+ {
|
|
|
+ int t = Range_status::Range_car_wheelbase;
|
|
|
+ t_range_status_last &= (~t);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 判断车辆旋转角超界情况
|
|
|
+ double t_dtheta = measure_result.car_angle + m_region.plc_offset_degree(); // 车身的旋转角, 修正到正5度, (m_region.plc_offset_degree():-89)
|
|
|
+ int t_terminal_id = m_region.region_id() +1; //region_id:0~5, terminal_id:1~6
|
|
|
+ if (t_dtheta > System_communication_mq::get_instance_references().dispatch_region_info_map[t_terminal_id].turnplate_angle_max()+0.00)
|
|
|
+ {
|
|
|
+ t_range_status_last |= Range_status::Range_angle_anti_clock;
|
|
|
+ }
|
|
|
+ else if (t_dtheta < System_communication_mq::get_instance_references().dispatch_region_info_map[t_terminal_id].turnplate_angle_max()-0.10)
|
|
|
+ {
|
|
|
+ int t = Range_status::Range_angle_anti_clock;
|
|
|
+ t_range_status_last &= (~t);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (t_dtheta < System_communication_mq::get_instance_references().dispatch_region_info_map[t_terminal_id].turnplate_angle_min()-0.00)
|
|
|
+ {
|
|
|
+ t_range_status_last |= Range_status::Range_angle_clock;
|
|
|
+ }
|
|
|
+ else if (t_dtheta > System_communication_mq::get_instance_references().dispatch_region_info_map[t_terminal_id].turnplate_angle_min()+0.10)
|
|
|
+ {
|
|
|
+ int t = Range_status::Range_angle_clock;
|
|
|
+ t_range_status_last &= (~t);
|
|
|
+ }
|
|
|
+
|
|
|
+ //huli 不再使用汽车左右边界来判断,直接使用中心点x值判断左右超界。
|
|
|
+ //plc坐标,1 3 5入口x为-1.8左右, 2 4 6入口为1.8左右
|
|
|
+ //要求x取值范围,1650~2150左右
|
|
|
+ if(car_uniform_center.x() < outOfRegion.border_minx()-0.000)
|
|
|
+ {
|
|
|
+ t_range_status_last |= Range_status::Range_left;
|
|
|
+ }
|
|
|
+ else if(car_uniform_center.x() > outOfRegion.border_minx()+0.010)
|
|
|
+ {
|
|
|
+ int t = Range_status::Range_left;
|
|
|
+ t_range_status_last &= (~t);
|
|
|
+ }
|
|
|
+ //else m_range_status_last no change
|
|
|
+
|
|
|
+ if(car_uniform_center.x() > outOfRegion.border_maxx()+0.000)
|
|
|
+ {
|
|
|
+ t_range_status_last |= Range_status::Range_right;
|
|
|
+ }
|
|
|
+ else if(car_uniform_center.x() < outOfRegion.border_maxx()-0.010)
|
|
|
+ {
|
|
|
+ int t = Range_status::Range_right;
|
|
|
+ t_range_status_last &= (~t);
|
|
|
+ }
|
|
|
+
|
|
|
+ return t_range_status_last;
|
|
|
+}
|
|
|
+
|
|
|
//外部调用获取当前车轮定位信息, 获取指令时间之后的车轮定位信息, 如果没有就会报错, 不会等待
|
|
|
Error_manager Ground_region::get_current_wheel_information(Common_data::Car_wheel_information *p_car_wheel_information, std::chrono::system_clock::time_point command_time)
|
|
|
{
|
|
@@ -1059,9 +1138,11 @@ void Ground_region::thread_measure_func()
|
|
|
// 超界校验
|
|
|
{
|
|
|
std::lock_guard<std::mutex> lck(m_filtered_cloud_mutex);
|
|
|
- int res = outOfRangeDetection(mp_cloud_filtered, m_car_wheel_information, m_region.turnplate_cx(), m_region.turnplate_cy(), 90.0 - t_result.theta);
|
|
|
- m_car_wheel_information.range_status = res;
|
|
|
- // LOG_IF(INFO, m_region.region_id() == 4) << res;
|
|
|
+
|
|
|
+ m_car_wheel_information.range_status = outOfRangeDetection(mp_cloud_filtered, m_car_wheel_information, m_region.turnplate_cx(), m_region.turnplate_cy(), 90.0 - t_result.theta);
|
|
|
+
|
|
|
+ // 新加对终端小框的边界判断
|
|
|
+ m_car_wheel_information.terminal_range_status = outOfTerminalRangeDetection(m_car_wheel_information, m_region.terminal_out_of_region());
|
|
|
}
|
|
|
// 添加plc偏移
|
|
|
m_car_wheel_information.car_center_x += m_region.plc_offsetx();
|
|
@@ -1070,13 +1151,6 @@ void Ground_region::thread_measure_func()
|
|
|
m_car_wheel_information.uniform_car_y += m_region.plc_offsety();
|
|
|
m_car_wheel_information.car_angle += m_region.plc_offset_degree();
|
|
|
|
|
|
-// LOG(INFO) << "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy t_result.theta = " << t_result.theta << " ";
|
|
|
-// LOG(INFO) << "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy m_region.plc_offset_degree() = " << m_region.plc_offset_degree() << " ";
|
|
|
-// LOG(INFO) << "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy m_car_wheel_information.car_angle= " << m_car_wheel_information.car_angle << " ";
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
t_wheel_info_stamped.wheel_data = m_car_wheel_information;
|
|
|
t_wheel_info_stamped.measure_time = m_detect_update_time;
|
|
|
Measure_filter::get_instance_references().update_data(m_region.region_id(), t_wheel_info_stamped);
|
|
@@ -1096,22 +1170,12 @@ void Ground_region::thread_measure_func()
|
|
|
}else
|
|
|
{
|
|
|
m_car_wheel_information.range_status |= Range_status::Range_car_moving;
|
|
|
- // if(m_region.region_id()==4){
|
|
|
- // std::cout<<"success: "<<car_status_res.to_string()<<std::endl;
|
|
|
- // }
|
|
|
}
|
|
|
Region_status_checker::get_instance_references().add_measure_data(m_region.region_id(), t_wheel_info_stamped_for_car_move, *mp_cloud_filtered);
|
|
|
|
|
|
ec = Measure_filter::get_instance_references().get_filtered_wheel_information(m_region.region_id(), t_wheel_info_stamped.wheel_data);
|
|
|
if (ec == SUCCESS)
|
|
|
{
|
|
|
- // 20221208 added by yct, use avg car angle and width data.
|
|
|
- // LOG(WARNING)<<m_region.region_id()<<" angles: "<<m_car_wheel_information.car_angle<<", "<<t_wheel_info_stamped.wheel_data.car_angle;
|
|
|
- // LOG(WARNING)<<m_region.region_id()<<" filter res: "<<t_wheel_info_stamped.wheel_data.to_string()<<std::endl;
|
|
|
-
|
|
|
- // m_car_wheel_information.car_angle = t_wheel_info_stamped.wheel_data.car_angle;
|
|
|
- // m_car_wheel_information.car_wheel_width = t_wheel_info_stamped.wheel_data.car_wheel_width;
|
|
|
-
|
|
|
m_car_wheel_information.car_wheel_base = t_wheel_info_stamped.wheel_data.car_wheel_base;
|
|
|
m_car_wheel_information.car_front_theta = t_wheel_info_stamped.wheel_data.car_front_theta;
|
|
|
// 临时添加,滤波后前轮超界
|
|
@@ -1120,10 +1184,9 @@ void Ground_region::thread_measure_func()
|
|
|
m_car_wheel_information.range_status |= Range_status::Range_steering_wheel_nozero;
|
|
|
}
|
|
|
}
|
|
|
- // else{
|
|
|
- // std::cout<<ec.to_string()<<std::endl;
|
|
|
- // }
|
|
|
- // LOG_IF(INFO, m_region.region_id() == 4) << m_car_wheel_information.to_string();
|
|
|
+
|
|
|
+ // 超界判断,这个必须最后判断
|
|
|
+
|
|
|
}
|
|
|
// rough angle too large, display for pre-movement
|
|
|
else if(ec.get_error_code() == VELODYNE_REGION_ANGLE_PRECHECK_FAILED)
|