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)
float nodeDistance(float node_x, float node_y)
ros::Publisher orderActionPub
vector< string > ordersToCancel
std::map< std::string, ros::Publisher > messagePublisher
void triggerNewActions(string nodeOrEdge)
bool compareBase(string startOfNewBaseNodeId, int startOfNewBaseSequenceId)
void OrderCallback(const vda5050_msgs::Order::ConstPtr &msg)
Subscriber subscribe(const std::string &topic, uint32_t queue_size, void(T::*fp)(M), T *obj, const TransportHints &transport_hints=TransportHints())
ros::Publisher orderIdPub
std::map< std::string, std::string > GetTopicPublisherList()
bool inDevRange(vda5050_msgs::Node node)
void DrivingCallback(const std_msgs::Bool::ConstPtr &msg)
void sendActions(ros::Publisher actionPublisher)
ROSCPP_DECL void init(int &argc, char **argv, const std::string &name, uint32_t options=0)
void sendEdgeStates(ros::Publisher edgeStatesPublisher)
void appendNewOrder(const vda5050_msgs::Order::ConstPtr &msg)
std::string GetTopic(std::string hierarchical_topic)
void updatePosition(float new_x, float new_y, float new_theta, string new_mapId)
void setOrderUpdateId(int incomingUpdateId)
void AgvPositionCallback(const vda5050_msgs::AGVPosition::ConstPtr &msg)
ros::Publisher orderCancelPub
void allActionsCancelledCallback(const std_msgs::String::ConstPtr &msg)
void startNewOrder(const vda5050_msgs::Order::ConstPtr &msg)
ros::Subscriber allActionsCancelledSub
void LinkSubscriptionTopics(ros::NodeHandle *nh)
void publish(const boost::shared_ptr< M > &message) const
vector< CurrentOrder > currentOrders
bool CheckTopic(std::string str1, std::string str2)
ros::Publisher orderUpdateIdPub
void sendNodeStates(ros::Publisher nodeStatesPublisher)
ros::Publisher errorPublisher
Publisher advertise(const std::string &topic, uint32_t queue_size, bool latch=false)
ros::Publisher edgeStatesPub
#define ROS_WARN_STREAM(args)
ros::Publisher lastNodeSequenceIdPub
void LinkPublishTopics(ros::NodeHandle *nh)
ros::Publisher nodeStatesPub
ros::Publisher lastNodeIdPub
std::map< std::string, ros::Subscriber > subscribers
vda5050_msgs::Node getLastNodeInBase()
bool validationCheck(const vda5050_msgs::Order::ConstPtr &msg)
void ActionStateCallback(const vda5050_msgs::ActionState::ConstPtr &msg)
ros::Publisher orderTriggerPub
void orderValidationError(string orderId, int orderUpdateId)
ros::Subscriber orderCancelSub
string compareOrderUpdateId(int orderUpdateIdToCompare)
void OrderCancelRequestCallback(const std_msgs::String::ConstPtr &msg)
int main(int argc, char **argv)
void updateExistingOrder(const vda5050_msgs::Order::ConstPtr &msg)
ROSCPP_DECL void spinOnce()
string findNodeEdge(int currSequenceId)
bool compareOrderId(string orderIdToCompare)
ros::Subscriber agvPositionSub
void orderUpdateError(string orderId, int orderUpdateId)
CurrentOrder(const vda5050_msgs::Order::ConstPtr &incomingOrder)
std::map< std::string, std::string > GetTopicSubscriberList()