camera.h
Go to the documentation of this file.
1 #pragma once
2 
10 
18 
28 
30 #include <tf2_ros/buffer.h>
33 
34 #include <fstream>
35 #include <map>
36 #include <memory>
37 #include <mutex>
38 #include <string>
39 #include <vector>
40 
41 #include "nxLib.h"
42 
46 double const STATUS_INTERVAL = 3.0; // Seconds.
47 
52 double const POSE_TF_INTERVAL = 1; // Seconds.
53 
57 double const TF_REQUEST_TIMEOUT = 10.; // Seconds.
58 
62 std::string const DEFAULT_PARAMETER_SET = "default";
63 
67 std::string const TARGET_FRAME_LINK = "Workspace";
68 
69 // The ROS node gives back error codes from the NxLib. Additionally, we use the following error codes to indicate errors
70 // from the ROS node itself.
72 int const ERROR_CODE_TF = 101;
73 
74 #define LOG_NXLIB_EXCEPTION(EXCEPTION) \
75  try \
76  { \
77  if (EXCEPTION.getErrorCode() == NxLibExecutionFailed) \
78  { \
79  NxLibItem executionNode(EXCEPTION.getItemPath()); \
80  ENSENSO_ERROR(nh, "%s: %s", executionNode[itmResult][itmErrorSymbol].asString().c_str(), \
81  executionNode[itmResult][itmErrorText].asString().c_str()); \
82  } /* NOLINT */ \
83  } /* NOLINT */ \
84  catch (...) \
85  { \
86  } /* NOLINT */ \
87  ENSENSO_DEBUG(nh, "Current NxLib tree: %s", NxLibItem().asJson(true).c_str());
88 
89 // The following macros are called at the beginning and end of each action handler that uses the NxLib. In case of an
90 // NxLib exception they automatically abort the action and return the corresponding error code and message.
91 // This assumes that all of our actions have the property error that represents an NxLibException.
92 
93 #define START_NXLIB_ACTION(ACTION_NAME, ACTION_SERVER) \
94  ENSENSO_DEBUG(nh, "Received a " #ACTION_NAME " request."); \
95  auto& server = ACTION_SERVER; \
96  if (server->isPreemptRequested()) \
97  { \
98  server->setPreempted(); \
99  return; \
100  } /* NOLINT */ \
101  std::lock_guard<std::mutex> lock(nxLibMutex); \
102  try \
103  {
104 #define FINISH_NXLIB_ACTION(ACTION_NAME) \
105  } /* NOLINT */ \
106  catch (NxLibException & e) \
107  { \
108  ENSENSO_ERROR(nh, "NxLibException %d (%s) for item %s", e.getErrorCode(), e.getErrorText().c_str(), \
109  e.getItemPath().c_str()); \
110  LOG_NXLIB_EXCEPTION(e) \
111  ensenso::action::ACTION_NAME##Result result; \
112  result.error.code = e.getErrorCode(); \
113  result.error.message = e.getErrorText(); \
114  server->setAborted(std::move(result)); \
115  return; \
116  } /* NOLINT */ \
117  catch (tf2::TransformException & e) \
118  { \
119  ENSENSO_ERROR(nh, "tf Exception: %s", e.what()); \
120  ensenso::action::ACTION_NAME##Result result; \
121  result.error.code = ERROR_CODE_TF; \
122  result.error.message = e.what(); \
123  server->setAborted(std::move(result)); \
124  return; \
125  } /* NOLINT */ \
126  catch (std::exception & e) \
127  { \
128  ENSENSO_ERROR(nh, "Unknown Exception: %s", e.what()); \
129  ensenso::action::ACTION_NAME##Result result; \
130  result.error.code = ERROR_CODE_UNKNOWN_EXCEPTION; \
131  result.error.message = e.what(); \
132  server->setAborted(std::move(result)); \
133  return; \
134  }
135 
136 #define PREEMPT_ACTION_IF_REQUESTED \
137  if (server->isPreemptRequested()) \
138  { \
139  server->setPreempted(); \
140  return; \
141  }
142 
147 {
151  NxLibItem node;
152 
156  bool useROI = false;
157 
162 
167  bool autoProjector = true;
168 
169  ParameterSet(std::string const& name, NxLibItem const& defaultParameters);
170 };
171 
176 {
180  std::string serial;
181 
186  bool isFileCamera = false;
187 
191  std::string fileCameraPath;
192 
196  bool fixed = false;
197 
201  bool waitForCamera = false;
202 
206  std::string cameraFrame;
207 
219  std::string linkFrame;
220 
227  std::string targetFrame;
228 
234  std::string robotFrame;
235 
240  std::string wristFrame;
241 
245  int captureTimeout = 0;
246 
250  std::unique_ptr<ensenso_camera::VirtualObjectHandler> virtualObjectHandler = nullptr;
251 
252  CameraParameters(ensenso::ros::NodeHandle& nh, std::string const& cameraType, std::string serial);
253 };
254 
255 class Camera
256 {
257 protected:
259 
260  // Whether the camera is a file camera and was created by this node. If it was created by this node, it will be
261  // deleted after it got closed.
262  bool createdFileCamera = false;
263 
265 
266  NxLibItem cameraNode;
267 
268  // Controls parallel access to the NxLib.
269  mutable std::mutex nxLibMutex;
270 
272 
276 
277  // tf buffer, that will store transformations for 10 seconds and dropping transformation afterwards.
278  std::unique_ptr<tf2_ros::Buffer> tfBuffer;
279  std::unique_ptr<tf2_ros::TransformListener> transformListener;
280  std::unique_ptr<tf2_ros::TransformBroadcaster> transformBroadcaster;
281 
282  std::unique_ptr<AccessTreeServer> accessTreeServer;
283  std::unique_ptr<ExecuteCommandServer> executeCommandServer;
284  std::unique_ptr<GetParameterServer> getParameterServer;
285  std::unique_ptr<SetParameterServer> setParameterServer;
286 
287  // Saves the latest transforms for a specific frame.
288  mutable std::map<std::string, geometry_msgs::msg::TransformStamped> transformationCache;
289 
290  // Contains a parameter tree that is used for creating new parameter sets.
291  NxLibItem defaultParameters;
292 
293  std::map<std::string, ParameterSet> parameterSets;
294  std::string currentParameterSet;
295 
296 public:
298 
302  bool open();
303 
308  {
309  }
310 
314  virtual void init() = 0;
315 
319  void close();
320 
325  virtual void startServers() const;
326 
333  bool loadSettings(std::string const& jsonFile, bool saveAsDefaultParameters = false);
334 
338  void onAccessTree(ensenso::action::AccessTreeGoalConstPtr const& goal);
339 
343  void onExecuteCommand(ensenso::action::ExecuteCommandGoalConstPtr const& goal);
344 
348  void onGetParameter(ensenso::action::GetParameterGoalConstPtr const& goal);
349 
353  virtual void onSetParameter(ensenso::action::SetParameterGoalConstPtr const& goal) = 0;
354 
355 protected:
359  virtual void initTfPublishTimer();
360 
364  virtual void initStatusTimer();
365 
372  void saveParameterSet(std::string name);
373 
377  bool cameraIsAvailable() const;
378 
382  bool cameraIsOpen() const;
383 
387  bool hasLink() const;
388 
393 
403  void loadParameterSet(std::string name);
404 
408  virtual ensenso::ros::Time capture() const = 0;
409 
418  virtual geometry_msgs::msg::PoseStamped estimatePatternPose(ensenso::ros::Time imageTimestamp,
419  std::string const& targetFrame = "",
420  bool latestPatternOnly = false) const = 0;
421 
425  virtual std::vector<geometry_msgs::msg::PoseStamped>
426  estimatePatternPoses(ensenso::ros::Time imageTimestamp, std::string const& targetFrame = "") const = 0;
427 
434  void updateGlobalLink(ensenso::ros::Time time, std::string targetFrame = "",
435  bool useCachedTransformation = false) const;
436 
440  std::string getNxLibTargetFrameName() const;
441 
446  void updateTransformations(tf2::Transform const& targetFrameTransformation) const;
447 
451  void fillBasicCameraInfoFromNxLib(sensor_msgs::msg::CameraInfoPtr const& info) const;
452 
456  virtual void updateCameraInfo() = 0;
457 
461  virtual ensenso::msg::ParameterPtr readParameter(std::string const& key) const;
462 
466  virtual void writeParameter(ensenso::msg::Parameter const& parameter);
467 
474 
478  void publishCameraLink();
479 
483  geometry_msgs::msg::TransformStamped stampedLinkToCamera();
484 
489 };
CameraParameters::CameraParameters
CameraParameters(ensenso::ros::NodeHandle &nh, std::string const &cameraType, std::string serial)
Definition: camera.cpp:19
execute_command.h
Camera::fillBasicCameraInfoFromNxLib
void fillBasicCameraInfoFromNxLib(sensor_msgs::msg::CameraInfoPtr const &info) const
Definition: camera.cpp:324
Camera::params
CameraParameters params
Definition: camera.h:258
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
virtual_object_handler.h
CameraParameters::robotFrame
std::string robotFrame
Definition: camera.h:234
image_transport.h
Camera::executeCommandServer
std::unique_ptr< ExecuteCommandServer > executeCommandServer
Definition: camera.h:283
Camera
Definition: camera.h:255
CameraParameters
Definition: camera.h:175
Camera::getNxLibTargetFrameName
std::string getNxLibTargetFrameName() const
Definition: camera.cpp:351
Camera::estimatePatternPose
virtual geometry_msgs::msg::PoseStamped estimatePatternPose(ensenso::ros::Time imageTimestamp, std::string const &targetFrame="", bool latestPatternOnly=false) const =0
parameter.h
ParameterSet::autoProjector
bool autoProjector
Definition: camera.h:167
ParameterSet::ParameterSet
ParameterSet(std::string const &name, NxLibItem const &defaultParameters)
Definition: camera.cpp:12
ERROR_CODE_TF
const int ERROR_CODE_TF
Definition: camera.h:72
DEFAULT_PARAMETER_SET
const std::string DEFAULT_PARAMETER_SET
Definition: camera.h:62
Camera::createdFileCamera
bool createdFileCamera
Definition: camera.h:262
Camera::init
virtual void init()=0
buffer.h
TF_REQUEST_TIMEOUT
const double TF_REQUEST_TIMEOUT
Definition: camera.h:57
NxLibVersion
Definition: nxlib_version.h:7
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
namespace.h
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
transform_broadcaster.h
CameraParameters::isFileCamera
bool isFileCamera
Definition: camera.h:186
Camera::saveParameterSet
void saveParameterSet(std::string name)
Definition: camera.cpp:602
access_tree.h
Camera::cameraPosePublisher
ensenso::ros::Timer cameraPosePublisher
Definition: camera.h:275
queued_action_server.h
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::estimatePatternPoses
virtual std::vector< geometry_msgs::msg::PoseStamped > estimatePatternPoses(ensenso::ros::Time imageTimestamp, std::string const &targetFrame="") const =0
PointCloudROI
Definition: point_cloud_utilities.h:15
Camera::currentParameterSet
std::string currentParameterSet
Definition: camera.h:294
Camera::transformBroadcaster
std::unique_ptr< tf2_ros::TransformBroadcaster > transformBroadcaster
Definition: camera.h:280
pose_stamped.h
point_cloud_utilities.h
Camera::stampedLinkToCamera
geometry_msgs::msg::TransformStamped stampedLinkToCamera()
Definition: camera.cpp:665
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::Timer
::ros::Timer Timer
Definition: time.h:68
time.h
get_parameter.h
Camera::cameraIsAvailable
bool cameraIsAvailable() const
Definition: camera.cpp:285
CameraParameters::fixed
bool fixed
Definition: camera.h:196
action_server.h
Camera::capture
virtual ensenso::ros::Time capture() const =0
transform_stamped.h
Camera::publishStatus
void publishStatus(TIMER_CALLBACK_DECLARATION_ARGS)
Definition: camera.cpp:302
string_helper.h
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
CameraParameters::linkFrame
std::string linkFrame
Definition: camera.h:219
Camera::onSetParameter
virtual void onSetParameter(ensenso::action::SetParameterGoalConstPtr const &goal)=0
ParameterSet
Definition: camera.h:146
ensenso::ros::Time
::ros::Time Time
Definition: time.h:67
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
CameraParameters::captureTimeout
int captureTimeout
Definition: camera.h:245
Camera::nxLibVersion
NxLibVersion nxLibVersion
Definition: camera.h:264
Camera::transformationCache
std::map< std::string, geometry_msgs::msg::TransformStamped > transformationCache
Definition: camera.h:288
transform_listener.h
Camera::onExecuteCommand
void onExecuteCommand(ensenso::action::ExecuteCommandGoalConstPtr const &goal)
Definition: camera.cpp:248
ERROR_CODE_UNKNOWN_EXCEPTION
const int ERROR_CODE_UNKNOWN_EXCEPTION
Definition: camera.h:71
calibration_pattern.h
Camera::readParameter
virtual ensenso::msg::ParameterPtr readParameter(std::string const &key) const
Definition: camera.cpp:406
set_parameter.h
TARGET_FRAME_LINK
const std::string TARGET_FRAME_LINK
Definition: camera.h:67
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
logging.h
nxlib_version.h
Camera::getParameterServer
std::unique_ptr< GetParameterServer > getParameterServer
Definition: camera.h:284
core.h
CameraParameters::waitForCamera
bool waitForCamera
Definition: camera.h:201
ensenso::ros::Publisher
::std::unique_ptr< ::ros::Publisher > Publisher
Definition: core.h:122
ParameterSet::roi
PointCloudROI roi
Definition: camera.h:161
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
camera_info.h
Camera::Camera
Camera(ensenso::ros::NodeHandle &nh, CameraParameters params)
Definition: camera.cpp:101
Camera::nxLibMutex
std::mutex nxLibMutex
Definition: camera.h:269
Camera::setParameterServer
std::unique_ptr< SetParameterServer > setParameterServer
Definition: camera.h:285
image_utilities.h
Camera::tfBuffer
std::unique_ptr< tf2_ros::Buffer > tfBuffer
Definition: camera.h:278
node_handle.h
Transform.h
Camera::nh
ensenso::ros::NodeHandle nh
Definition: camera.h:271
Camera::getCameraToLinkTransform
tf2::Transform getCameraToLinkTransform()
Definition: camera.cpp:674
CameraParameters::cameraFrame
std::string cameraFrame
Definition: camera.h:206
TIMER_CALLBACK_DECLARATION_ARGS
#define TIMER_CALLBACK_DECLARATION_ARGS
Definition: time.h:94
Camera::updateGlobalLink
void updateGlobalLink(ensenso::ros::Time time, std::string targetFrame="", bool useCachedTransformation=false) const
Definition: camera.cpp:362
diagnostic_array.h
ParameterSet::useROI
bool useROI
Definition: camera.h:156
STATUS_INTERVAL
const double STATUS_INTERVAL
Definition: camera.h:46
Camera::publishCurrentLinks
void publishCurrentLinks(TIMER_CALLBACK_DECLARATION_ARGS)
Definition: camera.cpp:650


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