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
32namespace 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
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
124
125 void
127 {
128 putAttribute("localizationTimestamp", timestamp);
129 }
130
131 bool
133 {
134 return hasAttribute("localizationTimestamp");
135 }
136
137 IceUtil::Time
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();
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
322 Ice::ObjectPtr
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
370 {
371 }
372
373} // namespace memoryx
std::string timestamp()
constexpr T c
The FramedOrientation class.
Definition FramedPose.h:216
The FramedPose class.
Definition FramedPose.h:281
The FramedPosition class.
Definition FramedPose.h:158
Implements a Variant type for timestamps.
The Variant class is described here: Variants.
Definition Variant.h:224
The DiscreteProbability class.
Attribute of MemoryX entities.
void setId(const ::std::string &id, const ::Ice::Current &=Ice::emptyCurrent) override
Set id of this entity.
Definition Entity.cpp:174
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
EntityAttributeBasePtr getAttribute(const ::std::string &attrName, const ::Ice::Current &=Ice::emptyCurrent) const override
Retrieve attribute from entity.
Definition Entity.cpp:311
void setName(const ::std::string &name, const ::Ice::Current &=Ice::emptyCurrent) override
Set name of this entity.
Definition Entity.cpp:188
Entity(const Entity &source)
Definition Entity.cpp:34
virtual armarx::VariantPtr getAttributeValue(const ::std::string &attrName) const
Retrieve value of an attribute from entity.
Definition Entity.cpp:327
std::mutex attributesMutex
Definition Entity.h:524
std::recursive_mutex wrappersMutex
Definition Entity.h:526
void output(std::ostream &stream) const
Definition Entity.cpp:436
void putAttribute(const ::memoryx::EntityAttributeBasePtr &attr, const ::Ice::Current &=Ice::emptyCurrent) override
Store attribute in entity.
Definition Entity.cpp:347
::std::string getName(const ::Ice::Current &=Ice::emptyCurrent) const override
Retrieve name of this entity.
Definition Entity.cpp:181
std::shared_mutex entityMutex
Definition Entity.h:525
void setMotionModel(AbstractMotionModelPtr motionModel)
Set the motion model for this object.
int getLocalizationPriority(const ::Ice::Current &=Ice::emptyCurrent) const override
void setOrientation(const armarx::FramedOrientationBasePtr &orientation, const ::Ice::Current &=Ice::emptyCurrent) override
Set orientation of the instance.
void setPositionUncertainty(const MultivariateNormalDistributionBasePtr &uncertainty, const ::Ice::Current &=Ice::emptyCurrent) override
Set uncertainty of position estimate.
EntityAttributeBasePtr getOrientationAttribute() const
Retrieve attribute which holds instance position.
armarx::FramedPosePtr getPose() const
Convenience function to get position and orientation attributes at once.
armarx::FramedOrientationPtr getOrientation() const
Retrieve orientation of the instance.
armarx::FramedPositionPtr getPosition() const
Retrieve position of the instance.
void setClass(const std::string &className, float probability, const Ice::Current &=Ice::emptyCurrent) override
Set the class attribute of the ObjectInstance.
bool hasLocalizationTimestamp() const
armarx::FramedPositionBasePtr getPositionBase(const ::Ice::Current &=Ice::emptyCurrent) const override
void setExistenceCertainty(float existenceCertainty, const ::Ice::Current &=Ice::emptyCurrent) override
Set existence certainty for this instance.
AbstractMotionModelPtr motionModel
void addClass(const std::string &className, float probability, const Ice::Current &=Ice::emptyCurrent) override
Adds new class membership to the class attribute.
void clearClasses(const Ice::Current &=Ice::emptyCurrent) override
Clear class membership.
float getExistenceCertainty(const ::Ice::Current &=Ice::emptyCurrent) const override
Retrieve existence certainty for this instance.
void setPose(const armarx::FramedPoseBasePtr &newPose)
Convenience function to set position and orientation attributes at once.
void setPosition(const armarx::FramedPositionBasePtr &position, const ::Ice::Current &=Ice::emptyCurrent) override
Set position of the instance.
AbstractMotionModelPtr getMotionModel() const
armarx::FramedOrientationBasePtr getOrientationBase(const ::Ice::Current &=Ice::emptyCurrent) const override
::std::string getMostProbableClass(const ::Ice::Current &=Ice::emptyCurrent) const override
Retrieve the class with highest membership probability.
void setLocalizationPriority(Ice::Int priority, const ::Ice::Current &=Ice::emptyCurrent) override
void setLocalizationTimestamp(const IceUtil::Time &timestamp)
Ice::ObjectPtr ice_clone() const override
ObjectInstance(const std::string &name, const std::string &id="")
Constructs a new ObjectInstance WorkingMemory entity.
MultivariateNormalDistributionBasePtr getPositionUncertainty(const ::Ice::Current &=Ice::emptyCurrent) const override
Get uncertainty of position estimate.
EntityAttributeBasePtr getPositionAttribute() const
Retrieve attribute which holds instance position.
ObjectInstancePtr clone(const Ice::Current &c=Ice::emptyCurrent) const
float getClassProbability(const ::std::string &className, const ::Ice::Current &=Ice::emptyCurrent) const override
Retrieve membership probability for a given class.
ClassProbabilityMap getClasses(const ::Ice::Current &=Ice::emptyCurrent) const override
Retrieve classes and associated class membership probability for this instance.
IceUtil::Time getLocalizationTimestamp() const
#define ARMARX_CHECK_EXPRESSION(expression)
This macro evaluates the expression and if it turns out to be false it will throw an ExpressionExcept...
#define ARMARX_DEBUG_S
The logging level for output that is only interesting while debugging.
Definition Logging.h:205
#define ARMARX_DEBUG
The logging level for output that is only interesting while debugging.
Definition Logging.h:184
This file offers overloads of toIce() and fromIce() functions for STL container types.
IceInternal::Handle< Variant > VariantPtr
Definition Variant.h:41
IceInternal::Handle< FramedPosition > FramedPositionPtr
Definition FramedPose.h:149
IceInternal::Handle< FramedOrientation > FramedOrientationPtr
Definition FramedPose.h:207
IceInternal::Handle< FramedPose > FramedPosePtr
Definition FramedPose.h:272
VirtualRobot headers.
IceInternal::Handle< EntityAttribute > EntityAttributePtr
Typedef of EntityAttributePtr as IceInternal::Handle<EntityAttribute> for convenience.
IceInternal::Handle< ObjectInstance > ObjectInstancePtr
IceInternal::Handle< AbstractMotionModel > AbstractMotionModelPtr