RGBDHandLocalizer.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 VisionX::ArmarXObjects::RGBDHandLocalizer
19  * @author Markus Grotz ( markus dot grotz at kit dot edu )
20  * @date 2015
21  * @copyright http://www.gnu.org/licenses/gpl-2.0.txt
22  * GNU General Public License
23  */
24 
25 #include "RGBDHandLocalizer.h"
26 
27 
28 
29 namespace visionx
30 {
31 
33  {
36  }
37 
39  {
40  usingProxy(getProperty<std::string>("RobotStateComponentProxyName").getValue());
41 
42  providerName = getProperty<std::string>("providerName").getValue();
43 
44 
45 
46  sensorFrameName = getProperty<std::string>("SensorFrameName").getValue();
47  markerFrameName = getProperty<std::string>("MarkerName").getValue();
48  handFrameName = getProperty<std::string>("HandNameInRobotModel").getValue();
49 
50 
51  usingImageProvider(providerName);
52  usingPointCloudProvider(providerName);
53  offeringTopic(getProperty<std::string>("DebugDrawerTopicName").getValue());
54  }
55 
57  {
58  ImageType imageDisplayType = visionx::tools::typeNameToImageType("rgb");
59 
60  ImageProviderInfo imageProviderInfo = getImageProvider(providerName, imageDisplayType);
61 
62  this->numImages = imageProviderInfo.numberImages;
63 
64  if (numImages < 1 || numImages > 2)
65  {
66  ARMARX_FATAL << "invalid number of images. aborting";
67  return;
68  }
69 
70  images = new CByteImage*[numImages];
71 
72  for (int i = 0 ; i < numImages ; i++)
73  {
74  images[i] = visionx::tools::createByteImage(imageProviderInfo);
75  }
76 
77  result = new CByteImage*[numImages];
78 
79  this->robotStatePrx = getProxy<armarx::RobotStateComponentInterfacePrx>(getProperty<std::string>("RobotStateComponentProxyName").getValue());
80 
81  ImageDimension dimension(images[0]->width, images[0]->height);
82  enableResultImages(numImages, dimension, visionx::tools::typeNameToImageType("rgb"));
83  enableResultPointClouds<pcl::PointXYZRGBA>("MarkerCloud");
84  enableResultPointClouds<pcl::PointXYZRGBA>("Filtered_Cloud");
85  this->debugDrawerTopic = getTopic<armarx::DebugDrawerInterfacePrx>(getProperty<std::string>("DebugDrawerTopicName").getValue());
86  }
87 
89  {
90  this->debugDrawerTopic->clearLayer("RGBDHandLocalizer");
91  }
92 
94  {
95  for (int i = 0; i < numImages; i++)
96  {
97  delete images[i];
98  }
99  delete [] images;
100 
101  for (int i = 0; i < numImages; i++)
102  {
103  delete result[i];
104  }
105  delete [] result;
106  }
107 
109  {
110 
111  if (!waitForImages(2000))
112  {
113  ARMARX_WARNING << "Timeout or error while waiting for image data";
114  return;
115  }
116  if (getImages(images) != numImages)
117  {
118  ARMARX_WARNING << "Unable to transfer or read images";
119  return;
120  }
121  if (!waitForPointClouds(2000))
122  {
123  ARMARX_WARNING << "Can't read Pointcloud.";
124  return;
125  }
126 
127  pcl::PointCloud<pcl::PointXYZRGBA>::Ptr currentPointCloud(new pcl::PointCloud<pcl::PointXYZRGBA>());
128  pcl::PointCloud<pcl::PointXYZRGBA>::Ptr filteredPointCloud(new pcl::PointCloud<pcl::PointXYZRGBA>());
129  armarx::SharedRobotInterfacePrx currentRobot = this->robotStatePrx->getSynchronizedRobot();
130  std::vector<Eigen::Vector3f> medianCoordinates;
131 
132 
133  getPointClouds(currentPointCloud);
134 
135  if (!currentPointCloud->isOrganized())
136  {
137  ARMARX_WARNING << "Pointcloud is not organized.";
138  return;
139  }
140 
141 
142  IplImage* iplImage = IplImageAdaptor::Adapt(images[0]);
143  cv::Mat RGBImage = cv::cvarrToMat(iplImage);
144 
145  cv::Mat HSVImage;
146  cv::cvtColor(RGBImage, HSVImage, cv::COLOR_RGB2HSV);
147 
148  cv::Mat mask;
149  // todo move to onInit..-method
150  cv::Scalar minColor(getProperty<int>("hueMin").getValue(),
151  getProperty<int>("satMin").getValue(),
152  getProperty<int>("valMin").getValue());
153 
154  cv::Scalar maxColor(getProperty<int>("hueMax").getValue(),
155  getProperty<int>("satMax").getValue(),
156  getProperty<int>("valMax").getValue());
157  cv::inRange(HSVImage, minColor, maxColor, mask);
158 
159  //opening
160  cv::erode(mask, mask, getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(6, 6)));
161  cv::dilate(mask, mask, getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(6, 6)));
162  //closing
163  cv::dilate(mask, mask, getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(3, 3)));
164  cv::erode(mask, mask, getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(3, 3)));
165 
166 
167  //ARMARX_INFO << "Hand name in robot model:" << handFrameName;
168 
169 
170 
171 
172  armarx::FramedPositionPtr kinematicMarkerPosition = new armarx::FramedPosition(Eigen::Vector3f(0, 0, 0), markerFrameName, currentRobot->getName());
173  armarx::FramedPositionPtr copy = armarx::FramedPositionPtr::dynamicCast(kinematicMarkerPosition->clone());
174  copy->changeFrame(currentRobot, sensorFrameName);
175  Eigen::Vector3f guessMM = copy->toEigen();
176  this->cropFilter(currentPointCloud, filteredPointCloud, getProperty<float>("uncertaintyMM").getValue(), guessMM);
177 
178  provideResultPointClouds(filteredPointCloud, "Filtered_Cloud");
179 
180 
181 
182  this->calcPositions(mask, filteredPointCloud, medianCoordinates); //Here the calculation happens
183 
184  armarx::FramedPositionPtr kinematicHandPosition = new armarx::FramedPosition(Eigen::Vector3f(0, 0, 0), handFrameName, currentRobot->getName());
185  kinematicHandPosition->changeFrame(currentRobot, markerFrameName);
186  armarx::FramedDirectionPtr offsetToHand = new armarx::FramedDirection(kinematicHandPosition->toEigen(), markerFrameName, currentRobot->getName());
187 
188  VirtualRobot::RobotPtr sharedRobot(new armarx::RemoteRobot(currentRobot));
189  offsetToHand->changeFrame(sharedRobot, sensorFrameName);
190 
191  //Choose the best blob
192  if (medianCoordinates.size() > 0)
193  {
196  for (Eigen::Vector3f currentMedian : medianCoordinates)
197  {
198  armarx::FramedPosition currentPos(currentMedian, sensorFrameName, currentRobot->getName());
199 
200  float currentDist = (kinematicMarkerPosition->toEigen() - currentMedian).norm();
201  if (currentDist < distance)
202  {
203  min = currentPos;
204  distance = currentDist;
205  }
206  }
207 
208 
210  Eigen::Vector3f handPositionEigen = markerPosition->toEigen() + offsetToHand->toEigen();
211 
212 
213  if (getProperty<bool>("PrimitiveCalibrationOnStart").getValue())
214  {
215  int numCalibrations = 20;
216  if (calibrationCounter < numCalibrations)
217  {
218  armarx::FramedPositionPtr kinCopy = armarx::FramedPositionPtr::dynamicCast(kinematicHandPosition->clone());
219  kinCopy->changeFrame(currentRobot, sensorFrameName);
220  Eigen::Vector3f diff = kinCopy->toEigen() - handPositionEigen;
221  this->calibrationSum = this->calibrationSum + diff;
222  calibrationCounter++;
223  }
224  else
225  {
226  handPositionEigen = handPositionEigen + (calibrationSum / numCalibrations);
227  }
228  }
229 
230 
231  armarx::FramedPositionPtr realHandPosition = new armarx::FramedPosition(handPositionEigen, sensorFrameName, currentRobot->getName());
232 
233 
234 
235  armarx::FramedPosePtr handRootPose = armarx::FramedPosePtr::dynamicCast(currentRobot->getRobotNode(handFrameName)->getPoseInRootFrame());
236 
237 
238  armarx::FramedOrientationPtr handOrientation = handRootPose->getOrientation();
239  handOrientation->changeFrame(currentRobot, sensorFrameName);
240 
241  std::scoped_lock lock(positionLock);
242 
243  this->realHandPose = new armarx::FramedPose(handOrientation->toEigen(), realHandPosition->toEigen(), sensorFrameName, currentRobot->getName());
244 
245  this->timestamp = armarx::TimestampVariant::nowPtr();
246 
247 
248  this->debugDrawerTopic->setPoseVisu("RGBDHandLocalizer",
249  "Real_Hand_Position",
250  this->realHandPose->toGlobal(currentRobot));
251  this->debugDrawerTopic->setPoseVisu("RGBDHandLocalizer",
252  "Kinematic_Hand_Position",
253  handRootPose->toGlobal(currentRobot));
254  this->debugDrawerTopic->setPoseVisu("RGBDHandLocalizer",
255  "DepthCamera",
256  currentRobot->getRobotNode(sensorFrameName)->getGlobalPose());
257  this->debugDrawerTopic->setSphereVisu("RGBDHandLocalizer",
258  "MarkerPos_Sensor",
259  new armarx::Vector3(markerPosition->toGlobalEigen(currentRobot)),
260  armarx::DrawColor {1, 1, 0, 0.5},
261  20.0f);
262  this->debugDrawerTopic->setSphereVisu("RGBDHandLocalizer",
263  "MarkerPos_Kinematic",
264  new armarx::Vector3(kinematicMarkerPosition->toGlobalEigen(currentRobot)),
265  armarx::DrawColor {1, 0, 1, 0.5},
266  20.0f);
267 
268  }
269  else
270  {
271  ARMARX_WARNING << "No blob found";
272  }
273 
274 
275  //Provide the segmented Image as Result
276 
277 
278  IplImage* img = cvCreateImage(cvSize(640, 480), IPL_DEPTH_8U, 3);
279  cv::Mat outMat = cv::cvarrToMat(img);
280  cv::cvtColor(mask, outMat, cv::COLOR_GRAY2RGB);
281 
282  result[1] = images[0];
283  result[0] = IplImageAdaptor::Adapt(img);
284  provideResultImages(result);
285  cvReleaseImage(&img);
286  outMat.release();
287  //ARMARX_VERBOSE << "process took: " << (IceUtil::Time::now() - start).toMilliSecondsDouble() << " milliseconds.";
288  }
289 
290 
291  void RGBDHandLocalizer::calcPositions(cv::Mat& binaryImage, pcl::PointCloud<pcl::PointXYZRGBA>::Ptr pointcloud, std::vector<Eigen::Vector3f>& medianCoordinates)
292  {
293  medianCoordinates.clear();
294  BlobLabeler labeler;
295  cv::Mat labeledImage;
296  std::vector<std::vector<cv::Point>> blobList;
297  labeler.labelBlobs(binaryImage, labeledImage, blobList);
298 
299  pcl::PointCloud<pcl::PointXYZRGBA>::Ptr outputCloud(new pcl::PointCloud<pcl::PointXYZRGBA>());
300 
301  for (std::vector<cv::Point> blob : blobList)
302  {
303  Eigen::Vector3f sum = Eigen::Vector3f::Zero();
304 
305  int numberOfPixels = 0;
306  for (cv::Point picturePoint : blob)
307  {
308  pcl::PointXYZRGBA point3D = pointcloud->at(picturePoint.x, picturePoint.y);
309  bool point3Dvalid = std::isfinite(point3D.x) && std::isfinite(point3D.y) && std::isfinite(point3D.z);
310 
311  if (point3Dvalid)
312  {
313  outputCloud->push_back(point3D);
314 
315  Eigen::Vector3f vector;
316  vector << point3D.x, point3D.y, point3D.z;
317  sum = sum + vector;
318  numberOfPixels ++;
319  }
320  }
321 
322  if (numberOfPixels != 0)
323  {
324  Eigen::Vector3f median = sum / numberOfPixels;
325  float markerRadius = getProperty<float>("MarkerRadiusMM").getValue();
326  median = median + markerRadius * median.normalized();
327  medianCoordinates.push_back(median);
328  }
329  }
330  labeledImage.release();
331  visionx::tools::colorizeSegment(outputCloud);
332  provideResultPointClouds(outputCloud, "MarkerCloud");
333  }
334 
335  void RGBDHandLocalizer::cropFilter(pcl::PointCloud<pcl::PointXYZRGBA>::Ptr input, pcl::PointCloud<pcl::PointXYZRGBA>::Ptr output, float uncertaintyMM, Eigen::Vector3f guessMM)
336  {
337 
338  //Guesses come from the armarx Framework and so are measured in mm.
339 
340 
341 
342 
343  //Crop the pointcloud
344  this->cropper.setInputCloud(input);
345  this->cropper.setKeepOrganized(true);
346  this->cropper.setMax(Eigen::Vector4f(uncertaintyMM, uncertaintyMM, uncertaintyMM, 1));
347  this->cropper.setMin(Eigen::Vector4f(-uncertaintyMM, -uncertaintyMM, -uncertaintyMM, 1));
348  this->cropper.setTranslation(guessMM);
349  this->cropper.setRotation(Eigen::Vector3f::Zero());
350  this->cropper.filter(*output);
351  }
352 
353  memoryx::ObjectLocalizationResultList RGBDHandLocalizer::localizeObjectClasses(const memoryx::ObjectClassNameList& classNames, const Ice::Current&)
354  {
355 
356  memoryx::ObjectLocalizationResultList resultList;
357 
358 
359  if (classNames.size() == 1)
360  {
361  if (classNames.at(0) == getProperty<std::string>("HandNameInMemory").getValue())
362  {
363  if (this->realHandPose)
364  {
365 
366  std::scoped_lock lock(positionLock);
367 
368  memoryx::ObjectLocalizationResult localizationResult;
369 
370  localizationResult.objectClassName = getProperty<std::string>("HandNameInMemory").getValue();
371  localizationResult.timeStamp = this->timestamp;
372  localizationResult.orientation = this->realHandPose->getOrientation();
373  localizationResult.position = this->realHandPose->getPosition();
374  localizationResult.recognitionCertainty = 1.0;
375  Eigen::Vector3f mean = Eigen::Vector3f::Zero();
376  Eigen::Matrix3f covar = Eigen::Matrix3f::Identity() * 10000;
377  memoryx::MultivariateNormalDistributionBasePtr dummy = new memoryx::MultivariateNormalDistribution(mean, covar);
378  localizationResult.positionNoise = dummy;
379 
380 
381  resultList.push_back(localizationResult);
382  ARMARX_INFO << "Hand found at: " << localizationResult.position->output();
383  }
384  else
385  {
386  ARMARX_WARNING << "Hand not found";
387  }
388 
389  }
390  else
391  {
392  ARMARX_WARNING << "Wrong classname requested";
393  }
394  }
395  else
396  {
397  ARMARX_WARNING << "More than one classname requested";
398  }
399 
400  return resultList;
401  }
402 }
visionx::tools::colorizeSegment
std::tuple< uint8_t, uint8_t, uint8_t > colorizeSegment(PointCloudPtrT &segment)
Definition: PCLUtilities.h:48
visionx::ImageProviderInfo::numberImages
int numberImages
Number of images.
Definition: ImageProcessor.h:506
visionx
ArmarX headers.
Definition: OpenPoseStressTest.h:38
armarx::VariantType::FramedPose
const VariantTypeId FramedPose
Definition: FramedPose.h:37
visionx::ImageProcessor::getImageProvider
ImageProviderInfo getImageProvider(std::string name, ImageType destinationImageType=eRgb, bool waitForProxy=false)
Select an ImageProvider.
Definition: ImageProcessor.cpp:152
visionx::RGBDHandLocalizer::createPropertyDefinitions
armarx::PropertyDefinitionsPtr createPropertyDefinitions() override
Definition: RGBDHandLocalizer.cpp:32
visionx::RGBDHandLocalizerPropertyDefinitions
Definition: RGBDHandLocalizer.h:63
BlobLabeler
Definition: bloblabeler.h:28
visionx::RGBDHandLocalizer::onConnectPointCloudAndImageProcessor
void onConnectPointCloudAndImageProcessor() override
Implement this method in your PointCloudAndImageProcessor in order execute parts when the component i...
Definition: RGBDHandLocalizer.cpp:56
armarx::TimestampVariant::nowPtr
static TimestampVariantPtr nowPtr()
Definition: TimestampVariant.h:111
visionx::tools::createByteImage
CByteImage * createByteImage(const ImageFormatInfo &imageFormat, const ImageType imageType)
Creates a ByteImage for the destination type specified in the given imageProviderInfo.
ARMARX_FATAL
#define ARMARX_FATAL
Definition: Logging.h:192
RGBDHandLocalizer.h
visionx::ImageProviderInfo
Definition: ImageProcessor.h:466
IceInternal::Handle< FramedPosition >
std::isfinite
bool isfinite(const std::vector< T, Ts... > &v)
Definition: algorithm.h:327
visionx::RGBDHandLocalizer::onExitPointCloudAndImageProcessor
void onExitPointCloudAndImageProcessor() override
Exit the ImapeProcessor component.
Definition: RGBDHandLocalizer.cpp:93
GfxTL::Identity
void Identity(MatrixXX< N, N, T > *a)
Definition: MatrixXX.h:523
visionx::PointCloudProcessor::provideResultPointClouds
void provideResultPointClouds(const PointCloudPtrT &pointClouds, std::string providerName="")
sends result PointClouds for visualization
Definition: PointCloudProcessor.h:286
armarx::mean
std::optional< float > mean(const boost::circular_buffer< NameValueMap > &buffer, const std::string &key)
Definition: KinematicUnitGuiPlugin.cpp:1615
copy
Use of this software is granted under one of the following two to be chosen freely by the user Boost Software License Version Marcin Kalicinski Permission is hereby free of to any person or organization obtaining a copy of the software and accompanying documentation covered by this and transmit the and to prepare derivative works of the and to permit third parties to whom the Software is furnished to do all subject to the including the above license this restriction and the following must be included in all copies of the in whole or in and all derivative works of the unless such copies or derivative works are solely in the form of machine executable object code generated by a source language processor THE SOFTWARE IS PROVIDED AS WITHOUT WARRANTY OF ANY EXPRESS OR INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF FITNESS FOR A PARTICULAR TITLE AND NON INFRINGEMENT IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE FOR ANY DAMAGES OR OTHER WHETHER IN TORT OR ARISING OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE The MIT Marcin Kalicinski Permission is hereby free of to any person obtaining a copy of this software and associated documentation to deal in the Software without including without limitation the rights to copy
Definition: license.txt:39
visionx::RGBDHandLocalizer::process
void process() override
Process the vision component.
Definition: RGBDHandLocalizer.cpp:108
armarx::FramedPosition
The FramedPosition class.
Definition: FramedPose.h:142
visionx::RGBDHandLocalizer::localizeObjectClasses
memoryx::ObjectLocalizationResultList localizeObjectClasses(const memoryx::ObjectClassNameList &, const Ice::Current &) override
Definition: RGBDHandLocalizer.cpp:353
visionx::PointCloudProcessor::waitForPointClouds
bool waitForPointClouds(int milliseconds=1000)
Wait for new PointClouds.
Definition: PointCloudProcessor.cpp:433
armarx::aron::input
ReaderT::InputType & input
Definition: rw.h:19
armarx::Vector3
The Vector3 class.
Definition: Pose.h:112
visionx::ImageProcessor::usingImageProvider
void usingImageProvider(std::string name)
Registers a delayed topic subscription and a delayed provider proxy retrieval which all will be avail...
Definition: ImageProcessor.cpp:117
visionx::Point
Eigen::Vector3f Point
Definition: ObjectShapeClassification.h:69
visionx::RGBDHandLocalizer::onInitPointCloudAndImageProcessor
void onInitPointCloudAndImageProcessor() override
Setup the vision component.
Definition: RGBDHandLocalizer.cpp:38
max
T max(T t1, T t2)
Definition: gdiam.h:48
visionx::ImageProcessor::getImages
int getImages(CByteImage **ppImages)
Poll images from provider.
Definition: ImageProcessor.cpp:351
visionx::PointCloudProcessor::getPointClouds
int getPointClouds(const PointCloudPtrT &pointCloudPtr)
Poll PointClouds from provider.
Definition: PointCloudProcessor.h:373
visionx::RGBDHandLocalizer::onDisconnectPointCloudAndImageProcessor
void onDisconnectPointCloudAndImageProcessor() override
Implement this method in the PointCloudAndImageProcessor in order to execute parts when the component...
Definition: RGBDHandLocalizer.cpp:88
armarx::Component::getConfigIdentifier
std::string getConfigIdentifier()
Retrieve config identifier for this component as set in constructor.
Definition: Component.cpp:74
armarx::RemoteRobot
Mimics the behaviour of the VirtualRobot::Robot class while redirecting everything to an Ice proxy.
Definition: RemoteRobot.h:139
GfxTL::Matrix3f
MatrixXX< 3, 3, float > Matrix3f
Definition: MatrixXX.h:600
ARMARX_INFO
#define ARMARX_INFO
Definition: Logging.h:174
armarx::VariantType::FramedDirection
const VariantTypeId FramedDirection
Definition: FramedPose.h:38
armarx::ManagedIceObject::offeringTopic
void offeringTopic(const std::string &name)
Registers a topic for retrival after initialization.
Definition: ManagedIceObject.cpp:290
IceUtil::Handle< class PropertyDefinitionContainer >
visionx::ImageProcessor::enableResultImages
void enableResultImages(int numberImages, ImageDimension imageDimension, ImageType imageType, const std::string &name="")
Enables visualization.
Definition: ImageProcessor.cpp:227
Scalar
float Scalar
Definition: basic.h:14
visionx::PointCloudProcessor::usingPointCloudProvider
void usingPointCloudProvider(std::string providerName)
Registers a delayed topic subscription and a delayed provider proxy retrieval which will be available...
Definition: PointCloudProcessor.cpp:261
IceInternal::ProxyHandle< ::IceProxy::armarx::SharedRobotInterface >
visionx::tools::typeNameToImageType
ImageType typeNameToImageType(const std::string &imageTypeName)
Converts an image type name as string into an ImageType integer.
Definition: TypeMapping.cpp:42
BlobLabeler::labelBlobs
void labelBlobs(cv::Mat &binaryImage, cv::Mat &outputImage, std::vector< std::vector< cv::Point > > &blobList)
Definition: bloblabeler.cpp:32
visionx::ImageProcessor::provideResultImages
void provideResultImages(CByteImage **images, armarx::MetaInfoSizeBasePtr info=nullptr)
sends result images for visualization
Definition: ImageProcessor.cpp:245
distance
double distance(const Point &a, const Point &b)
Definition: point.hpp:88
armarx::VariantType::FramedPosition
const VariantTypeId FramedPosition
Definition: FramedPose.h:39
min
T min(T t1, T t2)
Definition: gdiam.h:42
ARMARX_WARNING
#define ARMARX_WARNING
Definition: Logging.h:186
armarx::PropertyDefinitionsPtr
IceUtil::Handle< class PropertyDefinitionContainer > PropertyDefinitionsPtr
PropertyDefinitions smart pointer type.
Definition: forward_declarations.h:34
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
VirtualRobot::RobotPtr
std::shared_ptr< class Robot > RobotPtr
Definition: Bus.h:18
armarx::VariantType::MultivariateNormalDistribution
const armarx::VariantTypeId MultivariateNormalDistribution
Definition: ProbabilityMeasures.h:36
visionx::ImageProcessor::waitForImages
bool waitForImages(int milliseconds=1000)
Wait for new images.
Definition: ImageProcessor.cpp:275
norm
double norm(const Point &a)
Definition: point.hpp:94