31 #include <sick_safevisionary_base/SafeVisionaryData.h>
54 visionary::SafeVisionaryData& frame_data)
99 const visionary::SafeVisionaryData& frame_data)
101 sensor_msgs::CameraInfo camera_info;
102 camera_info.header =
header;
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;
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;
123 visionary::SafeVisionaryData& frame_data)
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;
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";
139 for (
size_t i = 0; i < 3; ++i)
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);
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);
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);
156 std::vector<visionary::PointXYZ> point_vec;
157 frame_data.generatePointCloud(point_vec);
158 frame_data.transformPointCloud(point_vec);
160 if (frame_data.getIntensityMap().size() != point_vec.size())
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();
170 for (
size_t i = 0; i < point_vec.size(); ++i, ++intensity_it, ++point_it)
172 memcpy(&cloud_msg->data[i * cloud_msg->point_step + cloud_msg->fields[0].offset],
174 sizeof(visionary::PointXYZ));
175 memcpy(&cloud_msg->data[i * cloud_msg->point_step + cloud_msg->fields[3].offset],
183 const visionary::SafeVisionaryData& frame_data)
185 sensor_msgs::Imu imu_msg;
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;
201 const visionary::SafeVisionaryData& frame_data)
207 const visionary::SafeVisionaryData& frame_data)
213 const visionary::SafeVisionaryData& frame_data)
218 sensor_msgs::ImagePtr
220 const visionary::SafeVisionaryData& frame_data,
221 std::vector<uint16_t> vec)
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));
228 const visionary::SafeVisionaryData& frame_data,
229 std::vector<uint8_t> vec)
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));
238 const visionary::SafeVisionaryData& frame_data)
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;
277 const visionary::SafeVisionaryData& frame_data)
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;
327 const visionary::SafeVisionaryData& frame_data)
329 sick_safevisionary_msgs::ROIArray roi_array_msg;
330 roi_array_msg.header =
header;
331 for (
auto& roi : frame_data.getRoiData().roiData)
333 sick_safevisionary_msgs::ROI roi_msg;
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);
364 const visionary::SafeVisionaryData& frame_data)
366 sick_safevisionary_msgs::FieldInformationArray field_array_msg;
367 field_array_msg.header =
header;
368 for (
auto& field : frame_data.getFieldInformationData().fieldInformation)
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);