ObjectLocalizationSaliency.cpp
Go to the documentation of this file.
1 /*
2  * This file is part of ArmarX.
3  *
4  * ArmarX is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License version 2 as
6  * published by the Free Software Foundation.
7  *
8  * ArmarX is distributed in the hope that it will be useful, but
9  * WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  * GNU General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program. If not, see <http://www.gnu.org/licenses/>.
15  *
16  * @package RobotComponents::ArmarXObjects::ObjectLocalizationSaliency
17  * @author David Schiebener (schiebener at kit dot edu)
18  * @author Markus Grotz ( markus dot grotz at kit dot edu )
19  * @date 2016
20  * @copyright http://www.gnu.org/licenses/gpl-2.0.txt
21  * GNU General Public License
22  */
23 
25 
29 
30 using namespace armarx;
31 
32 
34 {
35  usingProxy(getProperty<std::string>("ViewSelectionName").getValue());
36  usingTopic(getProperty<std::string>("ViewSelectionName").getValue() + "Observer");
37  usingProxy(getProperty<std::string>("RobotStateComponentName").getValue());
38  usingProxy(getProperty<std::string>("HeadIKUnitName").getValue());
39  usingProxy(getProperty<std::string>("WorkingMemoryName").getValue());
40  usingProxy(getProperty<std::string>("PriorKnowledgeName").getValue());
41 
42  randomNoiseLevel = getProperty<float>("RandomNoiseLevel").getValue();
43 
44  cameraFrameName = getProperty<std::string>("CameraFrameName").getValue();
45  headFrameName = getProperty<std::string>("HeadFrameName").getValue();
46  centralHeadTiltAngle = getProperty<float>("CentralHeadTiltAngle").getValue();
47 
48  halfCameraOpeningAngle = getProperty<float>("HalfCameraOpeningAngle").getValue();
49  deviationFromCameraCenterFactor = 0.5f;
50 
51  std::string graphFileName = "RobotAPI/ViewSelection/graph40k.gra";
52 
53  armarx::CMakePackageFinder finder("RobotAPI");
55 
56  if (ArmarXDataPath::getAbsolutePath(graphFileName, graphFileName))
57  {
58  saliencyEgosphereGraph = new CIntensityGraph(graphFileName);
59  ARMARX_VERBOSE << "Created egosphere graph with " << saliencyEgosphereGraph->getNodes()->size() << "nodes";
60  graphLookupTable = new CGraphPyramidLookupTable(9, 18);
61  graphLookupTable->buildLookupTable(saliencyEgosphereGraph);
62  nodeVisitedForObject.resize(saliencyEgosphereGraph->getNodes()->size());
63 
64  randomNoiseGraph = new CIntensityGraph(*saliencyEgosphereGraph);
65  randomNoiseGraph->set(0);
66  }
67  else
68  {
69  ARMARX_ERROR << "Could not find required graph file";
71  }
72 
73  // this is robot model specific: offset from the used head coordinate system to the actual
74  // head center where the eyes are assumed to be located. Here it is correct for ARMAR-III
75  offsetToHeadCenter << 0, 0, 150;
76  processorTask = new PeriodicTask<ObjectLocalizationSaliency>(this, &ObjectLocalizationSaliency::process, 1000.f / getProperty<float>("UpdateFrequency").getValue(), false, "ViewSelectionCalculation", false);
77  processorTask->setDelayWarningTolerance(2600);
78 }
79 
80 
82 {
83  viewSelection = getProxy<ViewSelectionInterfacePrx>(getProperty<std::string>("ViewSelectionName").getValue());
84  viewSelection = viewSelection->ice_compress(true);
85  robotStateComponent = getProxy<RobotStateComponentInterfacePrx>(getProperty<std::string>("RobotStateComponentName").getValue());
86 
87  memoryProxy = getProxy<memoryx::WorkingMemoryInterfacePrx>(getProperty<std::string>("WorkingMemoryName").getValue());
88  priorKnowledge = getProxy<memoryx::PriorKnowledgeInterfacePrx>(getProperty<std::string>("PriorKnowledgeName").getValue());
89  objectInstancesProxy = memoryx::ObjectInstanceMemorySegmentBasePrx::uncheckedCast(memoryProxy->getSegment("objectInstances"));
90  objectClassesProxy = memoryx::ObjectClassMemorySegmentBasePrx::uncheckedCast(memoryProxy->getSegment("objectClasses"));
91 
92  robot = RemoteRobot::createLocalClone(robotStateComponent);
93 
94  auto objClassSegment = priorKnowledge->getObjectClassesSegment();
95  std::vector<std::string> ids = objClassSegment->getAllEntityIds();
96 
97 
98  for (std::string& id : ids)
99  {
100  memoryx::ObjectClassPtr objClass = memoryx::ObjectClassPtr::dynamicCast(objClassSegment->getEntityById(id));
101 
102  if (objClass)
103  {
105 
106  if (!wrapper->getRecognitionMethod().empty() && wrapper->getRecognitionMethod() != "<none>")
107  {
108  recognizableObjClasses[objClass->getName()] = objClass;
109  ARMARX_INFO << objClass->getName() << " has " << wrapper->getRecognitionMethod();
110  }
111  }
112  }
113 
114  if (viewSelection->isEnabledAutomaticViewSelection())
115  {
117  }
118 }
119 
120 
122 {
123 
125 }
126 
127 
129 {
130  delete graphLookupTable;
131  delete saliencyEgosphereGraph;
132  delete randomNoiseGraph;
133 }
134 
135 
136 void ObjectLocalizationSaliency::process()
137 {
138  std::unique_lock<std::mutex> lock(mutex);
139 
140  IceUtil::Time delta = next - armarx::TimeUtil::GetTime();
141  delta -= lastDiff;
142  delta -= IceUtil::Time::milliSeconds(50);
143 
144  lock.unlock();
145 
146  if (delta > IceUtil::Time::seconds(0))
147  {
148  TimeUtil::Sleep(delta);
149  }
150 
151 
152  IceUtil::Time startTime = TimeUtil::GetTime();
153 
154  generateObjectLocalizationSaliency();
155 
156  SaliencyMapBasePtr objectLocalizationSaliencyMap = new SaliencyMapBase();
157  objectLocalizationSaliencyMap->name = "objectLocalizationSaliency";
158  saliencyEgosphereGraph->graphToVec(objectLocalizationSaliencyMap->map);
159  viewSelection->updateSaliencyMap(objectLocalizationSaliencyMap);
160 
161  SaliencyMapBasePtr randomNoise = new SaliencyMapBase();
162  randomNoise->name = "randomNoise";
163  randomNoiseGraph->graphToVec(randomNoise->map);
164  viewSelection->updateSaliencyMap(randomNoise);
165 
166  IceUtil::Time stopTime = TimeUtil::GetTime();
167 
168  std::lock_guard<std::mutex> lock2(mutex);
169 
170  lastDiff = (stopTime - startTime);
171 }
172 
173 
174 void ObjectLocalizationSaliency::generateObjectLocalizationSaliency()
175 {
176 
177  // reset saliency and visited nodes
178  saliencyEgosphereGraph->set(0);
179 
180  for (size_t i = 0; i < saliencyEgosphereGraph->getNodes()->size(); i++)
181  {
182  nodeVisitedForObject.at(i) = -1;
183  }
184 
185 
186  // collect localizable objects
187  std::vector<memoryx::ObjectInstancePtr> localizableObjects;
188  std::vector<FramedPositionPtr> localizableObjectPositions;
189  float maxObjectDistance = getProperty<float>("MaxObjectDistance").getValue();
190 
191  RemoteRobot::synchronizeLocalClone(robot, robotStateComponent);
192 
193  int numberOfLostObjects = 0;
194 
195  memoryx::EntityBaseList objectInstances = objectInstancesProxy->getAllEntities();
196 
197  for (size_t i = 0; i < objectInstances.size(); i++)
198  {
199  const memoryx::ObjectInstancePtr object = memoryx::ObjectInstancePtr::dynamicCast(objectInstances.at(i));
200 
201  if (object)
202  {
203  if (recognizableObjClasses.count(object->getMostProbableClass()) > 0 && !object->getPosition()->getFrame().empty())
204  {
205  if (objectClassesProxy->hasEntityByName(object->getMostProbableClass())) // should be true if and only if object has been requested
206  {
207  FramedPositionPtr position = object->getPosition();
208  position->changeFrame(robot, headFrameName);
209  float objDist = position->toEigen().norm();
210 
211  if (objDist <= maxObjectDistance)
212  {
213  localizableObjects.push_back(object);
214  localizableObjectPositions.push_back(position);
215 
216  if (object->getExistenceCertainty() < 0.5)
217  {
218  numberOfLostObjects++;
219  }
220  }
221  else
222  {
223  ARMARX_DEBUG << "Discarding " << object->getName() << " which is at " << position->output() << " ObjectDistance " << objDist;
224  }
225  }
226  }
227  }
228  }
229 
230 
231 
232  // generate new random noise
233  if (randomNoiseLevel > 0)
234  {
235  generateRandomNoise(localizableObjects, objectInstances);
236  }
237 
238 
239  const float probabilityToAddALostObject = (numberOfLostObjects > 0) ? getProperty<float>("ProbabilityToLookForALostObject").getValue() / numberOfLostObjects : 0;
240 
241  // add localization necessities to sphere of possible view directions
242  for (size_t i = 0; i < localizableObjects.size(); i++)
243  {
244  const memoryx::ObjectInstancePtr object = localizableObjects.at(i);
245 
246  if ((object->getExistenceCertainty() >= 0.5) || (rand() % 100000 < 100000 * probabilityToAddALostObject))
247  {
248  const FramedPositionPtr position = localizableObjectPositions.at(i);
249 
250  memoryx::MultivariateNormalDistributionPtr uncertaintyGaussian = memoryx::MultivariateNormalDistributionPtr::dynamicCast(object->getPositionUncertainty());
251 
252  if (!uncertaintyGaussian)
253  {
255  }
256 
257  float priority = object->getLocalizationPriority() / 100.0;
258  float saliency = priority * log(1.0 + uncertaintyGaussian->getVarianceScalar());
259 
260  if (saliency > 0)
261  {
262  // close objects get a smaller visibility angle to avoid problems due to the head being positioned unfortunately
263  float modifiedHalfCameraOpeningAngle = halfCameraOpeningAngle;
264  float objDist = position->toEigen().norm();
265  float shortDistance = 0.5f * maxObjectDistance;
266  if (objDist < shortDistance)
267  {
268  modifiedHalfCameraOpeningAngle = (objDist - 0.1f * shortDistance) / (0.9f * shortDistance) * halfCameraOpeningAngle;
269  modifiedHalfCameraOpeningAngle = std::max(0.0f, modifiedHalfCameraOpeningAngle);
270  }
271 
272  TSphereCoord positionInSphereCoordinates;
273  Eigen::Vector3f vec = position->toEigen() - offsetToHeadCenter;
274  MathTools::convert(vec, positionInSphereCoordinates);
275  int closestNodeIndex = graphLookupTable->getClosestNode(positionInSphereCoordinates);
276  addSaliencyRecursive(closestNodeIndex, saliency, positionInSphereCoordinates, i, modifiedHalfCameraOpeningAngle);
277  }
278  }
279  }
280 }
281 
282 
283 void ObjectLocalizationSaliency::addSaliencyRecursive(const int currentNodeIndex, const float saliency, const TSphereCoord objectSphereCoord, const int objectIndex, const float maxDistanceOnArc)
284 {
285 
286  // distance on arc between object projection center and node,
287  // normalized by the maximal viewing angle of the camera (=> in [0,1])
288  float normalizedDistance = MathTools::getDistanceOnArc(objectSphereCoord, saliencyEgosphereGraph->getNodes()->at(currentNodeIndex)->getPosition()) / maxDistanceOnArc;
289 
290  // increase value of node
291  float newValue = ((CIntensityNode*)saliencyEgosphereGraph->getNodes()->at(currentNodeIndex))->getIntensity()
292  + (1.0f - deviationFromCameraCenterFactor * normalizedDistance * normalizedDistance) * saliency;
293  ((CIntensityNode*)saliencyEgosphereGraph->getNodes()->at(currentNodeIndex))->setIntensity(newValue);
294 
295  // mark node as visited for this object
296  nodeVisitedForObject.at(currentNodeIndex) = objectIndex;
297 
298  // recurse on neighbours if they were not yet visited and close enough to the object projection center
299  int neighbourIndex;
300 
301  for (size_t i = 0; i < saliencyEgosphereGraph->getNodeAdjacency(currentNodeIndex)->size(); i++)
302  {
303  neighbourIndex = saliencyEgosphereGraph->getNodeAdjacency(currentNodeIndex)->at(i);
304 
305  if (nodeVisitedForObject.at(neighbourIndex) != objectIndex)
306  {
307  if (MathTools::getDistanceOnArc(objectSphereCoord, saliencyEgosphereGraph->getNodes()->at(neighbourIndex)->getPosition()) <= maxDistanceOnArc)
308  {
309  addSaliencyRecursive(neighbourIndex, saliency, objectSphereCoord, objectIndex, maxDistanceOnArc);
310  }
311  else
312  {
313  nodeVisitedForObject.at(neighbourIndex) = objectIndex;
314  }
315  }
316  }
317 }
318 
319 
320 void ObjectLocalizationSaliency::generateRandomNoise(std::vector<memoryx::ObjectInstancePtr>& localizableObjects, memoryx::EntityBaseList& objectInstances)
321 {
322 
323  // if there are requested objects that were not localized yet, the random noise component will be bigger
324  memoryx::EntityBaseList requestedObjectClasses = objectClassesProxy->getAllEntities();
325 
326  bool unlocalizedObjectExists = false;
327  for (size_t i = 0; i < requestedObjectClasses.size(); i++)
328  {
329  bool isInInstancesList = false;
330  for (size_t j = 0; j < objectInstances.size(); j++)
331  {
332  if (requestedObjectClasses.at(i)->getName() == memoryx::ObjectInstanceBasePtr::dynamicCast(objectInstances.at(j))->getMostProbableClass())
333  {
334  isInInstancesList = true;
335  break;
336  }
337  }
338  if (!isInInstancesList)
339  {
340  unlocalizedObjectExists = true;
341  break;
342  }
343  }
344 
345  if (unlocalizedObjectExists)
346  {
347  if (localizableObjects.size() == 0)
348  {
349  ARMARX_DEBUG << "There are objects requested, and none of them has been localized yet";
350  setRandomNoise(centralHeadTiltAngle + 30, 3.0f);
351  }
352  else
353  {
354  ARMARX_DEBUG << "There are objects requested, and some but not all of them have been localized already";
355  setRandomNoise(centralHeadTiltAngle + 20, 2.0f);
356  }
357  }
358  else
359  {
360  ARMARX_DEBUG << "There are no requested objects that were not localized yet. requestedObjectClasses.size() = " << requestedObjectClasses.size()
361  << ", objectInstances.size() = " << objectInstances.size();// << ", difference.size() = " << difference.size();
362  setRandomNoise(centralHeadTiltAngle, 1.0f);
363  }
364 
365 }
366 
367 
368 
369 void ObjectLocalizationSaliency::nextViewTarget(Ice::Long timestamp, const Ice::Current& c)
370 {
371  std::lock_guard<std::mutex> lock(mutex);
372 
373  next = IceUtil::Time::milliSeconds(timestamp);
374 }
375 
376 
377 void ObjectLocalizationSaliency::setRandomNoise(const float centralAngleForVerticalDirection, const float directionVariabilityFactor)
378 {
379 
380  Eigen::Vector3f currentViewTargetEigen(1000, 0, 0); // virtual central gaze goes into x direction
381  FramedPosition currentViewTarget(currentViewTargetEigen, cameraFrameName, robot->getName());
382  currentViewTarget.changeFrame(robot, headFrameName);
383  currentViewTargetEigen = currentViewTarget.toEigen() - offsetToHeadCenter;
384  TSphereCoord currentViewDirection;
385  MathTools::convert(currentViewTargetEigen, currentViewDirection);
386 
387  TNodeList* nodes = randomNoiseGraph->getNodes();
388  const int randomFactor = 100000;
389  const float noiseFactor = randomNoiseLevel / randomFactor;
390  const float distanceWeight = std::min(0.6f / directionVariabilityFactor, 1.0f);
391  const float centralityWeight = std::min(0.1f / directionVariabilityFactor, 0.2f);
392 
393  for (size_t i = 0; i < nodes->size(); i++)
394  {
395  CIntensityNode* node = (CIntensityNode*) nodes->at(i);
396  TSphereCoord nodeCoord = node->getPosition();
397  float distanceOnSphere = MathTools::getDistanceOnArc(currentViewDirection, nodeCoord);
398  float distanceFactor = 1.0f - distanceWeight * distanceOnSphere / M_PI; // prefer directions close to current direction
399  float verticalCenterFactor = 1.0f - centralityWeight * fabs(nodeCoord.fPhi - centralAngleForVerticalDirection) / 90.0f; // prefer directions that look to the center
400  float horizontalCenterFactor = 1.0f - centralityWeight * fabs(nodeCoord.fTheta) / 120.0f;
401  node->setIntensity(verticalCenterFactor * horizontalCenterFactor * distanceFactor * noiseFactor * (rand() % randomFactor));
402  }
403 
404 }
405 
406 
408 {
411 }
412 
413 
RemoteRobot.h
ARMARX_VERBOSE
#define ARMARX_VERBOSE
Definition: Logging.h:180
TNodeList
std::vector< CSGNode * > TNodeList
Definition: SphericalGraph.h:88
CIntensityNode
Definition: IntensityGraph.h:25
TSphereCoord::fTheta
float fTheta
Definition: Structs.h:26
CIntensityGraph::set
void set(float fIntensity)
Definition: IntensityGraph.cpp:115
armarx::RemoteRobot::synchronizeLocalClone
static bool synchronizeLocalClone(VirtualRobot::RobotPtr robot, RobotStateComponentInterfacePrx robotStatePrx)
Definition: RemoteRobot.cpp:448
armarx::ObjectLocalizationSaliencyPropertyDefinitions
Definition: ObjectLocalizationSaliency.h:60
armarx::CMakePackageFinder
The CMakePackageFinder class provides an interface to the CMake Package finder capabilities.
Definition: CMakePackageFinder.h:53
CSGNode::getPosition
TSphereCoord getPosition()
Definition: SphericalGraph.h:53
c
constexpr T c
Definition: UnscentedKalmanFilterTest.cpp:43
armarx::ObjectLocalizationSaliency::nextViewTarget
void nextViewTarget(Ice::Long timestamp, const Ice::Current &c=Ice::emptyCurrent) override
Definition: ObjectLocalizationSaliency.cpp:369
armarx::ObjectLocalizationSaliency::createPropertyDefinitions
armarx::PropertyDefinitionsPtr createPropertyDefinitions() override
Definition: ObjectLocalizationSaliency.cpp:407
armarx::ObjectLocalizationSaliency::onInitComponent
void onInitComponent() override
Definition: ObjectLocalizationSaliency.cpp:33
IceInternal::Handle< ObjectClass >
CGraphPyramidLookupTable::getClosestNode
int getClosestNode(Eigen::Vector3d position)
Definition: GraphPyramidLookupTable.cpp:70
memoryx::MultivariateNormalDistribution::CreateDefaultDistribution
static MultivariateNormalDistributionPtr CreateDefaultDistribution(float variance=10000)
Create a distribution with uncertainty of variance in all directions (default: variance = 10000,...
Definition: ProbabilityMeasures.h:251
armarx::ObjectLocalizationSaliency::onDisconnectComponent
void onDisconnectComponent() override
Definition: ObjectLocalizationSaliency.cpp:121
TSphereCoord::fPhi
float fPhi
Definition: Structs.h:25
CGraphPyramidLookupTable
Definition: GraphPyramidLookupTable.h:22
CIntensityGraph
Definition: IntensityGraph.h:51
M_PI
#define M_PI
Definition: MathTools.h:17
ARMARX_DEBUG
#define ARMARX_DEBUG
Definition: Logging.h:177
armarx::FramedPosition
The FramedPosition class.
Definition: FramedPose.h:142
armarx::CMakePackageFinder::getDataDir
std::string getDataDir() const
Definition: CMakePackageFinder.h:176
armarx::VariantType::Long
const VariantTypeId Long
Definition: Variant.h:917
ObjectLocalizationSaliency.h
max
T max(T t1, T t2)
Definition: gdiam.h:48
ARMARX_ERROR
#define ARMARX_ERROR
Definition: Logging.h:189
armarx::ObjectLocalizationSaliency::onExitComponent
void onExitComponent() override
Definition: ObjectLocalizationSaliency.cpp:128
armarx::TimeUtil::Sleep
static void Sleep(IceUtil::Time duration)
lock the calling thread for a given duration (like usleep(...) but using Timeserver time)
Definition: TimeUtil.cpp:76
armarx::armem::Time
armarx::core::time::DateTime Time
Definition: forward_declarations.h:13
CSphericalGraph::getNodeAdjacency
std::vector< int > * getNodeAdjacency(int nIndex)
Definition: SphericalGraph.cpp:177
armarx::TimeUtil::GetTime
static IceUtil::Time GetTime(TimeMode timeMode=TimeMode::VirtualTime)
Get the current time.
Definition: TimeUtil.cpp:42
armarx::ManagedIceObject::usingTopic
void usingTopic(const std::string &name, bool orderedPublishing=false)
Registers a proxy for subscription after initialization.
Definition: ManagedIceObject.cpp:248
armarx::Component::getConfigIdentifier
std::string getConfigIdentifier()
Retrieve config identifier for this component as set in constructor.
Definition: Component.cpp:74
CMakePackageFinder.h
armarx::ObjectLocalizationSaliency::onConnectComponent
void onConnectComponent() override
Definition: ObjectLocalizationSaliency.cpp:81
armarx::ObjectLocalizationSaliency::onDeactivateAutomaticViewSelection
void onDeactivateAutomaticViewSelection(const Ice::Current &c=Ice::emptyCurrent) override
Definition: ObjectLocalizationSaliency.h:127
ARMARX_INFO
#define ARMARX_INFO
Definition: Logging.h:174
armarx::ArmarXDataPath::addDataPaths
static void addDataPaths(const std::string &dataPathList)
Definition: ArmarXDataPath.cpp:559
armarx::RemoteRobot::createLocalClone
VirtualRobot::RobotPtr createLocalClone()
Clones the structure of this remote robot to a local instance.
Definition: RemoteRobot.cpp:328
CIntensityNode::setIntensity
void setIntensity(float fIntensity)
Definition: IntensityGraph.cpp:42
IceUtil::Handle< class PropertyDefinitionContainer >
CGraphPyramidLookupTable::buildLookupTable
void buildLookupTable(CSphericalGraph *pGraph)
Definition: GraphPyramidLookupTable.cpp:58
CSphericalGraph::getNodes
TNodeList * getNodes()
Definition: SphericalGraph.cpp:162
armarx::ObjectLocalizationSaliency::onActivateAutomaticViewSelection
void onActivateAutomaticViewSelection(const Ice::Current &c=Ice::emptyCurrent) override
Definition: ObjectLocalizationSaliency.h:109
memoryx::EntityWrappers::ObjectRecognitionWrapper
Definition: ObjectRecognitionWrapper.h:40
armarx::ArmarXDataPath::getAbsolutePath
static bool getAbsolutePath(const std::string &relativeFilename, std::string &storeAbsoluteFilename, const std::vector< std::string > &additionalSearchPaths={}, bool verbose=true)
Definition: ArmarXDataPath.cpp:111
armarx::PeriodicTask
Definition: ArmarXManager.h:70
min
T min(T t1, T t2)
Definition: gdiam.h:42
armarx::handleExceptions
void handleExceptions()
Definition: Exception.cpp:141
armarx::PropertyDefinitionsPtr
IceUtil::Handle< class PropertyDefinitionContainer > PropertyDefinitionsPtr
PropertyDefinitions smart pointer type.
Definition: forward_declarations.h:34
MathTools::getDistanceOnArc
static float getDistanceOnArc(TSphereCoord p1, TSphereCoord p2)
Definition: MathTools.cpp:277
ArmarXDataPath.h
TSphereCoord
Definition: Structs.h:22
MathTools::convert
static void convert(TSphereCoord in, Eigen::Vector3d &out)
Definition: MathTools.cpp:401
armarx::ManagedIceObject::usingProxy
bool usingProxy(const std::string &name, const std::string &endpoints="")
Registers a proxy for retrieval after initialization and adds it to the dependency list.
Definition: ManagedIceObject.cpp:151
armarx
This file offers overloads of toIce() and fromIce() functions for STL container types.
Definition: ArmarXTimeserver.cpp:28
CIntensityGraph::graphToVec
void graphToVec(std::vector< float > &vec)
Definition: IntensityGraph.cpp:264