reconfigure.cpp
Go to the documentation of this file.
1 
35 
36 using namespace crl::multisense;
37 
38 namespace multisense_ros {
39 
40 Reconfigure::Reconfigure(Channel* driver,
41  std::function<void (crl::multisense::image::Config)> resolutionChangeCallback,
42  std::function<void (BorderClip, double)> borderClipChangeCallback,
43  std::function<void (double)> maxPointCloudRangeCallback,
44  std::function<void (crl::multisense::system::ExternalCalibration)> extrinsicsCallback,
45  std::function<void (ground_surface_utilities::SplineDrawParameters)> groundSurfaceSplineDrawParametersCallback,
46  std::function<void (bool, int32_t)> timeSyncChangedCallback):
47  driver_(driver),
48  resolution_change_callback_(resolutionChangeCallback),
49  device_nh_(""),
50  imu_samples_per_message_(0),
51  lighting_supported_(false),
52  motor_supported_(false),
53  crop_mode_changed_(false),
54  ptp_supported_(false),
55  roi_supported_(false),
56  aux_supported_(false),
57  reconfigure_external_calibration_supported_(false),
58  origin_from_camera_calibration_initialized_(false),
59  border_clip_type_(BorderClip::NONE),
60  border_clip_value_(0.0),
61  border_clip_change_callback_(borderClipChangeCallback),
62  max_point_cloud_range_callback_(maxPointCloudRangeCallback),
63  extrinsics_callback_(extrinsicsCallback),
64  spline_draw_parameters_callback_(groundSurfaceSplineDrawParametersCallback),
65  time_sync_callback_(timeSyncChangedCallback)
66 {
67  system::DeviceInfo deviceInfo;
68  system::VersionInfo versionInfo;
69  std::vector<system::DeviceMode> deviceModes;
70 
71  //
72  // Query device and version information from sensor
73 
74  Status status = driver_->getVersionInfo(versionInfo);
75  if (Status_Ok != status) {
76  ROS_ERROR("Reconfigure: failed to query version info: %s",
77  Channel::statusString(status));
78  return;
79  }
80 
81  status = driver_->getDeviceInfo(deviceInfo);
82  if (Status_Ok != status) {
83  ROS_ERROR("Reconfigure: failed to query device info: %s",
84  Channel::statusString(status));
85  return;
86  }
87 
88  status = driver_->getDeviceModes(deviceModes);
89  if (Status_Ok != status) {
90  ROS_ERROR("Reconfigure: failed to query device modes: %s",
91  Channel::statusString(status));
92  return;
93  }
94 
95  const bool ground_surface_supported =
96  std::any_of(deviceModes.begin(), deviceModes.end(), [](const auto &mode) {
97  return (mode.supportedDataSources & Source_Ground_Surface_Spline_Data) &&
98  (mode.supportedDataSources & Source_Ground_Surface_Class_Image); });
99 
100  if (deviceInfo.lightingType != 0 ||
101  system::DeviceInfo::HARDWARE_REV_MULTISENSE_KS21 == deviceInfo.hardwareRevision ||
102  system::DeviceInfo::HARDWARE_REV_MULTISENSE_KS21i == deviceInfo.hardwareRevision)
103  {
104  lighting_supported_ = true;
105  }
106  if (deviceInfo.motorType != 0)
107  {
108  motor_supported_ = true;
109  }
110  if (system::DeviceInfo::HARDWARE_REV_MULTISENSE_C6S2_S27 == deviceInfo.hardwareRevision ||
111  system::DeviceInfo::HARDWARE_REV_MULTISENSE_S30 == deviceInfo.hardwareRevision ||
112  system::DeviceInfo::HARDWARE_REV_MULTISENSE_KS21 == deviceInfo.hardwareRevision ||
113  system::DeviceInfo::HARDWARE_REV_MULTISENSE_KS21i == deviceInfo.hardwareRevision ||
114  system::DeviceInfo::HARDWARE_REV_MULTISENSE_REMOTE_HEAD_VPB == deviceInfo.hardwareRevision ||
115  system::DeviceInfo::HARDWARE_REV_MULTISENSE_REMOTE_HEAD_STEREO == deviceInfo.hardwareRevision ||
116  system::DeviceInfo::HARDWARE_REV_MULTISENSE_REMOTE_HEAD_MONOCAM == deviceInfo.hardwareRevision)
117  {
118  ptp_supported_ = true;
119  }
120 
121  if (versionInfo.sensorFirmwareVersion >= 0x0403) {
122  roi_supported_ = true;
123  }
124 
125  if (system::DeviceInfo::HARDWARE_REV_MULTISENSE_C6S2_S27 == deviceInfo.hardwareRevision ||
126  system::DeviceInfo::HARDWARE_REV_MULTISENSE_S30 == deviceInfo.hardwareRevision ||
127  system::DeviceInfo::HARDWARE_REV_MULTISENSE_KS21i == deviceInfo.hardwareRevision)
128  {
129  if (versionInfo.sensorFirmwareVersion >= 0x0600) {
130  aux_supported_ = true;
131  }
132  else
133  {
134  aux_supported_ = false;
135  ROS_WARN("Reconfigure: MultiSense firmware version does not support the updated aux camera exposure controls. "
136  "The ROS driver will work normally, but you will have limited control over aux camera exposure parameters. "
137  "Please use the 2eae444 has of multisene_ros or contact support@carnegierobotics.com for "
138  "a updated firmware version greater than 6.0 to enable aux camera exposure controls.");
139  }
140  }
141 
142  if (versionInfo.sensorFirmwareVersion >= 0x0513) {
144  }
145 
146  //
147  // Launch the correct reconfigure server for this device configuration.
148 
149  if (system::DeviceInfo::HARDWARE_REV_BCAM == deviceInfo.hardwareRevision) {
150 
152  std::shared_ptr< dynamic_reconfigure::Server<multisense_ros::bcam_imx104Config> > (
153  new dynamic_reconfigure::Server<multisense_ros::bcam_imx104Config>(device_nh_));
154  server_bcam_imx104_->setCallback(std::bind(&Reconfigure::callback_bcam_imx104, this,
155  std::placeholders::_1, std::placeholders::_2));
156 
157  } else if (system::DeviceInfo::HARDWARE_REV_MULTISENSE_ST21 == deviceInfo.hardwareRevision) {
158 
160  std::shared_ptr< dynamic_reconfigure::Server<multisense_ros::st21_sgm_vga_imuConfig> > (
161  new dynamic_reconfigure::Server<multisense_ros::st21_sgm_vga_imuConfig>(device_nh_));
162  server_st21_vga_->setCallback(std::bind(&Reconfigure::callback_st21_vga, this,
163  std::placeholders::_1, std::placeholders::_2));
164 
165  } else if (system::DeviceInfo::HARDWARE_REV_MULTISENSE_ST25 == deviceInfo.hardwareRevision) {
166 
168  std::shared_ptr< dynamic_reconfigure::Server<multisense_ros::st25_sgm_imuConfig> > (
169  new dynamic_reconfigure::Server<multisense_ros::st25_sgm_imuConfig>(device_nh_));
170  server_st25_sgm_->setCallback(std::bind(&Reconfigure::callback_st25_sgm, this,
171  std::placeholders::_1, std::placeholders::_2));
172 
173  } else if (system::DeviceInfo::HARDWARE_REV_MULTISENSE_M == deviceInfo.hardwareRevision) {
174 
175  switch(deviceInfo.imagerType) {
176  case system::DeviceInfo::IMAGER_TYPE_CMV2000_GREY:
177  case system::DeviceInfo::IMAGER_TYPE_CMV2000_COLOR:
178 
180  std::shared_ptr< dynamic_reconfigure::Server<multisense_ros::mono_cmv2000Config> > (
181  new dynamic_reconfigure::Server<multisense_ros::mono_cmv2000Config>(device_nh_));
182  server_mono_cmv2000_->setCallback(std::bind(&Reconfigure::callback_mono_cmv2000, this,
183  std::placeholders::_1, std::placeholders::_2));
184 
185  break;
186  case system::DeviceInfo::IMAGER_TYPE_CMV4000_GREY:
187  case system::DeviceInfo::IMAGER_TYPE_CMV4000_COLOR:
188 
190  std::shared_ptr< dynamic_reconfigure::Server<multisense_ros::mono_cmv4000Config> > (
191  new dynamic_reconfigure::Server<multisense_ros::mono_cmv4000Config>(device_nh_));
192  server_mono_cmv4000_->setCallback(std::bind(&Reconfigure::callback_mono_cmv4000, this,
193  std::placeholders::_1, std::placeholders::_2));
194 
195  break;
196  }
197  } else if (system::DeviceInfo::HARDWARE_REV_MULTISENSE_C6S2_S27 == deviceInfo.hardwareRevision ||
198  system::DeviceInfo::HARDWARE_REV_MULTISENSE_S30 == deviceInfo.hardwareRevision) {
199 
200  if (ground_surface_supported) {
202  std::shared_ptr< dynamic_reconfigure::Server<multisense_ros::s27_sgm_AR0234_ground_surfaceConfig> > (
203  new dynamic_reconfigure::Server<multisense_ros::s27_sgm_AR0234_ground_surfaceConfig>(device_nh_));
205  std::placeholders::_1, std::placeholders::_2));
206  } else {
208  std::shared_ptr< dynamic_reconfigure::Server<multisense_ros::s27_sgm_AR0234Config> > (
209  new dynamic_reconfigure::Server<multisense_ros::s27_sgm_AR0234Config>(device_nh_));
210  server_s27_AR0234_->setCallback(std::bind(&Reconfigure::callback_s27_AR0234, this,
211  std::placeholders::_1, std::placeholders::_2));
212  }
213  } else if (system::DeviceInfo::HARDWARE_REV_MULTISENSE_KS21 == deviceInfo.hardwareRevision) {
214 
215  if (ground_surface_supported) {
217  std::shared_ptr< dynamic_reconfigure::Server<multisense_ros::ks21_sgm_AR0234_ground_surfaceConfig> > (
218  new dynamic_reconfigure::Server<multisense_ros::ks21_sgm_AR0234_ground_surfaceConfig>(device_nh_));
220  std::placeholders::_1, std::placeholders::_2));
221  } else {
223  std::shared_ptr< dynamic_reconfigure::Server<multisense_ros::ks21_sgm_AR0234Config> > (
224  new dynamic_reconfigure::Server<multisense_ros::ks21_sgm_AR0234Config>(device_nh_));
225  server_ks21_sgm_AR0234_->setCallback(std::bind(&Reconfigure::callback_ks21_AR0234, this,
226  std::placeholders::_1, std::placeholders::_2));
227  }
228  } else if (system::DeviceInfo::HARDWARE_REV_MULTISENSE_KS21i == deviceInfo.hardwareRevision) {
229 
230  if (ground_surface_supported) {
232  std::shared_ptr< dynamic_reconfigure::Server<multisense_ros::ks21i_sgm_AR0234_ground_surfaceConfig> > (
233  new dynamic_reconfigure::Server<multisense_ros::ks21i_sgm_AR0234_ground_surfaceConfig>(device_nh_));
235  std::placeholders::_1, std::placeholders::_2));
236  } else {
238  std::shared_ptr< dynamic_reconfigure::Server<multisense_ros::ks21i_sgm_AR0234Config> > (
239  new dynamic_reconfigure::Server<multisense_ros::ks21i_sgm_AR0234Config>(device_nh_));
240  server_ks21i_sgm_AR0234_->setCallback(std::bind(&Reconfigure::callback_ks21i_AR0234, this,
241  std::placeholders::_1, std::placeholders::_2));
242  }
243  } else if (system::DeviceInfo::HARDWARE_REV_MULTISENSE_REMOTE_HEAD_VPB == deviceInfo.hardwareRevision) {
245  std::shared_ptr< dynamic_reconfigure::Server<multisense_ros::remote_head_vpbConfig > > (
246  new dynamic_reconfigure::Server<multisense_ros::remote_head_vpbConfig>(device_nh_));
248  std::placeholders::_1, std::placeholders::_2));
249  } else if (system::DeviceInfo::HARDWARE_REV_MULTISENSE_REMOTE_HEAD_STEREO == deviceInfo.hardwareRevision) {
250  if (ground_surface_supported) {
252  std::shared_ptr< dynamic_reconfigure::Server<multisense_ros::remote_head_sgm_AR0234_ground_surfaceConfig > > (
253  new dynamic_reconfigure::Server<multisense_ros::remote_head_sgm_AR0234_ground_surfaceConfig>(device_nh_));
255  std::placeholders::_1, std::placeholders::_2));
256  } else {
258  std::shared_ptr< dynamic_reconfigure::Server<multisense_ros::remote_head_sgm_AR0234Config > > (
259  new dynamic_reconfigure::Server<multisense_ros::remote_head_sgm_AR0234Config>(device_nh_));
261  std::placeholders::_1, std::placeholders::_2));
262  }
263  } else if (system::DeviceInfo::HARDWARE_REV_MULTISENSE_REMOTE_HEAD_MONOCAM == deviceInfo.hardwareRevision) {
265  std::shared_ptr< dynamic_reconfigure::Server<multisense_ros::remote_head_monocam_AR0234Config > > (
266  new dynamic_reconfigure::Server<multisense_ros::remote_head_monocam_AR0234Config>(device_nh_));
268  std::placeholders::_1, std::placeholders::_2));
269  } else if (versionInfo.sensorFirmwareVersion <= 0x0202) {
270 
271  switch(deviceInfo.imagerType) {
272  case system::DeviceInfo::IMAGER_TYPE_CMV2000_GREY:
273  case system::DeviceInfo::IMAGER_TYPE_CMV2000_COLOR:
274 
276  std::shared_ptr< dynamic_reconfigure::Server<multisense_ros::sl_bm_cmv2000Config> > (
277  new dynamic_reconfigure::Server<multisense_ros::sl_bm_cmv2000Config>(device_nh_));
278  server_sl_bm_cmv2000_->setCallback(std::bind(&Reconfigure::callback_sl_bm_cmv2000, this,
279  std::placeholders::_1, std::placeholders::_2));
280 
281  break;
282  case system::DeviceInfo::IMAGER_TYPE_CMV4000_GREY:
283  case system::DeviceInfo::IMAGER_TYPE_CMV4000_COLOR:
284 
286  std::shared_ptr< dynamic_reconfigure::Server<multisense_ros::sl_bm_cmv4000Config> > (
287  new dynamic_reconfigure::Server<multisense_ros::sl_bm_cmv4000Config>(device_nh_));
288  server_sl_bm_cmv4000_->setCallback(std::bind(&Reconfigure::callback_sl_bm_cmv4000, this,
289  std::placeholders::_1, std::placeholders::_2));
290 
291  break;
292  default:
293 
294  ROS_ERROR("Reconfigure: unsupported imager type \"%d\"", deviceInfo.imagerType);
295  return;
296  }
297 
298  } else if (versionInfo.sensorFirmwareVersion < 0x0300) {
299 
300  switch(deviceInfo.imagerType) {
301  case system::DeviceInfo::IMAGER_TYPE_CMV2000_GREY:
302  case system::DeviceInfo::IMAGER_TYPE_CMV2000_COLOR:
303 
305  std::shared_ptr< dynamic_reconfigure::Server<multisense_ros::sl_bm_cmv2000_imuConfig> > (
306  new dynamic_reconfigure::Server<multisense_ros::sl_bm_cmv2000_imuConfig>(device_nh_));
308  std::placeholders::_1, std::placeholders::_2));
309 
310  break;
311  case system::DeviceInfo::IMAGER_TYPE_CMV4000_GREY:
312  case system::DeviceInfo::IMAGER_TYPE_CMV4000_COLOR:
313 
315  std::shared_ptr< dynamic_reconfigure::Server<multisense_ros::sl_bm_cmv4000_imuConfig> > (
316  new dynamic_reconfigure::Server<multisense_ros::sl_bm_cmv4000_imuConfig>(device_nh_));
318  std::placeholders::_1, std::placeholders::_2));
319 
320  break;
321  default:
322 
323  ROS_ERROR("Reconfigure: unsupported imager type \"%d\"", deviceInfo.imagerType);
324  return;
325  }
326 
327  } else {
328 
329  switch(deviceInfo.imagerType) {
330  case system::DeviceInfo::IMAGER_TYPE_CMV2000_GREY:
331  case system::DeviceInfo::IMAGER_TYPE_CMV2000_COLOR:
332 
334  std::shared_ptr< dynamic_reconfigure::Server<multisense_ros::sl_sgm_cmv2000_imuConfig> > (
335  new dynamic_reconfigure::Server<multisense_ros::sl_sgm_cmv2000_imuConfig>(device_nh_));
337  std::placeholders::_1, std::placeholders::_2));
338 
339  break;
340  case system::DeviceInfo::IMAGER_TYPE_CMV4000_GREY:
341  case system::DeviceInfo::IMAGER_TYPE_CMV4000_COLOR:
342 
344  std::shared_ptr< dynamic_reconfigure::Server<multisense_ros::sl_sgm_cmv4000_imuConfig> > (
345  new dynamic_reconfigure::Server<multisense_ros::sl_sgm_cmv4000_imuConfig>(device_nh_));
347  std::placeholders::_1, std::placeholders::_2));
348  break;
349  case system::DeviceInfo::IMAGER_TYPE_AR0234_GREY:
350  case system::DeviceInfo::IMAGER_TYPE_AR0239_COLOR:
351 
352  if (ground_surface_supported) {
354  std::shared_ptr< dynamic_reconfigure::Server<multisense_ros::s27_sgm_AR0234_ground_surfaceConfig> > (
355  new dynamic_reconfigure::Server<multisense_ros::s27_sgm_AR0234_ground_surfaceConfig>(device_nh_));
357  std::placeholders::_1, std::placeholders::_2));
358  } else {
360  std::shared_ptr< dynamic_reconfigure::Server<multisense_ros::s27_sgm_AR0234Config> > (
361  new dynamic_reconfigure::Server<multisense_ros::s27_sgm_AR0234Config>(device_nh_));
362  server_s27_AR0234_->setCallback(std::bind(&Reconfigure::callback_s27_AR0234, this,
363  std::placeholders::_1, std::placeholders::_2));
364  }
365 
366  break;
367 
368  default:
369 
370  ROS_ERROR("Reconfigure: unsupported imager type \"%d\"", deviceInfo.imagerType);
371  return;
372  }
373  }
374 
376 }
377 
379 {
380 }
381 
382 //
383 // Helper to change resolution. Will check against supported device modes
384 
386  int32_t width,
387  int32_t height,
388  int32_t disparities)
389 {
390  //
391  // See if we need to change resolutions
392  if (width == static_cast<int32_t>(cfg.width()) &&
393  height == static_cast<int32_t>(cfg.height()) &&
394  disparities == static_cast<int32_t>(cfg.disparities()))
395  return false;
396 
397  //
398  // Query all supported resolutions from the sensor, if we haven't already
399 
400  if (device_modes_.empty()) {
401 
403  if (Status_Ok != status) {
404  ROS_ERROR("Reconfigure: failed to query sensor modes: %s",
405  Channel::statusString(status));
406  return false;
407  }
408  }
409 
410  //
411  // Verify that this resolution is supported
412 
413  bool supported = false;
414  std::vector<system::DeviceMode>::const_iterator it = device_modes_.begin();
415  for(; it != device_modes_.end(); ++it) {
416 
417  const system::DeviceMode& m = *it;
418 
419  if (width == static_cast<int32_t>(m.width) &&
420  height == static_cast<int32_t>(m.height) &&
421  disparities == static_cast<int32_t>(m.disparities)) {
422 
423  supported = true;
424  break;
425  }
426  }
427 
428  if (false == supported) {
429  ROS_ERROR("Reconfigure: sensor does not support a resolution of: %dx%d (%d disparities)",
430  width, height, disparities);
431  return false;
432  }
433 
434  ROS_WARN("Reconfigure: changing sensor resolution to %dx%d (%d disparities), from %dx%d "
435  "(%d disparities): reconfiguration may take up to 30 seconds",
436  width, height, disparities,
437  cfg.width(), cfg.height(), cfg.disparities());
438 
439  cfg.setResolution(width, height);
440  cfg.setDisparities(disparities);
441 
442  return true;
443 }
444 
445 template<class T> void Reconfigure::configureSgm(image::Config& cfg, const T& dyn)
446 {
447  cfg.setStereoPostFilterStrength(dyn.stereo_post_filtering);
448 }
449 
450 template<class T> void Reconfigure::configureHdr(image::Config& cfg, const T& dyn)
451 {
452  cfg.setHdr(dyn.hdr_enable);
453 }
454 
455 template<class T> void Reconfigure::configureAutoWhiteBalance(image::Config& cfg, const T& dyn)
456 {
457  cfg.setWhiteBalance(dyn.white_balance_red, dyn.white_balance_blue);
458  cfg.setAutoWhiteBalance(dyn.auto_white_balance);
459  cfg.setAutoWhiteBalanceDecay(dyn.auto_white_balance_decay);
460  cfg.setAutoWhiteBalanceThresh(dyn.auto_white_balance_thresh);
461 }
462 
463 template<class T> void Reconfigure::configureGamma(image::Config& cfg, const T& dyn)
464 {
465  cfg.setGamma(dyn.gamma);
466 }
467 
468 template<class T> void Reconfigure::configureAuxCamera(const T& dyn)
469 {
470  if (aux_supported_) {
471 
472  image::AuxConfig auxConfig;
473  Status status = driver_->getAuxImageConfig(auxConfig);
474  if (Status_Ok != status) {
475  ROS_ERROR("Reconfigure: failed to query aux image config: %s",
476  Channel::statusString(status));
477  return;
478  }
479 
480  //
481  // See if we already have a secondary exposure we want to modify. If not create one for the aux camera
482 
483  auxConfig.setGain(dyn.aux_gain);
484  auxConfig.setGamma(dyn.aux_gamma);
485  auxConfig.setExposure(dyn.aux_exposure_time * 1e6);
486  auxConfig.setAutoExposure(dyn.aux_auto_exposure);
487  auxConfig.setAutoExposureMax(dyn.aux_auto_exposure_max_time * 1e6);
488  auxConfig.setAutoExposureDecay(dyn.aux_auto_exposure_decay);
489  auxConfig.setAutoExposureThresh(dyn.aux_auto_exposure_thresh);
490  auxConfig.setAutoExposureTargetIntensity(dyn.aux_auto_exposure_target_intensity);
491  auxConfig.enableSharpening(dyn.aux_enable_sharpening);
492  auxConfig.setSharpeningPercentage(dyn.aux_sharpening_percentage);
493  auxConfig.setSharpeningLimit(dyn.aux_sharpening_limit);
494 
495  auxConfig.setWhiteBalance(dyn.aux_white_balance_red, dyn.aux_white_balance_blue);
496  auxConfig.setAutoWhiteBalance(dyn.aux_auto_white_balance);
497  auxConfig.setAutoWhiteBalanceDecay(dyn.aux_auto_white_balance_decay);
498  auxConfig.setAutoWhiteBalanceThresh(dyn.aux_auto_white_balance_thresh);
499 
500 
501  if (dyn.aux_roi_auto_exposure) {
502  if (roi_supported_) {
503  //
504  // Ensure the commanded ROI region is in the full resolution image
505 
506  const int32_t maxX = dyn.__getMax__().aux_roi_auto_exposure_x;
507  const int32_t maxY = dyn.__getMax__().aux_roi_auto_exposure_y;
508 
509  const int32_t x = fmax(0, fmin(dyn.aux_roi_auto_exposure_x, maxX));
510  const int32_t y = fmax(0, fmin(dyn.aux_roi_auto_exposure_y, maxY));
511 
512  auxConfig.setAutoExposureRoi(x, y,
513  fmax(0, fmin(dyn.aux_roi_auto_exposure_width, maxX - x)),
514  fmax(0, fmin(dyn.aux_roi_auto_exposure_height, maxY - y)));
515  } else {
516  ROS_WARN("Reconfigure: ROI auto exposure is not supported with this firmware version");
517  return;
518  }
519 
520  } else {
521  auxConfig.setAutoExposureRoi(0, 0, Roi_Full_Image, Roi_Full_Image);
522  }
523 
524  status = driver_->setAuxImageConfig(auxConfig);
525  if (Status_Ok != status)
526  ROS_ERROR("Reconfigure: failed to set aux image config: %s",
527  Channel::statusString(status));
528 
529  }
530 }
531 
532 template<class T> void Reconfigure::configureCamera(image::Config& cfg, const T& dyn)
533 {
534  DataSource streamsEnabled = 0;
535  int32_t width, height, disparities;
536  bool resolutionChange=false;
537  Status status=Status_Ok;
538 
539  //
540  // Decode the resolution string
541 
542  if (3 != sscanf(dyn.resolution.c_str(), "%dx%dx%d", &width, &height, &disparities)) {
543  ROS_ERROR("Reconfigure: malformed resolution string: \"%s\"", dyn.resolution.c_str());
544  return;
545  }
546 
547  //
548  // If a resolution change is desired
549 
550  if ((resolutionChange = changeResolution(cfg, width, height, disparities) || crop_mode_changed_)) {
551  crop_mode_changed_ = false;
552  //
553  // Halt streams during the resolution change
554  status = driver_->getEnabledStreams(streamsEnabled);
555  if (Status_Ok != status) {
556  ROS_ERROR("Reconfigure: failed to get enabled streams: %s",
557  Channel::statusString(status));
558  return;
559  }
560  status = driver_->stopStreams(streamsEnabled);
561  if (Status_Ok != status) {
562  ROS_ERROR("Reconfigure: failed to stop streams for a resolution change: %s",
563  Channel::statusString(status));
564  return;
565  }
566  }
567 
568  //
569  // Set all other image config from dynamic reconfigure
570 
571  cfg.setFps(dyn.fps);
572  cfg.setGain(dyn.gain);
573  cfg.setExposure(dyn.exposure_time * 1e6);
574  cfg.setAutoExposure(dyn.auto_exposure);
575  cfg.setAutoExposureMax(dyn.auto_exposure_max_time * 1e6);
576  cfg.setAutoExposureDecay(dyn.auto_exposure_decay);
577  cfg.setAutoExposureThresh(dyn.auto_exposure_thresh);
578  cfg.setAutoExposureTargetIntensity(dyn.auto_exposure_target_intensity);
579 
580  if (dyn.roi_auto_exposure) {
581  if (roi_supported_) {
582  //
583  // Ensure the commanded ROI region is in the full resolution image
584 
585  const int32_t maxX = dyn.__getMax__().roi_auto_exposure_x;
586  const int32_t maxY = dyn.__getMax__().roi_auto_exposure_y;
587 
588  const int32_t x = fmax(0, fmin(dyn.roi_auto_exposure_x, maxX));
589  const int32_t y = fmax(0, fmin(dyn.roi_auto_exposure_y, maxY));
590 
591  cfg.setAutoExposureRoi(x, y,
592  fmax(0, fmin(dyn.roi_auto_exposure_width, maxX - x)),
593  fmax(0, fmin(dyn.roi_auto_exposure_height, maxY - y)));
594  } else {
595  ROS_WARN("Reconfigure: ROI auto exposure is not supported with this firmware version");
596  }
597 
598  } else {
599  cfg.setAutoExposureRoi(0, 0, Roi_Full_Image, Roi_Full_Image);
600  }
601 
602  //
603  // Apply, sensor enforces limits per setting.
604 
605  status = driver_->setImageConfig(cfg);
606  if (Status_Ok != status)
607  ROS_ERROR("Reconfigure: failed to set image config: %s",
608  Channel::statusString(status));
609 
610  status = driver_->getImageConfig(cfg);
611  if (Status_Ok != status)
612  ROS_ERROR("Reconfigure: failed to query image config: %s",
613  Channel::statusString(status));
614 
616 
617  //
618  // If we are changing the resolution, let others know about it
619 
620  if (resolutionChange) {
621  status = driver_->startStreams(streamsEnabled);
622  if (Status_Ok != status)
623  ROS_ERROR("Reconfigure: failed to restart streams after a resolution change: %s",
624  Channel::statusString(status));
625  }
626 
627  //
628  // Enable/disable network-based time synchronization.
629  //
630  // If enabled, sensor timestamps will be reported in the local
631  // system clock's frame, using a continuously updated offset from
632  // the sensor's internal clock.
633  //
634  // If disabled, sensor timestamps will be reported in the sensor
635  // clock's frame, which is free-running from zero on power up.
636  //
637  // Enabled by default.
638 
639  driver_->networkTimeSynchronization(dyn.network_time_sync);
640 
641  //
642  // Set our transmit delay
644  d.delay = dyn.desired_transmit_delay;
645  status = driver_->setTransmitDelay(d);
646  if (Status_Ok != status) {
647  ROS_ERROR("Reconfigure: failed to set transmit delay: %s",
648  Channel::statusString(status));
649  }
650 }
651 
652 template<class T> void Reconfigure::configureMotor(const T& dyn)
653 {
654  //
655  // Send the desired motor speed
656 
657  if (motor_supported_) {
658 
659  const float radiansPerSecondToRpm = 9.54929659643;
660 
661  Status status = driver_->setMotorSpeed(radiansPerSecondToRpm * dyn.motor_speed);
662  if (Status_Ok != status) {
663  if (Status_Unsupported == status)
664  motor_supported_ = false;
665  else
666  ROS_ERROR("Reconfigure: failed to set motor speed: %s",
667  Channel::statusString(status));
668  }
669  }
670 }
671 
672 template<class T> void Reconfigure::configureLeds(const T& dyn)
673 {
674  //
675  // Send the desired lighting configuration
676 
677  if (lighting_supported_) {
678 
679  lighting::Config leds;
680 
681  if (false == dyn.lighting) {
682  leds.setFlash(false);
683  leds.setDutyCycle(0.0);
684  } else {
685  leds.setFlash(dyn.flash);
686  leds.setDutyCycle(dyn.led_duty_cycle * 100.0);
687  }
688 
689  Status status = driver_->setLightingConfig(leds);
690  if (Status_Ok != status) {
691  if (Status_Unsupported == status)
692  lighting_supported_ = false;
693  else
694  ROS_ERROR("Reconfigure: failed to set lighting config: %s",
695  Channel::statusString(status));
696  }
697  }
698 }
699 
700 template<class T> void Reconfigure::configureS19Leds(const T& dyn)
701 {
702  //
703  // Send the desired lighting configuration
704 
705  if (lighting_supported_) {
706 
707  lighting::Config leds;
708 
709  if (false == dyn.lighting) {
710  leds.setFlash(false);
711  leds.setDutyCycle(0.0);
712  } else {
713  leds.setFlash(dyn.flash);
714  leds.setDutyCycle(dyn.led_duty_cycle * 100.0);
715  leds.setNumberOfPulses(dyn.led_number_of_pulses);
716  leds.setStartupTime(dyn.led_startup_time_us);
717  leds.setInvertPulse(dyn.led_invert_pulse);
718  }
719 
720  Status status = driver_->setLightingConfig(leds);
721  if (Status_Ok != status) {
722  if (Status_Unsupported == status)
723  lighting_supported_ = false;
724  else
725  ROS_ERROR("Reconfigure: failed to set lighting config: %s",
726  Channel::statusString(status));
727  }
728  }
729 }
730 
731 template<class T> void Reconfigure::configureImu(const T& dyn)
732 {
733  if (imu_configs_.empty()) {
735  imu_configs_);
736  if (Status_Ok != status) {
737  ROS_ERROR("Reconfigure: failed to query IMU config: %s",
738  Channel::statusString(status));
739  return;
740  }
741  }
742 
743  std::vector<imu::Config> changedConfigs;
744  std::vector<imu::Config>::iterator it = imu_configs_.begin();
745  for(; it!=imu_configs_.end(); ++it) {
746 
747  imu::Config& c = *it;
748 
749  if ("accelerometer" == c.name &&
750  (c.enabled != dyn.accelerometer_enabled ||
751  static_cast<int>(c.rateTableIndex) != dyn.accelerometer_rate ||
752  static_cast<int>(c.rangeTableIndex) != dyn.accelerometer_range)) {
753 
754  c.enabled = dyn.accelerometer_enabled;
755  c.rateTableIndex = dyn.accelerometer_rate;
756  c.rangeTableIndex = dyn.accelerometer_range;
757  changedConfigs.push_back(c);
758  }
759 
760  if ("gyroscope" == c.name &&
761  (c.enabled != dyn.gyroscope_enabled ||
762  static_cast<int>(c.rateTableIndex) != dyn.gyroscope_rate ||
763  static_cast<int>(c.rangeTableIndex) != dyn.gyroscope_range)) {
764 
765  c.enabled = dyn.gyroscope_enabled;
766  c.rateTableIndex = dyn.gyroscope_rate;
767  c.rangeTableIndex = dyn.gyroscope_range;
768  changedConfigs.push_back(c);
769  }
770 
771  if ("magnetometer" == c.name &&
772  (c.enabled != dyn.magnetometer_enabled ||
773  static_cast<int>(c.rateTableIndex) != dyn.magnetometer_rate ||
774  static_cast<int>(c.rangeTableIndex) != dyn.magnetometer_range)) {
775 
776  c.enabled = dyn.magnetometer_enabled;
777  c.rateTableIndex = dyn.magnetometer_rate;
778  c.rangeTableIndex = dyn.magnetometer_range;
779  changedConfigs.push_back(c);
780  }
781  }
782 
783  if (changedConfigs.size() > 0 ||
784  static_cast<int>(imu_samples_per_message_) != dyn.imu_samples_per_message) {
785 
786  ROS_WARN("Reconfigure: IMU configuration changes will take effect after all IMU "
787  "topic subscriptions have been closed.");
788 
789  imu_samples_per_message_ = dyn.imu_samples_per_message;
790 
791  Status status = driver_->setImuConfig(false, // store in non-volatile flash
793  changedConfigs); // can be empty
794  if (Status_Ok != status) {
795  ROS_ERROR("Reconfigure: failed to set IMU configuration: %s",
796  Channel::statusString(status));
797  imu_configs_.clear();
798  }
799  }
800 }
801 
802 template<class T> void Reconfigure::configureBorderClip(const T& dyn)
803 {
804 
805  if (static_cast<BorderClip>(dyn.border_clip_type) != border_clip_type_ ||
806  dyn.border_clip_value != border_clip_value_) {
807  border_clip_type_ = static_cast<BorderClip>(dyn.border_clip_type);
808  border_clip_value_ = dyn.border_clip_value;
810  }
811 }
812 
813 template<class T> void Reconfigure::configurePointCloudRange(const T& dyn)
814 {
815  max_point_cloud_range_callback_(dyn.max_point_cloud_range);
816 }
817 
818 template<class T> void Reconfigure::configurePtp(const T& dyn)
819 {
820  if (ptp_supported_) {
821  Status status = driver_->ptpTimeSynchronization(dyn.ptp_time_sync);
822  if (Status_Ok != status) {
823  if (Status_Unsupported == status || Status_Unknown == status) {
824  ptp_supported_ = false;
825  } else {
826  ROS_ERROR("Reconfigure: enable PTP time synchronization: %s",
827  Channel::statusString(status));
828  }
829  }
830  else
831  {
832  time_sync_callback_(dyn.ptp_time_sync, dyn.ptp_time_offset_sec);
833  }
834  }
835 
836  if (dyn.trigger_source != 3 || (ptp_supported_ && dyn.trigger_source == 3)) {
837  Status status = driver_->setTriggerSource(dyn.trigger_source);
838  if (Status_Ok != status) {
839  if (Status_Unsupported == status || Status_Unknown == status) {
840  ptp_supported_ = false;
841  } else {
842  ROS_ERROR("Reconfigure: failed to set trigger source: %s",
843  Channel::statusString(status));
844  }
845  }
846  }
847 }
848 
849 template<class T> void Reconfigure::configureStereoProfile(crl::multisense::CameraProfile &profile, const T& dyn)
850 {
851  profile |= (dyn.high_contrast_profile ? crl::multisense::High_Contrast : profile);
852  profile |= (dyn.show_roi_profile ? crl::multisense::Show_ROIs : profile);
853 }
854 
856 {
857  profile |= (dyn.ground_surface_profile ? crl::multisense::Ground_Surface : profile);
858 }
859 
861 {
862  profile |= (dyn.full_res_aux_profile ? crl::multisense::Full_Res_Aux_Cam : profile);
863 }
864 
866 {
867  profile |= (dyn.detail_disparity_profile ? crl::multisense::Detail_Disparity : profile);
868 }
869 
870 template<class T> void Reconfigure::configureExtrinsics(const T& dyn)
871 {
872  if (!dyn.enable_origin_from_camera_configuration)
873  return;
874 
875  //
876  // Setup extrinsics transform tree
878  {
880 
882 
883  return;
884  }
885 
886  //
887  // If supported, reconfigure with new dynamic configuration values
889  return;
890 
891  constexpr float deg_to_rad = M_PI / 180.0f;
892  if (std::abs(dyn.origin_from_camera_position_x_m - calibration_.x) < 1e-3 &&
893  std::abs(dyn.origin_from_camera_position_y_m - calibration_.y) < 1e-3 &&
894  std::abs(dyn.origin_from_camera_position_z_m - calibration_.z) < 1e-3 &&
895  std::abs(dyn.origin_from_camera_rotation_x_deg * deg_to_rad - calibration_.roll) < 1e-3 &&
896  std::abs(dyn.origin_from_camera_rotation_y_deg * deg_to_rad - calibration_.pitch) < 1e-3 &&
897  std::abs(dyn.origin_from_camera_rotation_z_deg * deg_to_rad - calibration_.yaw) < 1e-3) {
898  return;
899  }
900 
901  //
902  // Update calibration on camera via libmultisense
903 
904  calibration_.x = dyn.origin_from_camera_position_x_m;
905  calibration_.y = dyn.origin_from_camera_position_y_m;
906  calibration_.z = dyn.origin_from_camera_position_z_m;
907 
908  calibration_.roll = dyn.origin_from_camera_rotation_x_deg * deg_to_rad;
909  calibration_.pitch = dyn.origin_from_camera_rotation_y_deg * deg_to_rad;
910  calibration_.yaw = dyn.origin_from_camera_rotation_z_deg * deg_to_rad;
911 
913  if (Status_Ok != status) {
914  ROS_ERROR("Reconfigure: failed to set external calibration: %s",
915  Channel::statusString(status));
916  return;
917  }
918 
919  // Update camera class locally to modify pointcloud transform in rviz
921 }
922 
923 template<class T> void Reconfigure::configureGroundSurfaceParams(const T& dyn)
924 {
925  //
926  // Update calibration on camera via libmultisense
928 
929  params.ground_surface_number_of_levels_x = dyn.ground_surface_spline_resolution_x;
930  params.ground_surface_number_of_levels_z = dyn.ground_surface_spline_resolution_z;
931 
932  if (dyn.ground_surface_pre_transform_data == "Quadratic")
933  params.ground_surface_base_model = 0;
934  else if (dyn.ground_surface_pre_transform_data == "Mean")
935  params.ground_surface_base_model = 1;
936  else if (dyn.ground_surface_pre_transform_data == "Zero")
937  params.ground_surface_base_model = 2;
938 
939  params.ground_surface_pointcloud_grid_size = dyn.ground_surface_pointcloud_grid_size;
940  params.ground_surface_min_points_per_grid = dyn.ground_surface_min_points_per_grid;
941  params.ground_surface_pointcloud_decimation = dyn.ground_surface_pointcloud_decimation;
942  params.ground_surface_pointcloud_max_range_m = dyn.ground_surface_pointcloud_global_max_z_m;
943  params.ground_surface_pointcloud_min_range_m = dyn.ground_surface_pointcloud_global_min_z_m;
944  params.ground_surface_pointcloud_max_width_m = dyn.ground_surface_pointcloud_global_max_x_m;
945  params.ground_surface_pointcloud_min_width_m = dyn.ground_surface_pointcloud_global_min_x_m;
946  params.ground_surface_pointcloud_max_height_m = dyn.ground_surface_pointcloud_global_max_height_m;
947  params.ground_surface_pointcloud_min_height_m = dyn.ground_surface_pointcloud_global_min_height_m;
948  params.ground_surface_obstacle_height_thresh_m = dyn.ground_surface_obstacle_height_thresh_m;
949  params.ground_surface_obstacle_percentage_thresh = dyn.ground_surface_obstacle_percentage_thresh;
950  params.ground_surface_max_fitting_iterations = dyn.ground_surface_max_fitting_iterations;
951  params.ground_surface_adjacent_cell_search_size_m = dyn.ground_surface_adjacent_cell_search_size_m;
952 
953  // Update ground surface params on camera
954  Status status = driver_->setGroundSurfaceParams(params);
955  if (Status_Ok != status) {
956  ROS_ERROR("Reconfigure: failed to set ground surface params: %s",
957  Channel::statusString(status));
958  return;
959  }
960 
961  //
962  // Update spline drawing parameters locally
965  dyn.ground_surface_pointcloud_global_max_z_m,
966  dyn.ground_surface_pointcloud_global_min_z_m,
967  dyn.ground_surface_pointcloud_global_max_x_m,
968  dyn.ground_surface_pointcloud_global_min_x_m,
969  dyn.ground_surface_spline_draw_resolution}
970  );
971 }
972 
973 template<class T> void Reconfigure::configureRemoteHeadSyncGroups(const T& dyn)
974 {
975  // convert the dyn integer into a remote head channel enum
976  RemoteHeadChannel c1 = dyn.sync_group_1_controller != -1
977  ? static_cast<RemoteHeadChannel>(dyn.sync_group_1_controller) : Remote_Head_Invalid;
978  RemoteHeadChannel r1 = dyn.sync_group_1_responder != -1
979  ? static_cast<RemoteHeadChannel>(dyn.sync_group_1_responder) : Remote_Head_Invalid;
980 
981  RemoteHeadChannel c2 = dyn.sync_group_2_controller != -1
982  ? static_cast<RemoteHeadChannel>(dyn.sync_group_2_controller) : Remote_Head_Invalid;
983  RemoteHeadChannel r2 = dyn.sync_group_2_responder != -1
984  ? static_cast<RemoteHeadChannel>(dyn.sync_group_2_responder) : Remote_Head_Invalid;
985 
986  const std::vector<RemoteHeadSyncGroup> sync_groups{{c1, {r1}}, {c2, {r2}}};
987 
988  const image::RemoteHeadConfig rh_config{sync_groups};
989 
990  // Update ground surface params on camera
991  Status status = driver_->setRemoteHeadConfig(rh_config);
992  if (Status_Ok != status) {
993  ROS_ERROR("Reconfigure: failed to set remote head config: %s",
994  Channel::statusString(status));
995  return;
996  }
997 }
998 
999 #define GET_CONFIG() \
1000  image::Config cfg; \
1001  Status status = driver_->getImageConfig(cfg); \
1002  if (Status_Ok != status) { \
1003  ROS_ERROR("Reconfigure: failed to query image config: %s", \
1004  Channel::statusString(status)); \
1005  return; \
1006  } \
1007 
1008 #define SL_BM() do { \
1009  GET_CONFIG(); \
1010  configureAutoWhiteBalance(cfg, dyn); \
1011  configureCamera(cfg, dyn); \
1012  configureMotor(dyn); \
1013  configureLeds(dyn); \
1014  configureBorderClip(dyn); \
1015  configurePointCloudRange(dyn); \
1016  configureExtrinsics(dyn); \
1017  } while(0)
1018 
1019 #define SL_BM_IMU() do { \
1020  GET_CONFIG(); \
1021  configureAutoWhiteBalance(cfg, dyn); \
1022  configureCamera(cfg, dyn); \
1023  configureMotor(dyn); \
1024  configureLeds(dyn); \
1025  configureImu(dyn); \
1026  configureBorderClip(dyn); \
1027  configurePointCloudRange(dyn); \
1028  configureExtrinsics(dyn); \
1029  } while(0)
1030 
1031 #define MONO_BM_IMU() do { \
1032  GET_CONFIG(); \
1033  configureAutoWhiteBalance(cfg, dyn); \
1034  configureCamera(cfg, dyn); \
1035  configureLeds(dyn); \
1036  configureImu(dyn); \
1037  configureExtrinsics(dyn); \
1038  } while(0)
1039 
1040 #define SL_SGM_IMU() do { \
1041  GET_CONFIG(); \
1042  configureSgm(cfg, dyn); \
1043  configureHdr(cfg, dyn); \
1044  configureAutoWhiteBalance(cfg, dyn); \
1045  configureCamera(cfg, dyn); \
1046  configureMotor(dyn); \
1047  configureLeds(dyn); \
1048  configureImu(dyn); \
1049  configureBorderClip(dyn); \
1050  configurePointCloudRange(dyn); \
1051  configureExtrinsics(dyn); \
1052  } while(0)
1053 
1054 #define SL_SGM() do { \
1055  GET_CONFIG(); \
1056  configureSgm(cfg, dyn); \
1057  configureHdr(cfg, dyn); \
1058  configureAutoWhiteBalance(cfg, dyn); \
1059  configureCamera(cfg, dyn); \
1060  configureBorderClip(dyn); \
1061  configurePointCloudRange(dyn); \
1062  configureExtrinsics(dyn); \
1063  } while(0)
1064 
1065 #define SL_SGM_IMU_CMV4000() do { \
1066  GET_CONFIG(); \
1067  configureSgm(cfg, dyn); \
1068  configureHdr(cfg, dyn); \
1069  configureAutoWhiteBalance(cfg, dyn); \
1070  configureCamera(cfg, dyn); \
1071  configureMotor(dyn); \
1072  configureLeds(dyn); \
1073  configureImu(dyn); \
1074  configureBorderClip(dyn); \
1075  configurePointCloudRange(dyn); \
1076  configureExtrinsics(dyn); \
1077  } while(0)
1078 
1079 #define S27_SGM() do { \
1080  GET_CONFIG(); \
1081  configureSgm(cfg, dyn); \
1082  crl::multisense::CameraProfile profile = crl::multisense::User_Control; \
1083  configureStereoProfile(profile, dyn); \
1084  configureDetailDisparityStereoProfile(profile, dyn); \
1085  configureFullResAuxStereoProfile(profile, dyn); \
1086  cfg.setCameraProfile(profile); \
1087  configureGamma(cfg, dyn); \
1088  configureCamera(cfg, dyn); \
1089  configureBorderClip(dyn); \
1090  configurePtp(dyn); \
1091  configurePointCloudRange(dyn); \
1092  configureExtrinsics(dyn); \
1093  configureAuxCamera(dyn); \
1094  } while(0)
1095 
1096 #define KS21_SGM() do { \
1097  GET_CONFIG(); \
1098  configureSgm(cfg, dyn); \
1099  crl::multisense::CameraProfile profile = crl::multisense::User_Control; \
1100  configureStereoProfile(profile, dyn); \
1101  configureDetailDisparityStereoProfile(profile, dyn); \
1102  cfg.setCameraProfile(profile); \
1103  configureGamma(cfg, dyn); \
1104  configureCamera(cfg, dyn); \
1105  configureBorderClip(dyn); \
1106  configureS19Leds(dyn); \
1107  configurePtp(dyn); \
1108  configurePointCloudRange(dyn); \
1109  configureExtrinsics(dyn); \
1110  } while(0)
1111 
1112 #define KS21I_SGM() do { \
1113  GET_CONFIG(); \
1114  configureSgm(cfg, dyn); \
1115  crl::multisense::CameraProfile profile = crl::multisense::User_Control; \
1116  configureStereoProfile(profile, dyn); \
1117  configureDetailDisparityStereoProfile(profile, dyn); \
1118  configureFullResAuxStereoProfile(profile, dyn); \
1119  cfg.setCameraProfile(profile); \
1120  configureGamma(cfg, dyn); \
1121  configureCamera(cfg, dyn); \
1122  configureBorderClip(dyn); \
1123  configureS19Leds(dyn); \
1124  configurePtp(dyn); \
1125  configurePointCloudRange(dyn); \
1126  configureExtrinsics(dyn); \
1127  configureAuxCamera(dyn); \
1128  } while(0)
1129 
1130 #define S27_SGM_GROUND_SURFACE() do { \
1131  GET_CONFIG(); \
1132  configureSgm(cfg, dyn); \
1133  crl::multisense::CameraProfile profile = crl::multisense::User_Control; \
1134  configureStereoProfile(profile, dyn); \
1135  configureDetailDisparityStereoProfile(profile, dyn); \
1136  configureGroundSurfaceStereoProfile(profile, dyn); \
1137  configureFullResAuxStereoProfile(profile, dyn); \
1138  cfg.setCameraProfile(profile); \
1139  configureGamma(cfg, dyn); \
1140  configureCamera(cfg, dyn); \
1141  configureBorderClip(dyn); \
1142  configurePtp(dyn); \
1143  configurePointCloudRange(dyn); \
1144  configureExtrinsics(dyn); \
1145  configureGroundSurfaceParams(dyn); \
1146  configureAuxCamera(dyn); \
1147  } while(0)
1148 
1149 #define KS21_SGM_GROUND_SURFACE() do { \
1150  GET_CONFIG(); \
1151  configureSgm(cfg, dyn); \
1152  crl::multisense::CameraProfile profile = crl::multisense::User_Control; \
1153  configureStereoProfile(profile, dyn); \
1154  configureDetailDisparityStereoProfile(profile, dyn); \
1155  configureGroundSurfaceStereoProfile(profile, dyn); \
1156  cfg.setCameraProfile(profile); \
1157  configureGamma(cfg, dyn); \
1158  configureCamera(cfg, dyn); \
1159  configureBorderClip(dyn); \
1160  configureS19Leds(dyn); \
1161  configurePtp(dyn); \
1162  configurePointCloudRange(dyn); \
1163  configureExtrinsics(dyn); \
1164  configureGroundSurfaceParams(dyn); \
1165  } while(0)
1166 
1167 #define KS21I_SGM_GROUND_SURFACE() do { \
1168  GET_CONFIG(); \
1169  configureSgm(cfg, dyn); \
1170  crl::multisense::CameraProfile profile = crl::multisense::User_Control; \
1171  configureStereoProfile(profile, dyn); \
1172  configureDetailDisparityStereoProfile(profile, dyn); \
1173  configureGroundSurfaceStereoProfile(profile, dyn); \
1174  configureFullResAuxStereoProfile(profile, dyn); \
1175  cfg.setCameraProfile(profile); \
1176  configureGamma(cfg, dyn); \
1177  configureCamera(cfg, dyn); \
1178  configureBorderClip(dyn); \
1179  configureS19Leds(dyn); \
1180  configurePtp(dyn); \
1181  configurePointCloudRange(dyn); \
1182  configureExtrinsics(dyn); \
1183  configureGroundSurfaceParams(dyn); \
1184  configureAuxCamera(dyn); \
1185  } while(0)
1186 
1187 #define REMOTE_HEAD_VPB() do { \
1188  GET_CONFIG(); \
1189  configurePtp(dyn); \
1190  configureExtrinsics(dyn); \
1191  configureRemoteHeadSyncGroups(dyn); \
1192  } while(0)
1193 
1194 #define REMOTE_HEAD_SGM_AR0234() do { \
1195  GET_CONFIG(); \
1196  configureSgm(cfg, dyn); \
1197  crl::multisense::CameraProfile profile = crl::multisense::User_Control; \
1198  configureStereoProfile(profile, dyn); \
1199  configureDetailDisparityStereoProfile(profile, dyn); \
1200  cfg.setCameraProfile(profile); \
1201  configureGamma(cfg, dyn); \
1202  configureCamera(cfg, dyn); \
1203  configureBorderClip(dyn); \
1204  configureS19Leds(dyn); \
1205  configurePtp(dyn); \
1206  configurePointCloudRange(dyn); \
1207  configureExtrinsics(dyn); \
1208  } while(0)
1209 
1210 #define REMOTE_HEAD_SGM_AR0234_GROUND_SURFACE() do { \
1211  GET_CONFIG(); \
1212  configureSgm(cfg, dyn); \
1213  crl::multisense::CameraProfile profile = crl::multisense::User_Control; \
1214  configureStereoProfile(profile, dyn); \
1215  configureDetailDisparityStereoProfile(profile, dyn); \
1216  configureGroundSurfaceStereoProfile(profile, dyn); \
1217  cfg.setCameraProfile(profile); \
1218  configureGamma(cfg, dyn); \
1219  configureCamera(cfg, dyn); \
1220  configureBorderClip(dyn); \
1221  configureS19Leds(dyn); \
1222  configurePtp(dyn); \
1223  configurePointCloudRange(dyn); \
1224  configureExtrinsics(dyn); \
1225  configureGroundSurfaceParams(dyn); \
1226  } while(0)
1227 
1228 #define REMOTE_HEAD_MONOCAM_AR0234() do { \
1229  GET_CONFIG(); \
1230  crl::multisense::CameraProfile profile = crl::multisense::User_Control; \
1231  configureStereoProfile(profile, dyn); \
1232  cfg.setCameraProfile(profile); \
1233  configureGamma(cfg, dyn); \
1234  configureCamera(cfg, dyn); \
1235  configureS19Leds(dyn); \
1236  configurePtp(dyn); \
1237  configureExtrinsics(dyn); \
1238  } while(0)
1239 
1240 //
1241 // The dynamic reconfigure callbacks (MultiSense S* & feature variations)
1242 
1243 void Reconfigure::callback_sl_bm_cmv2000 (multisense_ros::sl_bm_cmv2000Config& dyn, uint32_t level) { (void) level; SL_BM(); }
1244 void Reconfigure::callback_sl_bm_cmv2000_imu (multisense_ros::sl_bm_cmv2000_imuConfig& dyn, uint32_t level) { (void) level; SL_BM_IMU(); }
1245 void Reconfigure::callback_sl_bm_cmv4000 (multisense_ros::sl_bm_cmv4000Config& dyn, uint32_t level) { (void) level; SL_BM(); }
1246 void Reconfigure::callback_sl_bm_cmv4000_imu (multisense_ros::sl_bm_cmv4000_imuConfig& dyn, uint32_t level) { (void) level; SL_BM_IMU(); }
1247 void Reconfigure::callback_sl_sgm_cmv2000_imu (multisense_ros::sl_sgm_cmv2000_imuConfig& dyn, uint32_t level) { (void) level; SL_SGM_IMU(); }
1248 void Reconfigure::callback_sl_sgm_cmv4000_imu (multisense_ros::sl_sgm_cmv4000_imuConfig& dyn, uint32_t level) { (void) level; SL_SGM_IMU_CMV4000(); }
1249 void Reconfigure::callback_mono_cmv2000 (multisense_ros::mono_cmv2000Config& dyn, uint32_t level) { (void) level; MONO_BM_IMU(); }
1250 void Reconfigure::callback_mono_cmv4000 (multisense_ros::mono_cmv4000Config& dyn, uint32_t level) { (void) level; MONO_BM_IMU(); }
1251 void Reconfigure::callback_s27_AR0234 (multisense_ros::s27_sgm_AR0234Config& dyn, uint32_t level) { (void) level; S27_SGM(); }
1252 void Reconfigure::callback_ks21_AR0234 (multisense_ros::ks21_sgm_AR0234Config& dyn, uint32_t level) { (void) level; KS21_SGM(); }
1253 void Reconfigure::callback_ks21i_AR0234 (multisense_ros::ks21i_sgm_AR0234Config& dyn, uint32_t level) { (void) level; KS21I_SGM(); }
1254 void Reconfigure::callback_remote_head_vpb (multisense_ros::remote_head_vpbConfig& dyn, uint32_t level) { (void) level; REMOTE_HEAD_VPB(); }
1255 void Reconfigure::callback_remote_head_sgm_AR0234 (multisense_ros::remote_head_sgm_AR0234Config& dyn, uint32_t level) { (void) level; REMOTE_HEAD_SGM_AR0234(); }
1256 void Reconfigure::callback_remote_head_monocam_AR0234(multisense_ros::remote_head_monocam_AR0234Config& dyn, uint32_t level) { (void) level; REMOTE_HEAD_MONOCAM_AR0234(); }
1257 
1258 void Reconfigure::callback_s27_AR0234_ground_surface (multisense_ros::s27_sgm_AR0234_ground_surfaceConfig& dyn, uint32_t level) { (void) level; S27_SGM_GROUND_SURFACE(); }
1259 void Reconfigure::callback_ks21_AR0234_ground_surface (multisense_ros::ks21_sgm_AR0234_ground_surfaceConfig& dyn, uint32_t level) { (void) level; KS21_SGM_GROUND_SURFACE(); }
1260 void Reconfigure::callback_ks21i_AR0234_ground_surface (multisense_ros::ks21i_sgm_AR0234_ground_surfaceConfig& dyn, uint32_t level) { (void) level; KS21I_SGM_GROUND_SURFACE(); }
1261 void Reconfigure::callback_remote_head_sgm_AR0234_ground_surface(multisense_ros::remote_head_sgm_AR0234_ground_surfaceConfig& dyn, uint32_t level) { (void) level; REMOTE_HEAD_SGM_AR0234_GROUND_SURFACE(); }
1262 
1263 //
1264 // BCAM (Sony IMX104)
1265 
1266 void Reconfigure::callback_bcam_imx104(multisense_ros::bcam_imx104Config& dyn,
1267  uint32_t level)
1268 {
1269  (void) level;
1270 
1271  GET_CONFIG();
1272  DataSource streamsEnabled = 0;
1273  int32_t width, height;
1274  bool resolutionChange=false;
1275 
1276  //
1277  // Decode the resolution string
1278 
1279  if (2 != sscanf(dyn.resolution.c_str(), "%dx%dx", &width, &height)) {
1280  ROS_ERROR("Reconfigure: malformed resolution string: \"%s\"", dyn.resolution.c_str());
1281  return;
1282  }
1283 
1284  //
1285  // If a resolution change is desired
1286 
1287  if ((resolutionChange = changeResolution(cfg, width, height, 0))) {
1288 
1289  //
1290  // Halt streams during the resolution change
1291 
1292  status = driver_->getEnabledStreams(streamsEnabled);
1293  if (Status_Ok != status) {
1294  ROS_ERROR("Reconfigure: failed to get enabled streams: %s",
1295  Channel::statusString(status));
1296  return;
1297  }
1298  status = driver_->stopStreams(streamsEnabled);
1299  if (Status_Ok != status) {
1300  ROS_ERROR("Reconfigure: failed to stop streams for a resolution change: %s",
1301  Channel::statusString(status));
1302  return;
1303  }
1304  }
1305 
1306  //
1307  // Set all other image config from dynamic reconfigure
1308 
1309  cfg.setFps(static_cast<float>(dyn.fps));
1310  cfg.setGain(dyn.gain);
1311  cfg.setExposure(dyn.exposure_time * 1e6);
1312  cfg.setAutoExposure(dyn.auto_exposure);
1313  cfg.setAutoExposureMax(dyn.auto_exposure_max_time * 1e6);
1314  cfg.setAutoExposureDecay(dyn.auto_exposure_decay);
1315  cfg.setAutoExposureThresh(dyn.auto_exposure_thresh);
1316  cfg.setWhiteBalance(dyn.white_balance_red,
1317  dyn.white_balance_blue);
1318  cfg.setAutoWhiteBalance(dyn.auto_white_balance);
1319  cfg.setAutoWhiteBalanceDecay(dyn.auto_white_balance_decay);
1320  cfg.setAutoWhiteBalanceThresh(dyn.auto_white_balance_thresh);
1321 
1322  //
1323  // Apply, sensor enforces limits per setting.
1324 
1325  status = driver_->setImageConfig(cfg);
1326  if (Status_Ok != status)
1327  ROS_ERROR("Reconfigure: failed to set image config: %s",
1328  Channel::statusString(status));
1329 
1330  status = driver_->getImageConfig(cfg);
1331  if (Status_Ok != status)
1332  ROS_ERROR("Reconfigure: failed to query image config: %s",
1333  Channel::statusString(status));
1334 
1336 
1337  //
1338  // If we are changing the resolution, let others know about it
1339 
1340  if (resolutionChange) {
1341 
1342  status = driver_->startStreams(streamsEnabled);
1343  if (Status_Ok != status)
1344  ROS_ERROR("Reconfigure: failed to restart streams after a resolution change: %s",
1345  Channel::statusString(status));
1346  }
1347 }
1348 
1349 //
1350 // ST21 FLIR Thermal Imagers
1351 // Seperate callback required due to limited subset of dyn parameters
1352 // in st21_sgm_vga_imuConfig. configureCamera results in SFINAE errors
1353 
1354 void Reconfigure::callback_st21_vga(multisense_ros::st21_sgm_vga_imuConfig& dyn,
1355  uint32_t level)
1356 {
1357  (void) level;
1358  DataSource streamsEnabled = 0;
1359  int32_t width, height, disparities;
1360  bool resolutionChange=false;
1361 
1362  GET_CONFIG();
1363 
1364  //
1365  // Decode the resolution string
1366 
1367  if (3 != sscanf(dyn.resolution.c_str(), "%dx%dx%d", &width, &height, &disparities)) {
1368  ROS_ERROR("Reconfigure: malformed resolution string: \"%s\"", dyn.resolution.c_str());
1369  return;
1370  }
1371 
1372  //
1373  // If a resolution change is desired
1374 
1375  if ((resolutionChange = changeResolution(cfg, width, height, disparities))) {
1376 
1377  //
1378  // Halt streams during the resolution change
1379 
1380  status = driver_->getEnabledStreams(streamsEnabled);
1381  if (Status_Ok != status) {
1382  ROS_ERROR("Reconfigure: failed to get enabled streams: %s",
1383  Channel::statusString(status));
1384  return;
1385  }
1386  status = driver_->stopStreams(streamsEnabled);
1387  if (Status_Ok != status) {
1388  ROS_ERROR("Reconfigure: failed to stop streams for a resolution change: %s",
1389  Channel::statusString(status));
1390  return;
1391  }
1392  }
1393 
1394  cfg.setFps(dyn.fps);
1395 
1396  configureSgm(cfg, dyn);
1397  configureImu(dyn);
1398 
1399  //
1400  // Apply, sensor enforces limits per setting.
1401 
1402  status = driver_->setImageConfig(cfg);
1403  if (Status_Ok != status)
1404  ROS_ERROR("Reconfigure: failed to set image config: %s",
1405  Channel::statusString(status));
1406 
1407  status = driver_->getImageConfig(cfg);
1408  if (Status_Ok != status)
1409  ROS_ERROR("Reconfigure: failed to query image config: %s",
1410  Channel::statusString(status));
1411 
1413 
1414  //
1415  // If we are changing the resolution, let others know about it
1416 
1417  if (resolutionChange) {
1418 
1419  status = driver_->startStreams(streamsEnabled);
1420  if (Status_Ok != status)
1421  ROS_ERROR("Reconfigure: failed to restart streams after a resolution change: %s",
1422  Channel::statusString(status));
1423  }
1424 
1425  configureBorderClip(dyn);
1427 }
1428 
1429 //
1430 // ST25 Thermal Imagers
1431 // Seperate callback required due to limited subset of dyn parameters
1432 // in st25_sgm_imuConfig. configureCamera results in SFINAE errors
1433 
1434 void Reconfigure::callback_st25_sgm(multisense_ros::st25_sgm_imuConfig& dyn,
1435  uint32_t level)
1436 {
1437  (void) level;
1438  DataSource streamsEnabled = 0;
1439  int32_t width, height, disparities;
1440  bool resolutionChange=false;
1441 
1442  GET_CONFIG();
1443 
1444  //
1445  // Decode the resolution string
1446 
1447  if (3 != sscanf(dyn.resolution.c_str(), "%dx%dx%d", &width, &height, &disparities)) {
1448  ROS_ERROR("Reconfigure: malformed resolution string: \"%s\"", dyn.resolution.c_str());
1449  return;
1450  }
1451 
1452  //
1453  // If a resolution change is desired
1454 
1455  if ((resolutionChange = changeResolution(cfg, width, height, disparities))) {
1456 
1457  //
1458  // Halt streams during the resolution change
1459 
1460  status = driver_->getEnabledStreams(streamsEnabled);
1461  if (Status_Ok != status) {
1462  ROS_ERROR("Reconfigure: failed to get enabled streams: %s",
1463  Channel::statusString(status));
1464  return;
1465  }
1466  status = driver_->stopStreams(streamsEnabled);
1467  if (Status_Ok != status) {
1468  ROS_ERROR("Reconfigure: failed to stop streams for a resolution change: %s",
1469  Channel::statusString(status));
1470  return;
1471  }
1472  }
1473 
1474  cfg.setFps(dyn.fps);
1475 
1476  configureSgm(cfg, dyn);
1477  configureImu(dyn);
1478 
1479  //
1480  // Apply, sensor enforces limits per setting.
1481 
1482  status = driver_->setImageConfig(cfg);
1483  if (Status_Ok != status)
1484  ROS_ERROR("Reconfigure: failed to set image config: %s",
1485  Channel::statusString(status));
1486 
1487  status = driver_->getImageConfig(cfg);
1488  if (Status_Ok != status)
1489  ROS_ERROR("Reconfigure: failed to query image config: %s",
1490  Channel::statusString(status));
1491 
1493 
1494  //
1495  // If we are changing the resolution, let others know about it
1496 
1497  if (resolutionChange) {
1498 
1499  status = driver_->startStreams(streamsEnabled);
1500  if (Status_Ok != status)
1501  ROS_ERROR("Reconfigure: failed to restart streams after a resolution change: %s",
1502  Channel::statusString(status));
1503  }
1504 
1505  configureBorderClip(dyn);
1507 }
1508 
1509 } // namespace
multisense_ros::Reconfigure::callback_s27_AR0234_ground_surface
void callback_s27_AR0234_ground_surface(multisense_ros::s27_sgm_AR0234_ground_surfaceConfig &dyn, uint32_t level)
Definition: reconfigure.cpp:1258
crl::multisense::lighting::Config::setFlash
void setFlash(bool onOff)
multisense_ros::Reconfigure::configureFullResAuxStereoProfile
void configureFullResAuxStereoProfile(crl::multisense::CameraProfile &profile, const T &dyn)
Definition: reconfigure.cpp:860
crl::multisense::Channel::networkTimeSynchronization
virtual Status networkTimeSynchronization(bool enabled)=0
multisense_ros::Reconfigure::border_clip_change_callback_
std::function< void(BorderClip, double)> border_clip_change_callback_
Definition: reconfigure.h:211
multisense_ros::Reconfigure::configureBorderClip
void configureBorderClip(const T &dyn)
Definition: reconfigure.cpp:802
multisense_ros::Reconfigure::callback_st25_sgm
void callback_st25_sgm(multisense_ros::st25_sgm_imuConfig &config, uint32_t level)
Definition: reconfigure.cpp:1434
multisense_ros::Reconfigure::server_sl_bm_cmv4000_imu_
std::shared_ptr< dynamic_reconfigure::Server< multisense_ros::sl_bm_cmv4000_imuConfig > > server_sl_bm_cmv4000_imu_
Definition: reconfigure.h:168
multisense_ros::Reconfigure::roi_supported_
bool roi_supported_
Definition: reconfigure.h:196
crl::multisense::image::Config::setAutoExposure
void setAutoExposure(bool e)
KS21I_SGM
#define KS21I_SGM()
Definition: reconfigure.cpp:1112
crl::multisense::Channel::getDeviceInfo
virtual Status getDeviceInfo(system::DeviceInfo &info)=0
KS21_SGM_GROUND_SURFACE
#define KS21_SGM_GROUND_SURFACE()
Definition: reconfigure.cpp:1149
crl::multisense::system::ExternalCalibration::yaw
float yaw
crl::multisense::image::AuxConfig::setSharpeningLimit
void setSharpeningLimit(const uint8_t &s)
multisense_ros::Reconfigure::reconfigure_external_calibration_supported_
bool reconfigure_external_calibration_supported_
Definition: reconfigure.h:198
crl::multisense::system::ExternalCalibration
multisense_ros::Reconfigure::callback_sl_sgm_cmv4000_imu
void callback_sl_sgm_cmv4000_imu(multisense_ros::sl_sgm_cmv4000_imuConfig &config, uint32_t level)
Definition: reconfigure.cpp:1248
multisense_ros::Reconfigure::server_sl_sgm_cmv2000_imu_
std::shared_ptr< dynamic_reconfigure::Server< multisense_ros::sl_sgm_cmv2000_imuConfig > > server_sl_sgm_cmv2000_imu_
Definition: reconfigure.h:169
crl::multisense::Channel::setTransmitDelay
virtual Status setTransmitDelay(const image::TransmitDelay &c)=0
multisense_ros::Reconfigure::crop_mode_changed_
bool crop_mode_changed_
Definition: reconfigure.h:194
crl::multisense::imu::Config::name
std::string name
crl::multisense::system::ExternalCalibration::y
float y
multisense_ros::Reconfigure::server_sl_sgm_cmv4000_imu_
std::shared_ptr< dynamic_reconfigure::Server< multisense_ros::sl_sgm_cmv4000_imuConfig > > server_sl_sgm_cmv4000_imu_
Definition: reconfigure.h:170
multisense_ros::Reconfigure::server_sl_bm_cmv2000_imu_
std::shared_ptr< dynamic_reconfigure::Server< multisense_ros::sl_bm_cmv2000_imuConfig > > server_sl_bm_cmv2000_imu_
Definition: reconfigure.h:166
crl::multisense::system::DeviceMode::width
uint32_t width
multisense_ros::Reconfigure::configureGamma
void configureGamma(crl::multisense::image::Config &cfg, const T &dyn)
Definition: reconfigure.cpp:463
multisense_ros::Reconfigure::configureHdr
void configureHdr(crl::multisense::image::Config &cfg, const T &dyn)
Definition: reconfigure.cpp:450
crl::multisense::image::Config::setWhiteBalance
void setWhiteBalance(float r, float b)
SL_BM_IMU
#define SL_BM_IMU()
Definition: reconfigure.cpp:1019
crl::multisense::system::DeviceMode::disparities
int32_t disparities
crl::multisense::system::DeviceInfo::lightingType
uint32_t lightingType
GET_CONFIG
#define GET_CONFIG()
Definition: reconfigure.cpp:999
crl::multisense::system::GroundSurfaceParams::ground_surface_pointcloud_grid_size
float ground_surface_pointcloud_grid_size
crl::multisense::image::Config::setDisparities
void setDisparities(uint32_t d)
reconfigure.h
multisense_ros::Reconfigure::callback_mono_cmv2000
void callback_mono_cmv2000(multisense_ros::mono_cmv2000Config &config, uint32_t level)
Definition: reconfigure.cpp:1249
multisense_ros::Reconfigure::configureStereoProfile
void configureStereoProfile(crl::multisense::CameraProfile &profile, const T &dyn)
Definition: reconfigure.cpp:849
crl::multisense::system::GroundSurfaceParams::ground_surface_adjacent_cell_search_size_m
float ground_surface_adjacent_cell_search_size_m
crl::multisense::image::Config::setAutoExposureMax
void setAutoExposureMax(uint32_t m)
multisense_ros::Reconfigure::callback_sl_bm_cmv4000_imu
void callback_sl_bm_cmv4000_imu(multisense_ros::sl_bm_cmv4000_imuConfig &config, uint32_t level)
Definition: reconfigure.cpp:1246
crl::multisense::image::Config::setAutoExposureTargetIntensity
void setAutoExposureTargetIntensity(float d)
multisense_ros::Reconfigure::configureCamera
void configureCamera(crl::multisense::image::Config &cfg, const T &dyn)
Definition: reconfigure.cpp:532
NONE
NONE
crl::multisense::image::AuxConfig::setGain
void setGain(float g)
multisense_ros::Reconfigure::server_st21_vga_
std::shared_ptr< dynamic_reconfigure::Server< multisense_ros::st21_sgm_vga_imuConfig > > server_st21_vga_
Definition: reconfigure.h:172
crl::multisense::system::GroundSurfaceParams::ground_surface_base_model
int ground_surface_base_model
multisense_ros::Reconfigure::server_mono_cmv4000_
std::shared_ptr< dynamic_reconfigure::Server< multisense_ros::mono_cmv4000Config > > server_mono_cmv4000_
Definition: reconfigure.h:175
crl::multisense::image::AuxConfig::setAutoExposure
void setAutoExposure(bool e)
crl::multisense::system::GroundSurfaceParams::ground_surface_min_points_per_grid
int ground_surface_min_points_per_grid
multisense_ros::Reconfigure::configureGroundSurfaceStereoProfile
void configureGroundSurfaceStereoProfile(crl::multisense::CameraProfile &profile, const T &dyn)
Definition: reconfigure.cpp:855
crl::multisense::image::Config::setHdr
void setHdr(bool e)
multisense_ros::Reconfigure::callback_remote_head_sgm_AR0234_ground_surface
void callback_remote_head_sgm_AR0234_ground_surface(multisense_ros::remote_head_sgm_AR0234_ground_surfaceConfig &dyn, uint32_t level)
Definition: reconfigure.cpp:1261
crl::multisense::image::Config::setStereoPostFilterStrength
void setStereoPostFilterStrength(float s)
crl::multisense::image::Config::setGain
void setGain(float g)
multisense_ros::Reconfigure::server_ks21i_sgm_AR0234_
std::shared_ptr< dynamic_reconfigure::Server< multisense_ros::ks21i_sgm_AR0234Config > > server_ks21i_sgm_AR0234_
Definition: reconfigure.h:178
crl::multisense::Full_Res_Aux_Cam
static CRL_CONSTEXPR CameraProfile Full_Res_Aux_Cam
crl::multisense::Detail_Disparity
static CRL_CONSTEXPR CameraProfile Detail_Disparity
multisense_ros::Reconfigure::device_nh_
ros::NodeHandle device_nh_
Definition: reconfigure.h:153
crl::multisense::system::DeviceMode
REMOTE_HEAD_MONOCAM_AR0234
#define REMOTE_HEAD_MONOCAM_AR0234()
Definition: reconfigure.cpp:1228
crl::multisense::system::GroundSurfaceParams::ground_surface_obstacle_height_thresh_m
float ground_surface_obstacle_height_thresh_m
crl::multisense::system::GroundSurfaceParams::ground_surface_pointcloud_min_height_m
float ground_surface_pointcloud_min_height_m
crl::multisense::image::AuxConfig::setAutoWhiteBalanceDecay
void setAutoWhiteBalanceDecay(uint32_t d)
crl::multisense::image::AuxConfig::setWhiteBalance
void setWhiteBalance(float r, float b)
crl::multisense::image::AuxConfig::setAutoExposureThresh
void setAutoExposureThresh(float t)
crl::multisense::lighting::Config::setNumberOfPulses
bool setNumberOfPulses(const uint32_t numPulses)
crl::multisense::system::GroundSurfaceParams::ground_surface_pointcloud_min_width_m
float ground_surface_pointcloud_min_width_m
multisense_ros::Reconfigure::time_sync_callback_
std::function< void(bool, int32_t)> time_sync_callback_
Definition: reconfigure.h:232
crl::multisense::lighting::Config::setInvertPulse
bool setInvertPulse(const bool invert)
multisense_ros::Reconfigure::callback_bcam_imx104
void callback_bcam_imx104(multisense_ros::bcam_imx104Config &config, uint32_t level)
Definition: reconfigure.cpp:1266
multisense_ros::Reconfigure::configureS19Leds
void configureS19Leds(const T &dyn)
Definition: reconfigure.cpp:700
REMOTE_HEAD_SGM_AR0234_GROUND_SURFACE
#define REMOTE_HEAD_SGM_AR0234_GROUND_SURFACE()
Definition: reconfigure.cpp:1210
crl::multisense::image::Config::setAutoExposureRoi
void setAutoExposureRoi(uint16_t start_x, uint16_t start_y, uint16_t width, uint16_t height)
crl::multisense::image::Config::width
uint32_t width() const
multisense_ros::Reconfigure::callback_ks21_AR0234
void callback_ks21_AR0234(multisense_ros::ks21_sgm_AR0234Config &config, uint32_t level)
Definition: reconfigure.cpp:1252
crl::multisense::Channel::getEnabledStreams
virtual Status getEnabledStreams(DataSource &mask)=0
multisense_ros::Reconfigure::motor_supported_
bool motor_supported_
Definition: reconfigure.h:193
multisense_ros::Reconfigure::configureMotor
void configureMotor(const T &dyn)
Definition: reconfigure.cpp:652
SL_SGM_IMU
#define SL_SGM_IMU()
Definition: reconfigure.cpp:1040
crl::multisense::Channel::setLightingConfig
virtual Status setLightingConfig(const lighting::Config &c)=0
crl::multisense::Channel::startStreams
virtual Status startStreams(DataSource mask)=0
crl::multisense::system::GroundSurfaceParams::ground_surface_obstacle_percentage_thresh
float ground_surface_obstacle_percentage_thresh
DataSource
DataSource
multisense_ros::Reconfigure::device_modes_
std::vector< crl::multisense::system::DeviceMode > device_modes_
Definition: reconfigure.h:158
multisense_ros::Reconfigure::server_st25_sgm_
std::shared_ptr< dynamic_reconfigure::Server< multisense_ros::st25_sgm_imuConfig > > server_st25_sgm_
Definition: reconfigure.h:173
multisense_ros::Reconfigure::callback_ks21i_AR0234
void callback_ks21i_AR0234(multisense_ros::ks21i_sgm_AR0234Config &config, uint32_t level)
Definition: reconfigure.cpp:1253
crl::multisense::image::AuxConfig::setAutoWhiteBalance
void setAutoWhiteBalance(bool e)
crl::multisense::system::GroundSurfaceParams::ground_surface_pointcloud_min_range_m
float ground_surface_pointcloud_min_range_m
multisense_ros::Status
Definition: status.h:43
crl::multisense::Channel::setAuxImageConfig
virtual Status setAuxImageConfig(const image::AuxConfig &c)=0
multisense_ros::Reconfigure::ptp_supported_
bool ptp_supported_
Definition: reconfigure.h:195
multisense_ros::Reconfigure::server_remote_head_vpb_
std::shared_ptr< dynamic_reconfigure::Server< multisense_ros::remote_head_vpbConfig > > server_remote_head_vpb_
Definition: reconfigure.h:183
multisense_ros::Reconfigure::callback_mono_cmv4000
void callback_mono_cmv4000(multisense_ros::mono_cmv4000Config &config, uint32_t level)
Definition: reconfigure.cpp:1250
crl::multisense::image::AuxConfig::setAutoExposureTargetIntensity
void setAutoExposureTargetIntensity(float d)
crl::multisense::image::Config
multisense_ros::Reconfigure::driver_
crl::multisense::Channel * driver_
Definition: reconfigure.h:143
crl::multisense::lighting::Config::setDutyCycle
bool setDutyCycle(float percent)
multisense_ros::Reconfigure::server_ks21i_sgm_AR0234_ground_surface_
std::shared_ptr< dynamic_reconfigure::Server< multisense_ros::ks21i_sgm_AR0234_ground_surfaceConfig > > server_ks21i_sgm_AR0234_ground_surface_
Definition: reconfigure.h:181
multisense_ros::Reconfigure::server_ks21_sgm_AR0234_ground_surface_
std::shared_ptr< dynamic_reconfigure::Server< multisense_ros::ks21_sgm_AR0234_ground_surfaceConfig > > server_ks21_sgm_AR0234_ground_surface_
Definition: reconfigure.h:180
multisense_ros::Reconfigure::configureLeds
void configureLeds(const T &dyn)
Definition: reconfigure.cpp:672
crl::multisense::image::Config::height
uint32_t height() const
multisense_ros
Definition: camera.h:58
S27_SGM_GROUND_SURFACE
#define S27_SGM_GROUND_SURFACE()
Definition: reconfigure.cpp:1130
crl::multisense::imu::Config::enabled
bool enabled
crl::multisense::system::GroundSurfaceParams::ground_surface_pointcloud_max_height_m
float ground_surface_pointcloud_max_height_m
crl::multisense::system::ExternalCalibration::roll
float roll
crl::multisense::system::GroundSurfaceParams::ground_surface_pointcloud_max_width_m
float ground_surface_pointcloud_max_width_m
crl::multisense::Show_ROIs
static CRL_CONSTEXPR CameraProfile Show_ROIs
crl::multisense::lighting::Config
crl::multisense::system::DeviceInfo
crl::multisense::system::GroundSurfaceParams::ground_surface_pointcloud_max_range_m
float ground_surface_pointcloud_max_range_m
multisense_ros::Reconfigure::extrinsics_callback_
std::function< void(crl::multisense::system::ExternalCalibration)> extrinsics_callback_
Definition: reconfigure.h:222
crl::multisense::system::DeviceInfo::hardwareRevision
uint32_t hardwareRevision
crl::multisense::Channel::setGroundSurfaceParams
virtual Status setGroundSurfaceParams(const system::GroundSurfaceParams &params)=0
crl::multisense::image::AuxConfig::setAutoExposureDecay
void setAutoExposureDecay(uint32_t d)
multisense_ros::Reconfigure::configureAuxCamera
void configureAuxCamera(const T &dyn)
Definition: reconfigure.cpp:468
multisense_ros::Reconfigure::server_s27_AR0234_
std::shared_ptr< dynamic_reconfigure::Server< multisense_ros::s27_sgm_AR0234Config > > server_s27_AR0234_
Definition: reconfigure.h:176
crl::multisense::image::RemoteHeadConfig
multisense_ros::Reconfigure::callback_sl_sgm_cmv2000_imu
void callback_sl_sgm_cmv2000_imu(multisense_ros::sl_sgm_cmv2000_imuConfig &config, uint32_t level)
Definition: reconfigure.cpp:1247
multisense_ros::Reconfigure::origin_from_camera_calibration_initialized_
bool origin_from_camera_calibration_initialized_
Definition: reconfigure.h:199
crl::multisense::image::TransmitDelay
multisense_ros::Reconfigure::server_remote_head_sgm_AR0234_ground_surface_
std::shared_ptr< dynamic_reconfigure::Server< multisense_ros::remote_head_sgm_AR0234_ground_surfaceConfig > > server_remote_head_sgm_AR0234_ground_surface_
Definition: reconfigure.h:185
multisense_ros::Reconfigure::calibration_
crl::multisense::system::ExternalCalibration calibration_
Definition: reconfigure.h:221
multisense_ros::Reconfigure::max_point_cloud_range_callback_
std::function< void(double)> max_point_cloud_range_callback_
Definition: reconfigure.h:216
multisense_ros::Reconfigure::lighting_supported_
bool lighting_supported_
Definition: reconfigure.h:192
multisense_ros::Reconfigure::configureSgm
void configureSgm(crl::multisense::image::Config &cfg, const T &dyn)
Definition: reconfigure.cpp:445
d
d
crl::multisense::image::AuxConfig::enableSharpening
bool enableSharpening() const
ROS_WARN
#define ROS_WARN(...)
crl::multisense::image::Config::setAutoWhiteBalanceThresh
void setAutoWhiteBalanceThresh(float t)
multisense_ros::Reconfigure::callback_ks21_AR0234_ground_surface
void callback_ks21_AR0234_ground_surface(multisense_ros::ks21_sgm_AR0234_ground_surfaceConfig &dyn, uint32_t level)
Definition: reconfigure.cpp:1259
multisense_ros::Reconfigure::imu_configs_
std::vector< crl::multisense::imu::Config > imu_configs_
Definition: reconfigure.h:160
crl::multisense::image::AuxConfig::setGamma
void setGamma(const float g)
multisense_ros::Reconfigure::callback_s27_AR0234
void callback_s27_AR0234(multisense_ros::s27_sgm_AR0234Config &config, uint32_t level)
Definition: reconfigure.cpp:1251
crl::multisense::system::VersionInfo::sensorFirmwareVersion
VersionType sensorFirmwareVersion
multisense_ros::Reconfigure::configureExtrinsics
void configureExtrinsics(const T &dyn)
Definition: reconfigure.cpp:870
multisense_ros::BorderClip
BorderClip
Definition: camera_utilities.h:62
crl::multisense::Channel::getImageConfig
virtual Status getImageConfig(image::Config &c)=0
crl::multisense::Channel::setExternalCalibration
virtual Status setExternalCalibration(const system::ExternalCalibration &calibration)=0
ground_surface_utilities::SplineDrawParameters
Struct containing parameters for drawing a pointcloud representation of a B-Spline model.
Definition: ground_surface_utilities.h:68
crl::multisense::Channel::getVersionInfo
virtual Status getVersionInfo(system::VersionInfo &v)=0
crl::multisense::system::DeviceInfo::motorType
uint32_t motorType
multisense_ros::Reconfigure::configurePtp
void configurePtp(const T &dyn)
Definition: reconfigure.cpp:818
SL_BM
#define SL_BM()
Definition: reconfigure.cpp:1008
multisense_ros::Reconfigure::changeResolution
bool changeResolution(crl::multisense::image::Config &cfg, int32_t width, int32_t height, int32_t disparities)
Definition: reconfigure.cpp:385
crl::multisense::Channel::getImuConfig
virtual Status getImuConfig(uint32_t &samplesPerMessage, std::vector< imu::Config > &c)=0
crl::multisense::image::Config::setAutoWhiteBalanceDecay
void setAutoWhiteBalanceDecay(uint32_t d)
crl::multisense::imu::Config::rangeTableIndex
uint32_t rangeTableIndex
multisense_ros::Reconfigure::server_ks21_sgm_AR0234_
std::shared_ptr< dynamic_reconfigure::Server< multisense_ros::ks21_sgm_AR0234Config > > server_ks21_sgm_AR0234_
Definition: reconfigure.h:177
multisense_ros::Reconfigure::callback_st21_vga
void callback_st21_vga(multisense_ros::st21_sgm_vga_imuConfig &config, uint32_t level)
Definition: reconfigure.cpp:1354
crl::multisense::system::DeviceMode::height
uint32_t height
REMOTE_HEAD_SGM_AR0234
#define REMOTE_HEAD_SGM_AR0234()
Definition: reconfigure.cpp:1194
crl::multisense::image::AuxConfig::setSharpeningPercentage
void setSharpeningPercentage(const float &s)
crl::multisense::image::Config::disparities
uint32_t disparities() const
crl::multisense::imu::Config::rateTableIndex
uint32_t rateTableIndex
crl::multisense::Channel::ptpTimeSynchronization
virtual Status ptpTimeSynchronization(bool enabled)=0
multisense_ros::Reconfigure::configureRemoteHeadSyncGroups
void configureRemoteHeadSyncGroups(const T &dyn)
Definition: reconfigure.cpp:973
MONO_BM_IMU
#define MONO_BM_IMU()
Definition: reconfigure.cpp:1031
multisense_ros::Reconfigure::callback_remote_head_monocam_AR0234
void callback_remote_head_monocam_AR0234(multisense_ros::remote_head_monocam_AR0234Config &dyn, uint32_t level)
Definition: reconfigure.cpp:1256
crl::multisense::system::ExternalCalibration::pitch
float pitch
crl::multisense::image::AuxConfig::setAutoExposureMax
void setAutoExposureMax(uint32_t m)
multisense_ros::Reconfigure::configureGroundSurfaceParams
void configureGroundSurfaceParams(const T &dyn)
Definition: reconfigure.cpp:923
multisense_ros::Reconfigure::server_s27_AR0234_ground_surface_
std::shared_ptr< dynamic_reconfigure::Server< multisense_ros::s27_sgm_AR0234_ground_surfaceConfig > > server_s27_AR0234_ground_surface_
Definition: reconfigure.h:179
crl::multisense::Channel::setRemoteHeadConfig
virtual Status setRemoteHeadConfig(const image::RemoteHeadConfig &c)=0
crl::multisense::Channel::getAuxImageConfig
virtual Status getAuxImageConfig(image::AuxConfig &c)=0
crl::multisense::system::VersionInfo
crl::multisense::system::GroundSurfaceParams::ground_surface_number_of_levels_x
int ground_surface_number_of_levels_x
crl::multisense::image::Config::setGamma
void setGamma(const float g)
multisense_ros::Reconfigure::callback_ks21i_AR0234_ground_surface
void callback_ks21i_AR0234_ground_surface(multisense_ros::ks21i_sgm_AR0234_ground_surfaceConfig &dyn, uint32_t level)
Definition: reconfigure.cpp:1260
multisense_ros::Reconfigure::configureDetailDisparityStereoProfile
void configureDetailDisparityStereoProfile(crl::multisense::CameraProfile &profile, const T &dyn)
Definition: reconfigure.cpp:865
multisense_ros::Reconfigure::border_clip_value_
double border_clip_value_
Definition: reconfigure.h:206
crl::multisense::Channel
crl::multisense::image::Config::setAutoWhiteBalance
void setAutoWhiteBalance(bool e)
crl::multisense::image::AuxConfig
multisense_ros::Reconfigure::callback_sl_bm_cmv2000_imu
void callback_sl_bm_cmv2000_imu(multisense_ros::sl_bm_cmv2000_imuConfig &config, uint32_t level)
Definition: reconfigure.cpp:1244
KS21I_SGM_GROUND_SURFACE
#define KS21I_SGM_GROUND_SURFACE()
Definition: reconfigure.cpp:1167
crl::multisense::image::Config::setAutoExposureDecay
void setAutoExposureDecay(uint32_t d)
crl::multisense::Channel::setMotorSpeed
virtual Status setMotorSpeed(float rpm)=0
KS21_SGM
#define KS21_SGM()
Definition: reconfigure.cpp:1096
crl::multisense::system::ExternalCalibration::x
float x
multisense_ros::Reconfigure::imu_samples_per_message_
uint32_t imu_samples_per_message_
Definition: reconfigure.h:159
S27_SGM
#define S27_SGM()
Definition: reconfigure.cpp:1079
multisense_ros::Reconfigure::resolution_change_callback_
std::function< void(crl::multisense::image::Config)> resolution_change_callback_
Definition: reconfigure.h:148
SL_SGM_IMU_CMV4000
#define SL_SGM_IMU_CMV4000()
Definition: reconfigure.cpp:1065
crl::multisense::Channel::setTriggerSource
virtual Status setTriggerSource(TriggerSource s)=0
crl::multisense::Channel::setImuConfig
virtual Status setImuConfig(bool storeSettingsInFlash, uint32_t samplesPerMessage, const std::vector< imu::Config > &c)=0
crl::multisense::image::AuxConfig::setAutoWhiteBalanceThresh
void setAutoWhiteBalanceThresh(float t)
ROS_ERROR
#define ROS_ERROR(...)
crl::multisense
crl::multisense::imu::Config
multisense_ros::Reconfigure::configurePointCloudRange
void configurePointCloudRange(const T &dyn)
Definition: reconfigure.cpp:813
crl::multisense::Channel::getDeviceModes
virtual Status getDeviceModes(std::vector< system::DeviceMode > &m)=0
crl::multisense::image::AuxConfig::setAutoExposureRoi
void setAutoExposureRoi(uint16_t start_x, uint16_t start_y, uint16_t width, uint16_t height)
crl::multisense::image::Config::setAutoExposureThresh
void setAutoExposureThresh(float t)
crl::multisense::Channel::stopStreams
virtual Status stopStreams(DataSource mask)=0
multisense_ros::Reconfigure::border_clip_type_
BorderClip border_clip_type_
Definition: reconfigure.h:205
crl::multisense::lighting::Config::setStartupTime
bool setStartupTime(uint32_t ledTransientResponse_us)
crl::multisense::system::GroundSurfaceParams
crl::multisense::system::DeviceInfo::imagerType
uint32_t imagerType
crl::multisense::High_Contrast
static CRL_CONSTEXPR CameraProfile High_Contrast
REMOTE_HEAD_VPB
#define REMOTE_HEAD_VPB()
Definition: reconfigure.cpp:1187
multisense_ros::Reconfigure::configureAutoWhiteBalance
void configureAutoWhiteBalance(crl::multisense::image::Config &cfg, const T &dyn)
Definition: reconfigure.cpp:455
multisense_ros::Reconfigure::server_remote_head_monocam_AR0234_
std::shared_ptr< dynamic_reconfigure::Server< multisense_ros::remote_head_monocam_AR0234Config > > server_remote_head_monocam_AR0234_
Definition: reconfigure.h:186
crl::multisense::system::GroundSurfaceParams::ground_surface_max_fitting_iterations
int ground_surface_max_fitting_iterations
multisense_ros::Reconfigure::configureImu
void configureImu(const T &dyn)
Definition: reconfigure.cpp:731
crl::multisense::system::ExternalCalibration::z
float z
multisense_ros::Reconfigure::server_remote_head_sgm_AR0234_
std::shared_ptr< dynamic_reconfigure::Server< multisense_ros::remote_head_sgm_AR0234Config > > server_remote_head_sgm_AR0234_
Definition: reconfigure.h:184
crl::multisense::CameraProfile
uint32_t CameraProfile
crl::multisense::image::Config::setResolution
void setResolution(uint32_t w, uint32_t h)
crl::multisense::image::Config::setFps
void setFps(float f)
multisense_ros::Reconfigure::spline_draw_parameters_callback_
std::function< void(ground_surface_utilities::SplineDrawParameters)> spline_draw_parameters_callback_
Definition: reconfigure.h:227
multisense_ros::Reconfigure::server_bcam_imx104_
std::shared_ptr< dynamic_reconfigure::Server< multisense_ros::bcam_imx104Config > > server_bcam_imx104_
Definition: reconfigure.h:171
multisense_ros::Reconfigure::~Reconfigure
~Reconfigure()
Definition: reconfigure.cpp:378
multisense_ros::Reconfigure::server_sl_bm_cmv4000_
std::shared_ptr< dynamic_reconfigure::Server< multisense_ros::sl_bm_cmv4000Config > > server_sl_bm_cmv4000_
Definition: reconfigure.h:167
crl::multisense::Ground_Surface
static CRL_CONSTEXPR CameraProfile Ground_Surface
crl::multisense::image::AuxConfig::setExposure
void setExposure(uint32_t e)
multisense_ros::Reconfigure::callback_remote_head_vpb
void callback_remote_head_vpb(multisense_ros::remote_head_vpbConfig &dyn, uint32_t level)
Definition: reconfigure.cpp:1254
crl::multisense::system::GroundSurfaceParams::ground_surface_pointcloud_decimation
int ground_surface_pointcloud_decimation
multisense_ros::Reconfigure::aux_supported_
bool aux_supported_
Definition: reconfigure.h:197
RemoteHeadChannel
int16_t RemoteHeadChannel
multisense_ros::Reconfigure::server_sl_bm_cmv2000_
std::shared_ptr< dynamic_reconfigure::Server< multisense_ros::sl_bm_cmv2000Config > > server_sl_bm_cmv2000_
Definition: reconfigure.h:165
crl::multisense::system::GroundSurfaceParams::ground_surface_number_of_levels_z
int ground_surface_number_of_levels_z
multisense_ros::Reconfigure::server_mono_cmv2000_
std::shared_ptr< dynamic_reconfigure::Server< multisense_ros::mono_cmv2000Config > > server_mono_cmv2000_
Definition: reconfigure.h:174
crl::multisense::image::Config::setExposure
void setExposure(uint32_t e)
multisense_ros::Reconfigure::callback_sl_bm_cmv4000
void callback_sl_bm_cmv4000(multisense_ros::sl_bm_cmv4000Config &config, uint32_t level)
Definition: reconfigure.cpp:1245
multisense_ros::Reconfigure::callback_remote_head_sgm_AR0234
void callback_remote_head_sgm_AR0234(multisense_ros::remote_head_sgm_AR0234Config &dyn, uint32_t level)
Definition: reconfigure.cpp:1255
multisense_ros::Reconfigure::callback_sl_bm_cmv2000
void callback_sl_bm_cmv2000(multisense_ros::sl_bm_cmv2000Config &config, uint32_t level)
Definition: reconfigure.cpp:1243
crl::multisense::Channel::setImageConfig
virtual Status setImageConfig(const image::Config &c)=0


multisense_ros
Author(s):
autogenerated on Thu Apr 17 2025 02:49:24