|
@@ -7,10 +7,15 @@
|
|
|
/**
|
|
|
* 有参构造
|
|
|
* */
|
|
|
-Region_worker::Region_worker(int id, wj::Region region):
|
|
|
+Region_worker::Region_worker(int id, wj::Region region, Verify_result* verify_handle):
|
|
|
m_read_code_count(0),
|
|
|
-mb_cloud_updated(0)
|
|
|
+mb_cloud_updated(0),
|
|
|
+mp_verify_handle(0)
|
|
|
{
|
|
|
+ if(verify_handle!= nullptr)
|
|
|
+ {
|
|
|
+ mp_verify_handle = verify_handle;
|
|
|
+ }
|
|
|
m_update_plc_time = std::chrono::steady_clock::now();
|
|
|
m_cloud = pcl::PointCloud<pcl::PointXYZ>::Ptr(new pcl::PointCloud<pcl::PointXYZ>);
|
|
|
m_detector = new Region_detector(id, region);
|
|
@@ -45,7 +50,6 @@ Region_worker::~Region_worker()
|
|
|
* */
|
|
|
int Region_worker::get_id()
|
|
|
{
|
|
|
- std::lock_guard<std::mutex> lck(m_mutex);
|
|
|
if (m_detector)
|
|
|
{
|
|
|
return m_detector->get_region_id();
|
|
@@ -108,31 +112,54 @@ void Region_worker::detect_loop(Region_worker *worker)
|
|
|
// 2.检测与更新循环
|
|
|
while (!worker->m_cond_exit.WaitFor(200))
|
|
|
{
|
|
|
- // LOG(INFO) << "worker detect loop";
|
|
|
- stateCode code = stateCode::eNoCar;
|
|
|
- std::lock_guard<std::mutex> lck(worker->m_mutex);
|
|
|
+// LOG(INFO) << "worker detect loop";
|
|
|
// 检查当前状态
|
|
|
if (worker->mb_cloud_updated)
|
|
|
{
|
|
|
+ std::lock_guard<std::mutex> lck(worker->m_mutex);
|
|
|
+ int code = REGION_WORKER_VERIFY_OK;
|
|
|
worker->mb_cloud_updated = false;
|
|
|
- // LOG(INFO) << "worker detect loop detect";
|
|
|
- Error_manager result = worker->m_detector->detect(worker->m_cloud);
|
|
|
- // LOG(INFO) << "worker detect loop end detect";
|
|
|
+ double x,y,angle,wheelbase,width;
|
|
|
+ Error_manager result = worker->m_detector->detect(worker->m_cloud, x, y, angle, wheelbase, width, true);
|
|
|
+ if(worker->mp_verify_handle == nullptr)
|
|
|
+ {
|
|
|
+ code = REGION_WORKER_NULL_POINTER;
|
|
|
+ LOG(WARNING) << "verify handle null pointer";
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+// LOG(INFO) << "worker detect loop end detect";
|
|
|
if (result == WJ_REGION_EMPTY_CLOUD)
|
|
|
{
|
|
|
- code = stateCode::eNoCar;
|
|
|
+ code = REGION_WORKER_EMPTY_SPACE;
|
|
|
}
|
|
|
else if (result == SUCCESS)
|
|
|
{
|
|
|
- code = stateCode::eOk;
|
|
|
+ cv::RotatedRect car_border;
|
|
|
+ car_border.center = cv::Point2f(1000.0*x,1000.0*y);
|
|
|
+ car_border.angle = angle;
|
|
|
+ const int default_car_width = 2650;
|
|
|
+ const int ext_length = 700;
|
|
|
+ car_border.size.width = default_car_width;
|
|
|
+ car_border.size.height = wheelbase+ext_length*2;
|
|
|
+ int verify_return_code = 0;
|
|
|
+ int terminal_id=worker->get_id();
|
|
|
+ Error_manager verify_error_code = worker->mp_verify_handle->verify(car_border, terminal_id, verify_return_code);
|
|
|
+// Error_manager verify_error_code = SUCCESS;
|
|
|
+ if(verify_error_code == SUCCESS) {
|
|
|
+ code = REGION_WORKER_VERIFY_OK;
|
|
|
+ LOG(INFO) << "region worker verify ok";
|
|
|
+ }else{
|
|
|
+ code |= verify_return_code;
|
|
|
+ LOG(WARNING) << "region worker verify result: " << code;
|
|
|
+ }
|
|
|
}
|
|
|
else if (result == WJ_REGION_CLUSTER_SIZE_ERROR)
|
|
|
{
|
|
|
- code = stateCode::eClusterSizeError;
|
|
|
+ code = REGION_WORKER_CLUSTER_SIZE_ERROR;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- code = stateCode ::eVerifyFailed;
|
|
|
+ code = REGION_WORKER_OTHER_ERROR;
|
|
|
}
|
|
|
// LOG(INFO) << "worker detect loop 000";
|
|
|
// 判断与上次读取是否相同,并计数
|
|
@@ -143,14 +170,16 @@ void Region_worker::detect_loop(Region_worker *worker)
|
|
|
worker->m_last_read_code = code;
|
|
|
worker->m_read_code_count += 1;
|
|
|
|
|
|
+ if(worker->get_id() == 4) {
|
|
|
+ LOG(WARNING) << "worker id: " << worker->get_id()<<" code: "<<code;
|
|
|
+ }
|
|
|
// 写入plc,加入写入频率限制
|
|
|
int duration = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now() - worker->m_update_plc_time).count();
|
|
|
- // LOG(INFO) << "worker detect loop 111";
|
|
|
Plc_data *p = Plc_data::get_instance();
|
|
|
- // LOG(INFO) << "worker detect loop 222";
|
|
|
// 写入间隔必须超过500ms,当前状态不同于上次写入状态,且该状态已连续读到三次
|
|
|
if (p!=0 && duration > 500 && worker->m_last_sent_code != worker->m_last_read_code && worker->m_read_code_count > 3)
|
|
|
{
|
|
|
+ worker->m_last_sent_code = worker->m_last_read_code;
|
|
|
p->update_data(code, worker->m_detector->get_region_id());
|
|
|
worker->m_update_plc_time = std::chrono::steady_clock::now();
|
|
|
}
|