camera.cpp
Go to the documentation of this file.
2 
6 
8 
11 
12 ParameterSet::ParameterSet(std::string const& name, NxLibItem const& defaultParameters)
13 {
14  // Create a new NxLib node where we will store the parameters for this set and overwrite it with the default settings.
15  node = NxLibItem()["rosParameterSets"][name];
16  node << defaultParameters;
17 }
18 
19 CameraParameters::CameraParameters(ensenso::ros::NodeHandle& nh, std::string const& cameraType, std::string serial)
20  : serial(std::move(serial))
21 {
22  ensenso::ros::get_parameter(nh, "file_camera_path", fileCameraPath);
23  isFileCamera = !fileCameraPath.empty();
24 
25  ensenso::ros::get_parameter(nh, "fixed", fixed);
26  ensenso::ros::get_parameter(nh, "wait_for_camera", waitForCamera);
27 
28  ensenso::ros::get_parameter(nh, "camera_frame", cameraFrame);
29  if (cameraFrame.empty())
30  {
31  cameraFrame = "optical_frame_" + this->serial;
32  }
33 
34  ensenso::ros::get_parameter(nh, "link_frame", linkFrame);
35  ensenso::ros::get_parameter(nh, "target_frame", targetFrame);
36 
37  if (linkFrame.empty() && !targetFrame.empty())
38  {
40  }
41  else if (linkFrame.empty() && targetFrame.empty())
42  {
45  }
46  else if (!linkFrame.empty() && targetFrame.empty())
47  {
49  }
50 
51  ensenso::ros::get_parameter(nh, "capture_timeout", captureTimeout);
52 
53  if (cameraType != valMonocular)
54  {
55  ensenso::ros::get_parameter(nh, "robot_frame", robotFrame);
56  ensenso::ros::get_parameter(nh, "wrist_frame", wristFrame);
57 
58  if (fixed && robotFrame.empty())
59  {
61  }
62  if (!fixed && wristFrame.empty())
63  {
65  if (robotFrame.empty())
66  {
68  }
69  }
70 
71  // Load virtual objects and create the handler.
72  std::string objectsFile = "";
73  ensenso::ros::get_parameter(nh, "objects_file", objectsFile);
74  if (!objectsFile.empty())
75  {
76  // Get objects frame, default to target.
77  std::string objectsFrame = targetFrame;
78  ensenso::ros::get_parameter(nh, "objects_frame", objectsFrame);
79 
80  // Get virtual object marker publish settings.
81  // Default to empty topic, meaning no markers are published.
82  std::string markerTopic;
83  double markerRate = 1;
84  ensenso::ros::get_parameter(nh, "visualization_marker_topic", markerTopic);
85  ensenso::ros::get_parameter(nh, "visualization_marker_rate", markerRate);
86 
87  ENSENSO_DEBUG(nh, "Loading virtual objects...");
88  try
89  {
90  virtualObjectHandler = ensenso::std::make_unique<ensenso_camera::VirtualObjectHandler>(
91  nh, objectsFile, objectsFrame, linkFrame, markerTopic, markerRate);
92  }
93  catch (std::exception const& e)
94  {
95  ENSENSO_WARN(nh, "Unable to load virtual objects file '%s'. Error: %s", objectsFile.c_str(), e.what());
96  }
97  }
98  }
99 }
100 
101 Camera::Camera(ensenso::ros::NodeHandle& nh, CameraParameters _params) : params(std::move(_params)), nh(nh)
102 {
104  transformListener = ensenso::std::make_unique<tf2_ros::TransformListener>(*tfBuffer);
106 
107  accessTreeServer = MAKE_SERVER(Camera, AccessTree, "access_tree");
108  executeCommandServer = MAKE_SERVER(Camera, ExecuteCommand, "execute_command");
109  getParameterServer = MAKE_SERVER(Camera, GetParameter, "get_parameter");
110  setParameterServer = MAKE_SERVER(Camera, SetParameter, "set_parameter");
111 
112  statusPublisher = ensenso::ros::create_publisher<diagnostic_msgs::msg::DiagnosticArray>(nh, "/diagnostics", 1);
113 
115 
116  cameraNode = NxLibItem()[itmCameras][itmBySerialNo][params.serial];
117  defaultParameters = NxLibItem()["rosDefaultParameters"][params.serial + "_" + DEFAULT_PARAMETER_SET];
118 }
119 
121 {
122  accessTreeServer->start();
123  executeCommandServer->start();
124 
125  getParameterServer->start();
126  setParameterServer->start();
127 }
128 
129 bool Camera::loadSettings(std::string const& jsonFile, bool saveAsDefaultParameters)
130 {
131  if (jsonFile.empty())
132  {
133  return true;
134  }
135 
136  std::ifstream file(expandPath(jsonFile));
137  if (file.is_open() && file.rdbuf())
138  {
139  std::stringstream buffer;
140  buffer << file.rdbuf();
141  std::string const& jsonSettings = buffer.str();
142 
143  NxLibItem tmpParameters = NxLibItem()["rosTemporaryParameters"];
144  try
145  {
146  tmpParameters.setJson(jsonSettings);
147  }
148  catch (NxLibException&)
149  {
150  ENSENSO_ERROR(nh, "The file '%s' does not contain valid JSON", jsonFile.c_str());
151  return false;
152  }
153 
154  try
155  {
156  if (tmpParameters[itmParameters].exists())
157  {
158  // The file contains the entire camera node.
159  cameraNode[itmParameters] << tmpParameters[itmParameters];
160  }
161  else
162  {
163  // The file contains only the parameter node.
164  cameraNode[itmParameters].setJson(jsonSettings, true);
165  }
166  tmpParameters.erase();
167 
168  NxLibCommand synchronize(cmdSynchronize, params.serial);
169  synchronize.parameters()[itmCameras] = params.serial;
170  synchronize.execute();
171 
173  if (saveAsDefaultParameters)
174  {
176  }
177 
178  ENSENSO_INFO(nh, "Loaded settings from '%s'.", jsonFile.c_str());
179  }
180  catch (NxLibException& e)
181  {
183  return false;
184  }
185  }
186  else
187  {
188  ENSENSO_ERROR(nh, "Could not open the file '%s'", jsonFile.c_str());
189  return false;
190  }
191 
192  return true;
193 }
194 
195 void Camera::onAccessTree(ensenso::action::AccessTreeGoalConstPtr const& goal)
196 {
198 
199  loadParameterSet(goal->parameter_set);
200 
201  NxLibItem item(goal->path);
202 
203  bool treeChanged = false;
204  if (goal->erase)
205  {
206  item.erase();
207  treeChanged = true;
208  }
209  else if (goal->set_null)
210  {
211  item.setNull();
212  treeChanged = true;
213  }
214  else if (!goal->json_value.empty())
215  {
216  item.setJson(goal->json_value);
217  treeChanged = true;
218  }
219 
220  if (treeChanged)
221  {
222  saveParameterSet(goal->parameter_set);
223  }
224 
225  ensenso::action::AccessTreeResult result;
226 
227  result.exists = false;
228  if (item.exists())
229  {
230  result.exists = true;
231 
232  result.json_value = item.asJson();
233  try
234  {
235  // This could load any image that does not belong to the node's camera, so we do not know its frame.
236  result.binary_data = *imageFromNxLibNode(item, "", params.isFileCamera);
237  }
238  catch (NxLibException&)
239  {
240  } // The item was not binary.
241  }
242 
243  accessTreeServer->setSucceeded(std::move(result));
244 
245  FINISH_NXLIB_ACTION(AccessTree)
246 }
247 
248 void Camera::onExecuteCommand(ensenso::action::ExecuteCommandGoalConstPtr const& goal)
249 {
251 
252  loadParameterSet(goal->parameter_set);
253 
254  NxLibCommand command(goal->command);
255  command.parameters().setJson(goal->parameters);
256  command.execute();
257 
258  ensenso::action::ExecuteCommandResult result;
259  result.result = command.result().asJson();
260 
261  executeCommandServer->setSucceeded(std::move(result));
262 
263  FINISH_NXLIB_ACTION(ExecuteCommand)
264 }
265 
266 void Camera::onGetParameter(ensenso::action::GetParameterGoalConstPtr const& goal)
267 {
269 
270  ensenso::action::GetParameterResult result;
271 
272  loadParameterSet(goal->parameter_set);
273 
274  result.stamp = ensenso::ros::now(nh);
275  for (auto const& key : goal->keys)
276  {
277  result.results.push_back(*readParameter(key));
278  }
279 
280  getParameterServer->setSucceeded(std::move(result));
281 
282  FINISH_NXLIB_ACTION(GetParameter)
283 }
284 
286 {
287  return cameraNode[itmStatus].exists() && cameraNode[itmStatus][itmAvailable].exists() &&
288  cameraNode[itmStatus][itmAvailable].asBool();
289 }
290 
292 {
293  return cameraNode[itmStatus].exists() && cameraNode[itmStatus][itmOpen].exists() &&
294  cameraNode[itmStatus][itmOpen].asBool();
295 }
296 
297 bool Camera::hasLink() const
298 {
299  return !isIdentity(transformFromNxLib(cameraNode[itmLink]));
300 }
301 
303 {
304  std::lock_guard<std::mutex> lock(nxLibMutex);
305 
306  diagnostic_msgs::msg::DiagnosticStatus cameraStatus;
307  cameraStatus.name = "Camera";
308  cameraStatus.hardware_id = params.serial;
309  cameraStatus.level = diagnostic_msgs::msg::DiagnosticStatus::OK;
310  cameraStatus.message = "OK";
311 
312  if (!cameraIsOpen())
313  {
314  cameraStatus.level = diagnostic_msgs::msg::DiagnosticStatus::ERROR;
315  cameraStatus.message = "Camera is no longer open";
316  }
317 
318  diagnostic_msgs::msg::DiagnosticArray status;
319  status.header.stamp = ensenso::ros::now(nh);
320  status.status.push_back(cameraStatus);
321  statusPublisher->publish(status);
322 }
323 
324 void Camera::fillBasicCameraInfoFromNxLib(sensor_msgs::msg::CameraInfoPtr const& info) const
325 {
326  info->header.frame_id = params.cameraFrame;
327 
328  info->width = cameraNode[itmSensor][itmSize][0].asInt();
329  info->height = cameraNode[itmSensor][itmSize][1].asInt();
330 
331  info->distortion_model = sensor_msgs::distortion_models::PLUMB_BOB;
332 
333  GET_D_MATRIX(info).clear();
334 
335  GET_K_MATRIX(info).fill(0);
336  GET_P_MATRIX(info).fill(0);
337  GET_R_MATRIX(info).fill(0);
338 
339  if (cameraNode[itmParameters][itmCapture][itmBinning].exists())
340  {
341  info->binning_x = cameraNode[itmParameters][itmCapture][itmBinning].asInt();
342  info->binning_y = info->binning_x;
343  }
344  else
345  {
346  info->binning_x = 1;
347  info->binning_y = 1;
348  }
349 }
350 
352 {
353  return TARGET_FRAME_LINK + "_" + params.serial;
354 }
355 
356 void Camera::updateTransformations(tf2::Transform const& targetFrameTransformation) const
357 {
358  cameraNode[itmLink][itmTarget] = getNxLibTargetFrameName();
359  writeTransformToNxLib(targetFrameTransformation, NxLibItem()[itmLinks][getNxLibTargetFrameName()]);
360 }
361 
362 void Camera::updateGlobalLink(ensenso::ros::Time time, std::string targetFrame, bool useCachedTransformation) const
363 {
364  // Transformations are represented in the NxLib as follows:
365  // - The camera's link node might contain calibration data from e.g. a hand-eye calibration. This is always used if
366  // is present.
367  // - The transformation between the link frame and the target frame (in which the data is returned) is fetched from
368  // tf and written to the global link node of the NxLib.
369  // - The link in the camera node has to reference this global link if it exists (e.g. if the linkFrame is different
370  // from the targetFrame).
371 
372  if (targetFrame.empty())
373  {
374  targetFrame = params.targetFrame;
375  }
376 
377  if (params.linkFrame == targetFrame)
378  {
379  // The given target frame is the target frame already. So the camera does not need a reference to a global link.
380  cameraNode[itmLink][itmTarget] = "";
381  return;
382  }
383 
384  cameraNode[itmLink][itmTarget] = getNxLibTargetFrameName();
385 
386  // Update the transformation to the target frame in the NxLib according to the current information from tf only if
387  // link and target frame differ.
388  geometry_msgs::msg::TransformStamped transformMsg;
389  if (useCachedTransformation && transformationCache.count(targetFrame) != 0)
390  {
391  transformMsg = transformationCache[targetFrame];
392  }
393  else
394  {
395  transformMsg = tfBuffer->lookupTransform(params.linkFrame, targetFrame, time,
397  transformationCache[targetFrame] = transformMsg;
398  }
399  tf2::Transform transform;
400  tf2::convert(transformMsg.transform, transform);
401  NxLibItem()[itmLinks][getNxLibTargetFrameName()].setNull();
402  NxLibItem()[itmLinks].setNull();
403  writeTransformToNxLib(transform, NxLibItem()[itmLinks][getNxLibTargetFrameName()]);
404 }
405 
406 ensenso::msg::ParameterPtr Camera::readParameter(std::string const& key) const
407 {
408  auto message = ensenso::std::make_shared<ensenso::msg::Parameter>();
409  message->key = key;
410  if (parameterExists(key))
411  {
412  // The parameter is mapped to an NxLib node.
413 
414  ParameterMapping parameterMapping = parameterInformation.at(key);
415  NxLibItem node = parameterMapping.node(cameraNode);
416 
417  if (node.exists())
418  {
419  switch (parameterMapping.type)
420  {
421  case ParameterType::Bool:
422  message->bool_value = node.asBool();
423  break;
425  message->float_value = node.asDouble();
426  break;
428  message->string_value = node.asString();
429  break;
430  }
431  }
432  else
433  {
434  ENSENSO_WARN(nh, "Reading the parameter %s, but the camera does not support it!", key.c_str());
435  }
436  }
437  else
438  {
439  ENSENSO_ERROR(nh, "Unknown parameter '%s'!", key.c_str());
440  }
441 
442  return message;
443 }
444 
445 void Camera::writeParameter(ensenso::msg::Parameter const& parameter)
446 {
447  if (parameterExists(parameter.key))
448  {
449  // The parameter is mapped to an NxLib node.
450 
451  ParameterMapping parameterMapping = parameterInformation.at(parameter.key);
452  NxLibItem node = parameterMapping.node(cameraNode);
453 
454  if (!node.exists())
455  {
456  ENSENSO_WARN(nh, "Writing the parameter %s, but the camera does not support it!", parameter.key.c_str());
457  return;
458  }
459 
460  switch (parameterMapping.type)
461  {
462  case ParameterType::Bool:
463  node.set<bool>(parameter.bool_value);
464  break;
466  node.set<double>(parameter.float_value);
467  break;
469  node.set<std::string>(parameter.string_value);
470  }
471  }
472  else
473  {
474  ENSENSO_ERROR(nh, "Unknown parameter '%s'!", parameter.key.c_str());
475  }
476 }
477 
479 {
480  if (params.isFileCamera && !cameraNode.exists())
481  {
482  try
483  {
484  if (params.serial.empty())
485  {
486  ENSENSO_ERROR(nh, "The serial is empty, please proivde a valid one!");
487  return false;
488  }
489  if (params.serial.size() > 15)
490  {
491  ENSENSO_ERROR(nh, "The serial '%s' is too long!", params.serial.c_str());
492  return false;
493  }
494 
495  NxLibCommand createCamera(cmdCreateCamera, params.serial);
496  createCamera.parameters()[itmSerialNumber] = params.serial;
497  createCamera.parameters()[itmFolderPath] = params.fileCameraPath;
498  createCamera.execute();
499 
500  ENSENSO_INFO(nh, "Successfully created the file camera");
501  createdFileCamera = true;
502  }
503  catch (NxLibException& e)
504  {
505  ENSENSO_ERROR(nh, "Failed to create the file camera!");
507  return false;
508  }
509  }
510 
511  if (!cameraNode.exists())
512  {
513  ENSENSO_ERROR(nh, "The camera '%s' could not be found", params.serial.c_str());
514  return false;
515  }
516 
517  if (params.waitForCamera)
518  {
519  while (!cameraIsAvailable() && ensenso::ros::ok())
520  {
521  ENSENSO_INFO(nh, "Waiting for camera '%s' to become available", params.serial.c_str());
522  ensenso::ros::sleep(0.5);
523  }
524  }
525  else if (!cameraIsAvailable())
526  {
527  ENSENSO_ERROR(nh, "The camera '%s' is already in use", params.serial.c_str());
528  return false;
529  }
530 
531  // At this point the camera does for sure exist (since in case it is a file camera it has been created above) and the
532  // camera type is available in the NxLib. Update the camera type in order to also support S-series cameras, which are
533  // a subtype of stereo and do not have their own ROS node, but are handled by the stereo node.
535 
536  try
537  {
538  NxLibCommand open(cmdOpen, params.serial);
539  open.parameters()[itmCameras] = params.serial;
540  open.execute();
541  }
542  catch (NxLibException& e)
543  {
544  ENSENSO_ERROR(nh, "Error while opening the camera '%s'!", params.serial.c_str());
546  return false;
547  }
548 
552 
553  ENSENSO_INFO(nh, "Opened camera with serial number '%s'.", params.serial.c_str());
554 
556  {
557  ENSENSO_WARN_ONCE(nh, "Ensenso SDK 3.0 or newer is required, you are using version %s.",
558  nxLibVersion.toString().c_str());
559  }
560 
562  {
564  "Camera %s has an internal link (i.e. it is either extrinsically calibrated (workspace- or "
565  "hand-eye) or has a link to another camera), but camera and target frame are equal, which means "
566  "that neither a link nor a target frame has been provided. The images and 3d data retreived from "
567  "the camera are transformed by the NxLib with the transform stored in the camera's link node, "
568  "however, this transform is not known to tf. Please provide a link or target frame in order for "
569  "the transform to be published.",
570  params.serial.c_str());
571  }
572  return true;
573 }
574 
576 {
577  std::lock_guard<std::mutex> lock(nxLibMutex);
578 
579  try
580  {
581  NxLibCommand close(cmdClose, params.serial);
582  close.parameters()[itmCameras] = params.serial;
583  close.execute();
584 
586  {
587  NxLibCommand deleteCmd(cmdDeleteCamera, params.serial);
588  deleteCmd.parameters()[itmCameras] = params.serial;
589  deleteCmd.execute();
590  }
591  }
592  catch (NxLibException&)
593  {
594  }
595 }
596 
598 {
599  defaultParameters << cameraNode[itmParameters];
600 }
601 
602 void Camera::saveParameterSet(std::string name)
603 {
604  if (name.empty())
605  {
606  name = DEFAULT_PARAMETER_SET;
607  }
608 
609  ParameterSet& parameterSet = parameterSets.at(name);
610 
611  parameterSet.node.erase();
612  parameterSet.node << cameraNode[itmParameters];
613 }
614 
615 void Camera::loadParameterSet(std::string name)
616 {
617  if (name.empty())
618  {
619  name = DEFAULT_PARAMETER_SET;
620  }
621 
622  ENSENSO_DEBUG(nh, "Loading parameter set '%s'", name.c_str());
623 
624  if (parameterSets.count(name) == 0)
625  {
626  // The parameter set was never used before. Create it by copying the default settings.
627  std::string nodeName = params.serial + "_" + name;
628  parameterSets.insert(std::make_pair(name, ParameterSet(nodeName, defaultParameters)));
629  }
630 
631  ParameterSet const& parameterSet = parameterSets.at(name);
632 
633  bool changedParameters = false;
634  if (name != currentParameterSet)
635  {
636  cameraNode[itmParameters] << parameterSet.node;
637  changedParameters = true;
638  }
639 
640  if (changedParameters)
641  {
642  NxLibCommand synchronize(cmdSynchronize, params.serial);
643  synchronize.parameters()[itmCameras] = params.serial;
644  synchronize.execute();
645  }
646 
647  currentParameterSet = name;
648 }
649 
651 {
653 }
654 
656 {
658  {
659  return;
660  }
661 
662  transformBroadcaster->sendTransform(stampedLinkToCamera());
663 }
664 
665 geometry_msgs::msg::TransformStamped Camera::stampedLinkToCamera()
666 {
667  // Get the inverse of the camera to link transform, because we want to publish the other way around (e.g. instead of
668  // camera->link, we want link->camera).
669  tf2::Transform cameraToLinkInverse = getCameraToLinkTransform().inverse();
670  // The camera always needs to be the child frame in this transformation.
671  return fromTf(cameraToLinkInverse, params.linkFrame, params.cameraFrame, ensenso::ros::now(nh));
672 }
673 
675 {
676  // The NxLib will always give the transform from the camera to the link target in camera coordinates.
677  // Always initialize transform otherwise the transform will be invalid.
679 
680  try
681  {
682  transform = transformFromNxLib(cameraNode[itmLink]);
683  }
684  catch (NxLibException const& e)
685  {
686  ENSENSO_WARN(nh, "Link does not exist. Therefore we cannot publish a transform to any target. Error message: %s",
687  e.getErrorText().c_str());
688  }
689 
690  if (!isValid(transform))
691  {
692  ENSENSO_WARN(nh, "Did not find a good transform from %s to %s. Transform has been set to identity",
693  params.cameraFrame.c_str(), params.linkFrame.c_str());
694  }
695 
696  return transform;
697 }
698 
700 {
702 }
703 
705 {
707 }
GET_R_MATRIX
#define GET_R_MATRIX(info)
Definition: namespace.h:57
ENSENSO_WARN
void ENSENSO_WARN(T... args)
Definition: logging.h:210
fromTf
StampedTransformMsg fromTf(Transform const &transform, std::string parentFrame, std::string childFrame, ensenso::ros::Time timestamp)
Definition: pose_utilities.cpp:239
tf2::convert
void convert(const A &a, B &b)
CameraParameters::CameraParameters
CameraParameters(ensenso::ros::NodeHandle &nh, std::string const &cameraType, std::string serial)
Definition: camera.cpp:19
exists
ROSCPP_DECL bool exists(const std::string &service_name, bool print_failure_reason)
Camera::fillBasicCameraInfoFromNxLib
void fillBasicCameraInfoFromNxLib(sensor_msgs::msg::CameraInfoPtr const &info) const
Definition: camera.cpp:324
Camera::params
CameraParameters params
Definition: camera.h:258
GET_P_MATRIX
#define GET_P_MATRIX(info)
Definition: namespace.h:56
ParameterMapping::type
ParameterType type
Definition: parameters.h:27
Camera::updateCameraTypeSpecifics
virtual void updateCameraTypeSpecifics()
Definition: camera.h:307
Camera::updateTransformations
void updateTransformations(tf2::Transform const &targetFrameTransformation) const
Definition: camera.cpp:356
ParameterSet::node
NxLibItem node
Definition: camera.h:151
Camera::parameterSets
std::map< std::string, ParameterSet > parameterSets
Definition: camera.h:293
ParameterMapping::node
NxLibItem node(NxLibItem const &cameraNode)
Definition: parameters.h:35
tf2::Transform::inverse
Transform inverse() const
CameraParameters::robotFrame
std::string robotFrame
Definition: camera.h:234
isValid
bool isValid(Transform const &transform)
Definition: pose_utilities.cpp:32
parameterInformation
const std::map< std::string, ParameterMapping > parameterInformation
Definition: parameters.h:53
Camera::executeCommandServer
std::unique_ptr< ExecuteCommandServer > executeCommandServer
Definition: camera.h:283
Camera
Definition: camera.h:255
NxLibVersion::meetsMinimumRequirement
bool meetsMinimumRequirement(int majorRequired, int minorRequired) const
Definition: nxlib_version.h:29
distortion_models.h
START_NXLIB_ACTION
#define START_NXLIB_ACTION(ACTION_NAME, ACTION_SERVER)
Definition: camera.h:93
command
ROSLIB_DECL std::string command(const std::string &cmd)
CameraParameters
Definition: camera.h:175
Camera::getNxLibTargetFrameName
std::string getNxLibTargetFrameName() const
Definition: camera.cpp:351
ParameterSet::ParameterSet
ParameterSet(std::string const &name, NxLibItem const &defaultParameters)
Definition: camera.cpp:12
ENSENSO_INFO
void ENSENSO_INFO(T... args)
Definition: logging.h:142
transformFromNxLib
Transform transformFromNxLib(NxLibItem const &node)
Definition: pose_utilities.cpp:144
DEFAULT_PARAMETER_SET
const std::string DEFAULT_PARAMETER_SET
Definition: camera.h:62
Camera::createdFileCamera
bool createdFileCamera
Definition: camera.h:262
FINISH_NXLIB_ACTION
#define FINISH_NXLIB_ACTION(ACTION_NAME)
Definition: camera.h:104
writeTransformToNxLib
void writeTransformToNxLib(Transform const &transform, NxLibItem const &node)
Definition: pose_utilities.cpp:70
TF_REQUEST_TIMEOUT
const double TF_REQUEST_TIMEOUT
Definition: camera.h:57
CameraParameters::virtualObjectHandler
std::unique_ptr< ensenso_camera::VirtualObjectHandler > virtualObjectHandler
Definition: camera.h:250
Camera::saveDefaultParameterSet
void saveDefaultParameterSet()
Definition: camera.cpp:597
Camera::cameraIsOpen
bool cameraIsOpen() const
Definition: camera.cpp:291
Camera::onGetParameter
void onGetParameter(ensenso::action::GetParameterGoalConstPtr const &goal)
Definition: camera.cpp:266
Camera::onAccessTree
void onAccessTree(ensenso::action::AccessTreeGoalConstPtr const &goal)
Definition: camera.cpp:195
ParameterType::Number
@ Number
Camera::loadParameterSet
void loadParameterSet(std::string name)
Definition: camera.cpp:615
Camera::writeParameter
virtual void writeParameter(ensenso::msg::Parameter const &parameter)
Definition: camera.cpp:445
CameraParameters::isFileCamera
bool isFileCamera
Definition: camera.h:186
CREATE_TIMER
#define CREATE_TIMER(nh, duration_in_seconds, callback_ref, object_ptr)
Definition: time.h:98
ParameterMapping
Definition: parameters.h:25
Camera::saveParameterSet
void saveParameterSet(std::string name)
Definition: camera.cpp:602
ENSENSO_DEBUG
void ENSENSO_DEBUG(T... args)
Definition: logging.h:74
make_tf2_broadcaster
std::unique_ptr< tf2_ros::TransformBroadcaster > make_tf2_broadcaster(ensenso::ros::NodeHandle const &nh)
Definition: tf2.h:25
Camera::cameraPosePublisher
ensenso::ros::Timer cameraPosePublisher
Definition: camera.h:275
message
def message(msg, *args, **kwargs)
Camera::startServers
virtual void startServers() const
Definition: camera.cpp:120
CameraParameters::fileCameraPath
std::string fileCameraPath
Definition: camera.h:191
CameraParameters::serial
std::string serial
Definition: camera.h:180
Camera::currentParameterSet
std::string currentParameterSet
Definition: camera.h:294
Camera::transformBroadcaster
std::unique_ptr< tf2_ros::TransformBroadcaster > transformBroadcaster
Definition: camera.h:280
Camera::stampedLinkToCamera
geometry_msgs::msg::TransformStamped stampedLinkToCamera()
Definition: camera.cpp:665
tf2::Transform::getIdentity
static const Transform & getIdentity()
MAKE_SERVER
#define MAKE_SERVER(CallbackClass, ActionName, TopicName)
Definition: action_server.h:35
GET_D_MATRIX
#define GET_D_MATRIX(info)
Definition: namespace.h:54
CameraParameters::wristFrame
std::string wristFrame
Definition: camera.h:240
Camera::statusTimer
ensenso::ros::Timer statusTimer
Definition: camera.h:274
Camera::hasLink
bool hasLink() const
Definition: camera.cpp:297
ensenso::ros::get_parameter
bool get_parameter(NodeHandle &nh, const char *name, T &parameter)
Definition: core.h:148
ParameterType::String
@ String
Camera::cameraIsAvailable
bool cameraIsAvailable() const
Definition: camera.cpp:285
CameraParameters::fixed
bool fixed
Definition: camera.h:196
LOG_NXLIB_EXCEPTION
#define LOG_NXLIB_EXCEPTION(EXCEPTION)
Definition: camera.h:74
Camera::publishStatus
void publishStatus(TIMER_CALLBACK_DECLARATION_ARGS)
Definition: camera.cpp:302
Camera::loadSettings
bool loadSettings(std::string const &jsonFile, bool saveAsDefaultParameters=false)
Definition: camera.cpp:129
Camera::statusPublisher
ensenso::ros::Publisher< diagnostic_msgs::msg::DiagnosticArray > statusPublisher
Definition: camera.h:273
tf2::Transform
ensenso::ros::NodeHandle
::ros::NodeHandle NodeHandle
Definition: node.h:215
Camera::updateCameraInfo
virtual void updateCameraInfo()=0
Camera::transformListener
std::unique_ptr< tf2_ros::TransformListener > transformListener
Definition: camera.h:279
pose_utilities.h
CameraParameters::linkFrame
std::string linkFrame
Definition: camera.h:219
ParameterSet
Definition: camera.h:146
ensenso::ros::Time
::ros::Time Time
Definition: time.h:67
ParameterType::Bool
@ Bool
Camera::close
void close()
Definition: camera.cpp:575
Camera::initStatusTimer
virtual void initStatusTimer()
Definition: camera.cpp:704
Camera::initTfPublishTimer
virtual void initTfPublishTimer()
Definition: camera.cpp:699
ensenso::ros::ok
bool ok()
Definition: core.h:159
CameraParameters::captureTimeout
int captureTimeout
Definition: camera.h:245
Camera::nxLibVersion
NxLibVersion nxLibVersion
Definition: camera.h:264
NxLibVersion::toString
std::string toString() const
Definition: nxlib_version.h:37
isIdentity
bool isIdentity(Transform const &transform)
Definition: pose_utilities.cpp:55
conversion.h
expandPath
std::string expandPath(std::string const &path_)
Definition: string_helper.h:10
Camera::transformationCache
std::map< std::string, geometry_msgs::msg::TransformStamped > transformationCache
Definition: camera.h:288
parameters.h
camera.h
NxLibVersion::fillFromNxLib
void fillFromNxLib()
Definition: nxlib_version.h:16
ensenso::ros::now
inline ::ros::Time now(ensenso::ros::NodeHandle const &nh)
Definition: time.h:76
Camera::onExecuteCommand
void onExecuteCommand(ensenso::action::ExecuteCommandGoalConstPtr const &goal)
Definition: camera.cpp:248
make_tf2_buffer
std::unique_ptr< tf2_ros::Buffer > make_tf2_buffer(ensenso::ros::NodeHandle const &nh)
Definition: tf2.h:20
Camera::readParameter
virtual ensenso::msg::ParameterPtr readParameter(std::string const &key) const
Definition: camera.cpp:406
parameterExists
bool parameterExists(std::string const &key)
Definition: parameters.h:89
TARGET_FRAME_LINK
const std::string TARGET_FRAME_LINK
Definition: camera.h:67
std
POSE_TF_INTERVAL
const double POSE_TF_INTERVAL
Definition: camera.h:52
Camera::defaultParameters
NxLibItem defaultParameters
Definition: camera.h:291
Camera::cameraNode
NxLibItem cameraNode
Definition: camera.h:266
Camera::accessTreeServer
std::unique_ptr< AccessTreeServer > accessTreeServer
Definition: camera.h:282
Camera::getParameterServer
std::unique_ptr< GetParameterServer > getParameterServer
Definition: camera.h:284
imageFromNxLibNode
ImagePtr imageFromNxLibNode(NxLibItem const &node, std::string const &frame, bool isFileCamera)
Definition: image_utilities.cpp:93
CameraParameters::waitForCamera
bool waitForCamera
Definition: camera.h:201
GET_K_MATRIX
#define GET_K_MATRIX(info)
Definition: namespace.h:55
Camera::publishCameraLink
void publishCameraLink()
Definition: camera.cpp:655
Camera::open
bool open()
Definition: camera.cpp:478
CameraParameters::targetFrame
std::string targetFrame
Definition: camera.h:227
ENSENSO_WARN_ONCE
void ENSENSO_WARN_ONCE(T... args)
Definition: logging.h:229
ENSENSO_ERROR
void ENSENSO_ERROR(T... args)
Definition: logging.h:278
tf2.h
diagnostic_status.h
Camera::Camera
Camera(ensenso::ros::NodeHandle &nh, CameraParameters params)
Definition: camera.cpp:101
sensor_msgs::distortion_models::PLUMB_BOB
const std::string PLUMB_BOB
Camera::nxLibMutex
std::mutex nxLibMutex
Definition: camera.h:269
Camera::setParameterServer
std::unique_ptr< SetParameterServer > setParameterServer
Definition: camera.h:285
TIMER_CALLBACK_DEFINITION_ARGS
#define TIMER_CALLBACK_DEFINITION_ARGS
Definition: time.h:96
ensenso::ros::durationFromSeconds
inline ::ros::Duration durationFromSeconds(double d)
Definition: time.h:71
Camera::tfBuffer
std::unique_ptr< tf2_ros::Buffer > tfBuffer
Definition: camera.h:278
Camera::nh
ensenso::ros::NodeHandle nh
Definition: camera.h:271
ensenso::ros::sleep
void sleep(double t)
Definition: time.h:82
Camera::getCameraToLinkTransform
tf2::Transform getCameraToLinkTransform()
Definition: camera.cpp:674
CameraParameters::cameraFrame
std::string cameraFrame
Definition: camera.h:206
Camera::updateGlobalLink
void updateGlobalLink(ensenso::ros::Time time, std::string targetFrame="", bool useCachedTransformation=false) const
Definition: camera.cpp:362
STATUS_INTERVAL
const double STATUS_INTERVAL
Definition: camera.h:46
Camera::publishCurrentLinks
void publishCurrentLinks(TIMER_CALLBACK_DECLARATION_ARGS)
Definition: camera.cpp:650
move
void move(std::vector< T > &a, std::vector< T > &b)


ensenso_camera
Author(s): Ensenso
autogenerated on Wed Apr 2 2025 02:37:46