27 #include <unordered_map>
28 #include <unordered_set>
48 std::unordered_set<std::string>
names{};
49 const auto ids = getAllEntityIds(
c);
51 for (
const auto&
id : ids)
53 auto elem = getNodeById(
id,
c);
57 names.insert(elem->getScene());
61 return Ice::StringSeq{
names.begin(),
names.end()};
64 memoryx::GraphNodeBaseList
67 memoryx::GraphNodeBaseList result{};
70 for (
auto& elem : filtered)
72 auto ptr = memoryx::GraphNodeBasePtr::dynamicCast(elem);
76 result.push_back(ptr);
83 memoryx::GraphNodeBasePtr
86 return memoryx::GraphNodeBasePtr::dynamicCast(getEntityById(entityId,
c));
89 memoryx::GraphNodeBasePtr
92 return memoryx::GraphNodeBasePtr::dynamicCast(getEntityById(entityId,
c));
95 memoryx::GraphNodeBasePtr
98 return memoryx::GraphNodeBasePtr::dynamicCast(getEntityByName(entityName,
c));
101 memoryx::GraphNodeBaseList
104 memoryx::GraphNodeBaseList nodes{};
105 const auto ids = getAllEntityIds(
c);
107 for (
const auto&
id : ids)
109 auto elem = getNodeById(
id,
c);
113 nodes.push_back(elem);
123 ARMARX_INFO_S <<
"GraphMemorySegment: clearing scene " << sceneName <<
"...";
126 for (
auto& elem : filtered)
128 removeEntity(elem->getId(
c));
131 ARMARX_INFO_S <<
"GraphMemorySegment: clearing scene " << sceneName <<
". Removed "
132 << filtered.size() <<
" elements";
138 GraphNodeBasePtr node = getNodeById(nodeId);
139 auto allnodes = getAllNodes();
140 for (
auto& curNode : allnodes)
142 if (curNode->removeAdjacentNode(nodeId))
144 updateEntity(curNode->getId(), curNode);
149 removeEntity(nodeId);
157 const std::string& endNodeId,
160 GraphNodeBasePtr startNode = getNodeById(startNodeId);
163 if (startNode->removeAdjacentNode(endNodeId))
165 updateEntity(startNodeId, startNode);
175 ARMARX_INFO_S <<
"GraphMemorySegment adding node " << (node ? node->getName() :
"NULL node");
176 return addEntity(node,
c);
181 const std::string& toId,
182 const Ice::Current&
c)
184 ARMARX_INFO_S <<
"GraphMemorySegment adding edge " << fromId <<
" -> " << toId <<
"...";
185 auto fromNode = getNodeById(fromId,
c);
190 <<
" does not reference a node";
194 auto toNode = getNodeById(toId,
c);
198 ARMARX_ERROR_S <<
"GraphMemorySegment addEdge: Id " << toId <<
" does not reference a node";
203 fromNode->addAdjacentNode(getEntityRefById(toId,
c),
c);
205 updateEntity(fromId, fromNode,
c);
206 ARMARX_INFO_S <<
"GraphMemorySegment adding edge " << fromId <<
" -> " << toId <<
"done!";
219 const ::std::string& nodeName,
220 const ::Ice::Current&)
222 auto nodes = getNodesByScene(sceneName);
224 for (
const auto& node : nodes)
226 if (node->getName() == nodeName)
235 memoryx::GraphNodeBasePtr
237 const ::std::string& nodeName,
238 const ::Ice::Current&)
240 auto nodes = getNodesByScene(sceneName);
242 for (
const auto& node : nodes)
244 if (node->getName() == nodeName)
250 return memoryx::GraphNodeBasePtr{};
294 memoryx::GraphNodeBaseList
296 const ::std::string& idTo,
297 const ::Ice::Current&)
300 auto start = getNodeById(idFrom);
301 auto goal = getNodeById(idTo);
305 std::stringstream
s{};
306 s <<
"aStar: Node from: No node with ID: " << idFrom;
308 throw memoryx::EntityNotFoundException{
s.str()};
313 std::stringstream
s{};
315 s <<
"aStar: Node to: No node with ID: " << idTo;
316 throw memoryx::EntityNotFoundException{
s.str()};
319 ARMARX_VERBOSE_S <<
"memoryx::GraphMemorySegment::aStar from " << start->getPose()->frame
320 <<
" to " << goal->getPose()->frame;
323 if (start->getScene() != goal->getScene())
325 std::stringstream
s{};
327 s <<
"aStar: Nodes from and to belong to different scenes: " << start->getScene() <<
" | "
329 throw armarx::InvalidArgumentException{
s.str()};
334 std::unordered_map<std::string, memoryx::GraphNodeBasePtr> nodes{};
336 for (
const auto& node : getNodesByScene(start->getScene()))
338 nodes[node->getId()] = node;
342 nodes[start->getId()] = start;
343 nodes[goal->getId()] = goal;
347 auto dist = [](memoryx::GraphNodeBasePtr n1, memoryx::GraphNodeBasePtr n2)
349 auto p1 = n1->getPose();
350 auto p2 = n2->getPose();
351 const float dX = p1->position->x - p2->position->x;
352 const float dY = p1->position->y - p2->position->y;
356 memoryx::GraphNodeBaseList path{};
357 memoryx::GraphNodeBaseList closedSet{};
358 memoryx::GraphNodeBaseList openSet{};
359 openSet.push_back(start);
361 std::unordered_map<std::string, float> gScore;
362 gScore[start->getId()] = 0.f;
363 std::unordered_map<std::string, float> fScore;
364 fScore[start->getId()] = gScore.at(start->getId()) + dist(start, goal);
365 std::unordered_map<std::string, memoryx::GraphNodeBasePtr> cameFrom;
366 cameFrom[goal->getId()] = start;
368 ARMARX_VERBOSE_S <<
"memoryx::GraphMemorySegment::aStar from " << idFrom <<
" to " << idTo
369 <<
". Start path search.";
371 while (!openSet.empty())
374 auto currentIT = std::min_element(
377 [&fScore](
const memoryx::GraphNodeBasePtr&
a,
const memoryx::GraphNodeBasePtr& b)
378 { return fScore.at(a->getId()) < fScore.at(b->getId()); });
379 assert(currentIT != openSet.end());
380 memoryx::GraphNodeBasePtr current = *currentIT;
384 if (current->getId() == goal->getId())
386 auto cameFromNode = goal;
388 while (cameFromNode->getId() != start->getId())
390 path.insert(path.begin(), cameFromNode);
391 cameFromNode = cameFrom.at(cameFromNode->getId());
394 path.insert(path.begin(), start);
398 openSet.erase(currentIT);
399 closedSet.push_back(current);
402 for (
int i = 0; i < current->getOutdegree(); i++)
404 auto neighbor = nodes.at(current->getAdjacentNode(i)->getEntity()->getId());
408 if (std::find(closedSet.begin(), closedSet.end(), neighbor) != closedSet.end())
413 float tentativeGScore = gScore.at(current->getId()) + dist(current, neighbor);
414 bool notInOS = std::find(openSet.begin(), openSet.end(), neighbor) == openSet.end();
416 if (notInOS || tentativeGScore < gScore.at(neighbor->getId()))
418 cameFrom[neighbor->getId()] = current;
419 gScore[neighbor->getId()] = tentativeGScore;
420 fScore[neighbor->getId()] = tentativeGScore + dist(neighbor, goal);
424 openSet.push_back(neighbor);
430 ARMARX_VERBOSE_S <<
"memoryx::GraphMemorySegment::aStar from " << idFrom <<
" to " << idTo