input_sensor_adtf31xx.cpp
Go to the documentation of this file.
1 /******************************************************************************
2 Copyright (c), 2023 - Analog Devices Inc. All Rights Reserved.
3 This software is PROPRIETARY & CONFIDENTIAL to Analog Devices, Inc.
4 and its licensors.
5 ******************************************************************************/
6 
8 #include "aditof/camera.h"
9 #include "aditof/frame.h"
10 #include "aditof/system.h"
11 #include "aditof/version.h"
12 #include "aditof/sensor_definitions.h"
13 #include "aditof/depth_sensor_interface.h"
14 #include <ros/ros.h>
15 #include <fstream>
16 
17 using aditof::Status;
18 
28 void InputSensorADTF31XX::openSensor(std::string /*sensor_name*/, int input_image_width, int input_image_height,
29  std::string config_file_name, std::string input_sensor_ip)
30 {
31  sensor_open_flag_ = false;
32 
33  // realtime mode
34  Status status = Status::OK;
35  aditof::System system;
36  std::vector<std::shared_ptr<aditof::Camera>> cameras;
37 
38  if (!input_sensor_ip.empty())
39  {
40  std::string ip = "ip:" + input_sensor_ip;
41  system.getCameraList(cameras, ip);
42  }
43  else
44  {
45  system.getCameraList(cameras);
46  }
47 
48  if (cameras.empty())
49  {
50  ROS_ERROR("No cameras found");
51  return;
52  }
53 
54  camera_ = cameras.front();
55 
56  status = camera_->initialize(config_file_name);
57  if (status != Status::OK)
58  {
59  ROS_ERROR("Could not initialize camera!");
60  return;
61  }
62 
63  sensor_open_flag_ = true;
64 
65  frame_width_ = input_image_width;
66  frame_height_ = input_image_height;
67 
68  // Clear camera parameters.
69  memset(&camera_intrinsics_, 0, sizeof(camera_intrinsics_));
70 
71  return;
72 }
73 
80 {
81  Status status = Status::OK;
82  aditof::System system;
83 
84  std::vector<uint8_t> available_modes;
85  camera_->getAvailableModes(available_modes);
86  if (available_modes.empty())
87  {
88  ROS_ERROR("no frame type avaialble!");
89  return;
90  }
91 
92  aditof::CameraDetails camera_details;
93  camera_->getDetails(camera_details);
94 
95  std::cout << std::endl << "Camera Parameters:" << std::endl;
96  std::cout << "Cx, Cy : " << camera_details.intrinsics.cx << ", " << camera_details.intrinsics.cy << std::endl;
97  std::cout << "Fx, Fy : " << camera_details.intrinsics.fx << ", " << camera_details.intrinsics.fy << std::endl;
98  std::cout << "K1, K2 : " << camera_details.intrinsics.k1 << ", " << camera_details.intrinsics.k2 << std::endl;
99  std::cout << "K3, K4 : " << camera_details.intrinsics.k3 << ", " << camera_details.intrinsics.k4 << std::endl;
100  std::cout << "K5, K6 : " << camera_details.intrinsics.k5 << ", " << camera_details.intrinsics.k6 << std::endl;
101  std::cout << "P1, P2 : " << camera_details.intrinsics.p1 << ", " << camera_details.intrinsics.p2 << std::endl;
102 
103  // Camera matrix = [fx, 0, cx, 0, fy, cy, 0, 0, 1]
104  camera_intrinsics_.camera_matrix[0] = camera_details.intrinsics.fx;
106  camera_intrinsics_.camera_matrix[2] = camera_details.intrinsics.cx;
108  camera_intrinsics_.camera_matrix[4] = camera_details.intrinsics.fy;
109  camera_intrinsics_.camera_matrix[5] = camera_details.intrinsics.cy;
113 
114  // Distortion vector = [k1, k2, p1, p2, k3, k4, k5, k6]
115  camera_intrinsics_.distortion_coeffs[0] = camera_details.intrinsics.k1;
116  camera_intrinsics_.distortion_coeffs[1] = camera_details.intrinsics.k2;
117 
118  camera_intrinsics_.distortion_coeffs[2] = camera_details.intrinsics.p1;
119  camera_intrinsics_.distortion_coeffs[3] = camera_details.intrinsics.p2;
120 
121  camera_intrinsics_.distortion_coeffs[4] = camera_details.intrinsics.k3;
122  camera_intrinsics_.distortion_coeffs[5] = camera_details.intrinsics.k4;
123  camera_intrinsics_.distortion_coeffs[6] = camera_details.intrinsics.k5;
124  camera_intrinsics_.distortion_coeffs[7] = camera_details.intrinsics.k6;
125 
126  status = camera_->setMode(camera_mode);
127  if (status != Status::OK)
128  {
129  ROS_ERROR("Could not set camera mode!");
130  return;
131  }
132 
133  aditof::DepthSensorModeDetails depth_sensor_details;
134  std::shared_ptr<aditof::DepthSensorInterface> sensor = camera_->getSensor();
135 
136  aditof::Status st = sensor->getModeDetails(camera_mode, depth_sensor_details);
137  if (st != aditof::Status::OK)
138  {
139  ROS_ERROR("Failed to get frame type details!");
140  return;
141  }
142 
143  setFrameWidth(depth_sensor_details.baseResolutionWidth);
144  setFrameHeight(depth_sensor_details.baseResolutionHeight);
145 
146  // Set the scale factor
147  if ((depth_sensor_details.baseResolutionWidth == 1024 && depth_sensor_details.baseResolutionHeight == 1024) ||
148  (depth_sensor_details.baseResolutionWidth == 512 && depth_sensor_details.baseResolutionHeight == 640))
149  {
151  }
152  else
153  {
155  }
156 
157  status = camera_->start();
158  if (status != Status::OK)
159  {
160  ROS_ERROR("Could not start the camera!");
161  return;
162  }
163 
164  return;
165 }
166 
173 {
174  *camera_intrinsics = camera_intrinsics_;
175 
176  // Scale
177  camera_intrinsics->camera_matrix[0] /= input_scale_factor_;
178  camera_intrinsics->camera_matrix[2] /= input_scale_factor_;
179  camera_intrinsics->camera_matrix[4] /= input_scale_factor_;
180  camera_intrinsics->camera_matrix[5] /= input_scale_factor_;
181 
182  return;
183 }
184 
194 bool InputSensorADTF31XX::readNextFrame(unsigned short* depth_frame, unsigned short* ab_frame,
195  unsigned short* conf_frame, short* xyz_frame)
196 {
197  aditof::Frame frame;
198 
199  Status status = camera_->requestFrame(&frame);
200 
201  if (status != Status::OK)
202  {
203  ROS_ERROR("Could not request frame!");
204  return false;
205  }
206 
207  int frame_width = frame_width_;
208  int frame_height = frame_height_;
209 
210  // Depth
211  uint16_t* depth_frame_src;
212  status = frame.getData("depth", &depth_frame_src);
213  if (status != Status::OK)
214  {
215  ROS_ERROR("Could not get depth data!");
216  return false;
217  }
218  memcpy(depth_frame, depth_frame_src, frame_width * frame_height * bytes_per_pixel_);
219 
220  // AB
221  unsigned short* ab_frame_src;
222  status = frame.getData("ab", &ab_frame_src);
223  if (status != Status::OK)
224  {
225  ROS_ERROR("Could not get ab data!");
226  return false;
227  }
228  memcpy(ab_frame, ab_frame_src, frame_width * frame_height * bytes_per_pixel_);
229 
230  // Confidence image
231  uint16_t* conf_frame_src;
232  status = frame.getData("conf", &conf_frame_src);
233  if (status != Status::OK)
234  {
235  ROS_ERROR("Could not get confidence data!");
236  return false;
237  }
238  memcpy(conf_frame, conf_frame_src, frame_width * frame_height * bytes_per_pixel_);
239 
240  // XYZ image
241  short* xyz_frame_src;
242  status = frame.getData("xyz", (unsigned short int**)&xyz_frame_src);
243  if (status != Status::OK)
244  {
245  ROS_ERROR("Could not get XYZ data!");
246  return false;
247  }
248  memcpy(xyz_frame, xyz_frame_src, frame_width * frame_height * 3 * sizeof(short));
249 
250  return true;
251 }
252 
259 {
260  *timestamp = ros::Time::now();
261  return true;
262 }
263 
271 {
272  camera_extrinsics->rotation_matrix[0] = 1.0f;
273  camera_extrinsics->rotation_matrix[1] = 0.0f;
274  camera_extrinsics->rotation_matrix[2] = 0.0f;
275  camera_extrinsics->rotation_matrix[3] = 0.0f;
276  camera_extrinsics->rotation_matrix[4] = 1.0f;
277  camera_extrinsics->rotation_matrix[5] = 0.0f;
278  camera_extrinsics->rotation_matrix[6] = 0.0f;
279  camera_extrinsics->rotation_matrix[7] = 0.0f;
280  camera_extrinsics->rotation_matrix[8] = 1.0f;
281 
282  camera_extrinsics->translation_matrix[0] = 0.0f;
283  camera_extrinsics->translation_matrix[1] = 0.0f;
284  camera_extrinsics->translation_matrix[2] = 0.0f;
285 
286  return;
287 }
288 
294 {
295  ROS_INFO("Stopping the Camera");
296  camera_->stop();
297  return;
298 }
299 
306 {
307  camera_->adsd3500SetABinvalidationThreshold(threshold);
308  return;
309 }
310 
317 {
318  camera_->adsd3500SetConfidenceThreshold(threshold);
319  return;
320 }
321 
327 void InputSensorADTF31XX::setJBLFFilterState(bool enable_jblf_filter)
328 {
329  camera_->adsd3500SetJBLFfilterEnableState(enable_jblf_filter);
330  return;
331 }
332 
338 void InputSensorADTF31XX::setJBLFFilterSize(int jbfl_filter_size)
339 {
340  camera_->adsd3500SetJBLFfilterSize(jbfl_filter_size);
341  return;
342 }
343 
350 {
351  camera_->adsd3500SetRadialThresholdMin(radial_min_threshold);
352  return;
353 }
354 
361 {
362  camera_->adsd3500SetRadialThresholdMax(radial_max_threshold);
363  return;
364 }
InputSensorADTF31XX::setJBLFFilterSize
void setJBLFFilterSize(int jbfl_filter_size)
sets the size of JBLF filter
Definition: input_sensor_adtf31xx.cpp:338
InputSensorADTF31XX::getIntrinsics
void getIntrinsics(CameraIntrinsics *camera_intrinsics)
gets the camera intrinsics from the ToF SDK.
Definition: input_sensor_adtf31xx.cpp:172
IInputSensor::setFrameWidth
void setFrameWidth(int frm_width)
Set the Frame Width object Only integer scaling is supported.
Definition: input_sensor.h:84
ros.h
InputSensorADTF31XX::openSensor
void openSensor(std::string, int input_image_width, int input_image_height, std::string config_file_name, std::string input_sensor_ip)
Opens the camera.
Definition: input_sensor_adtf31xx.cpp:28
InputSensorADTF31XX::configureSensor
void configureSensor(int camera_mode)
Configures the camera.
Definition: input_sensor_adtf31xx.cpp:79
input_sensor_adtf31xx.h
InputSensorADTF31XX::readNextFrame
bool readNextFrame(unsigned short *depth_frame, unsigned short *ab_frame, unsigned short *conf_frame, short *xyz_frame)
reads frame from ToF SDK
Definition: input_sensor_adtf31xx.cpp:194
IInputSensor::frame_width_
int frame_width_
Definition: input_sensor.h:26
IInputSensor::bytes_per_pixel_
int bytes_per_pixel_
Definition: input_sensor.h:28
CameraIntrinsics::camera_matrix
float camera_matrix[9]
Camera matrix = [fx, 0, cx, 0, fy, cy, 0, 0, 1] fx, fy : Camera focal lengths (pixels) cx,...
Definition: adi_camera.h:27
InputSensorADTF31XX::camera_
std::shared_ptr< aditof::Camera > camera_
Definition: input_sensor_adtf31xx.h:44
InputSensorADTF31XX::setABinvalidationThreshold
void setABinvalidationThreshold(int threshold)
calls set ab invalidation threshold function from ToF SDK
Definition: input_sensor_adtf31xx.cpp:305
IInputSensor::input_scale_factor_
int input_scale_factor_
Definition: input_sensor.h:29
InputSensorADTF31XX::setJBLFFilterState
void setJBLFFilterState(bool enable_jblf_filter)
sets the state of JBLF filter
Definition: input_sensor_adtf31xx.cpp:327
CameraExtrinsics::rotation_matrix
float rotation_matrix[9]
Camera rotation parameters.
Definition: adi_camera.h:44
InputSensorADTF31XX::setConfidenceThreshold
void setConfidenceThreshold(int threshold)
calls set confidence threshold function from ToF SDK
Definition: input_sensor_adtf31xx.cpp:316
CameraExtrinsics::translation_matrix
float translation_matrix[3]
Camera translation matrix : [Tx,Ty,Tz].
Definition: adi_camera.h:50
InputSensorADTF31XX::setRadialFilterMaxThreshold
void setRadialFilterMaxThreshold(int radial_max_threshold)
sets the maximum threshold for radial filter
Definition: input_sensor_adtf31xx.cpp:360
InputSensorADTF31XX::closeSensor
void closeSensor()
closes the sensor
Definition: input_sensor_adtf31xx.cpp:293
InputSensorADTF31XX::getExtrinsics
void getExtrinsics(CameraExtrinsics *camera_extrinsics)
Gets camera extrinsics.
Definition: input_sensor_adtf31xx.cpp:270
InputSensorADTF31XX::setRadialFilterMinThreshold
void setRadialFilterMinThreshold(int radial_min_threshold)
sets the minimum threshold for radial filter
Definition: input_sensor_adtf31xx.cpp:349
IInputSensor::setFrameHeight
void setFrameHeight(int frm_height)
Sett the Frame Height object Only integer scaling is supported.
Definition: input_sensor.h:93
IInputSensor::setProcessingScale
void setProcessingScale(int scale_factor)
Set the Processing Scale object.
Definition: input_sensor.h:103
ros::Time
CameraExtrinsics
Extrinsic parameters of the camera.
Definition: adi_camera.h:38
CameraIntrinsics
Intrinsic parameters of the camera.
Definition: adi_camera.h:15
ROS_ERROR
#define ROS_ERROR(...)
InputSensorADTF31XX::camera_intrinsics_
CameraIntrinsics camera_intrinsics_
Definition: input_sensor_adtf31xx.h:45
IInputSensor::frame_height_
int frame_height_
Definition: input_sensor.h:27
IInputSensor::sensor_open_flag_
bool sensor_open_flag_
Definition: input_sensor.h:25
InputSensorADTF31XX::getFrameTimestamp
bool getFrameTimestamp(ros::Time *timestamp)
gets the frame timestamp from ToF SDK
Definition: input_sensor_adtf31xx.cpp:258
ROS_INFO
#define ROS_INFO(...)
CameraIntrinsics::distortion_coeffs
float distortion_coeffs[8]
Distortion vector = [k1, k2, p1, p2, k3, k4, k5, k6] k1, k2, k3, k4, k5, k6 : Camera radial distortio...
Definition: adi_camera.h:35
ros::Time::now
static Time now()


adi_3dtof_adtf31xx
Author(s):
autogenerated on Sat May 17 2025 02:12:30