visionary_s.cpp
Go to the documentation of this file.
1 //
2 // Copyright (c) 2023 SICK AG, Waldkirch
3 //
4 // SPDX-License-Identifier: Unlicense
5 
6 #include <boost/thread.hpp>
7 #include <cv_bridge/cv_bridge.h>
9 #include <ros/ros.h>
10 #include <sensor_msgs/CameraInfo.h>
11 #include <sensor_msgs/PointCloud2.h>
13 #include <std_msgs/ByteMultiArray.h>
14 #include <memory>
15 
18 
19 #include "VisionaryControl.h"
20 #include "VisionaryDataStream.h"
21 #include "VisionarySData.h" // Header specific for the Stereo data
22 
23 using namespace visionary;
24 
25 std::shared_ptr<VisionaryControl> gControl;
26 
27 std::shared_ptr<VisionarySData> gDataHandler;
28 
31 
32 std::shared_ptr<diagnostic_updater::Updater> updater;
33 std::shared_ptr<diagnostic_updater::TopicDiagnostic> gPubZ_freq, gPubStatemap_freq, gPubRGBA_freq;
34 std::shared_ptr<diagnostic_updater::TopicDiagnostic> gPubCameraInfo_freq, gPubPoints_freq;
35 
36 std::string gFrameId;
37 std::string gDeviceIdent;
39 
40 boost::mutex gDataMtx;
41 bool gReceive = true;
42 
43 int gNumSubs = 0;
44 
46 {
47  updater->update();
48 }
49 
51 {
52  stat.summary(diagnostic_msgs::DiagnosticStatus::OK, "driver running");
53  stat.add("frame_id", gFrameId);
54  stat.add("device_ident", gDeviceIdent);
55  stat.add("NumSubscribers_CameraInfo", gPubCameraInfo.getNumSubscribers());
56  stat.add("gEnablePoints", gEnablePoints);
57  if (gEnablePoints)
58  stat.add("NumSubscribers_Points", gPubPoints.getNumSubscribers());
59  stat.add("gEnableZ", gEnableZ);
60  if (gEnableZ)
61  stat.add("NumSubscribers_Z", gPubZ.getNumSubscribers());
62  stat.add("gEnableStatemap", gEnableStatemap);
63  if (gEnableStatemap)
64  stat.add("NumSubscribers_Statemap", gPubStatemap.getNumSubscribers());
65  stat.add("gEnableRGBA", gEnableRGBA);
66  if (gEnableRGBA)
67  stat.add("NumSubscribers_RGBA", gPubRGBA.getNumSubscribers());
68 }
69 
70 void publishCameraInfo(std_msgs::Header header, VisionarySData& dataHandler)
71 {
72  sensor_msgs::CameraInfo ci;
73  ci.header = header;
74 
75  ci.height = dataHandler.getHeight();
76  ci.width = dataHandler.getWidth();
77 
78  ci.D.clear();
79  ci.D.resize(5, 0);
80  ci.D[0] = dataHandler.getCameraParameters().k1;
81  ci.D[1] = dataHandler.getCameraParameters().k2;
82  ci.D[2] = dataHandler.getCameraParameters().p1;
83  ci.D[3] = dataHandler.getCameraParameters().p2;
84  ci.D[4] = dataHandler.getCameraParameters().k3;
85 
86  for (int i = 0; i < 9; i++)
87  {
88  ci.K[i] = 0;
89  }
90  ci.K[0] = dataHandler.getCameraParameters().fx;
91  ci.K[4] = dataHandler.getCameraParameters().fy;
92  ci.K[2] = dataHandler.getCameraParameters().cx;
93  ci.K[5] = dataHandler.getCameraParameters().cy;
94  ci.K[8] = 1;
95 
96  for (int i = 0; i < 12; i++)
97  ci.P[i] = 0; // data.getCameraParameters().cam2worldMatrix[i];
98  // TODO:....
99  ci.P[0] = dataHandler.getCameraParameters().fx;
100  ci.P[5] = dataHandler.getCameraParameters().fy;
101  ci.P[10] = 1;
102  ci.P[2] = dataHandler.getCameraParameters().cx;
103  ci.P[6] = dataHandler.getCameraParameters().cy;
104 
106 }
107 
108 void publishZ(std_msgs::Header header, VisionarySData& dataHandler)
109 {
110  std::vector<uint16_t> vec = dataHandler.getZMap();
111  cv::Mat m = cv::Mat(dataHandler.getHeight(), dataHandler.getWidth(), CV_16UC1);
112  memcpy(m.data, vec.data(), vec.size() * sizeof(uint16_t));
113  sensor_msgs::ImagePtr msg =
115 
116  msg->header = header;
117  gPubZ.publish(msg);
118 }
119 
120 void publishStatemap(std_msgs::Header header, VisionarySData& dataHandler)
121 {
122  std::vector<uint16_t> vec = dataHandler.getConfidenceMap();
123  cv::Mat m = cv::Mat(dataHandler.getHeight(), dataHandler.getWidth(), CV_16UC1);
124  memcpy(m.data, vec.data(), vec.size() * sizeof(uint16_t));
125  sensor_msgs::ImagePtr msg =
127 
128  msg->header = header;
130 }
131 
132 void publishRGBA(std_msgs::Header header, VisionarySData& dataHandler)
133 {
134  std::vector<uint32_t> vec = dataHandler.getRGBAMap();
135  cv::Mat m = cv::Mat(dataHandler.getHeight(), dataHandler.getWidth(), CV_8UC4);
136  memcpy(m.data, vec.data(), vec.size() * sizeof(uint32_t));
137  sensor_msgs::ImagePtr msg =
139 
140  msg->header = header;
142 }
143 
144 void publishPointCloud(std_msgs::Header header, VisionarySData& dataHandler)
145 {
146  typedef sensor_msgs::PointCloud2 PointCloud;
147 
148  // Allocate new point cloud message
149  PointCloud::Ptr cloudMsg(new PointCloud);
150  cloudMsg->header = header;
151  cloudMsg->height = dataHandler.getHeight();
152  cloudMsg->width = dataHandler.getWidth();
153  cloudMsg->is_dense = false;
154  cloudMsg->is_bigendian = false;
155 
156  cloudMsg->fields.resize(5);
157  cloudMsg->fields[0].name = "x";
158  cloudMsg->fields[1].name = "y";
159  cloudMsg->fields[2].name = "z";
160  cloudMsg->fields[3].name = "confidence";
161  cloudMsg->fields[4].name = "rgba";
162  int offset = 0;
163  for (size_t d = 0; d < 3; ++d, offset += sizeof(float))
164  {
165  cloudMsg->fields[d].offset = offset;
166  cloudMsg->fields[d].datatype = int(sensor_msgs::PointField::FLOAT32);
167  cloudMsg->fields[d].count = 1;
168  }
169 
170  cloudMsg->fields[3].offset = offset;
171  cloudMsg->fields[3].datatype = int(sensor_msgs::PointField::UINT16);
172  cloudMsg->fields[3].count = 1;
173  offset += sizeof(uint16_t);
174 
175  cloudMsg->fields[4].offset = offset;
176  cloudMsg->fields[4].datatype = int(sensor_msgs::PointField::UINT32);
177  cloudMsg->fields[4].count = 1;
178  offset += sizeof(uint32_t);
179 
180  cloudMsg->point_step = offset;
181  cloudMsg->row_step = cloudMsg->point_step * cloudMsg->width;
182  cloudMsg->data.resize(cloudMsg->height * cloudMsg->row_step);
183 
184  std::vector<PointXYZ> pointCloud;
185  dataHandler.generatePointCloud(pointCloud);
186  dataHandler.transformPointCloud(pointCloud);
187 
188  // simple copy to create a XYZ point cloud
189  // memcpy(&cloud_msg->data[0], &pointCloud[0], pointCloud.size()*sizeof(PointXYZ));
190 
191  std::vector<uint16_t>::const_iterator itConf = dataHandler.getConfidenceMap().begin();
192  std::vector<uint32_t>::const_iterator itRGBA = dataHandler.getRGBAMap().begin();
193  std::vector<PointXYZ>::const_iterator itPC = pointCloud.begin();
194  size_t cloudSize = dataHandler.getHeight() * dataHandler.getWidth();
195  for (size_t index = 0; index < cloudSize; ++index, ++itConf, ++itRGBA, ++itPC)
196  {
197  memcpy(&cloudMsg->data[index * cloudMsg->point_step + cloudMsg->fields[0].offset], &*itPC, sizeof(PointXYZ));
198 
199  memcpy(&cloudMsg->data[index * cloudMsg->point_step + cloudMsg->fields[3].offset], &*itConf, sizeof(uint16_t));
200  memcpy(&cloudMsg->data[index * cloudMsg->point_step + cloudMsg->fields[4].offset], &*itRGBA, sizeof(uint32_t));
201  }
202  gPubPoints.publish(cloudMsg);
203 }
204 
205 void publish_frame(VisionarySData& dataHandler)
206 {
207  bool publishedAnything = false;
208 
209  std_msgs::Header header;
210  header.stamp = ros::Time::now();
211  header.frame_id = gFrameId;
212 
214  {
215  publishedAnything = true;
216  publishCameraInfo(header, dataHandler);
217  // gPubCameraInfo_freq->tick(header.stamp);
218  }
219  if (gEnableZ && gPubZ.getNumSubscribers() > 0)
220  {
221  publishedAnything = true;
222  publishZ(header, dataHandler);
223  // gPubZ_freq->tick(header.stamp);
224  }
226  {
227  publishedAnything = true;
228  publishStatemap(header, dataHandler);
229  // gPubStatemap_freq->tick(header.stamp);
230  }
232  {
233  publishedAnything = true;
234  publishRGBA(header, dataHandler);
235  // gPubRGBA_freq->tick(header.stamp);
236  }
238  {
239  publishedAnything = true;
240  publishPointCloud(header, dataHandler);
241  // gPubPoints_freq->tick(header.stamp);
242  }
243 
244  if (publishedAnything)
245  {
246  gPubCameraInfo_freq->tick(header.stamp);
247  if (gEnableZ)
248  gPubZ_freq->tick(header.stamp);
249  if (gEnableStatemap)
250  gPubStatemap_freq->tick(header.stamp);
251  if (gEnableRGBA)
252  gPubRGBA_freq->tick(header.stamp);
253  if (gEnablePoints)
254  gPubPoints_freq->tick(header.stamp);
255  }
256  else
257  {
258  ROS_DEBUG("Nothing published");
259  if (gControl)
260  gControl->stopAcquisition();
261  }
262 }
263 
265 {
266  gDataMtx.lock();
268  gDataMtx.unlock();
269 }
270 
271 void thr_receive_frame(std::shared_ptr<VisionaryDataStream> pDataStream, std::shared_ptr<VisionarySData> pDataHandler)
272 {
273  while (gReceive)
274  {
275  if (!pDataStream->getNextFrame())
276  {
277  continue; // No valid frame received
278  }
279  if (gDataMtx.try_lock())
280  {
281  gDataHandler = pDataHandler;
282  gDataMtx.unlock();
283  boost::thread thr(&thr_publish_frame);
284  }
285  else
286  ROS_INFO("skipping frame with number %d", pDataHandler->getFrameNum());
287  }
288 }
289 
291 {
292  gNumSubs++;
293  ROS_DEBUG_STREAM("Got new subscriber, total amount of subscribers: " << gNumSubs);
294  if (gControl)
295  gControl->startAcquisition();
296 }
297 
299 {
300  gNumSubs--;
301  ROS_DEBUG_STREAM("Subscriber disconnected, total amount of subscribers: " << gNumSubs);
302 }
303 
305 {
307 }
308 
310 {
312 }
313 
315 {
317 }
318 
320 {
322 }
323 
324 int main(int argc, char** argv)
325 {
326  ros::init(argc, argv, "sick_visionary_s");
327  ros::NodeHandle nh("~");
328 
329  // default parameters
330  std::string remoteDeviceIp = "192.168.1.10";
331  gFrameId = "camera";
332 
333  ros::param::get("~remote_device_ip", remoteDeviceIp);
334  ros::param::get("~frame_id", gFrameId);
335  ros::param::get("~enable_z", gEnableZ);
336  ros::param::get("~enable_statemap", gEnableStatemap);
337  ros::param::get("~enable_rgba", gEnableRGBA);
338  ros::param::get("~enable_points", gEnablePoints);
339 
340  std::shared_ptr<VisionarySData> pDataHandler = std::make_shared<VisionarySData>();
341  std::shared_ptr<VisionaryDataStream> pDataStream = std::make_shared<VisionaryDataStream>(pDataHandler);
342  gControl = std::make_shared<VisionaryControl>();
343 
344  ROS_INFO("Connecting to device at %s", remoteDeviceIp.c_str());
345  if (!gControl->open(VisionaryControl::ProtocolType::COLA_B, remoteDeviceIp.c_str(), 5000 /*ms*/))
346  {
347  ROS_ERROR("Connection with devices control channel failed");
348  return -1;
349  }
350  // To be sure the acquisition is currently stopped.
351  gControl->stopAcquisition();
352 
353  if (!pDataStream->open(remoteDeviceIp.c_str(), 2114))
354  {
355  ROS_ERROR("Connection with devices data channel failed");
356  return -1;
357  }
358 
359  // TODO: add get device name and device version and print to ros info.
360  ROS_INFO("Connected with Visionary-S");
361 
362  // make me public (after init.)
364  gPubCameraInfo = nh.advertise<sensor_msgs::CameraInfo>("camera_info",
365  1,
368  if (gEnablePoints)
369  gPubPoints = nh.advertise<sensor_msgs::PointCloud2>("points",
370  2,
373  if (gEnableZ)
374  gPubZ = it.advertise("z",
375  1,
378  if (gEnableStatemap)
379  gPubStatemap = it.advertise("statemap",
380  1,
383  if (gEnableRGBA)
384  gPubRGBA = it.advertise("rgba",
385  1,
388 
389  gDeviceIdent = gControl->getDeviceIdent();
390 
391  // diagnostics
393  updater->setHardwareID(nh.getNamespace());
394  updater->add("driver", driver_diagnostics);
395 
396  double desiredFreq; // device max freq is 30FPS
397  ros::param::get("~desired_frequency", desiredFreq);
398  double min_freq = desiredFreq * 0.9;
399  double max_freq = desiredFreq * 1.1;
400  gPubCameraInfo_freq.reset(
401  new diagnostic_updater::TopicDiagnostic("camera_info",
402  *updater,
403  diagnostic_updater::FrequencyStatusParam(&min_freq, &max_freq),
405  if (gEnablePoints)
406  gPubPoints_freq.reset(
408  *updater,
409  diagnostic_updater::FrequencyStatusParam(&min_freq, &max_freq),
411  if (gEnableZ)
412  gPubZ_freq.reset(
414  *updater,
415  diagnostic_updater::FrequencyStatusParam(&min_freq, &max_freq),
417  if (gEnableStatemap)
418  gPubStatemap_freq.reset(
420  *updater,
421  diagnostic_updater::FrequencyStatusParam(&min_freq, &max_freq),
423  if (gEnableRGBA)
424  gPubRGBA_freq.reset(
426  *updater,
427  diagnostic_updater::FrequencyStatusParam(&min_freq, &max_freq),
429 
431 
432  // start receiver thread for camera images
433  boost::thread rec_thr(boost::bind(&thr_receive_frame, pDataStream, pDataHandler));
434 
435  // wait til end of exec.
436  ros::spin();
437 
438  gReceive = false;
439  rec_thr.join();
440 
441  gControl->stopAcquisition();
442  gControl->close();
443  pDataStream->close();
444 
445  if (gEnableZ)
446  gPubZ.shutdown();
447  if (gEnableStatemap)
449  if (gEnableRGBA)
450  gPubRGBA.shutdown();
451  if (gEnablePoints)
454  // gPubIos.shutdown();
455 
456  return 0;
457 }
gEnablePoints
bool gEnablePoints
Definition: visionary_s.cpp:38
VisionaryControl.h
visionary::CameraParameters::fy
double fy
Definition: VisionaryData.h:27
diag_timer_cb
void diag_timer_cb(const ros::TimerEvent &)
Definition: visionary_s.cpp:45
visionary::CameraParameters::p1
double p1
Definition: VisionaryData.h:29
msg
msg
ros::Publisher
image_encodings.h
image_transport::ImageTransport
gControl
std::shared_ptr< VisionaryControl > gControl
Definition: visionary_s.cpp:25
gPubPoints
ros::Publisher gPubPoints
Definition: visionary_s.cpp:30
diagnostic_updater::TimeStampStatusParam
diagnostic_updater::DiagnosticStatusWrapper::add
void add(const std::string &key, const bool &b)
cv_bridge::CvImage::toImageMsg
sensor_msgs::ImagePtr toImageMsg() const
visionary::CameraParameters::cy
double cy
Definition: VisionaryData.h:27
ros::init
ROSCPP_DECL void init(const M_string &remappings, const std::string &name, uint32_t options=0)
ros::param::get
ROSCPP_DECL bool get(const std::string &key, bool &b)
visionary
Definition: MD5.cpp:44
VisionaryDataStream.h
ros.h
VisionarySData.h
visionary::CameraParameters::fx
double fx
Camera Matrix.
Definition: VisionaryData.h:27
main
int main(int argc, char **argv)
Definition: visionary_s.cpp:324
visionary::VisionaryData::getWidth
int getWidth() const
Definition: VisionaryData.cpp:198
image_transport::Publisher::getNumSubscribers
uint32_t getNumSubscribers() const
sensor_msgs::image_encodings::RGBA8
const std::string RGBA8
gPubZ_freq
std::shared_ptr< diagnostic_updater::TopicDiagnostic > gPubZ_freq
Definition: visionary_s.cpp:33
publishCameraInfo
void publishCameraInfo(std_msgs::Header header, VisionarySData &dataHandler)
Definition: visionary_s.cpp:70
diagnostic_updater::Updater
gReceive
bool gReceive
Definition: visionary_s.cpp:41
PointCloud
sensor_msgs::PointCloud2 PointCloud
visionary::VisionarySData::getConfidenceMap
const std::vector< std::uint16_t > & getConfidenceMap() const
Definition: VisionarySData.cpp:233
gNumSubs
int gNumSubs
Definition: visionary_s.cpp:43
visionary::CameraParameters::k3
double k3
Definition: VisionaryData.h:29
gEnableRGBA
bool gEnableRGBA
Definition: visionary_s.cpp:38
gFrameId
std::string gFrameId
Definition: visionary_s.cpp:36
ros::SubscriberStatusCallback
boost::function< void(const SingleSubscriberPublisher &)> SubscriberStatusCallback
gEnableZ
bool gEnableZ
Definition: visionary_s.cpp:38
ROS_DEBUG_STREAM
#define ROS_DEBUG_STREAM(args)
ros::Publisher::publish
void publish(const boost::shared_ptr< M > &message) const
gPubStatemap_freq
std::shared_ptr< diagnostic_updater::TopicDiagnostic > gPubStatemap_freq
Definition: visionary_s.cpp:33
ros::NodeHandle::advertise
Publisher advertise(AdvertiseOptions &ops)
publisher.h
diagnostic_updater.h
publishRGBA
void publishRGBA(std_msgs::Header header, VisionarySData &dataHandler)
Definition: visionary_s.cpp:132
image_transport::ImageTransport::advertise
Publisher advertise(const std::string &base_topic, uint32_t queue_size, bool latch=false)
sensor_msgs::image_encodings::TYPE_16UC1
const std::string TYPE_16UC1
thr_publish_frame
void thr_publish_frame()
Definition: visionary_s.cpp:264
visionary::PointXYZ
Definition: PointXYZ.h:10
ros::SingleSubscriberPublisher
updater
std::shared_ptr< diagnostic_updater::Updater > updater
Definition: visionary_s.cpp:32
diagnostic_updater::DiagnosticStatusWrapper::summary
void summary(const diagnostic_msgs::DiagnosticStatus &src)
publish_frame
void publish_frame(VisionarySData &dataHandler)
Definition: visionary_s.cpp:205
_on_new_subscriber
void _on_new_subscriber()
Definition: visionary_s.cpp:290
gPubRGBA
image_transport::Publisher gPubRGBA
Definition: visionary_s.cpp:29
ros::Publisher::shutdown
void shutdown()
visionary::VisionaryData::getCameraParameters
const CameraParameters & getCameraParameters() const
Definition: VisionaryData.cpp:235
ROS_DEBUG
#define ROS_DEBUG(...)
publishPointCloud
void publishPointCloud(std_msgs::Header header, VisionarySData &dataHandler)
Definition: visionary_s.cpp:144
gDataHandler
std::shared_ptr< VisionarySData > gDataHandler
Definition: visionary_s.cpp:27
on_new_subscriber_ros
void on_new_subscriber_ros(const ros::SingleSubscriberPublisher &)
Definition: visionary_s.cpp:304
gPubRGBA_freq
std::shared_ptr< diagnostic_updater::TopicDiagnostic > gPubRGBA_freq
Definition: visionary_s.cpp:33
image_transport::Publisher::shutdown
void shutdown()
d
d
publishStatemap
void publishStatemap(std_msgs::Header header, VisionarySData &dataHandler)
Definition: visionary_s.cpp:120
ros::TimerEvent
_on_subscriber_disconnected
void _on_subscriber_disconnected()
Definition: visionary_s.cpp:298
image_transport::Publisher::publish
void publish(const sensor_msgs::Image &message) const
visionary::CameraParameters::cx
double cx
Definition: VisionaryData.h:27
gDataMtx
boost::mutex gDataMtx
Definition: visionary_s.cpp:40
image_transport::SingleSubscriberPublisher
image_transport.h
diagnostic_updater::TopicDiagnostic
driver_diagnostics
void driver_diagnostics(diagnostic_updater::DiagnosticStatusWrapper &stat)
Definition: visionary_s.cpp:50
visionary::VisionarySData::generatePointCloud
void generatePointCloud(std::vector< PointXYZ > &pointCloud) override
Definition: VisionarySData.cpp:218
boost::iterators::i
D const & i
Definition: iterator_facade.hpp:956
visionary::CameraParameters::k2
double k2
Definition: VisionaryData.h:29
on_new_subscriber_it
void on_new_subscriber_it(const image_transport::SingleSubscriberPublisher &)
Definition: visionary_s.cpp:309
visionary::VisionarySData::getZMap
const std::vector< std::uint16_t > & getZMap() const
Definition: VisionarySData.cpp:223
visionary::VisionaryData::transformPointCloud
void transformPointCloud(std::vector< PointXYZ > &pointCloud) const
Definition: VisionaryData.cpp:171
visionary::VisionarySData
Definition: VisionarySData.h:17
image_transport::Publisher
cv_bridge.h
visionary::VisionarySData::getRGBAMap
const std::vector< std::uint32_t > & getRGBAMap() const
Definition: VisionarySData.cpp:228
gPubStatemap
image_transport::Publisher gPubStatemap
Definition: visionary_s.cpp:29
ROS_ERROR
#define ROS_ERROR(...)
cv_bridge::CvImage
visionary::VisionaryData::getHeight
int getHeight() const
Definition: VisionaryData.cpp:193
gPubPoints_freq
std::shared_ptr< diagnostic_updater::TopicDiagnostic > gPubPoints_freq
Definition: visionary_s.cpp:34
on_subscriber_disconnected_ros
void on_subscriber_disconnected_ros(const ros::SingleSubscriberPublisher &)
Definition: visionary_s.cpp:314
publishZ
void publishZ(std_msgs::Header header, VisionarySData &dataHandler)
Definition: visionary_s.cpp:108
on_subscriber_disconnected_it
void on_subscriber_disconnected_it(const image_transport::SingleSubscriberPublisher &)
Definition: visionary_s.cpp:319
diagnostic_updater::DiagnosticStatusWrapper
image_transport::SubscriberStatusCallback
boost::function< void(const SingleSubscriberPublisher &)> SubscriberStatusCallback
gPubCameraInfo
ros::Publisher gPubCameraInfo
Definition: visionary_s.cpp:30
visionary::CameraParameters::p2
double p2
Definition: VisionaryData.h:29
ros::spin
ROSCPP_DECL void spin()
ros::Publisher::getNumSubscribers
uint32_t getNumSubscribers() const
ros::NodeHandle::getNamespace
const std::string & getNamespace() const
header
const std::string header
ROS_INFO
#define ROS_INFO(...)
gDeviceIdent
std::string gDeviceIdent
Definition: visionary_s.cpp:37
ros::NodeHandle::createTimer
Timer createTimer(Duration period, const TimerCallback &callback, bool oneshot=false, bool autostart=true) const
ros::Duration
ros::Timer
thr_receive_frame
void thr_receive_frame(std::shared_ptr< VisionaryDataStream > pDataStream, std::shared_ptr< VisionarySData > pDataHandler)
Definition: visionary_s.cpp:271
gPubZ
image_transport::Publisher gPubZ
Definition: visionary_s.cpp:29
visionary::CameraParameters::k1
double k1
Camera Distortion Parameters.
Definition: VisionaryData.h:29
gPubCameraInfo_freq
std::shared_ptr< diagnostic_updater::TopicDiagnostic > gPubCameraInfo_freq
Definition: visionary_s.cpp:34
ros::NodeHandle
gEnableStatemap
bool gEnableStatemap
Definition: visionary_s.cpp:38
ros::Time::now
static Time now()
diagnostic_updater::FrequencyStatusParam


sick_visionary_ros
Author(s): SICK AG TechSupport 3D Snapshot
autogenerated on Thu Feb 8 2024 03:56:19