compound_publisher.cpp
Go to the documentation of this file.
1 // -- BEGIN LICENSE BLOCK ----------------------------------------------
20 // -- END LICENSE BLOCK ------------------------------------------------
21 
22 //----------------------------------------------------------------------
29 //----------------------------------------------------------------------
30 
31 #include <sick_safevisionary_base/SafeVisionaryData.h>
33 
35  : priv_nh_("~/")
36 {
37  camera_info_pub_ = priv_nh_.advertise<sensor_msgs::CameraInfo>("camera_info", 1);
38  pointcloud_pub_ = priv_nh_.advertise<sensor_msgs::PointCloud2>("points", 1);
39  imu_pub_ = priv_nh_.advertise<sensor_msgs::Imu>("imu_data", 1);
40  io_pub_ = priv_nh_.advertise<sick_safevisionary_msgs::CameraIO>("camera_io", 1);
41  roi_pub_ = priv_nh_.advertise<sick_safevisionary_msgs::ROIArray>("region_of_interest", 1);
42  field_pub_ = priv_nh_.advertise<sick_safevisionary_msgs::FieldInformationArray>("fields", 1);
44  priv_nh_.advertise<sick_safevisionary_msgs::DeviceStatus>("device_status", 1);
45 
47  depth_pub_ = image_transport.advertise("depth", 1);
48  intensity_pub_ = image_transport.advertise("intensity", 1);
49  state_pub_ = image_transport.advertise("state", 1);
50 }
51 
52 
53 void CompoundPublisher::publish(const std_msgs::Header& header,
54  visionary::SafeVisionaryData& frame_data)
55 {
57  {
58  publishCameraInfo(header, frame_data);
59  }
61  {
62  publishPointCloud(header, frame_data);
63  }
64  if (depth_pub_.getNumSubscribers() > 0)
65  {
66  publishDepthImage(header, frame_data);
67  }
69  {
70  publishIntensityImage(header, frame_data);
71  }
72  if (state_pub_.getNumSubscribers() > 0)
73  {
74  publishStateMap(header, frame_data);
75  }
76  if (imu_pub_.getNumSubscribers() > 0)
77  {
78  publishIMUData(header, frame_data);
79  }
81  {
82  publishDeviceStatus(header, frame_data);
83  }
84  if (io_pub_.getNumSubscribers() > 0)
85  {
86  publishIOs(header, frame_data);
87  }
88  if (roi_pub_.getNumSubscribers() > 0)
89  {
90  publishROI(header, frame_data);
91  }
92  if (field_pub_.getNumSubscribers() > 0)
93  {
94  publishFieldInformation(header, frame_data);
95  }
96 }
97 
98 void CompoundPublisher::publishCameraInfo(const std_msgs::Header& header,
99  const visionary::SafeVisionaryData& frame_data)
100 {
101  sensor_msgs::CameraInfo camera_info;
102  camera_info.header = header;
103 
104  camera_info.height = frame_data.getHeight();
105  camera_info.width = frame_data.getWidth();
106  camera_info.D = std::vector<double>(5, 0);
107  camera_info.D[0] = frame_data.getCameraParameters().k1;
108  camera_info.D[1] = frame_data.getCameraParameters().k2;
109  camera_info.D[2] = frame_data.getCameraParameters().p1;
110  camera_info.D[3] = frame_data.getCameraParameters().p2;
111  camera_info.D[4] = frame_data.getCameraParameters().k3;
112 
113  camera_info.K[0] = frame_data.getCameraParameters().fx;
114  camera_info.K[2] = frame_data.getCameraParameters().cx;
115  camera_info.K[4] = frame_data.getCameraParameters().fy;
116  camera_info.K[5] = frame_data.getCameraParameters().cy;
117  camera_info.K[8] = 1;
118  // TODO add missing parameter in Projection Matrix
119  camera_info_pub_.publish(camera_info);
120 }
121 
122 void CompoundPublisher::publishPointCloud(const std_msgs::Header& header,
123  visionary::SafeVisionaryData& frame_data)
124 {
125  sensor_msgs::PointCloud2::Ptr cloud_msg(new sensor_msgs::PointCloud2);
126  cloud_msg->header = header;
127  cloud_msg->height = frame_data.getHeight();
128  cloud_msg->width = frame_data.getWidth();
129  cloud_msg->is_dense = false;
130  cloud_msg->is_bigendian = false;
131 
132  cloud_msg->fields.resize(4);
133  cloud_msg->fields[0].name = "x";
134  cloud_msg->fields[1].name = "y";
135  cloud_msg->fields[2].name = "z";
136  cloud_msg->fields[3].name = "intensity";
137 
138  int offset = 0;
139  for (size_t i = 0; i < 3; ++i)
140  {
141  cloud_msg->fields[i].offset = offset;
142  cloud_msg->fields[i].datatype = int(sensor_msgs::PointField::FLOAT32);
143  cloud_msg->fields[i].count = 1;
144  offset += sizeof(float);
145  }
146 
147  cloud_msg->fields[3].offset = offset;
148  cloud_msg->fields[3].datatype = int(sensor_msgs::PointField::UINT16);
149  cloud_msg->fields[3].count = 1;
150  offset += sizeof(uint16_t);
151 
152  cloud_msg->point_step = offset;
153  cloud_msg->row_step = cloud_msg->point_step * cloud_msg->width;
154  cloud_msg->data.resize(cloud_msg->height * cloud_msg->row_step);
155 
156  std::vector<visionary::PointXYZ> point_vec;
157  frame_data.generatePointCloud(point_vec);
158  frame_data.transformPointCloud(point_vec);
159 
160  if (frame_data.getIntensityMap().size() != point_vec.size())
161  {
162  ROS_INFO_STREAM("Missmatch point and intensity data.");
163  return;
164  }
165 
166  std::vector<uint16_t>::const_iterator intensity_it = frame_data.getIntensityMap().begin();
167  std::vector<visionary::PointXYZ>::const_iterator point_it = point_vec.begin();
168  // TODO check if both vector sizes align
169 
170  for (size_t i = 0; i < point_vec.size(); ++i, ++intensity_it, ++point_it)
171  {
172  memcpy(&cloud_msg->data[i * cloud_msg->point_step + cloud_msg->fields[0].offset],
173  &*point_it,
174  sizeof(visionary::PointXYZ));
175  memcpy(&cloud_msg->data[i * cloud_msg->point_step + cloud_msg->fields[3].offset],
176  &*intensity_it,
177  sizeof(uint16_t));
178  }
179  pointcloud_pub_.publish(cloud_msg);
180 }
181 
182 void CompoundPublisher::publishIMUData(const std_msgs::Header& header,
183  const visionary::SafeVisionaryData& frame_data)
184 {
185  sensor_msgs::Imu imu_msg;
186  imu_msg.header = header;
187  imu_msg.angular_velocity.x = frame_data.getIMUData().angularVelocity.X;
188  imu_msg.angular_velocity.y = frame_data.getIMUData().angularVelocity.Y;
189  imu_msg.angular_velocity.z = frame_data.getIMUData().angularVelocity.Z;
190  imu_msg.linear_acceleration.x = frame_data.getIMUData().acceleration.X;
191  imu_msg.linear_acceleration.y = frame_data.getIMUData().acceleration.Y;
192  imu_msg.linear_acceleration.z = frame_data.getIMUData().acceleration.Z;
193  imu_msg.orientation.x = frame_data.getIMUData().orientation.X;
194  imu_msg.orientation.y = frame_data.getIMUData().orientation.Y;
195  imu_msg.orientation.z = frame_data.getIMUData().orientation.Z;
196  imu_msg.orientation.w = frame_data.getIMUData().orientation.W;
197  imu_pub_.publish(imu_msg);
198 }
199 
200 void CompoundPublisher::publishDepthImage(const std_msgs::Header& header,
201  const visionary::SafeVisionaryData& frame_data)
202 {
203  depth_pub_.publish(Vec16ToImage(header, frame_data, frame_data.getDistanceMap()));
204 }
205 
206 void CompoundPublisher::publishIntensityImage(const std_msgs::Header& header,
207  const visionary::SafeVisionaryData& frame_data)
208 {
209  intensity_pub_.publish(Vec16ToImage(header, frame_data, frame_data.getIntensityMap()));
210 }
211 
212 void CompoundPublisher::publishStateMap(const std_msgs::Header& header,
213  const visionary::SafeVisionaryData& frame_data)
214 {
215  state_pub_.publish(Vec8ToImage(header, frame_data, frame_data.getStateMap()));
216 }
217 
218 sensor_msgs::ImagePtr
219 CompoundPublisher::Vec16ToImage(const std_msgs::Header& header,
220  const visionary::SafeVisionaryData& frame_data,
221  std::vector<uint16_t> vec)
222 {
223  cv::Mat image = cv::Mat(frame_data.getHeight(), frame_data.getWidth(), CV_16UC1);
224  std::memcpy(image.data, vec.data(), vec.size() * sizeof(uint16_t));
226 }
227 sensor_msgs::ImagePtr CompoundPublisher::Vec8ToImage(const std_msgs::Header& header,
228  const visionary::SafeVisionaryData& frame_data,
229  std::vector<uint8_t> vec)
230 {
231  cv::Mat image = cv::Mat(frame_data.getHeight(), frame_data.getWidth(), CV_8UC1);
232  std::memcpy(image.data, vec.data(), vec.size() * sizeof(uint8_t));
234 }
235 
236 
237 void CompoundPublisher::publishDeviceStatus(const std_msgs::Header& header,
238  const visionary::SafeVisionaryData& frame_data)
239 {
240  sick_safevisionary_msgs::DeviceStatus device_status_msg;
241  device_status_msg.header = header;
242  device_status_msg.status = static_cast<uint8_t>(frame_data.getDeviceStatus());
243  device_status_msg.general_status.application_error =
244  frame_data.getDeviceStatusData().generalStatus.applicationError;
245  device_status_msg.general_status.contamination_error =
246  frame_data.getDeviceStatusData().generalStatus.contaminationError;
247  device_status_msg.general_status.contamination_warning =
248  frame_data.getDeviceStatusData().generalStatus.contaminationWarning;
249  device_status_msg.general_status.dead_zone_detection =
250  frame_data.getDeviceStatusData().generalStatus.deadZoneDetection;
251  device_status_msg.general_status.device_error =
252  frame_data.getDeviceStatusData().generalStatus.deviceError;
253  device_status_msg.general_status.temperature_warning =
254  frame_data.getDeviceStatusData().generalStatus.temperatureWarning;
255  device_status_msg.general_status.run_mode_active =
256  frame_data.getDeviceStatusData().generalStatus.runModeActive;
257  device_status_msg.general_status.wait_for_cluster =
258  frame_data.getDeviceStatusData().generalStatus.waitForCluster;
259  device_status_msg.general_status.wait_for_input =
260  frame_data.getDeviceStatusData().generalStatus.waitForInput;
261  device_status_msg.COP_non_safety_related = frame_data.getDeviceStatusData().COPNonSaftyRelated;
262  device_status_msg.COP_safety_related = frame_data.getDeviceStatusData().COPSaftyRelated;
263  device_status_msg.COP_reset_required = frame_data.getDeviceStatusData().COPResetRequired;
264  device_status_msg.active_monitoring_case.monitoring_case_1 =
265  frame_data.getDeviceStatusData().activeMonitoringCase.currentCaseNumberMonitoringCase1;
266  device_status_msg.active_monitoring_case.monitoring_case_2 =
267  frame_data.getDeviceStatusData().activeMonitoringCase.currentCaseNumberMonitoringCase2;
268  device_status_msg.active_monitoring_case.monitoring_case_3 =
269  frame_data.getDeviceStatusData().activeMonitoringCase.currentCaseNumberMonitoringCase3;
270  device_status_msg.active_monitoring_case.monitoring_case_4 =
271  frame_data.getDeviceStatusData().activeMonitoringCase.currentCaseNumberMonitoringCase4;
272  device_status_msg.contamination_level = frame_data.getDeviceStatusData().contaminationLevel;
273  device_status_pub_.publish(device_status_msg);
274 }
275 
276 void CompoundPublisher::publishIOs(const std_msgs::Header& header,
277  const visionary::SafeVisionaryData& frame_data)
278 {
279  sick_safevisionary_msgs::CameraIO camera_io_msg;
280  camera_io_msg.header = header;
281  camera_io_msg.configured.pin_5 =
282  frame_data.getLocalIOData().universalIOConfigured.configuredUniIOPin5;
283  camera_io_msg.configured.pin_6 =
284  frame_data.getLocalIOData().universalIOConfigured.configuredUniIOPin6;
285  camera_io_msg.configured.pin_7 =
286  frame_data.getLocalIOData().universalIOConfigured.configuredUniIOPin7;
287  camera_io_msg.configured.pin_8 =
288  frame_data.getLocalIOData().universalIOConfigured.configuredUniIOPin8;
289  camera_io_msg.direction.pin_5 =
290  frame_data.getLocalIOData().universalIODirection.directionValueUniIOPin5;
291  camera_io_msg.direction.pin_6 =
292  frame_data.getLocalIOData().universalIODirection.directionValueUniIOPin6;
293  camera_io_msg.direction.pin_7 =
294  frame_data.getLocalIOData().universalIODirection.directionValueUniIOPin7;
295  camera_io_msg.direction.pin_8 =
296  frame_data.getLocalIOData().universalIODirection.directionValueUniIOPin8;
297  camera_io_msg.input_values.pin_5 =
298  frame_data.getLocalIOData().universalIOInputValue.logicalValueUniIOPin5;
299  camera_io_msg.input_values.pin_6 =
300  frame_data.getLocalIOData().universalIOInputValue.logicalValueUniIOPin6;
301  camera_io_msg.input_values.pin_7 =
302  frame_data.getLocalIOData().universalIOInputValue.logicalValueUniIOPin7;
303  camera_io_msg.input_values.pin_8 =
304  frame_data.getLocalIOData().universalIOInputValue.logicalValueUniIOPin8;
305  camera_io_msg.output_values.pin_5 =
306  frame_data.getLocalIOData().universalIOOutputValue.localOutput1Pin5;
307  camera_io_msg.output_values.pin_6 =
308  frame_data.getLocalIOData().universalIOOutputValue.localOutput2Pin6;
309  camera_io_msg.output_values.pin_7 =
310  frame_data.getLocalIOData().universalIOOutputValue.localOutput3Pin7;
311  camera_io_msg.output_values.pin_8 =
312  frame_data.getLocalIOData().universalIOOutputValue.localOutput4Pin8;
313  camera_io_msg.ossds_state.OSSD1A = frame_data.getLocalIOData().ossdsState.stateOSSD1A;
314  camera_io_msg.ossds_state.OSSD1B = frame_data.getLocalIOData().ossdsState.stateOSSD1B;
315  camera_io_msg.ossds_state.OSSD2A = frame_data.getLocalIOData().ossdsState.stateOSSD2A;
316  camera_io_msg.ossds_state.OSSD2B = frame_data.getLocalIOData().ossdsState.stateOSSD2B;
317  camera_io_msg.ossds_dyn_count = frame_data.getLocalIOData().ossdsDynCount;
318  camera_io_msg.ossds_crc = frame_data.getLocalIOData().ossdsCRC;
319  camera_io_msg.ossds_io_status = frame_data.getLocalIOData().ossdsIOStatus;
320  camera_io_msg.dynamic_speed_a = frame_data.getLocalIOData().dynamicSpeedA;
321  camera_io_msg.dynamic_speed_b = frame_data.getLocalIOData().dynamicSpeedB;
322  camera_io_msg.dynamic_valid_flags = frame_data.getLocalIOData().DynamicValidFlags;
323  io_pub_.publish(camera_io_msg);
324 }
325 
326 void CompoundPublisher::publishROI(const std_msgs::Header& header,
327  const visionary::SafeVisionaryData& frame_data)
328 {
329  sick_safevisionary_msgs::ROIArray roi_array_msg;
330  roi_array_msg.header = header;
331  for (auto& roi : frame_data.getRoiData().roiData)
332  {
333  sick_safevisionary_msgs::ROI roi_msg;
334  roi_msg.id = roi.id;
335  roi_msg.distance_value = roi.distanceValue;
336  roi_msg.result_data.distance_safe = roi.result.distanceSafe;
337  roi_msg.result_data.distance_valid = roi.result.distanceValid;
338  roi_msg.result_data.result_safe = roi.result.resultSafe;
339  roi_msg.result_data.result_valid = roi.result.resultValid;
340  roi_msg.result_data.task_result = roi.result.taskResult;
341  roi_msg.safety_data.invalid_due_to_invalid_pixels =
342  roi.safetyRelatedData.tMembers.invalidDueToInvalidPixels;
343  roi_msg.safety_data.invalid_due_to_variance =
344  roi.safetyRelatedData.tMembers.invalidDueToVariance;
345  roi_msg.safety_data.invalid_due_to_overexposure =
346  roi.safetyRelatedData.tMembers.invalidDueToOverexposure;
347  roi_msg.safety_data.invalid_due_to_underexposure =
348  roi.safetyRelatedData.tMembers.invalidDueToUnderexposure;
349  roi_msg.safety_data.invalid_due_to_temporal_variance =
350  roi.safetyRelatedData.tMembers.invalidDueToTemporalVariance;
351  roi_msg.safety_data.invalid_due_to_outside_of_measurement_range =
352  roi.safetyRelatedData.tMembers.invalidDueToOutsideOfMeasurementRange;
353  roi_msg.safety_data.invalid_due_to_retro_reflector_interference =
354  roi.safetyRelatedData.tMembers.invalidDueToRetroReflectorInterference;
355  roi_msg.safety_data.contamination_error = roi.safetyRelatedData.tMembers.contaminationError;
356  roi_msg.safety_data.quality_class = roi.safetyRelatedData.tMembers.qualityClass;
357  roi_msg.safety_data.slot_active = roi.safetyRelatedData.tMembers.slotActive;
358  roi_array_msg.rois.push_back(roi_msg);
359  }
360  roi_pub_.publish(roi_array_msg);
361 }
362 
363 void CompoundPublisher::publishFieldInformation(const std_msgs::Header& header,
364  const visionary::SafeVisionaryData& frame_data)
365 {
366  sick_safevisionary_msgs::FieldInformationArray field_array_msg;
367  field_array_msg.header = header;
368  for (auto& field : frame_data.getFieldInformationData().fieldInformation)
369  {
370  sick_safevisionary_msgs::FieldInformation field_msg;
371  field_msg.field_id = field.fieldID;
372  field_msg.field_set_id = field.fieldSetID;
373  field_msg.field_active = field.fieldActive;
374  field_msg.field_result = field.fieldResult;
375  field_msg.eval_method = field.evalMethod;
376  field_array_msg.fields.push_back(field_msg);
377  }
378  field_pub_.publish(field_array_msg);
379 }
CompoundPublisher::camera_info_pub_
ros::Publisher camera_info_pub_
Definition: compound_publisher.h:178
CompoundPublisher::publishFieldInformation
void publishFieldInformation(const std_msgs::Header &header, const visionary::SafeVisionaryData &frame_data)
Publishes the evaluation of the configured safety fields.
Definition: compound_publisher.cpp:363
CompoundPublisher::intensity_pub_
image_transport::Publisher intensity_pub_
Definition: compound_publisher.h:187
sensor_msgs::image_encodings::TYPE_8UC1
const std::string TYPE_8UC1
CompoundPublisher::Vec8ToImage
sensor_msgs::ImagePtr Vec8ToImage(const std_msgs::Header &header, const visionary::SafeVisionaryData &frame_data, std::vector< uint8_t > vec)
Creates an image from a data vector.
Definition: compound_publisher.cpp:227
CompoundPublisher::roi_pub_
ros::Publisher roi_pub_
Definition: compound_publisher.h:183
CompoundPublisher::publishCameraInfo
void publishCameraInfo(const std_msgs::Header &header, const visionary::SafeVisionaryData &frame_data)
Publishes the camera information of the sensor.
Definition: compound_publisher.cpp:98
image_transport::ImageTransport
CompoundPublisher::device_status_pub_
ros::Publisher device_status_pub_
Definition: compound_publisher.h:181
cv_bridge::CvImage::toImageMsg
sensor_msgs::ImagePtr toImageMsg() const
CompoundPublisher::state_pub_
image_transport::Publisher state_pub_
Definition: compound_publisher.h:188
CompoundPublisher::publishIOs
void publishIOs(const std_msgs::Header &header, const visionary::SafeVisionaryData &frame_data)
Publishes the state of the IO ports.
Definition: compound_publisher.cpp:276
CompoundPublisher::publishROI
void publishROI(const std_msgs::Header &header, const visionary::SafeVisionaryData &frame_data)
Publishes the regions of interest.
Definition: compound_publisher.cpp:326
image_transport::Publisher::getNumSubscribers
uint32_t getNumSubscribers() const
ros::Publisher::publish
void publish(const boost::shared_ptr< M > &message) const
ros::NodeHandle::advertise
Publisher advertise(AdvertiseOptions &ops)
sensor_msgs::image_encodings::TYPE_16UC1
const std::string TYPE_16UC1
CompoundPublisher::Vec16ToImage
sensor_msgs::ImagePtr Vec16ToImage(const std_msgs::Header &header, const visionary::SafeVisionaryData &frame_data, std::vector< uint16_t > vec)
Creates an image from a data vector.
Definition: compound_publisher.cpp:219
CompoundPublisher::imu_pub_
ros::Publisher imu_pub_
Definition: compound_publisher.h:180
CompoundPublisher::publishIntensityImage
void publishIntensityImage(const std_msgs::Header &header, const visionary::SafeVisionaryData &frame_data)
Publishes the raw intensity image.
Definition: compound_publisher.cpp:206
CompoundPublisher::CompoundPublisher
CompoundPublisher()
Definition: compound_publisher.cpp:34
compound_publisher.h
CompoundPublisher::publishIMUData
void publishIMUData(const std_msgs::Header &header, const visionary::SafeVisionaryData &frame_data)
Publishes the values of the IMU.
Definition: compound_publisher.cpp:182
ROS_INFO_STREAM
#define ROS_INFO_STREAM(args)
image_transport::Publisher::publish
void publish(const sensor_msgs::Image &message) const
CompoundPublisher::publishStateMap
void publishStateMap(const std_msgs::Header &header, const visionary::SafeVisionaryData &frame_data)
Publishes the raw state map of each pixel.
Definition: compound_publisher.cpp:212
CompoundPublisher::priv_nh_
ros::NodeHandle priv_nh_
Definition: compound_publisher.h:189
CompoundPublisher::io_pub_
ros::Publisher io_pub_
Definition: compound_publisher.h:182
CompoundPublisher::depth_pub_
image_transport::Publisher depth_pub_
Definition: compound_publisher.h:186
CompoundPublisher::publishDepthImage
void publishDepthImage(const std_msgs::Header &header, const visionary::SafeVisionaryData &frame_data)
Publishes the raw depth image.
Definition: compound_publisher.cpp:200
cv_bridge::CvImage
image_transport
CompoundPublisher::publishPointCloud
void publishPointCloud(const std_msgs::Header &header, visionary::SafeVisionaryData &frame_data)
Publishes the generated 3D Pointcloud.
Definition: compound_publisher.cpp:122
CompoundPublisher::pointcloud_pub_
ros::Publisher pointcloud_pub_
Definition: compound_publisher.h:179
ros::Publisher::getNumSubscribers
uint32_t getNumSubscribers() const
header
const std::string header
CompoundPublisher::field_pub_
ros::Publisher field_pub_
Definition: compound_publisher.h:184
CompoundPublisher::publishDeviceStatus
void publishDeviceStatus(const std_msgs::Header &header, const visionary::SafeVisionaryData &frame_data)
Publishes the device status.
Definition: compound_publisher.cpp:237
CompoundPublisher::publish
void publish(const std_msgs::Header &header, visionary::SafeVisionaryData &frame_data)
Publish once with all registered publishers.
Definition: compound_publisher.cpp:53


sick_safevisionary_driver
Author(s):
autogenerated on Fri Oct 20 2023 02:09:16