|
@@ -14,8 +14,8 @@ Dispatch_process::Dispatch_process()
|
|
|
m_dispatch_destination = 0;
|
|
|
m_wheel_base = 0;
|
|
|
|
|
|
- m_dispatch_process_catcher_motion = CATCHER_MOTION_UNKNOW;
|
|
|
- m_dispatch_process_carrier_motion = CARRIER_MOTION_UNKNOW;
|
|
|
+// m_dispatch_process_catcher_motion = CATCHER_MOTION_UNKNOW;
|
|
|
+// m_dispatch_process_carrier_motion = CARRIER_MOTION_UNKNOW;
|
|
|
}
|
|
|
|
|
|
Dispatch_process::~Dispatch_process()
|
|
@@ -24,7 +24,7 @@ Dispatch_process::~Dispatch_process()
|
|
|
}
|
|
|
|
|
|
//初始化, 就把主控发送的请求传入即可.
|
|
|
-Error_manager Dispatch_process::Dispatch_process_init(message::Dispatch_request_msg dispatch_request_msg)
|
|
|
+Error_manager Dispatch_process::Dispatch_process_init(message::Dispatch_request_msg &dispatch_request_msg)
|
|
|
{
|
|
|
if ( dispatch_request_msg.base_info().has_timeout_ms() )
|
|
|
{
|
|
@@ -77,6 +77,20 @@ Error_manager Dispatch_process::Dispatch_process_uninit()
|
|
|
return Error_code::SUCCESS;
|
|
|
}
|
|
|
|
|
|
+//检查流程是否空闲待机
|
|
|
+Error_manager Dispatch_process::check_process_ready()
|
|
|
+{
|
|
|
+ if ( m_dispatch_process_status == DISPATCH_PROCESS_READY )
|
|
|
+ {
|
|
|
+ return Error_code::SUCCESS;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ return Error_manager(Error_code::DISPATCH_PROCESS_IS_NOT_READY, Error_level::MINOR_ERROR,
|
|
|
+ " Dispatch_process::check_process_ready() fun error ");
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
void Dispatch_process::Main()
|
|
|
{
|
|
|
Error_manager t_error;
|
|
@@ -88,7 +102,7 @@ void Dispatch_process::Main()
|
|
|
|
|
|
switch ( m_dispatch_process_status )
|
|
|
{
|
|
|
- case DISPATCH_PROCESS_CREATED:
|
|
|
+ case DISPATCH_PROCESS_CREATED://流程创建,
|
|
|
{
|
|
|
//检查调度请求
|
|
|
m_result = check_dispatch_request_msg();
|
|
@@ -108,36 +122,42 @@ void Dispatch_process::Main()
|
|
|
m_dispatch_process_status = DISPATCH_PROCESS_READY;
|
|
|
break;
|
|
|
}
|
|
|
- case DISPATCH_PROCESS_READY:
|
|
|
+ case DISPATCH_PROCESS_READY://流程准备,待机
|
|
|
{
|
|
|
//等待控制指令
|
|
|
m_result = wait_dispatch_control_request_msg();
|
|
|
- if ( m_result !=Error_code::SUCCESS)
|
|
|
- {
|
|
|
- //不成功, 就表示没有新的指令, 那么什么都不做, 原地待命
|
|
|
- }
|
|
|
- else
|
|
|
+ if ( m_result ==Error_code::SUCCESS)
|
|
|
{
|
|
|
//流程正常, 就去连接设备
|
|
|
m_dispatch_process_status = DISPATCH_PROCESS_CONNECT_DEVICE;
|
|
|
break;
|
|
|
+
|
|
|
}
|
|
|
+ else if ( m_result !=Error_code::NODATA )
|
|
|
+ {
|
|
|
+ m_dispatch_process_status = DISPATCH_PROCESS_FAULT;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ //else nodata, 就表示没有新的指令, 那么什么都不做, 原地待命
|
|
|
|
|
|
//等待调度总计划答复
|
|
|
m_result = wait_dispatch_plan_response_msg();
|
|
|
- if ( m_result !=Error_code::SUCCESS)
|
|
|
- {
|
|
|
- //不成功, 就表示没有总计划答复, 那么什么都不做, 原地待命
|
|
|
- }
|
|
|
- else
|
|
|
+ if ( m_result ==Error_code::SUCCESS)
|
|
|
{
|
|
|
//流程正常, 就进入完成状态,
|
|
|
m_dispatch_process_status = DISPATCH_PROCESS_OVER;
|
|
|
break;
|
|
|
}
|
|
|
+ else if ( m_result !=Error_code::NODATA )
|
|
|
+ {
|
|
|
+ m_dispatch_process_status = DISPATCH_PROCESS_FAULT;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ //else nodata, 就表示没有新的指令, 那么什么都不做, 原地待命
|
|
|
+
|
|
|
break;
|
|
|
}
|
|
|
- case DISPATCH_PROCESS_CONNECT_DEVICE:
|
|
|
+ case DISPATCH_PROCESS_CONNECT_DEVICE://流程 连接设备
|
|
|
{
|
|
|
//连接调度设备
|
|
|
m_result = connect_dispatch_device();
|
|
@@ -149,19 +169,51 @@ void Dispatch_process::Main()
|
|
|
//流程正常, 就进入工作状态,
|
|
|
m_dispatch_process_status = DISPATCH_PROCESS_WORKING;
|
|
|
break;
|
|
|
-
|
|
|
+ }
|
|
|
+ case DISPATCH_PROCESS_WORKING://流程工作正忙, 进行长流程
|
|
|
+ {
|
|
|
+ //执行调度控制指令, 并根据完成情况给答复
|
|
|
+ m_result = excute_dispatch_control();
|
|
|
+ if ( m_result == Error_code::NODATA )
|
|
|
+ {
|
|
|
+ //继续 长流程, 什么也不做
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //长流程结束, 就答复 control_response_msg
|
|
|
+ // 注:这里执行调度控制, 即使报错了 也要答复给调度控制, 交给调度控制来进行决策.
|
|
|
+ m_dispatch_process_status = DISPATCH_PROCESS_RESPONSE;
|
|
|
+ }
|
|
|
break;
|
|
|
}
|
|
|
- case DISPATCH_PROCESS_WORKING:
|
|
|
+ case DISPATCH_PROCESS_RESPONSE://流程 给调度控制答复
|
|
|
{
|
|
|
-
|
|
|
+ //发送调度控制答复, 发给调度控制的
|
|
|
+ t_error = send_dispatch_control_response_msg();
|
|
|
+ m_result = t_error;
|
|
|
+ if ( m_result !=Error_code::SUCCESS)
|
|
|
+ {
|
|
|
+ m_dispatch_process_status = DISPATCH_PROCESS_FAULT;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ //流程正常, 就进入等待状态, 等待调度控制发送动作指令
|
|
|
+ m_dispatch_process_status = DISPATCH_PROCESS_DISCONNECT_DEVICE;
|
|
|
break;
|
|
|
}
|
|
|
- case DISPATCH_PROCESS_RESPONSE:
|
|
|
+ case DISPATCH_PROCESS_DISCONNECT_DEVICE://流程 解除设备
|
|
|
{
|
|
|
+ //断开调度设备, 释放任务单 与设备解除连接
|
|
|
+ m_result = disconnect_dispatch_device();
|
|
|
+ if ( m_result !=Error_code::SUCCESS)
|
|
|
+ {
|
|
|
+ m_dispatch_process_status = DISPATCH_PROCESS_FAULT;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ //流程正常, 就回到 等待状态, 等待调度控制发送动作指令
|
|
|
+ m_dispatch_process_status = DISPATCH_PROCESS_READY;
|
|
|
break;
|
|
|
}
|
|
|
- case DISPATCH_PROCESS_OVER:
|
|
|
+ case DISPATCH_PROCESS_OVER://流程完成
|
|
|
{
|
|
|
//发送调度答复, 发给主控的
|
|
|
m_result = send_dispatch_response_msg();
|
|
@@ -174,7 +226,7 @@ void Dispatch_process::Main()
|
|
|
m_dispatch_process_status = DISPATCH_PROCESS_RELEASE;
|
|
|
break;
|
|
|
}
|
|
|
- case DISPATCH_PROCESS_RELEASE:
|
|
|
+ case DISPATCH_PROCESS_RELEASE://流程释放
|
|
|
{
|
|
|
//通知调度管理, 释放资源,
|
|
|
m_result = release_resource();
|
|
@@ -188,7 +240,7 @@ void Dispatch_process::Main()
|
|
|
return;
|
|
|
break;
|
|
|
}
|
|
|
- case DISPATCH_PROCESS_FAULT:
|
|
|
+ case DISPATCH_PROCESS_FAULT://故障
|
|
|
{
|
|
|
Exception_handling();
|
|
|
//在这里, 整个流程彻底结束, 之后线程池会自动回收 这个流程对象的资源
|
|
@@ -224,7 +276,7 @@ Error_manager Dispatch_process::send_dispatch_plan_request_msg()
|
|
|
m_dispatch_plan_request_msg.mutable_base_info()->set_timeout_ms(m_timeout_ms);
|
|
|
m_dispatch_plan_request_msg.mutable_base_info()->set_sender(message::Communicator::eDispatch_mamager);
|
|
|
m_dispatch_plan_request_msg.mutable_base_info()->set_receiver(message::Communicator::eDispatch_control);
|
|
|
- m_dispatch_plan_request_msg.set_command_key(m_command_key);
|
|
|
+ m_dispatch_plan_request_msg.set_command_key(m_dispatch_request_msg.command_key());
|
|
|
|
|
|
m_dispatch_plan_request_msg.set_dispatch_task_type((message::Dispatch_task_type)m_dispatch_process_type);
|
|
|
m_dispatch_plan_request_msg.set_dispatch_source(m_dispatch_source);
|
|
@@ -379,14 +431,128 @@ Error_manager Dispatch_process::connect_dispatch_device()
|
|
|
Error_manager Dispatch_process::excute_dispatch_control()
|
|
|
{
|
|
|
//设备的动作也使用外部的Main()的线程来循环
|
|
|
+ switch ( m_dispatch_control_request_msg.dispatch_task_type() )
|
|
|
+ {
|
|
|
+ case message::Dispatch_task_type::ROBOT_CATCH_CAR_FROM_INLET:
|
|
|
+ {
|
|
|
+ return excute_robot_catch_car_from_inlet();
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case message::Dispatch_task_type::ROBOT_PUT_CAR_TO_CARRIER:
|
|
|
+ {
|
|
|
+ return excute_robot_put_car_to_carrier();
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case message::Dispatch_task_type::ROBOT_CATCH_CAR_FROM_CARRIER:
|
|
|
+ {
|
|
|
+ return excute_robot_catch_car_from_carrier();
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case message::Dispatch_task_type::ROBOT_PUT_CAR_TO_OUTLET:
|
|
|
+ {
|
|
|
+ return excute_robot_put_car_to_outlet();
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case message::Dispatch_task_type::ROBOT_MOVE:
|
|
|
+ {
|
|
|
+ return excute_robot_move();
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case message::Dispatch_task_type::CARRIER_RECEIVE_CAR_FROM_ROBOT:
|
|
|
+ {
|
|
|
+ return excute_carrier_receive_car_from_robot();
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case message::Dispatch_task_type::CARRIER_STORE_CAR_TO_PARKINGSPACE:
|
|
|
+ {
|
|
|
+ return excute_carrier_store_car_to_parkingspace();
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case message::Dispatch_task_type::CARRIER_STORE_CAR_TO_PARKINGSPACE_EX:
|
|
|
+ {
|
|
|
+ return excute_carrier_store_car_to_parkingspace_ex();
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case message::Dispatch_task_type::CARRIER_PICKUP_CAR_FROM_PARKINGSPACE:
|
|
|
+ {
|
|
|
+ return excute_carrier_pickup_car_from_parkingspace();
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case message::Dispatch_task_type::CARRIER_PICKUP_CAR_FROM_PARKINGSPACE_EX:
|
|
|
+ {
|
|
|
+ return excute_carrier_pickup_car_from_parkingspace_ex();
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case message::Dispatch_task_type::CARRIER_DELIVER_CAR_TO_ROBOT:
|
|
|
+ {
|
|
|
+ return excute_carrier_deliver_car_to_robot();
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case message::Dispatch_task_type::CARRIER_MOVE:
|
|
|
+ {
|
|
|
+ return excute_carrier_move();
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ default:
|
|
|
+ {
|
|
|
+ return Error_manager(Error_code::DISPATCH_PROCESS_TASK_STATUS_ERROR, Error_level::MINOR_ERROR,
|
|
|
+ "Dispatch_process::excute_dispatch_control() fun error ");
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
return Error_code::SUCCESS;
|
|
|
}
|
|
|
-
|
|
|
-//连接调度设备, 释放任务单 与设备解除连接
|
|
|
-Error_manager Dispatch_process::disconnect_dispatch_device()
|
|
|
+//发送调度控制答复, 发给调度控制的
|
|
|
+Error_manager Dispatch_process::send_dispatch_control_response_msg()
|
|
|
{
|
|
|
+ std::unique_lock<std::mutex> t_lock(m_lock);
|
|
|
+ m_dispatch_control_response_msg.mutable_base_info()->set_msg_type(message::Message_type::eDispatch_control_response_msg);
|
|
|
+ m_dispatch_control_response_msg.mutable_base_info()->set_timeout_ms(m_timeout_ms);
|
|
|
+ m_dispatch_control_response_msg.mutable_base_info()->set_sender(message::Communicator::eDispatch_mamager);
|
|
|
+ m_dispatch_control_response_msg.mutable_base_info()->set_receiver(message::Communicator::eDispatch_control);
|
|
|
+ m_dispatch_control_response_msg.set_command_key(m_dispatch_control_request_msg.command_key());
|
|
|
+
|
|
|
+ m_dispatch_control_response_msg.set_dispatch_task_type(m_dispatch_control_request_msg.dispatch_task_type());
|
|
|
+ m_dispatch_control_response_msg.set_dispatch_device_type(m_dispatch_control_request_msg.dispatch_device_type());
|
|
|
+ m_dispatch_control_response_msg.set_dispatch_source(m_dispatch_control_request_msg.dispatch_source());
|
|
|
+ m_dispatch_control_response_msg.set_dispatch_destination(m_dispatch_control_request_msg.dispatch_destination());
|
|
|
+
|
|
|
+ m_dispatch_control_response_msg.mutable_error_manager()->set_error_code(m_result.get_error_code());
|
|
|
+ m_dispatch_control_response_msg.mutable_error_manager()->set_error_level((message::Error_level)m_result.get_error_level());
|
|
|
+ m_dispatch_control_response_msg.mutable_error_manager()->set_error_description(m_result.get_error_description(), m_result.get_description_length());
|
|
|
+
|
|
|
+ std::string t_msg = m_dispatch_control_response_msg.SerializeAsString();
|
|
|
+ System_communication::get_instance_references().encapsulate_msg(t_msg);
|
|
|
return Error_code::SUCCESS;
|
|
|
}
|
|
|
+//断开调度设备, 释放任务单 与设备解除连接
|
|
|
+Error_manager Dispatch_process::disconnect_dispatch_device()
|
|
|
+{
|
|
|
+ std::unique_lock<std::mutex> t_lock(m_lock);
|
|
|
+ Error_manager t_error;
|
|
|
+
|
|
|
+ //机器手
|
|
|
+ if ( m_dispatch_control_request_msg.dispatch_device_type() >= message::Dispatch_device_type::ROBOT_1 &&
|
|
|
+ m_dispatch_control_request_msg.dispatch_device_type() <= message::Dispatch_device_type::ROBOT_2 )
|
|
|
+ {
|
|
|
+ //收回任务
|
|
|
+ mp_catcher_task->set_task_statu(Task_Base::Task_statu::TASK_WITHDRAW);
|
|
|
+ //释放设备和任务单的指针
|
|
|
+ mp_catcher_task.reset();
|
|
|
+ mp_catcher.reset();
|
|
|
+ }
|
|
|
+ //搬运器
|
|
|
+ else if ( m_dispatch_control_request_msg.dispatch_device_type() >= message::Dispatch_device_type::CARRIER_1 &&
|
|
|
+ m_dispatch_control_request_msg.dispatch_device_type() <= message::Dispatch_device_type::CARRIER_3 )
|
|
|
+ {
|
|
|
+ //收回任务
|
|
|
+ mp_carrier_task->set_task_statu(Task_Base::Task_statu::TASK_WITHDRAW);
|
|
|
+ //释放设备和任务单的指针
|
|
|
+ mp_carrier_task.reset();
|
|
|
+ mp_carrier.reset();
|
|
|
+ }
|
|
|
+
|
|
|
+ return Error_code::SUCCESS;}
|
|
|
|
|
|
//等待调度总计划答复
|
|
|
Error_manager Dispatch_process::wait_dispatch_plan_response_msg()
|
|
@@ -411,7 +577,7 @@ Error_manager Dispatch_process::send_dispatch_response_msg()
|
|
|
m_dispatch_response_msg.mutable_base_info()->set_timeout_ms(m_timeout_ms);
|
|
|
m_dispatch_response_msg.mutable_base_info()->set_sender(message::Communicator::eDispatch_mamager);
|
|
|
m_dispatch_response_msg.mutable_base_info()->set_receiver(message::Communicator::eMain);
|
|
|
- m_dispatch_response_msg.set_command_key(m_command_key);
|
|
|
+ m_dispatch_response_msg.set_command_key(m_dispatch_request_msg.command_key());
|
|
|
|
|
|
m_dispatch_response_msg.mutable_error_manager()->CopyFrom(m_dispatch_plan_response_msg.error_manager());
|
|
|
|
|
@@ -591,8 +757,8 @@ Error_manager Dispatch_process::excute_robot_put_car_to_carrier()
|
|
|
if ( tp_catcher_task->m_step == 1 )//检查姿态
|
|
|
{
|
|
|
if ( tp_catcher->m_actual_load_status == Dispatch_device_base::Load_status::HAVE_CAR &&
|
|
|
- tp_catcher->m_actual_clamp_motion1 == Dispatch_device_base::Clamp_motion::E_CLAMP_TIGHT &&
|
|
|
- (Common_data::approximate(tp_catcher->m_actual_b, 90, 0.01) || Common_data::approximate(tp_catcher->m_actual_b, 270, 0.01) ) )
|
|
|
+ tp_catcher->m_actual_clamp_motion1 == Dispatch_device_base::Clamp_motion::E_CLAMP_TIGHT &&
|
|
|
+ (Common_data::approximate(tp_catcher->m_actual_b, 90, 0.01) || Common_data::approximate(tp_catcher->m_actual_b, 270, 0.01) ) )
|
|
|
{
|
|
|
//检测正常, 直接跳过即可
|
|
|
tp_catcher_task->m_step +=2;
|
|
@@ -628,7 +794,7 @@ Error_manager Dispatch_process::excute_robot_put_car_to_carrier()
|
|
|
{
|
|
|
float temp_y = tp_dispatch_coordinates->m_carrier_default_y1_back - (m_wheel_base /2);
|
|
|
if ( Common_data::approximate(tp_catcher->m_actual_x, m_destination_coordinates.x, 0.01) &&
|
|
|
- Common_data::approximate(tp_catcher->m_actual_y, temp_y, 0.01))
|
|
|
+ Common_data::approximate(tp_catcher->m_actual_y, temp_y, 0.01))
|
|
|
{
|
|
|
//检测正常, 直接跳过即可
|
|
|
tp_catcher_task->m_step +=2;
|
|
@@ -1023,7 +1189,7 @@ Error_manager Dispatch_process::excute_carrier_receive_car_from_robot()
|
|
|
if ( tp_carrier->m_actual_load_status == Dispatch_device_base::Load_status::NO_CAR )
|
|
|
{
|
|
|
if ( tp_carrier_task->m_request_clamp_motion == Carrier_task::Clamp_motion::E_CLAMP_LOOSE &&
|
|
|
- Common_data::approximate(m_wheel_base, tp_carrier->m_actual_y1-tp_carrier->m_actual_y2, 0.01))
|
|
|
+ Common_data::approximate(m_wheel_base, tp_carrier->m_actual_y1-tp_carrier->m_actual_y2, 0.01))
|
|
|
{
|
|
|
tp_carrier_task->m_step +=2;
|
|
|
}
|
|
@@ -1154,7 +1320,7 @@ Error_manager Dispatch_process::excute_carrier_receive_car_from_robot()
|
|
|
}
|
|
|
if ( tp_carrier_task->m_step == 15 )
|
|
|
{
|
|
|
- return Error_code::SUCCESS;
|
|
|
+ return Error_code::SUCCESS;
|
|
|
}
|
|
|
}
|
|
|
//搬运器把车存到停车位上(例如:小跑车夹车后,搬运器移动到56号停车位,然后小跑车将车存入车位,之后搬运器退回至电梯井)
|
|
@@ -1184,7 +1350,7 @@ Error_manager Dispatch_process::excute_carrier_store_car_to_parkingspace()
|
|
|
{
|
|
|
//检查姿态(注注注注注意了, 调试阶段是无车, 真实环境是有车的)
|
|
|
if ( tp_carrier->m_actual_load_status == Dispatch_device_base::Load_status::NO_CAR &&
|
|
|
- tp_carrier->m_actual_clamp_motion1 == Dispatch_device_base::Clamp_motion::E_CLAMP_LOOSE)
|
|
|
+ tp_carrier->m_actual_clamp_motion1 == Dispatch_device_base::Clamp_motion::E_CLAMP_LOOSE)
|
|
|
{
|
|
|
//检测正常, 直接跳过即可
|
|
|
tp_carrier_task->m_step +=2;
|
|
@@ -1320,8 +1486,8 @@ Error_manager Dispatch_process::excute_carrier_store_car_to_parkingspace()
|
|
|
}
|
|
|
if ( tp_carrier_task->m_step == 17 )//小跑车 进入车位
|
|
|
{
|
|
|
- carrier_move_y(tp_carrier, tp_carrier_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_carrier_default_y_leave);
|
|
|
- tp_carrier_task->m_step++;
|
|
|
+ carrier_move_y(tp_carrier, tp_carrier_task, tp_dispatch_coordinates, tp_dispatch_coordinates->m_carrier_default_y_leave);
|
|
|
+ tp_carrier_task->m_step++;
|
|
|
}
|
|
|
if ( tp_carrier_task->m_step == 18 )
|
|
|
{
|
|
@@ -2012,10 +2178,10 @@ Error_manager Dispatch_process::excute_carrier_deliver_car_to_robot()
|
|
|
{
|
|
|
//检查姿态
|
|
|
if ( tp_carrier->m_actual_load_status == Dispatch_device_base::Load_status::HAVE_CAR &&
|
|
|
- tp_carrier->m_actual_clamp_motion1 == Dispatch_device_base::Clamp_motion::E_CLAMP_TIGHT)
|
|
|
+ tp_carrier->m_actual_clamp_motion1 == Dispatch_device_base::Clamp_motion::E_CLAMP_TIGHT)
|
|
|
{
|
|
|
//检测正常, 直接跳过
|
|
|
- tp_carrier_task->m_step +=2;
|
|
|
+ tp_carrier_task->m_step +=2;
|
|
|
}
|
|
|
else
|
|
|
{
|