ObjectInstance.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 MemoryX::WorkingMemory
17 * @author ALexey Kozlov ( kozlov at kit dot edu), Kai Welke (welke at kit got edu)
18 * @date 2012
19 * @copyright http://www.gnu.org/licenses/gpl-2.0.txt
20 * GNU General Public License
21 */
22 
23 #include "ObjectInstance.h"
24 
26 
28 
29 #include <MemoryX/interface/observers/ObjectMemoryObserverInterface.h>
31 
32 namespace memoryx
33 {
34 
35  // ********************************************************************
36  // construction / destruction
37  // ********************************************************************
38  ObjectInstance::ObjectInstance(const std::string& name, const std::string& id) : Entity()
39  {
40  // set entity properties (TODO: maybe move to entity constructor)
41  setName(name);
42  setId(id);
43 
44  // initialize attributes
48  putAttribute(new EntityAttribute("priority"));
49  setLocalizationPriority(armarx::DEFAULT_VIEWTARGET_PRIORITY);
50 
51  EntityAttributePtr classNamesAttr = new EntityAttribute("classes");
52  putAttribute(classNamesAttr);
53 
54  motionModel = NULL;
55  }
56 
57  ObjectInstance::ObjectInstance(const ObjectInstance& source) :
58  IceUtil::Shared(source),
59  ::armarx::Serializable(source),
60  EntityBase(), // dont copy
61  ObjectInstanceBase(source),
62  Entity(source)
63  {
64  }
65 
66  // ********************************************************************
67  // attribute getters / setters
68  // ********************************************************************
69  float
70  ObjectInstance::getExistenceCertainty(const ::Ice::Current&) const
71  {
72  return getAttributeValue("existenceCertainty")->getFloat();
73  }
74 
75  void
76  ObjectInstance::setExistenceCertainty(float existenceCertainty, const ::Ice::Current&)
77  {
78  putAttribute("existenceCertainty", existenceCertainty);
79  }
80 
81  EntityAttributeBasePtr
83  {
84  return getAttribute("position");
85  }
86 
89  {
90  return armarx::FramedPositionPtr::dynamicCast(getPositionBase());
91  }
92 
93  void
94  ObjectInstance::setPosition(const armarx::FramedPositionBasePtr& position,
95  const ::Ice::Current&)
96  {
98  {
99  if (getPositionAttribute()->getUncertainty())
100  {
101  MultivariateNormalDistributionBasePtr uncertainty =
102  MultivariateNormalDistributionBasePtr::dynamicCast(
103  getPositionAttribute()->getUncertainty());
104  putAttribute("position", position);
105  getPositionAttribute()->setValueWithUncertainty(getPositionAttribute()->getValue(),
106  uncertainty);
107  }
108  else
109  {
110  putAttribute("position", position);
111  }
112  }
113  else
114  {
115  putAttribute("position", position);
116  }
117  }
118 
119  void
121  {
123  }
124 
125  void
126  ObjectInstance::setLocalizationTimestamp(const armarx::TimestampBasePtr& timestamp)
127  {
128  putAttribute("localizationTimestamp", timestamp);
129  }
130 
131  bool
133  {
134  return hasAttribute("localizationTimestamp");
135  }
136 
139  {
140  auto variant = getAttributeValue("localizationTimestamp");
141  ARMARX_CHECK_EXPRESSION(variant) << "no timestamp was set for this object pose";
142  auto timestamp = variant->get<armarx::TimestampVariant>();
143  return timestamp->toTime();
144  }
145 
146  int
147  ObjectInstance::getLocalizationPriority(const ::Ice::Current&) const
148  {
149  if (!hasAttribute("priority"))
150  {
151  return armarx::DEFAULT_VIEWTARGET_PRIORITY;
152  }
153  return getAttributeValue("priority")->getInt();
154  }
155 
156  void
157  ObjectInstance::setLocalizationPriority(Ice::Int priority, const ::Ice::Current&)
158  {
159  getAttribute("priority")->setValue(new armarx::Variant(priority));
160  }
161 
162  MultivariateNormalDistributionBasePtr
163  ObjectInstance::getPositionUncertainty(const ::Ice::Current&) const
164  {
165  return MultivariateNormalDistributionBasePtr::dynamicCast(
166  getPositionAttribute()->getUncertainty());
167  }
168 
169  void
170  ObjectInstance::setPositionUncertainty(const MultivariateNormalDistributionBasePtr& uncertainty,
171  const ::Ice::Current&)
172  {
173  getPositionAttribute()->setValueWithUncertainty(getPositionAttribute()->getValue(),
174  uncertainty);
175  ARMARX_DEBUG << "New position uncertainty mean: " << getPositionUncertainty()->getMean();
176  }
177 
178  EntityAttributeBasePtr
180  {
181  return getAttribute("orientation");
182  }
183 
186  {
187  return armarx::FramedOrientationPtr::dynamicCast(getOrientationBase());
188  }
189 
190  void
191  ObjectInstance::setOrientation(const armarx::FramedOrientationBasePtr& orientation,
192  const ::Ice::Current&)
193  {
194  putAttribute("orientation", orientation);
195  }
196 
199  {
200  auto pos = getPosition();
201  armarx::FramedPosePtr pose =
202  new armarx::FramedPose(pos, getOrientation(), pos->frame, pos->agent);
203  return pose;
204  }
205 
206  void
207  ObjectInstance::setPose(const armarx::FramedPoseBasePtr& newPose)
208  {
209  armarx::FramedPosePtr pose = armarx::FramedPosePtr::dynamicCast(newPose);
210  setPosition(pose->getPosition());
211  setOrientation(pose->getOrientation());
212  }
213 
214  ClassProbabilityMap
215  ObjectInstance::getClasses(const ::Ice::Current&) const
216  {
217  ClassProbabilityMap classes;
218 
219  EntityAttributeBasePtr attr = getAttribute("classes");
220  int numberValues = attr->size();
221 
222  std::pair<std::string, float> element;
223 
224  for (int v = 0; v < numberValues; v++)
225  {
226  element.first = attr->getValueAt(v)->getString();
227  element.second = DiscreteProbabilityBasePtr::dynamicCast(attr->getUncertaintyAt(v))
228  ->getProbability();
229 
230  classes.insert(element);
231  }
232 
233  return classes;
234  }
235 
236  void
237  ObjectInstance::setClass(const std::string& className, float probability, const Ice::Current&)
238  {
239  if (getClasses().size() == 1)
240  {
241  // Workaround: Don't change container size in case of container size one.
242  // Provents segfaults when other threads loop through the container
243  EntityAttributeBasePtr attr = getAttribute("classes");
244  attr->setValueWithUncertainty(
245  armarx::VariantPtr(new armarx::Variant(className)),
246  ProbabilityMeasureBasePtr(new DiscreteProbability(probability)));
247  }
248  else
249  {
250  clearClasses();
251  addClass(className, probability);
252  }
253  }
254 
255  void
256  ObjectInstance::addClass(const std::string& className, float probability, const Ice::Current&)
257  {
258  EntityAttributeBasePtr attr = getAttribute("classes");
259  attr->addValueWithUncertainty(
260  armarx::VariantPtr(new armarx::Variant(className)),
261  ProbabilityMeasureBasePtr(new DiscreteProbability(probability)));
262  }
263 
264  void
265  ObjectInstance::clearClasses(const Ice::Current&)
266  {
267  EntityAttributeBasePtr attr = getAttribute("classes");
268  attr->clear();
269  }
270 
271  // ********************************************************************
272  // special ObjectClass handling
273  // ********************************************************************
274  std::string
275  ObjectInstance::getMostProbableClass(const Ice::Current&) const
276  {
277  ClassProbabilityMap classes = getClasses();
278 
279  ClassProbabilityMap::const_iterator itMax = classes.end();
280 
281  for (ClassProbabilityMap::const_iterator it = classes.begin(); it != classes.end(); ++it)
282  if (itMax == classes.end() || it->second > itMax->second)
283  {
284  itMax = it;
285  }
286 
287  return (itMax != classes.end()) ? itMax->first : "";
288  }
289 
290  float
291  ObjectInstance::getClassProbability(const std::string& className, const Ice::Current&) const
292  {
293  ClassProbabilityMap classes = getClasses();
294  ClassProbabilityMap::const_iterator it = classes.find(className);
295 
296  if (it != classes.end())
297  {
298  return it->second;
299  }
300  else
301  {
302  return 0.;
303  }
304  }
305 
306  void
308  {
309  std::scoped_lock lock(wrappersMutex);
310  ARMARX_DEBUG_S << "New motion model is being set for " << this->getName() << ": "
311  << motionModel->getMotionModelName();
312  this->motionModel = motionModel;
313  }
314 
317  {
318  std::scoped_lock lock(wrappersMutex);
319  return motionModel;
320  }
321 
324  {
325  return this->clone();
326  }
327 
329  ObjectInstance::clone(const Ice::Current& c) const
330  {
332  {
333  std::shared_lock lock1(entityMutex);
334  std::scoped_lock lock2(attributesMutex);
335  std::scoped_lock lock3(wrappersMutex);
336  ret = new ObjectInstance(*this);
337  ret->motionModel = this->motionModel;
338  }
339  // ret->deepCopy(*this);
340  return ret;
341  }
342 
343  // ********************************************************************
344  // i / o
345  // ********************************************************************
346  void
347  ObjectInstance::output(std::ostream& stream) const
348  {
349  Entity::output(stream);
350  }
351 
352  // ********************************************************************
353  // protected members (Ice interface methods overwritten by c++ implementation)
354  // ********************************************************************
355  armarx::FramedPositionBasePtr
356  ObjectInstance::getPositionBase(const ::Ice::Current&) const
357  {
358  return armarx::VariantPtr::dynamicCast(getPositionAttribute()->getValue())
359  ->getClass<armarx::FramedPositionBase>();
360  }
361 
362  armarx::FramedOrientationBasePtr
363  ObjectInstance::getOrientationBase(const ::Ice::Current&) const
364  {
365  return armarx::VariantPtr::dynamicCast(getOrientationAttribute()->getValue())
366  ->getClass<armarx::FramedOrientationBase>();
367  }
368 
369  ObjectInstance::ObjectInstance()
370  {
371  }
372 
373 } // namespace memoryx
memoryx::ObjectInstance::hasLocalizationTimestamp
bool hasLocalizationTimestamp() const
Definition: ObjectInstance.cpp:132
armarx::Variant
The Variant class is described here: Variants.
Definition: Variant.h:223
memoryx::ObjectInstance::setLocalizationPriority
void setLocalizationPriority(Ice::Int priority, const ::Ice::Current &=Ice::emptyCurrent) override
Definition: ObjectInstance.cpp:157
armarx::aron::ret
ReaderT::InputType T & ret
Definition: rw.h:13
memoryx::ObjectInstance::getOrientation
armarx::FramedOrientationPtr getOrientation() const
Retrieve orientation of the instance.
Definition: ObjectInstance.cpp:185
memoryx::Entity::putAttribute
void putAttribute(const ::memoryx::EntityAttributeBasePtr &attr, const ::Ice::Current &=Ice::emptyCurrent) override
Store attribute in entity.
Definition: Entity.cpp:347
memoryx::Entity::getName
::std::string getName(const ::Ice::Current &=Ice::emptyCurrent) const override
Retrieve name of this entity.
Definition: Entity.cpp:181
armarx::VariantType::FramedPose
const VariantTypeId FramedPose
Definition: FramedPose.h:36
memoryx::Entity::getAttribute
EntityAttributeBasePtr getAttribute(const ::std::string &attrName, const ::Ice::Current &=Ice::emptyCurrent) const override
Retrieve attribute from entity.
Definition: Entity.cpp:311
memoryx::ObjectInstance::getExistenceCertainty
float getExistenceCertainty(const ::Ice::Current &=Ice::emptyCurrent) const override
Retrieve existence certainty for this instance.
Definition: ObjectInstance.cpp:70
armarx::TimestampVariant
Definition: TimestampVariant.h:54
AbstractObjectSerializer.h
memoryx
VirtualRobot headers.
Definition: CommonPlacesTester.cpp:48
c
constexpr T c
Definition: UnscentedKalmanFilterTest.cpp:46
memoryx::ObjectInstance::getPositionAttribute
EntityAttributeBasePtr getPositionAttribute() const
Retrieve attribute which holds instance position.
Definition: ObjectInstance.cpp:82
memoryx::ObjectInstance
Definition: ObjectInstance.h:48
memoryx::ObjectInstance::setLocalizationTimestamp
void setLocalizationTimestamp(const IceUtil::Time &timestamp)
Definition: ObjectInstance.cpp:120
memoryx::ObjectInstance::setPose
void setPose(const armarx::FramedPoseBasePtr &newPose)
Convenience function to set position and orientation attributes at once.
Definition: ObjectInstance.cpp:207
IceUtil
Definition: Instance.h:21
memoryx::ObjectInstance::setMotionModel
void setMotionModel(AbstractMotionModelPtr motionModel)
Set the motion model for this object.
Definition: ObjectInstance.cpp:307
memoryx::ObjectInstance::getPositionUncertainty
MultivariateNormalDistributionBasePtr getPositionUncertainty(const ::Ice::Current &=Ice::emptyCurrent) const override
Get uncertainty of position estimate.
Definition: ObjectInstance.cpp:163
memoryx::Entity::output
void output(std::ostream &stream) const
Definition: Entity.cpp:436
memoryx::Entity::getAttributeValue
virtual armarx::VariantPtr getAttributeValue(const ::std::string &attrName) const
Retrieve value of an attribute from entity.
Definition: Entity.cpp:327
memoryx::ObjectInstance::getClasses
ClassProbabilityMap getClasses(const ::Ice::Current &=Ice::emptyCurrent) const override
Retrieve classes and associated class membership probability for this instance.
Definition: ObjectInstance.cpp:215
memoryx::ObjectInstance::getMotionModel
AbstractMotionModelPtr getMotionModel() const
Definition: ObjectInstance.cpp:316
memoryx::ObjectInstance::getLocalizationPriority
int getLocalizationPriority(const ::Ice::Current &=Ice::emptyCurrent) const override
Definition: ObjectInstance.cpp:147
IceInternal::Handle
Definition: forward_declarations.h:8
memoryx::ObjectInstance::addClass
void addClass(const std::string &className, float probability, const Ice::Current &=Ice::emptyCurrent) override
Adds new class membership to the class attribute.
Definition: ObjectInstance.cpp:256
memoryx::ObjectInstance::setPositionUncertainty
void setPositionUncertainty(const MultivariateNormalDistributionBasePtr &uncertainty, const ::Ice::Current &=Ice::emptyCurrent) override
Set uncertainty of position estimate.
Definition: ObjectInstance.cpp:170
ViewSelection.h
memoryx::ObjectInstance::getPosition
armarx::FramedPositionPtr getPosition() const
Retrieve position of the instance.
Definition: ObjectInstance.cpp:88
ARMARX_DEBUG_S
#define ARMARX_DEBUG_S
Definition: Logging.h:205
memoryx::Entity::attributesMutex
std::mutex attributesMutex
Definition: Entity.h:524
ARMARX_DEBUG
#define ARMARX_DEBUG
Definition: Logging.h:184
armarx::FramedPosition
The FramedPosition class.
Definition: FramedPose.h:157
memoryx::ObjectInstance::setClass
void setClass(const std::string &className, float probability, const Ice::Current &=Ice::emptyCurrent) override
Set the class attribute of the ObjectInstance.
Definition: ObjectInstance.cpp:237
memoryx::ObjectInstance::getLocalizationTimestamp
IceUtil::Time getLocalizationTimestamp() const
Definition: ObjectInstance.cpp:138
timestamp
std::string timestamp()
Definition: CartographerAdapter.cpp:85
memoryx::ObjectInstance::clearClasses
void clearClasses(const Ice::Current &=Ice::emptyCurrent) override
Clear class membership.
Definition: ObjectInstance.cpp:265
memoryx::ObjectInstance::motionModel
AbstractMotionModelPtr motionModel
Definition: ObjectInstance.h:232
armarx::FramedOrientation
The FramedOrientation class.
Definition: FramedPose.h:215
memoryx::ObjectInstance::setPosition
void setPosition(const armarx::FramedPositionBasePtr &position, const ::Ice::Current &=Ice::emptyCurrent) override
Set position of the instance.
Definition: ObjectInstance.cpp:94
memoryx::ObjectInstance::getMostProbableClass
::std::string getMostProbableClass(const ::Ice::Current &=Ice::emptyCurrent) const override
Retrieve the class with highest membership probability.
Definition: ObjectInstance.cpp:275
boost::source
Vertex source(const detail::edge_base< Directed, Vertex > &e, const PCG &)
Definition: point_cloud_graph.h:661
memoryx::Entity::setId
void setId(const ::std::string &id, const ::Ice::Current &=Ice::emptyCurrent) override
Set id of this entity.
Definition: Entity.cpp:174
armarx::armem::Time
armarx::core::time::DateTime Time
Definition: forward_declarations.h:13
memoryx::ObjectInstance::getPose
armarx::FramedPosePtr getPose() const
Convenience function to get position and orientation attributes at once.
Definition: ObjectInstance.cpp:198
memoryx::ObjectInstance::getOrientationBase
armarx::FramedOrientationBasePtr getOrientationBase(const ::Ice::Current &=Ice::emptyCurrent) const override
Definition: ObjectInstance.cpp:363
armarx::ctrlutil::v
double v(double t, double v0, double a0, double j)
Definition: CtrlUtil.h:39
ObjectInstance.h
ARMARX_CHECK_EXPRESSION
#define ARMARX_CHECK_EXPRESSION(expression)
This macro evaluates the expression and if it turns out to be false it will throw an ExpressionExcept...
Definition: ExpressionException.h:73
AbstractMotionModel.h
memoryx::ObjectInstance::getOrientationAttribute
EntityAttributeBasePtr getOrientationAttribute() const
Retrieve attribute which holds instance position.
Definition: ObjectInstance.cpp:179
memoryx::Entity::entityMutex
std::shared_mutex entityMutex
Definition: Entity.h:525
memoryx::Entity::hasAttribute
bool hasAttribute(const ::std::string &attrName, const ::Ice::Current &=Ice::emptyCurrent) const override
Check whether this entity has an attribute with the given name.
Definition: Entity.cpp:361
memoryx::ObjectInstance::setExistenceCertainty
void setExistenceCertainty(float existenceCertainty, const ::Ice::Current &=Ice::emptyCurrent) override
Set existence certainty for this instance.
Definition: ObjectInstance.cpp:76
memoryx::ObjectInstance::ice_clone
Ice::ObjectPtr ice_clone() const override
Definition: ObjectInstance.cpp:323
memoryx::EntityAttribute
Attribute of MemoryX entities.
Definition: EntityAttribute.h:49
armarx::VariantType::Int
const VariantTypeId Int
Definition: Variant.h:917
memoryx::ObjectInstance::clone
ObjectInstancePtr clone(const Ice::Current &c=Ice::emptyCurrent) const
Definition: ObjectInstance.cpp:329
armarx::aron::type::ObjectPtr
std::shared_ptr< Object > ObjectPtr
Definition: Object.h:36
memoryx::ObjectInstance::getPositionBase
armarx::FramedPositionBasePtr getPositionBase(const ::Ice::Current &=Ice::emptyCurrent) const override
Definition: ObjectInstance.cpp:356
memoryx::Entity
Definition: Entity.h:245
armarx::VariantType::DiscreteProbability
const armarx::VariantTypeId DiscreteProbability
Definition: ProbabilityMeasures.h:34
memoryx::ObjectInstance::setOrientation
void setOrientation(const armarx::FramedOrientationBasePtr &orientation, const ::Ice::Current &=Ice::emptyCurrent) override
Set orientation of the instance.
Definition: ObjectInstance.cpp:191
memoryx::Entity::setName
void setName(const ::std::string &name, const ::Ice::Current &=Ice::emptyCurrent) override
Set name of this entity.
Definition: Entity.cpp:188
memoryx::Entity::wrappersMutex
std::recursive_mutex wrappersMutex
Definition: Entity.h:526
armarx
This file offers overloads of toIce() and fromIce() functions for STL container types.
Definition: ArmarXTimeserver.cpp:27
memoryx::ObjectInstance::getClassProbability
float getClassProbability(const ::std::string &className, const ::Ice::Current &=Ice::emptyCurrent) const override
Retrieve membership probability for a given class.
Definition: ObjectInstance.cpp:291