TopologyTreeGenerator.cpp
Go to the documentation of this file.
1 
19 #include <ros/ros.h>
20 
21 namespace SceneModel {
22 
24 
26 
28 {
29  buildTree(pObjectSets, pRoot, mRelations[0]->getObjectTypeA()); // Builds tree with first object found as node.
30 }
31 
32 void TopologyTreeGenerator::buildTree(ObjectSetList pTrajectories, boost::shared_ptr<TreeNode>& pRoot, std::string pType)
33 {
34  std::cout << "Creating tree from topology." << std::endl;
35  // Create nodes for each type and map them to their type. bool indicates whether the node was already added to the tree.
36  std::map<std::string, std::pair<boost::shared_ptr<TreeNode>, bool>> nodesByType;
37  for (boost::shared_ptr<ISM::ObjectSet> trajectory: pTrajectories.mObjectSets)
38  {
39  boost::shared_ptr<TreeNode> newNode(new TreeNode(trajectory));
40  nodesByType[trajectory->objects[0]->type] = std::pair<boost::shared_ptr<TreeNode>, bool>(newNode, false);
41  }
42  std::vector<std::string> typesToVisit;
43  typesToVisit.push_back(pType);
44  std::vector<boost::shared_ptr<Relation>> remainingRelations = mRelations;
45  while (!remainingRelations.empty())
46  {
47  std::cout << "Number of relations left is " << remainingRelations.size() << ". ";
48  std::string currentType = typesToVisit[0];
49  typesToVisit.erase(typesToVisit.begin());
50  std::cout << "Current type is " << currentType << std::endl;
51  boost::shared_ptr<TreeNode> currentNode = nodesByType[currentType].first;
52  std::vector<boost::shared_ptr<Relation>> newRemainingRelations;
53  // Iterate over all relations and build tree. Relation graph is assumed to be connected, so, every type will be visited.
54  for (boost::shared_ptr<Relation> relation: remainingRelations)
55  {
56  if (relation->containsObject(currentType))
57  {
58  std::string otherType = relation->getOtherType(currentType);
59  std::cout << "Found relation to " << otherType << ". ";
60  if (!nodesByType[otherType].second) // type's node was not yet added to tree
61  {
62  std::cout << "Node not yet in tree. ";
63  currentNode->addChild(nodesByType[otherType].first); // add to tree
64  nodesByType[otherType].second = true; // mark as added
65  typesToVisit.push_back(otherType);
66  std::cout << "Added node." << std::endl;
67  }
68  else // type's node has already been added to tree: add reference to it instead
69  {
70  std::cout << "Node already in tree. ";
71  boost::shared_ptr<TreeNode> reference(new TreeNode(nodesByType[otherType].first->mObjectSet));
72  // references have no mChildren:
73  reference->mChildren = std::vector<boost::shared_ptr<TreeNode>>();
74  reference->mReferenceTo = nodesByType[otherType].first;
75  reference->mIsReference = true;
76  currentNode->addChild(reference);
77  std::cout << "Added reference." << std::endl;
78  }
79  }
80  else newRemainingRelations.push_back(relation);
81  }
82  remainingRelations = newRemainingRelations;
83  }
84  std::cout << "All relations visited." << std::endl;
85  pRoot = nodesByType[pType].first;
86  pRoot->setIDs();
87 }
88 
90 {
91  mRelations = std::vector<boost::shared_ptr<Relation>>();
92  // Only keep one relation from duplicates (the last one found):
93  std::cout << "Removing duplicate relations. " << pRelations.size(); // Old number of relations was " << pRelations.size() << std::endl;
94  for (unsigned int i = 0; i < pRelations.size(); i++)
95  {
96  bool unique = true;
97  for (unsigned int j = i + 1; j < pRelations.size(); j++)
98  {
99  if (pRelations[i]->containsObject(pRelations[j]->getObjectTypeA()) && pRelations[i]->containsObject(pRelations[j]->getObjectTypeB()))
100  unique = false;
101  }
102  if (unique) mRelations.push_back(pRelations[i]);
103  }
104  std::cout << " -> " << mRelations.size() << " relations." << std::endl;
105 }
106 
107 }
std::vector< boost::shared_ptr< ISM::ObjectSet > > mObjectSets
Definition: ObjectSetList.h:67
void buildTree(ObjectSetList pObjectSets, boost::shared_ptr< TreeNode > &pRoot)
void setRelations(std::vector< boost::shared_ptr< Relation >> pRelations)
std::vector< boost::shared_ptr< Relation > > mRelations


asr_relation_graph_generator
Author(s): Meißner Pascal
autogenerated on Fri Nov 15 2019 03:39:19