14 #include "std_msgs/String.h"
15 #include "std_msgs/Bool.h"
16 #include "std_msgs/Int32.h"
17 #include "vda5050_msgs/Order.h"
18 #include "vda5050_msgs/OrderActions.h"
19 #include "vda5050_msgs/Action.h"
20 #include "vda5050_msgs/ActionState.h"
21 #include "vda5050_msgs/AGVPosition.h"
22 #include "vda5050_msgs/OrderMotion.h"
23 #include "vda5050_msgs/NodeState.h"
24 #include "vda5050_msgs/EdgeState.h"
32 actionsFinished =
false;
33 actionCancellationComplete =
false;
35 orderId = incomingOrder->orderId;
36 orderUpdateId = incomingOrder->orderUpdateId;
37 zoneSetId = incomingOrder->zoneSetId;
38 edgeStates = deque<vda5050_msgs::Edge>({incomingOrder->edges.begin(), incomingOrder->edges.end()});
39 nodeStates = deque<vda5050_msgs::Node>({incomingOrder->nodes.begin(), incomingOrder->nodes.end()});
44 return this->orderId == orderIdToCompare;
49 if (orderUpdateIdToCompare == this->orderUpdateId)
51 else if (orderUpdateIdToCompare > this->orderUpdateId)
53 else if (orderUpdateIdToCompare < this->orderUpdateId)
61 return (this->nodeStates.back().nodeId == startOfNewBaseNodeId) &&
62 (this->nodeStates.back().sequenceId == startOfNewBaseSequenceId);
72 return this->orderUpdateId;
77 this->orderUpdateId = incomingUpdateId;
82 if (!this->nodeStates.empty())
84 if (!this->edgeStates.empty())
86 if (this->actionStates.empty())
95 if (edgeStates.front().sequenceId == currSequenceId)
97 else if (nodeStates.front().sequenceId == currSequenceId)
100 return "SEQUENCE ERROR";
106 auto it = find_if(nodeStates.begin(), nodeStates.end(), [] (
const vda5050_msgs::Node &node) {return node.released == false;});
108 if (it != nodeStates.end())
112 return nodeStates.back();
117 int maxSequenceId = max(edgeStates.back().sequenceId, nodeStates.back().sequenceId);
118 deque<vda5050_msgs::Edge>::iterator edgeIt = edgeStates.begin();
119 deque<vda5050_msgs::Node>::iterator nodeIt = nodeStates.begin();
122 if (nodeStates.front().actions.empty())
123 this->actionsFinished =
true;
125 for (
int currSeq = 0; currSeq <= maxSequenceId; currSeq++)
127 if ((edgeIt->sequenceId == currSeq) && (edgeIt->released) && !(edgeIt->actions.empty()))
129 vda5050_msgs::OrderActions msg;
130 msg.orderActions = edgeIt->actions;
131 msg.orderId = orderId;
135 if ((nodeIt->sequenceId == currSeq) && (nodeIt->released) && !(nodeIt->actions.empty()))
137 vda5050_msgs::OrderActions msg;
138 msg.orderActions = nodeIt->actions;
139 msg.orderId = orderId;
148 for (
auto const &state_it : this->nodeStates)
151 vda5050_msgs::NodeState state_msg;
152 state_msg.nodeId = state_it.nodeId;
153 state_msg.sequenceId = state_it.sequenceId;
154 state_msg.nodeDescription = state_it.nodeDescription;
155 state_msg.position = state_it.nodePosition;
156 state_msg.released = state_it.released;
159 nodeStatesPublisher.
publish(state_msg);
161 ROS_INFO(
"x: %f, y: %f", state_it.nodePosition.x, state_it.nodePosition.y);
167 for (
auto const &state_it : this->edgeStates)
170 vda5050_msgs::EdgeState state_msg;
171 state_msg.edgeId = state_it.edgeId;
172 state_msg.sequenceId = state_it.sequenceId;
173 state_msg.edgeDescription = state_it.edgeDescription;
174 state_msg.trajectory = state_it.trajectory;
175 state_msg.released = state_it.released;
178 edgeStatesPublisher.
publish(state_msg);
190 mapId =
"initializing...";
203 return sqrt(pow(node_x-x, 2)+pow(node_y-y,2));
237 std::string topic_index;
239 for(
const auto& elem : topicList)
242 ROS_INFO(
"topic_index = %s",topic_index.c_str());
254 for(
const auto& elem : topicList)
276 node.nodePosition.y)) <=
277 node.nodePosition.allowedDeviationXY) &&
283 if (nodeOrEdge ==
"NODE")
287 if (!this->
currentOrders.front().nodeStates.front().actions.empty())
289 for (
auto const &action : this->
currentOrders.front().nodeStates.front().actions)
291 std_msgs::String msg;
292 msg.data = action.actionId;
300 else if (nodeOrEdge ==
"EDGE")
304 if (!this->
currentOrders.front().edgeStates.front().actions.empty())
306 for (
auto const &action : this->
currentOrders.front().edgeStates.front().actions)
308 std_msgs::String msg;
309 msg.data = action.actionId;
318 ROS_ERROR(
"Neither node nor edge matching sequence ID!");
323 vda5050_msgs::Edge edge =
currentOrders.front().edgeStates.front();
324 vda5050_msgs::OrderMotion msg;
328 msg.maxSpeed = edge.maxSpeed;
329 msg.maxRotationSpeed = edge.maxRotationSpeed;
330 msg.maxHeight = edge.maxHeight;
331 msg.minHeight = edge.minHeight;
332 msg.direction = edge.direction;
333 msg.rotationAllowed = edge.rotationAllowed;
334 msg.orientation = edge.orientation;
335 msg.length = edge.length;
338 if (edge.trajectory.knotVector.empty())
339 msg.target =
currentOrders.front().nodeStates.front().nodePosition;
341 msg.trajectory = edge.trajectory;
345 ROS_ERROR(
"Neither node nor edge matching sequence ID!");
356 if (
currentOrders.back().compareOrderUpdateId(msg->orderUpdateId) ==
"LOWER")
360 else if (
currentOrders.back().compareOrderUpdateId(msg->orderUpdateId) ==
"EQUAL")
362 ROS_WARN_STREAM(
"Order discarded. Strucure invalid! " << msg->orderId <<
", " << msg->orderUpdateId);
368 if (
currentOrders.back().compareBase(msg->nodes.front().nodeId,
369 msg->nodes.front().sequenceId))
380 if (
currentOrders.back().compareBase(msg->nodes.front().nodeId,
381 msg->nodes.front().sequenceId))
394 if (
currentOrders.back().compareBase(msg->nodes.front().nodeId,
395 msg->nodes.front().sequenceId))
422 ROS_INFO(
"Received cancel request for order: %s", msg.get()->data.c_str());
425 { return order.compareOrderId(msg.get()->data); });
430 std_msgs::String msg;
437 ROS_ERROR(
"Order to cancel not found: %s", msg.get()->data.c_str());
444 { return order.compareOrderId(msg.get()->data); });
455 auto it = find(order.actionStates.begin(), order.actionStates.end(), msg.get()->actionID);
456 if (it != order.actionStates.end())
458 if (msg.get()->actionStatus ==
"FINISHED")
460 order.actionStates.erase(it);
461 if (order.actionStates.empty())
463 order.actionsFinished =
true;
466 else if (msg.get()->actionStatus ==
"FAILED");
475 ROS_INFO(
"Got new position: %f, %f", msg->x, msg->y);
495 for (
auto const &action :
currentOrders.front().nodeStates.front().actions)
496 currentOrders.front().actionStates.push_back(action.actionId);
500 ROS_ERROR(
"Missing node in current order!");
514 std_msgs::String lastNodeIdMsg;
515 lastNodeIdMsg.data =
currentOrders.front().nodeStates.front().nodeId;
519 std_msgs::Int32 lastNodeSequenceIdMsg;
520 lastNodeSequenceIdMsg.data =
currentOrders.front().nodeStates.front().sequenceId;
533 for (
auto const &action :
currentOrders.front().edgeStates.front().actions)
534 currentOrders.front().actionStates.push_back(action.actionId);
542 std_msgs::String orderIdMsg;
547 std_msgs::Int32 orderUpdateIdMsg;
548 orderUpdateIdMsg.data =
currentOrders.front().getOrderUpdateId();
580 if (!
currentOrders.back().nodeStates.front().actions.empty())
583 for (
auto const &action :
currentOrders.front().nodeStates.front().actions)
584 currentOrders.front().actionStates.push_back(action.actionId);
592 std_msgs::String orderIdMsg;
597 std_msgs::Int32 orderUpdateIdMsg;
598 orderUpdateIdMsg.data =
currentOrders.front().getOrderUpdateId();
601 ROS_INFO(
"Started new order: %s", msg->orderId.c_str());
609 [](vda5050_msgs::Edge delEdge)
610 { return !delEdge.released; }));
613 [](vda5050_msgs::Node delNode)
614 { return !delNode.released; }));
631 [](vda5050_msgs::Edge delEdge)
632 { return !delEdge.released; }));
635 [](vda5050_msgs::Node delNode)
636 { return !delNode.released; }));
639 for (
auto const &newEdge: msg->edges)
641 for (
auto const &newNode: msg->nodes)
644 currentOrders.front().setOrderUpdateId(msg.get()->orderUpdateId);
655 std_msgs::Int32 orderUpdateMsg;
656 orderUpdateMsg.data = msg.get()->orderUpdateId;
670 { return currOrd.compareOrderId(*orderIdIt); });
673 if (order->actionCancellationComplete)
678 { return order.compareOrderId(*orderIdIt); }),
681 std_msgs::String msg;
682 msg.data = *orderIdIt;
693 ROS_WARN(
"Order to cancel not found: %s", (*orderIdIt).c_str());
702 std_msgs::String rejectMsg;
704 ss <<
"orderUpdateError: " << orderId <<
", " << orderUpdateId;
705 rejectMsg.data = ss.str();
711 std_msgs::String rejectMsg;
713 ss <<
"orderValidationError: " << orderId <<
", " << orderUpdateId;
714 rejectMsg.data = ss.str();
718 int main(
int argc,
char **argv)