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", wait_for_camera);
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  if (cameraType != valMonocular)
52  {
53  ensenso::ros::get_parameter(nh, "robot_frame", robotFrame);
54  ensenso::ros::get_parameter(nh, "wrist_frame", wristFrame);
55 
56  if (fixed && robotFrame.empty())
57  {
59  }
60  if (!fixed && wristFrame.empty())
61  {
63  if (robotFrame.empty())
64  {
66  }
67  }
68 
69  ensenso::ros::get_parameter(nh, "capture_timeout", captureTimeout);
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  createdFileCamera = true;
501  }
502  catch (NxLibException& e)
503  {
504  ENSENSO_ERROR(nh, "Failed to create the file camera!");
506  return false;
507  }
508  }
509 
510  if (!cameraNode.exists())
511  {
512  ENSENSO_ERROR(nh, "The camera '%s' could not be found", params.serial.c_str());
513  return false;
514  }
515 
517  {
518  while (!cameraIsAvailable() && ensenso::ros::ok())
519  {
520  ENSENSO_INFO(nh, "Waiting for camera '%s' to become available", params.serial.c_str());
521  ensenso::ros::sleep(0.5);
522  }
523  }
524  else if (!cameraIsAvailable())
525  {
526  ENSENSO_ERROR(nh, "The camera '%s' is already in use", params.serial.c_str());
527  return false;
528  }
529 
530  // At this point the camera does for sure exist (since in case it is a file camera it has been created above) and the
531  // camera type is available in the NxLib. Update the camera type in order to also support S-series cameras, which are
532  // a subtype of stereo and do not have their own ROS node, but are handled by the stereo node.
534 
535  try
536  {
537  NxLibCommand open(cmdOpen, params.serial);
538  open.parameters()[itmCameras] = params.serial;
539  open.execute();
540  }
541  catch (NxLibException& e)
542  {
543  ENSENSO_ERROR(nh, "Error while opening the camera '%s'!", params.serial.c_str());
545  return false;
546  }
547 
551 
552  ENSENSO_INFO(nh, "Opened camera with serial number '%s'.", params.serial.c_str());
553 
555  {
556  ENSENSO_WARN_ONCE(nh, "Ensenso SDK 3.0 or newer is required, you are using version %s.",
557  nxLibVersion.toString().c_str());
558  }
559 
561  {
563  "Camera %s has an internal link (i.e. it is either extrinsically calibrated (workspace- or "
564  "hand-eye) or has a link to another camera), but camera and target frame are equal, which means "
565  "that neither a link nor a target frame has been provided. The images and 3d data retreived from "
566  "the camera are transformed by the NxLib with the transform stored in the camera's link node, "
567  "however, this transform is not known to tf. Please provide a link or target frame in order for "
568  "the transform to be published.",
569  params.serial.c_str());
570  }
571  return true;
572 }
573 
575 {
576  std::lock_guard<std::mutex> lock(nxLibMutex);
577 
578  try
579  {
580  NxLibCommand close(cmdClose, params.serial);
581  close.parameters()[itmCameras] = params.serial;
582  close.execute();
583 
585  {
586  NxLibCommand deleteCmd(cmdDeleteCamera, params.serial);
587  deleteCmd.parameters()[itmCameras] = params.serial;
588  deleteCmd.execute();
589  }
590  }
591  catch (NxLibException&)
592  {
593  }
594 }
595 
597 {
598  defaultParameters << cameraNode[itmParameters];
599 }
600 
601 void Camera::saveParameterSet(std::string name)
602 {
603  if (name.empty())
604  {
605  name = DEFAULT_PARAMETER_SET;
606  }
607 
608  ParameterSet& parameterSet = parameterSets.at(name);
609 
610  parameterSet.node.erase();
611  parameterSet.node << cameraNode[itmParameters];
612 }
613 
614 void Camera::loadParameterSet(std::string name)
615 {
616  if (name.empty())
617  {
618  name = DEFAULT_PARAMETER_SET;
619  }
620 
621  ENSENSO_DEBUG(nh, "Loading parameter set '%s'", name.c_str());
622 
623  if (parameterSets.count(name) == 0)
624  {
625  // The parameter set was never used before. Create it by copying the default settings.
626  std::string nodeName = params.serial + "_" + name;
627  parameterSets.insert(std::make_pair(name, ParameterSet(nodeName, defaultParameters)));
628  }
629 
630  ParameterSet const& parameterSet = parameterSets.at(name);
631 
632  bool changedParameters = false;
633  if (name != currentParameterSet)
634  {
635  cameraNode[itmParameters] << parameterSet.node;
636  changedParameters = true;
637  }
638 
639  if (changedParameters)
640  {
641  NxLibCommand synchronize(cmdSynchronize, params.serial);
642  synchronize.parameters()[itmCameras] = params.serial;
643  synchronize.execute();
644  }
645 
646  currentParameterSet = name;
647 }
648 
650 {
652 }
653 
655 {
657  {
658  return;
659  }
660 
661  transformBroadcaster->sendTransform(stampedLinkToCamera());
662 }
663 
664 geometry_msgs::msg::TransformStamped Camera::stampedLinkToCamera()
665 {
666  // Get the inverse of the camera to link transform, because we want to publish the other way around (e.g. instead of
667  // camera->link, we want link->camera).
668  tf2::Transform cameraToLinkInverse = getCameraToLinkTransform().inverse();
669  // The camera always needs to be the child frame in this transformation.
670  return fromTf(cameraToLinkInverse, params.linkFrame, params.cameraFrame, ensenso::ros::now(nh));
671 }
672 
674 {
675  // The NxLib will always give the transform from the camera to the link target in camera coordinates.
676  // Always initialize transform otherwise the transform will be invalid.
678 
679  try
680  {
681  transform = transformFromNxLib(cameraNode[itmLink]);
682  }
683  catch (NxLibException const& e)
684  {
685  ENSENSO_WARN(nh, "Link does not exist. Therefore we cannot publish a transform to any target. Error message: %s",
686  e.getErrorText().c_str());
687  }
688 
689  if (!isValid(transform))
690  {
691  ENSENSO_WARN(nh, "Did not find a good transform from %s to %s. Transform has been set to identity",
692  params.cameraFrame.c_str(), params.linkFrame.c_str());
693  }
694 
695  return transform;
696 }
697 
699 {
701 }
702 
704 {
706 }
std::string const DEFAULT_PARAMETER_SET
Definition: camera.h:62
bool get_parameter(NodeHandle &nh, const char *name, T &parameter)
Definition: core.h:141
geometry_msgs::msg::TransformStamped stampedLinkToCamera()
Definition: camera.cpp:664
inline ::ros::Duration durationFromSeconds(double d)
Definition: time.h:71
std::map< std::string, ParameterSet > parameterSets
Definition: camera.h:293
bool wait_for_camera
Definition: camera.h:201
void ENSENSO_WARN_ONCE(T... args)
Definition: logging.h:229
std::string cameraFrame
Definition: camera.h:206
#define GET_K_MATRIX(info)
Definition: namespace.h:55
void ENSENSO_ERROR(T... args)
Definition: logging.h:278
void writeTransformToNxLib(Transform const &transform, NxLibItem const &node)
void fillFromNxLib()
Definition: nxlib_version.h:16
NxLibItem node
Definition: camera.h:151
void ENSENSO_DEBUG(T... args)
Definition: logging.h:74
#define TIMER_CALLBACK_DEFINITION_ARGS
Definition: time.h:96
NxLibVersion nxLibVersion
Definition: camera.h:264
virtual void initStatusTimer()
Definition: camera.cpp:703
::ros::Time Time
Definition: time.h:67
void publishStatus(TIMER_CALLBACK_DECLARATION_ARGS)
Definition: camera.cpp:302
#define GET_P_MATRIX(info)
Definition: namespace.h:56
bool parameterExists(std::string const &key)
Definition: parameters.h:88
void ENSENSO_INFO(T... args)
Definition: logging.h:142
std::map< std::string, ParameterMapping > const parameterInformation
Definition: parameters.h:53
CameraParameters(ensenso::ros::NodeHandle &nh, std::string const &cameraType, std::string serial)
Definition: camera.cpp:19
double const POSE_TF_INTERVAL
Definition: camera.h:52
bool isFileCamera
Definition: camera.h:186
CameraParameters params
Definition: camera.h:258
std::string const TARGET_FRAME_LINK
Definition: camera.h:67
virtual ensenso::msg::ParameterPtr readParameter(std::string const &key) const
Definition: camera.cpp:406
void updateTransformations(tf2::Transform const &targetFrameTransformation) const
Definition: camera.cpp:356
bool cameraIsOpen() const
Definition: camera.cpp:291
std::unique_ptr< ensenso_camera::VirtualObjectHandler > virtualObjectHandler
Definition: camera.h:250
NxLibItem node(NxLibItem const &cameraNode)
Definition: parameters.h:35
double const STATUS_INTERVAL
Definition: camera.h:46
void publishCameraLink()
Definition: camera.cpp:654
bool meetsMinimumRequirement(int majorRequired, int minorRequired) const
Definition: nxlib_version.h:29
virtual void writeParameter(ensenso::msg::Parameter const &parameter)
Definition: camera.cpp:445
bool open()
Definition: camera.cpp:478
NxLibItem defaultParameters
Definition: camera.h:291
std::string toString() const
Definition: nxlib_version.h:37
std::string getNxLibTargetFrameName() const
Definition: camera.cpp:351
std::string expandPath(std::string const &path_)
Definition: string_helper.h:10
ensenso::ros::Timer cameraPosePublisher
Definition: camera.h:275
Camera(ensenso::ros::NodeHandle &nh, CameraParameters params)
Definition: camera.cpp:101
#define MAKE_SERVER(CallbackClass, ActionName, TopicName)
Definition: action_server.h:35
std::mutex nxLibMutex
Definition: camera.h:269
Transform inverse() const
bool cameraIsAvailable() const
Definition: camera.cpp:285
std::string serial
Definition: camera.h:180
ensenso::ros::NodeHandle nh
Definition: camera.h:271
double const TF_REQUEST_TIMEOUT
Definition: camera.h:57
std::unique_ptr< SetParameterServer > setParameterServer
Definition: camera.h:285
virtual void updateCameraInfo()=0
void updateGlobalLink(ensenso::ros::Time time, std::string targetFrame="", bool useCachedTransformation=false) const
Definition: camera.cpp:362
virtual void initTfPublishTimer()
Definition: camera.cpp:698
std::string fileCameraPath
Definition: camera.h:191
ROSLIB_DECL std::string command(const std::string &cmd)
std::unique_ptr< tf2_ros::Buffer > tfBuffer
Definition: camera.h:278
int captureTimeout
Definition: camera.h:245
#define GET_D_MATRIX(info)
Definition: namespace.h:54
void publishCurrentLinks(TIMER_CALLBACK_DECLARATION_ARGS)
Definition: camera.cpp:649
std::string wristFrame
Definition: camera.h:240
inline ::ros::Time now(ensenso::ros::NodeHandle const &nh)
Definition: time.h:76
tf2::Transform getCameraToLinkTransform()
Definition: camera.cpp:673
virtual void updateCameraTypeSpecifics()
Definition: camera.h:307
static const Transform & getIdentity()
std::map< std::string, geometry_msgs::msg::TransformStamped > transformationCache
Definition: camera.h:288
ensenso::ros::Timer statusTimer
Definition: camera.h:274
bool hasLink() const
Definition: camera.cpp:297
ensenso::ros::Publisher< diagnostic_msgs::msg::DiagnosticArray > statusPublisher
Definition: camera.h:273
std::string linkFrame
Definition: camera.h:219
def message(msg, args, kwargs)
::ros::NodeHandle NodeHandle
Definition: node.h:214
std::unique_ptr< ExecuteCommandServer > executeCommandServer
Definition: camera.h:283
bool ok()
Definition: core.h:152
void ENSENSO_WARN(T... args)
Definition: logging.h:210
NxLibItem cameraNode
Definition: camera.h:266
std::string targetFrame
Definition: camera.h:227
bool createdFileCamera
Definition: camera.h:262
void onAccessTree(ensenso::action::AccessTreeGoalConstPtr const &goal)
Definition: camera.cpp:195
std::unique_ptr< tf2_ros::Buffer > make_tf2_buffer(ensenso::ros::NodeHandle const &nh)
Definition: tf2.h:20
#define CREATE_TIMER(nh, duration_in_seconds, callback_ref, object_ptr)
Definition: time.h:98
void loadParameterSet(std::string name)
Definition: camera.cpp:614
#define LOG_NXLIB_EXCEPTION(EXCEPTION)
Definition: camera.h:74
ParameterSet(std::string const &name, NxLibItem const &defaultParameters)
Definition: camera.cpp:12
void move(std::vector< T > &a, std::vector< T > &b)
#define GET_R_MATRIX(info)
Definition: namespace.h:57
void saveDefaultParameterSet()
Definition: camera.cpp:596
Transform transformFromNxLib(NxLibItem const &node)
void onGetParameter(ensenso::action::GetParameterGoalConstPtr const &goal)
Definition: camera.cpp:266
void onExecuteCommand(ensenso::action::ExecuteCommandGoalConstPtr const &goal)
Definition: camera.cpp:248
void sleep(double t)
Definition: time.h:82
#define START_NXLIB_ACTION(ACTION_NAME, ACTION_SERVER)
Definition: camera.h:93
void convert(const A &a, B &b)
bool isIdentity(Transform const &transform)
std::unique_ptr< AccessTreeServer > accessTreeServer
Definition: camera.h:282
ROSCPP_DECL bool exists(const std::string &service_name, bool print_failure_reason)
virtual void startServers() const
Definition: camera.cpp:120
std::unique_ptr< GetParameterServer > getParameterServer
Definition: camera.h:284
void saveParameterSet(std::string name)
Definition: camera.cpp:601
std::unique_ptr< tf2_ros::TransformBroadcaster > make_tf2_broadcaster(ensenso::ros::NodeHandle const &nh)
Definition: tf2.h:25
ImagePtr imageFromNxLibNode(NxLibItem const &node, std::string const &frame, bool isFileCamera)
StampedTransformMsg fromTf(Transform const &transform, std::string parentFrame, std::string childFrame, ensenso::ros::Time timestamp)
Definition: camera.h:255
#define FINISH_NXLIB_ACTION(ACTION_NAME)
Definition: camera.h:104
std::string currentParameterSet
Definition: camera.h:294
bool isValid(Transform const &transform)
ParameterType type
Definition: parameters.h:27
std::string robotFrame
Definition: camera.h:234
bool loadSettings(std::string const &jsonFile, bool saveAsDefaultParameters=false)
Definition: camera.cpp:129
std::unique_ptr< tf2_ros::TransformListener > transformListener
Definition: camera.h:279
std::unique_ptr< tf2_ros::TransformBroadcaster > transformBroadcaster
Definition: camera.h:280
void close()
Definition: camera.cpp:574
void fillBasicCameraInfoFromNxLib(sensor_msgs::msg::CameraInfoPtr const &info) const
Definition: camera.cpp:324


ensenso_camera
Author(s): Ensenso
autogenerated on Sat Jun 3 2023 02:17:04