MotionModelKBM.cpp
Go to the documentation of this file.
1 /*
2  * This file is part of ArmarX.
3  *
4  * Copyright (C) 2011-2016, High Performance Humanoid Technologies (H2T), Karlsruhe Institute of Technology (KIT), all rights reserved.
5  *
6  * ArmarX is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation.
9  *
10  * ArmarX is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program. If not, see <http://www.gnu.org/licenses/>.
17  *
18  * @package
19  * @author
20  * @date
21  * @copyright http://www.gnu.org/licenses/gpl-2.0.txt
22  * GNU General Public License
23  */
24 
25 #include "MotionModelKBM.h"
28 
29 #include <VirtualRobot/LinkedCoordinate.h>
30 
32 #include <VirtualRobot/RobotNodeSet.h>
33 #include <VirtualRobot/Robot.h>
34 
35 using namespace VirtualRobot;
36 
37 namespace memoryx
38 {
39  MotionModelKBM::MotionModelKBM(std::string referenceNodeName, std::string nodeSetName,
40  armarx::RobotStateComponentInterfacePrx robotStateProxy, memoryx::LongtermMemoryInterfacePrx longtermMemory): AbstractMotionModel(robotStateProxy)
41  {
42  this->nodeSetName = nodeSetName;
43  this->referenceNodeName = referenceNodeName;
44 
45  this->longtermMemory = longtermMemory;
46  memoryName = robotStateProxy->getRobotName() + "_" + referenceNodeName + "_" + nodeSetName;
48  init();
49  }
50 
51  void MotionModelKBM::setPoseAtLastLocalisation(const armarx::LinkedPoseBasePtr& poseAtLastLocalization, const armarx::PoseBasePtr& globalRobotPoseAtLastLocalization,
52  const MultivariateNormalDistributionBasePtr& uncertaintyAtLastLocalization, const Ice::Current& c)
53  {
54  std::unique_lock lock(motionPredictionLock);
55  this->poseAtLastLocalization = poseAtLastLocalization;
56  timeOfLastSuccessfulLocalization = armarx::TimestampVariantPtr::dynamicCast(timeOfLastLocalizationStart->clone());
57 
58  if (globalRobotPoseAtLastLocalization)
59  {
60  this->globalRobotPoseAtLastLocalization = globalRobotPoseAtLastLocalization;
61  }
62 
63  if (uncertaintyAtLastLocalization)
64  {
65  this->uncertaintyAtLastLocalization = uncertaintyAtLastLocalization;
66  }
67 
68  armarx::LinkedPosePtr pose = armarx::LinkedPosePtr::dynamicCast(poseAtLastLocalization);
69 
70  pose->changeFrame(referenceNodeName);
71  auto poseKBM = armarx::LinkedPosePtr::dynamicCast(pose->clone());
72  poseKBM->changeFrame(robot->getRobotNodeSet(nodeSetName)->getKinematicRoot()->getName());
73 
74  KBM::Matrix shape = poseKBM->toEigen().block<3, 1>(0, 3).cast<double>();
75  // shape.conservativeResize(3, 1);
76 
77  kbm->online(this->getJointAngles(poseAtLastLocalization->referenceRobot).cast<double>(), shape);
78 
79  }
80 
82  {
83  std::unique_lock lock(motionPredictionLock);
84  armarx::LinkedPosePtr linkedPose = armarx::LinkedPosePtr::dynamicCast(poseAtLastLocalization);
85 
86  //auto snapshot = robotStateProxy->getRobotSnapshot(robotStateProxy->getSynchronizedRobot()->getName());
87 
88  auto snapShot = robotStateProxy->getRobotSnapshot(robot->getName());
89  Eigen::MatrixXd jointAngles = this->getJointAngles(snapShot).cast<double>()/*.colwise().reverse().reverse()*/;
91  auto time = IceUtil::Time::now();
92  Eigen::Vector3f kbmPos = this->kbm->predict(jointAngles).cast<float>();
93  ARMARX_DEBUG_S << "KBM prediction Took: " << (IceUtil::Time::now() - time).toMilliSecondsDouble() << " ms";
94  auto nodeSet = robot->getRobotNodeSet(nodeSetName);
95  Eigen::Matrix4f pose = nodeSet->getTCP()->getGlobalPose();
96  armarx::FramedPosition framedKbmPos(kbmPos, nodeSet->getKinematicRoot()->getName(), linkedPose->agent);
97  framedKbmPos.changeToGlobal(robot);
98  ARMARX_DEBUG_S << pose.block<3, 1>(0, 3) << " vs. " << framedKbmPos.toEigen();
99  ARMARX_DEBUG_S << "Difference between KBM and robot model: " << (pose.block<3, 1>(0, 3) - framedKbmPos.toEigen()).norm() << " mm";
100  pose.block<3, 1>(0, 3) = framedKbmPos.toEigen();
101  //shape.conservativeResize(4, 4);
102  // FramedPose framedPose(pose, nodeSet->getKinematicRoot()->getName(), linkedPose->agent);
104  return ret;
105 
106  }
107 
109  {
111  Eigen::MatrixXf proprioception(nDoF, 1);
112  std::vector<float> jointAngles = robot->getRobotNodeSet(nodeSetName)->getJointValues();
113  ARMARX_CHECK_EXPRESSION(nDoF == (int)jointAngles.size());
114  for (int i = 0; i < nDoF; i++)
115  {
116  proprioception(i, 0) = jointAngles[i];
117  }
118 
119  return proprioception;
120  }
121 
123  {
124  ARMARX_INFO_S << "KBM Database update";
125 
126 
127  if (longtermMemory)
128  {
129  auto kbmSeg = longtermMemory->getKBMSegment();
130  std::unique_lock lock(motionPredictionLock);
131 
132 
133 
134  if (kbmSeg)
135  {
136  if (kbmSeg->hasEntityByName(memoryName))
137  {
138  auto entity = kbmSeg->getEntityByName(memoryName);
139  KBMDataPtr kbmData = KBMDataPtr::dynamicCast(entity);
140 
141  if (kbmData)
142  {
143  if (kbm)
144  {
145  kbmData->setControlNet(new armarx::MatrixVariant(kbm->getControlNet()));
146  kbmSeg->updateEntity(kbmData->getId(), kbmData);
147  }
148  else
149  {
150  ARMARX_WARNING_S << "No KBM!";
151  }
152  }
153  else
154  {
155  ARMARX_WARNING_S << "Entity is not KBMData. MemoryName: " << memoryName << " Entity ice_id:" << entity->ice_id();
156  }
157 
158  }
159  else
160  {
161  if (kbm)
162  {
163  KBMDataPtr kbmData = KBMDataPtr(new KBMData(new armarx::MatrixVariant(kbm->getControlNet()), nodeSetName, referenceNodeName, robotStateProxy->getRobotName()));
164  ARMARX_INFO_S << "Adding new kbm with name " << kbmData->getName();
165  kbmSeg->addEntity(kbmData);
166  }
167  else
168  {
169  ARMARX_WARNING_S << "No KBM!";
170  }
171 
172  }
173  }
174  else
175  {
176  ARMARX_WARNING_S << "No KBM Segment!";
177  }
178  }
179  }
180 
181  void MotionModelKBM::init()
182  {
183  ARMARX_DEBUG << "init";
184  //armarx::SharedRobotInterfacePrx currentRobotSnapshot = ;//getRobotSnapshot("KBMSnapshot");
185  robot = armarx::RemoteRobot::createLocalCloneFromFile(this->robotStateProxy);
186 
187  nDoF = robot->getRobotNodeSet(this->nodeSetName)->getSize();
188 
189  auto kbmSeg = longtermMemory->getKBMSegment();
190  std::unique_lock lock(motionPredictionLock);
191 
193  if (kbmSeg && kbmSeg->hasEntityByName(memoryName))
194  {
195  ARMARX_VERBOSE << "Fetching KBM from memory";
196  auto entity = kbmSeg->getEntityByName(memoryName);
197  KBMDataPtr kbmData = KBMDataPtr::dynamicCast(entity);
198 
199  if (kbmData)
200  {
201 
202  armarx::MatrixVariantPtr controlNet = armarx::MatrixVariantPtr::dynamicCast(kbmData->getControlNet());
203 
204  this->kbm = KBM::Models::KBM::createKBM(nDoF, controlNet->rows, Eigen::VectorXd::Zero(nDoF), Eigen::VectorXd::Constant(nDoF, M_PI / 4.0f), controlNet->toEigen().cast<double>());
205  }
206  else
207  {
208  ARMARX_WARNING_S << "Entity is not KBMData. MemoryName: " << memoryName << " Entity ice_id:" << entity->ice_id();
209  }
210 
211  // get file from long-term memory and store in name in
212  //std::string tempFileName;
213  //this->kbm.reset(new KBM::Models::KBM(nDoF,16,M_PI/4.0f));
214  //this->kbm->restore(tempFileName);
215  }
216  else
217  {
218  // If longtermmemory = empty
219  ARMARX_VERBOSE << "Longterm memory empty";
220 
221  try
222  {
223 
224  auto nodeSet = robot->getRobotNodeSet(nodeSetName);
226  nodeSet,
227  nodeSet->getKinematicRoot());
228  KBMDataPtr kbmData = new KBMData(new armarx::MatrixDouble(kbm->getControlNet()), nodeSetName,
229  referenceNodeName,
230  robot->getName());
231  kbmSeg->addEntity(kbmData);
232  ARMARX_VERBOSE << "Adding new entity with name " << kbmData->getName();
233  // this->kbm = KBM::Models::KBM::createFromVirtualRobot(chain, FoR, Eigen::VectorXd::Constant(nDoF, M_PI / 4.0), false);
234  }
235  catch (VirtualRobot::VirtualRobotException& e)
236  {
237  ARMARX_ERROR_S << "KBM creation exception. " << e.what();
238 
239  /*
240  * Probably an invalid Kinematic chain.
241  * Throw an adequate exception here!
242  */
243  }
244  }
245 
246 
247 
249 
250  if (longtermMemory)
251  {
253  updaterThreadTask->start();
254  }
255  }
256 
258  {
259  ARMARX_INFO_S << "Starting to generate KBM with random samples for nodeset " << nodeSet->getName();
260  nodeSet->print();
262  // KBMComponentInterfacePrx kbmComponent = getKbmComponent();
263  std::vector<RobotNodePtr> nodes = nodeSet->getAllRobotNodes();
264  RobotNodePtr root = nodeSet->getKinematicRoot();
265  RobotNodePtr TCP = nodeSet->getTCP();
266  size_t nJoints = nodes.size();
267  size_t nOutputDim = 3;
268  Eigen::VectorXf jointMin = Eigen::VectorXf::Zero(nJoints, 1);
269  Eigen::VectorXf jointMax = Eigen::VectorXf::Zero(nJoints, 1);
270 
271  for (size_t i = 0; i < nJoints; i++)
272  {
273  RobotNodePtr n = nodes[i];
274  jointMax(i) = n->getJointLimitHi() - 0.1f;
275  jointMin(i) = n->getJointLimitLo() + 0.1f;
276  }
277 
278  // if(kbmComponent->isInMemory(in.getnodeSetName(),root->getName(),robot->getName()))
279  // {
280  // ARMARX_INFO << "Loading KBM from memory";
281  // kbmComponent->restoreFromMemory(in.getkbmName(),in.getnodeSetName(),root->getName(), robot->getName());
282  // }
283  // else
284  // {
285  // ARMARX_INFO << "KBM not found in memory. Batch training KBM.";
286 
287  size_t nTrainingSamples = (size_t)pow(nOutputDim, nJoints);
288  kbm.reset(new memoryx::KBM::Models::KBM(nJoints, nOutputDim, M_PI / 4.0f));
289  std::vector<memoryx::KBM::Real> proprioceptionAccumulator;
290  std::vector<memoryx::KBM::Real> positionAccumulator;
291  ARMARX_INFO_S << VAROUT(nTrainingSamples);
292  for (size_t i = 0; i < nTrainingSamples; i++)
293  {
294  Ice::DoubleSeq proprioception, pos;
295 
296  CreateSample(nodeSet, jointMax, jointMin, root, TCP, proprioception, pos);
297 
298  proprioceptionAccumulator.insert(proprioceptionAccumulator.end(), proprioception.begin(), proprioception.end());
299  positionAccumulator.insert(positionAccumulator.end(), pos.begin(), pos.end());
300  }
301  auto mapVectorToMatrix = [](const std::vector<memoryx::KBM::Real>& vec, size_t rows)
302  {
303  size_t cols = vec.size() / rows;
304  return Eigen::Map<const memoryx::KBM::Matrix>(vec.data(), rows, cols);
305  };
306 
307  kbm->batch(mapVectorToMatrix(proprioceptionAccumulator, nJoints),
308  mapVectorToMatrix(positionAccumulator, nOutputDim), KBM::Models::KBM::STANDARD, 0.0f);
309  // kbmComponent->createKBM(in.getkbmName(), nJoints, 3, M_PI/4.0f);
310  // kbmComponent->batchAccumulator(in.getkbmName(),0,0.0f);
311  // kbmComponent->storeToMemory(in.getkbmName(),in.getnodeSetName(),root->getName(), robot->getName());
312 
313  // kbmComponent->printAccumulatorStatistics(3, nJoints);
314  // kbmComponent->printErrorsAccumulator(in.getkbmName());
315  // kbmComponent->clearAccumulators();
316  // }
317 
318 
319  // unsigned int nEvaluationSamples = (int)pow(nOutputDim, nJoints) / 20;
320  // proprioceptionAccumulator.clear();
321  // positionAccumulator.clear();
322  // for (size_t i = 0; i < nEvaluationSamples; i++)
323  // {
324  // Ice::DoubleSeq prop, pos;
325 
326  // CreateSample(nodeSet, jointMax, jointMin, root, TCP, prop, pos);
327  // proprioceptionAccumulator.insert(proprioceptionAccumulator.end(), prop.begin(), prop.end());
328  // positionAccumulator.insert(positionAccumulator.end(), pos.begin(), pos.end());
329  // ARMARX_INFO_S << "Error: " << (kbm->predict(mapVectorToMatrix(prop, nJoints)) - mapVectorToMatrix(pos, nOutputDim)).norm() << " mm";
330  // }
331  // auto errors = kbm->getErrors(mapVectorToMatrix(proprioceptionAccumulator, nJoints),
332  // mapVectorToMatrix(positionAccumulator, nOutputDim));
333  // ARMARX_INFO_S << "Errors: " << errors;
334  ARMARX_INFO_S << "DONE";
335 
336  return kbm;
337 
338 
339  }
340 
341 
342 
343  memoryx::MultivariateNormalDistributionBasePtr MotionModelKBM::getUncertaintyInternal()
344  {
345  if (uncertaintyAtLastLocalization)
346  {
347  auto handNodeName = robot->getRobotNodeSet(nodeSetName)->getTCP()->getName();
348  armarx::PosePtr oldHandNodePose = armarx::PosePtr::dynamicCast(poseAtLastLocalization->referenceRobot->getRobotNode(handNodeName)->getPoseInRootFrame());
349  armarx::PosePtr newHandNodePose = armarx::PosePtr::dynamicCast(robotStateProxy->getSynchronizedRobot()->getRobotNode(handNodeName)->getPoseInRootFrame());
350 
351  // additional uncertainty is 0.07 * the distance that the hand moved since the last localization
352  float dist = (oldHandNodePose->toEigen().block<3, 1>(0, 3) - newHandNodePose->toEigen().block<3, 1>(0, 3)).norm();
353  dist *= 0.3;
354  Eigen::Matrix3f additionalUncertainty = dist * dist * Eigen::Matrix3f::Identity();
355 
356  Eigen::Matrix3f oldUncertainty = MultivariateNormalDistributionPtr::dynamicCast(uncertaintyAtLastLocalization)->toEigenCovariance();
357  Eigen::Matrix3f newUncertainty = oldUncertainty + additionalUncertainty;
358 
359  return new MultivariateNormalDistribution(armarx::Vector3Ptr::dynamicCast(poseAtLastLocalization->position)->toEigen(), newUncertainty);
360  }
361  else
362  {
363  return NULL;
364  }
365  }
366 
368  {
369  init();
370  }
371 
372  void MotionModelKBM::CreateSample(RobotNodeSetPtr nodeSet, Eigen::VectorXf jointMax, Eigen::VectorXf jointMin, RobotNodePtr root, RobotNodePtr TCP, Ice::DoubleSeq& prop, Ice::DoubleSeq& shape)
373  {
374  unsigned int nJoints = nodeSet->getSize();
375  Eigen::VectorXf rnd = Eigen::VectorXf::Random(nJoints, 1);
376  Eigen::VectorXf sample = (rnd + Eigen::VectorXf::Ones(nJoints, 1)).cwiseProduct((jointMax - jointMin) / 2) + jointMin;
377 
378  for (size_t k = 0; k < nJoints; k++)
379  {
380  nodeSet->getNode(k)->setJointValue(sample(k));
381  }
382  std::vector<float> actualJointValues = nodeSet->getJointValues();
383  // for (size_t l = 0; l < nJoints; l++)
384  // {
385  // actualJointValues.push_back(nodeSet->getNode(l)->getJointValue());
386  // }
387 
388  Eigen::Vector3f tcpPos = TCP->getTransformationFrom(root).block<3, 1>(0, 3);
389 
390  for (size_t j = 0; j < nJoints; j++)
391  {
392  prop.push_back(actualJointValues[j]);
393  }
394 
395  assert(tcpPos.rows() >= 0);
396  for (size_t k = 0; k < static_cast<std::size_t>(tcpPos.rows()); k++)
397  {
398  shape.push_back(tcpPos(k));
399  }
400  }
401 
402 
403 }
RemoteRobot.h
ARMARX_VERBOSE
#define ARMARX_VERBOSE
Definition: Logging.h:180
ARMARX_IMPORTANT_S
#define ARMARX_IMPORTANT_S
Definition: Logging.h:203
armarx::MatrixDouble
The MatrixDouble class.
Definition: MatrixVariant.h:114
armarx::aron::ret
ReaderT::InputType T & ret
Definition: rw.h:21
memoryx::KBM::Models::KBM_ptr
std::shared_ptr< KBM > KBM_ptr
Definition: kbm.h:68
memoryx::KBMDataPtr
IceInternal::Handle< KBMData > KBMDataPtr
Definition: KBMData.h:71
memoryx::KBM::Matrix
Eigen::MatrixXd Matrix
Definition: kbm.h:38
armarx::RemoteRobot::synchronizeLocalClone
static bool synchronizeLocalClone(VirtualRobot::RobotPtr robot, RobotStateComponentInterfacePrx robotStatePrx)
Definition: RemoteRobot.cpp:448
VirtualRobot
Definition: FramedPose.h:43
armarx::RemoteRobot::createLocalCloneFromFile
static VirtualRobot::RobotPtr createLocalCloneFromFile(RobotStateComponentInterfacePrx robotStatePrx, VirtualRobot::RobotIO::RobotDescription loadMode=VirtualRobot::RobotIO::eFull)
This is a convenience function for createLocalClone, which automatically gets the filename from the R...
Definition: RemoteRobot.cpp:441
memoryx::MotionModelKBM::memoryName
std::string memoryName
Definition: MotionModelKBM.h:74
memoryx::MotionModelKBM::CreateKBMFromSamples
static KBM::Models::KBM_ptr CreateKBMFromSamples(VirtualRobot::RobotPtr robot, VirtualRobot::RobotNodeSetPtr nodeSet, VirtualRobot::SceneObjectPtr referenceFrame)
Definition: MotionModelKBM.cpp:257
armarx::GlobalFrame
const std::string GlobalFrame
Definition: FramedPose.h:62
memoryx::MotionModelKBM::getPredictedPoseInternal
armarx::LinkedPosePtr getPredictedPoseInternal() override
Definition: MotionModelKBM.cpp:81
memoryx
VirtualRobot headers.
Definition: CommonPlacesTester.cpp:48
c
constexpr T c
Definition: UnscentedKalmanFilterTest.cpp:43
memoryx::MotionModelKBM::getJointAngles
Eigen::MatrixXf getJointAngles(armarx::SharedRobotInterfacePrx robotPrx)
Definition: MotionModelKBM.cpp:108
memoryx::MotionModelKBM::ice_postUnmarshal
void ice_postUnmarshal() override
Definition: MotionModelKBM.cpp:367
IceInternal::Handle
Definition: forward_declarations.h:8
MotionModelKBM.h
GfxTL::Identity
void Identity(MatrixXX< N, N, T > *a)
Definition: MatrixXX.h:523
armarx::VariantType::LinkedPose
const VariantTypeId LinkedPose
Definition: LinkedPose.h:43
ARMARX_DEBUG_S
#define ARMARX_DEBUG_S
Definition: Logging.h:198
memoryx::MotionModelKBM::getUncertaintyInternal
MultivariateNormalDistributionBasePtr getUncertaintyInternal() override
Definition: MotionModelKBM.cpp:343
M_PI
#define M_PI
Definition: MathTools.h:17
memoryx::MotionModelKBM::robot
VirtualRobot::RobotPtr robot
Definition: MotionModelKBM.h:72
memoryx::KBM::Models::KBM::createKBM
static KBM_ptr createKBM(int nDoF, int dim, const Vector &center, const Vector &spreadAngles, const Matrix &controlNet)
Factory methods.
Definition: kbm.cpp:407
ARMARX_ERROR_S
#define ARMARX_ERROR_S
Definition: Logging.h:209
ARMARX_DEBUG
#define ARMARX_DEBUG
Definition: Logging.h:177
memoryx::KBM::Models::KBM::STANDARD
@ STANDARD
Definition: kbm.h:85
armarx::FramedPosition
The FramedPosition class.
Definition: FramedPose.h:142
memoryx::AbstractMotionModel
Definition: AbstractMotionModel.h:39
memoryx::MotionModelKBM::updaterThreadTask
armarx::PeriodicTask< MotionModelKBM >::pointer_type updaterThreadTask
Definition: MotionModelKBM.h:73
KBMData.h
memoryx::MotionModelKBM::CreateSample
static void CreateSample(VirtualRobot::RobotNodeSetPtr nodeSet, Eigen::VectorXf jointMax, Eigen::VectorXf jointMin, VirtualRobot::RobotNodePtr root, VirtualRobot::RobotNodePtr TCP, Ice::DoubleSeq &prop, Ice::DoubleSeq &shape)
Definition: MotionModelKBM.cpp:372
memoryx::MotionModelKBM::periodicUpdate
void periodicUpdate()
Definition: MotionModelKBM.cpp:122
armarx::FramedPosition::changeToGlobal
void changeToGlobal(const SharedRobotInterfacePrx &referenceRobot)
Definition: FramedPose.cpp:708
ARMARX_WARNING_S
#define ARMARX_WARNING_S
Definition: Logging.h:206
memoryx::AbstractMotionModel::motionPredictionLock
std::recursive_mutex motionPredictionLock
Definition: AbstractMotionModel.h:95
ProbabilityMeasures.h
armarx::channels::KinematicUnitObserver::jointAngles
const KinematicUnitDatafieldCreator jointAngles("jointAngles")
memoryx::KBMData
Definition: KBMData.h:46
GfxTL::Matrix3f
MatrixXX< 3, 3, float > Matrix3f
Definition: MatrixXX.h:600
GfxTL::Matrix4f
MatrixXX< 4, 4, float > Matrix4f
Definition: MatrixXX.h:601
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
armarx::Vector3::toEigen
virtual Eigen::Vector3f toEigen() const
Definition: Pose.cpp:134
VAROUT
#define VAROUT(x)
Definition: StringHelpers.h:182
IceInternal::ProxyHandle<::IceProxy::armarx::RobotStateComponentInterface >
memoryx::KBM::Models::KBM
The Kinematic B\'ezier Maps.
Definition: kbm.h:78
scene3D::SceneObjectPtr
boost::intrusive_ptr< SceneObject > SceneObjectPtr
Definition: PointerDefinitions.h:40
ARMARX_INFO_S
#define ARMARX_INFO_S
Definition: Logging.h:195
armarx::PeriodicTask
Definition: ArmarXManager.h:70
memoryx::MotionModelKBM::setPoseAtLastLocalisation
void setPoseAtLastLocalisation(const armarx::LinkedPoseBasePtr &poseAtLastLocalization, const armarx::PoseBasePtr &globalRobotPoseAtLastLocalization, const MultivariateNormalDistributionBasePtr &uncertaintyAtLastLocalization, const Ice::Current &c=Ice::emptyCurrent) override
Definition: MotionModelKBM.cpp:51
memoryx::MotionModelKBM::kbm
KBM::Models::KBM_ptr kbm
Definition: MotionModelKBM.h:71
VirtualRobot::RobotPtr
std::shared_ptr< class Robot > RobotPtr
Definition: Bus.h:18
armarx::VariantType::MultivariateNormalDistribution
const armarx::VariantTypeId MultivariateNormalDistribution
Definition: ProbabilityMeasures.h:36
norm
double norm(const Point &a)
Definition: point.hpp:94