42 std::function<
void (
BorderClip,
double)> borderClipChangeCallback,
43 std::function<
void (
double)> maxPointCloudRangeCallback):
45 resolution_change_callback_(resolutionChangeCallback),
47 imu_samples_per_message_(0),
48 lighting_supported_(false),
49 motor_supported_(false),
50 crop_mode_changed_(false),
51 ptp_supported_(false),
53 border_clip_value_(0.0),
54 border_clip_change_callback_(borderClipChangeCallback),
55 max_point_cloud_range_callback_(maxPointCloudRangeCallback)
64 if (Status_Ok != status) {
65 ROS_ERROR(
"Reconfigure: failed to query version info: %s",
66 Channel::statusString(status));
70 if (Status_Ok != status) {
71 ROS_ERROR(
"Reconfigure: failed to query device info: %s",
72 Channel::statusString(status));
84 if (system::DeviceInfo::HARDWARE_REV_MULTISENSE_C6S2_S27 == deviceInfo.
hardwareRevision ||
85 system::DeviceInfo::HARDWARE_REV_MULTISENSE_S30 == deviceInfo.
hardwareRevision ||
86 system::DeviceInfo::HARDWARE_REV_MULTISENSE_KS21 == deviceInfo.
hardwareRevision)
97 std::shared_ptr< dynamic_reconfigure::Server<multisense_ros::bcam_imx104Config> > (
98 new dynamic_reconfigure::Server<multisense_ros::bcam_imx104Config>(
device_nh_));
100 std::placeholders::_1, std::placeholders::_2));
102 }
else if (system::DeviceInfo::HARDWARE_REV_MULTISENSE_ST21 == deviceInfo.
hardwareRevision) {
105 std::shared_ptr< dynamic_reconfigure::Server<multisense_ros::st21_sgm_vga_imuConfig> > (
106 new dynamic_reconfigure::Server<multisense_ros::st21_sgm_vga_imuConfig>(
device_nh_));
108 std::placeholders::_1, std::placeholders::_2));
110 }
else if (system::DeviceInfo::HARDWARE_REV_MULTISENSE_M == deviceInfo.
hardwareRevision) {
113 case system::DeviceInfo::IMAGER_TYPE_CMV2000_GREY:
114 case system::DeviceInfo::IMAGER_TYPE_CMV2000_COLOR:
117 std::shared_ptr< dynamic_reconfigure::Server<multisense_ros::mono_cmv2000Config> > (
118 new dynamic_reconfigure::Server<multisense_ros::mono_cmv2000Config>(
device_nh_));
120 std::placeholders::_1, std::placeholders::_2));
123 case system::DeviceInfo::IMAGER_TYPE_CMV4000_GREY:
124 case system::DeviceInfo::IMAGER_TYPE_CMV4000_COLOR:
127 std::shared_ptr< dynamic_reconfigure::Server<multisense_ros::mono_cmv4000Config> > (
128 new dynamic_reconfigure::Server<multisense_ros::mono_cmv4000Config>(
device_nh_));
130 std::placeholders::_1, std::placeholders::_2));
138 case system::DeviceInfo::IMAGER_TYPE_CMV2000_GREY:
139 case system::DeviceInfo::IMAGER_TYPE_CMV2000_COLOR:
142 std::shared_ptr< dynamic_reconfigure::Server<multisense_ros::sl_bm_cmv2000Config> > (
143 new dynamic_reconfigure::Server<multisense_ros::sl_bm_cmv2000Config>(
device_nh_));
145 std::placeholders::_1, std::placeholders::_2));
148 case system::DeviceInfo::IMAGER_TYPE_CMV4000_GREY:
149 case system::DeviceInfo::IMAGER_TYPE_CMV4000_COLOR:
152 std::shared_ptr< dynamic_reconfigure::Server<multisense_ros::sl_bm_cmv4000Config> > (
153 new dynamic_reconfigure::Server<multisense_ros::sl_bm_cmv4000Config>(
device_nh_));
155 std::placeholders::_1, std::placeholders::_2));
158 case system::DeviceInfo::IMAGER_TYPE_AR0239_COLOR:
159 case system::DeviceInfo::IMAGER_TYPE_AR0234_GREY:
162 std::shared_ptr< dynamic_reconfigure::Server<multisense_ros::s27_sgm_AR0234Config> > (
163 new dynamic_reconfigure::Server<multisense_ros::s27_sgm_AR0234Config>(
device_nh_));
165 std::placeholders::_1, std::placeholders::_2));
177 case system::DeviceInfo::IMAGER_TYPE_CMV2000_GREY:
178 case system::DeviceInfo::IMAGER_TYPE_CMV2000_COLOR:
181 std::shared_ptr< dynamic_reconfigure::Server<multisense_ros::sl_bm_cmv2000_imuConfig> > (
182 new dynamic_reconfigure::Server<multisense_ros::sl_bm_cmv2000_imuConfig>(
device_nh_));
184 std::placeholders::_1, std::placeholders::_2));
187 case system::DeviceInfo::IMAGER_TYPE_CMV4000_GREY:
188 case system::DeviceInfo::IMAGER_TYPE_CMV4000_COLOR:
191 std::shared_ptr< dynamic_reconfigure::Server<multisense_ros::sl_bm_cmv4000_imuConfig> > (
192 new dynamic_reconfigure::Server<multisense_ros::sl_bm_cmv4000_imuConfig>(
device_nh_));
194 std::placeholders::_1, std::placeholders::_2));
197 case system::DeviceInfo::IMAGER_TYPE_AR0239_COLOR:
198 case system::DeviceInfo::IMAGER_TYPE_AR0234_GREY:
201 std::shared_ptr< dynamic_reconfigure::Server<multisense_ros::s27_sgm_AR0234Config> > (
202 new dynamic_reconfigure::Server<multisense_ros::s27_sgm_AR0234Config>(
device_nh_));
204 std::placeholders::_1, std::placeholders::_2));
216 case system::DeviceInfo::IMAGER_TYPE_CMV2000_GREY:
217 case system::DeviceInfo::IMAGER_TYPE_CMV2000_COLOR:
220 std::shared_ptr< dynamic_reconfigure::Server<multisense_ros::sl_sgm_cmv2000_imuConfig> > (
221 new dynamic_reconfigure::Server<multisense_ros::sl_sgm_cmv2000_imuConfig>(
device_nh_));
223 std::placeholders::_1, std::placeholders::_2));
226 case system::DeviceInfo::IMAGER_TYPE_CMV4000_GREY:
227 case system::DeviceInfo::IMAGER_TYPE_CMV4000_COLOR:
230 std::shared_ptr< dynamic_reconfigure::Server<multisense_ros::sl_sgm_cmv4000_imuConfig> > (
231 new dynamic_reconfigure::Server<multisense_ros::sl_sgm_cmv4000_imuConfig>(
device_nh_));
233 std::placeholders::_1, std::placeholders::_2));
235 case system::DeviceInfo::IMAGER_TYPE_AR0239_COLOR:
236 case system::DeviceInfo::IMAGER_TYPE_AR0234_GREY:
239 std::shared_ptr< dynamic_reconfigure::Server<multisense_ros::s27_sgm_AR0234Config> > (
240 new dynamic_reconfigure::Server<multisense_ros::s27_sgm_AR0234Config>(
device_nh_));
242 std::placeholders::_1, std::placeholders::_2));
267 if (width == static_cast<int32_t>(cfg.
width()) &&
268 height == static_cast<int32_t>(cfg.
height()) &&
269 disparities == static_cast<int32_t>(cfg.
disparities()))
278 if (Status_Ok != status) {
279 ROS_ERROR(
"Reconfigure: failed to query sensor modes: %s",
280 Channel::statusString(status));
288 bool supported =
false;
289 std::vector<system::DeviceMode>::const_iterator it =
device_modes_.begin();
294 if (width == static_cast<int32_t>(m.
width) &&
295 height ==
static_cast<int32_t
>(m.
height) &&
296 disparities == static_cast<int32_t>(m.
disparities)) {
303 if (
false == supported) {
304 ROS_ERROR(
"Reconfigure: sensor does not support a resolution of: %dx%d (%d disparities)",
305 width, height, disparities);
309 ROS_WARN(
"Reconfigure: changing sensor resolution to %dx%d (%d disparities), from %dx%d " 310 "(%d disparities): reconfiguration may take up to 30 seconds",
311 width, height, disparities,
322 cfg.
setCamMode(dyn.crop_mode == 1 ? 2000 : 4000);
324 ROS_WARN(
"Reconfigure: changing cam mode to %s with offset %d: reconfiguration may take up to 30 seconds",
325 dyn.crop_mode == 1 ?
"ON" :
"OFF" , cfg.
offset());
337 int32_t width, height, disparities;
338 bool resolutionChange=
false;
344 if (3 != sscanf(dyn.resolution.c_str(),
"%dx%dx%d", &width, &height, &disparities)) {
345 ROS_ERROR(
"Reconfigure: malformed resolution string: \"%s\"", dyn.resolution.c_str());
357 if (Status_Ok != status) {
358 ROS_ERROR(
"Reconfigure: failed to get enabled streams: %s",
359 Channel::statusString(status));
363 if (Status_Ok != status) {
364 ROS_ERROR(
"Reconfigure: failed to stop streams for a resolution change: %s",
365 Channel::statusString(status));
381 dyn.white_balance_blue);
385 cfg.
setHdr(dyn.hdr_enable);
391 if (Status_Ok != status)
392 ROS_ERROR(
"Reconfigure: failed to set image config: %s",
393 Channel::statusString(status));
396 if (Status_Ok != status)
397 ROS_ERROR(
"Reconfigure: failed to query image config: %s",
398 Channel::statusString(status));
406 if (resolutionChange) {
408 if (Status_Ok != status)
409 ROS_ERROR(
"Reconfigure: failed to restart streams after a resolution change: %s",
410 Channel::statusString(status));
430 d.
delay = dyn.desired_transmit_delay;
432 if (Status_Ok != status) {
433 ROS_ERROR(
"Reconfigure: failed to set transmit delay: %s",
434 Channel::statusString(status));
445 const float radiansPerSecondToRpm = 9.54929659643;
448 if (Status_Ok != status) {
449 if (Status_Unsupported == status)
452 ROS_ERROR(
"Reconfigure: failed to set motor speed: %s",
453 Channel::statusString(status));
468 if (
false == dyn.lighting) {
477 if (Status_Ok != status) {
478 if (Status_Unsupported == status)
481 ROS_ERROR(
"Reconfigure: failed to set lighting config: %s",
482 Channel::statusString(status));
493 if (Status_Ok != status) {
494 ROS_ERROR(
"Reconfigure: failed to query IMU config: %s",
495 Channel::statusString(status));
500 std::vector<imu::Config> changedConfigs;
501 std::vector<imu::Config>::iterator it =
imu_configs_.begin();
506 if (
"accelerometer" == c.
name &&
507 (c.
enabled != dyn.accelerometer_enabled ||
511 c.
enabled = dyn.accelerometer_enabled;
514 changedConfigs.push_back(c);
517 if (
"gyroscope" == c.
name &&
518 (c.
enabled != dyn.gyroscope_enabled ||
522 c.
enabled = dyn.gyroscope_enabled;
525 changedConfigs.push_back(c);
528 if (
"magnetometer" == c.
name &&
529 (c.
enabled != dyn.magnetometer_enabled ||
533 c.
enabled = dyn.magnetometer_enabled;
536 changedConfigs.push_back(c);
540 if (changedConfigs.size() > 0 ||
543 ROS_WARN(
"Reconfigure: IMU configuration changes will take effect after all IMU " 544 "topic subscriptions have been closed.");
551 if (Status_Ok != status) {
552 ROS_ERROR(
"Reconfigure: failed to set IMU configuration: %s",
553 Channel::statusString(status));
579 if (Status_Ok != status) {
580 if (Status_Unsupported == status || Status_Unknown == status) {
583 ROS_ERROR(
"Reconfigure: enable PTP time synchronization: %s",
584 Channel::statusString(status));
589 if (dyn.trigger_source != 3 || (
ptp_supported_ && dyn.trigger_source == 3)) {
591 if (Status_Ok != status) {
592 if (Status_Unsupported == status || Status_Unknown == status) {
595 ROS_ERROR(
"Reconfigure: failed to set trigger source: %s",
596 Channel::statusString(status));
607 #define GET_CONFIG() \ 609 Status status = driver_->getImageConfig(cfg); \ 610 if (Status_Ok != status) { \ 611 ROS_ERROR("Reconfigure: failed to query image config: %s", \ 612 Channel::statusString(status)); \ 616 #define SL_BM() do { \ 618 configureCamera(cfg, dyn); \ 619 configureMotor(dyn); \ 620 configureLeds(dyn); \ 621 configureBorderClip(dyn); \ 622 configurePointCloudRange(dyn); \ 625 #define SL_BM_IMU() do { \ 627 configureCamera(cfg, dyn); \ 628 configureMotor(dyn); \ 629 configureLeds(dyn); \ 631 configureBorderClip(dyn); \ 632 configurePointCloudRange(dyn); \ 635 #define SL_SGM_IMU() do { \ 637 configureSgm(cfg, dyn); \ 638 configureCamera(cfg, dyn); \ 639 configureMotor(dyn); \ 640 configureLeds(dyn); \ 642 configureBorderClip(dyn); \ 643 configurePointCloudRange(dyn); \ 646 #define SL_SGM() do { \ 648 configureSgm(cfg, dyn); \ 649 configureCamera(cfg, dyn); \ 650 configureBorderClip(dyn); \ 653 #define SL_SGM_IMU_CMV4000() do { \ 655 configureSgm(cfg, dyn); \ 656 configureCropMode(cfg, dyn); \ 657 configureCamera(cfg, dyn); \ 658 configureMotor(dyn); \ 659 configureLeds(dyn); \ 661 configureBorderClip(dyn); \ 662 configurePointCloudRange(dyn); \ 665 #define S27_SGM() do { \ 667 configureSgm(cfg, dyn); \ 668 configureStereoProfile(cfg, dyn); \ 669 configureCamera(cfg, dyn); \ 670 configureBorderClip(dyn); \ 699 int32_t width, height;
700 bool resolutionChange=
false;
705 if (2 != sscanf(dyn.resolution.c_str(),
"%dx%dx", &width, &height)) {
706 ROS_ERROR(
"Reconfigure: malformed resolution string: \"%s\"", dyn.resolution.c_str());
719 if (Status_Ok != status) {
720 ROS_ERROR(
"Reconfigure: failed to get enabled streams: %s",
721 Channel::statusString(status));
725 if (Status_Ok != status) {
726 ROS_ERROR(
"Reconfigure: failed to stop streams for a resolution change: %s",
727 Channel::statusString(status));
735 cfg.setFps(static_cast<float>(dyn.fps));
736 cfg.setGain(dyn.gain);
737 cfg.setExposure(dyn.exposure_time * 1e6);
738 cfg.setAutoExposure(dyn.auto_exposure);
739 cfg.setAutoExposureMax(dyn.auto_exposure_max_time * 1e6);
740 cfg.setAutoExposureDecay(dyn.auto_exposure_decay);
741 cfg.setAutoExposureThresh(dyn.auto_exposure_thresh);
742 cfg.setWhiteBalance(dyn.white_balance_red,
743 dyn.white_balance_blue);
744 cfg.setAutoWhiteBalance(dyn.auto_white_balance);
745 cfg.setAutoWhiteBalanceDecay(dyn.auto_white_balance_decay);
746 cfg.setAutoWhiteBalanceThresh(dyn.auto_white_balance_thresh);
752 if (Status_Ok != status)
753 ROS_ERROR(
"Reconfigure: failed to set image config: %s",
754 Channel::statusString(status));
757 if (Status_Ok != status)
758 ROS_ERROR(
"Reconfigure: failed to query image config: %s",
759 Channel::statusString(status));
766 if (resolutionChange) {
769 if (Status_Ok != status)
770 ROS_ERROR(
"Reconfigure: failed to restart streams after a resolution change: %s",
771 Channel::statusString(status));
785 int32_t width, height, disparities;
786 bool resolutionChange=
false;
793 if (3 != sscanf(dyn.resolution.c_str(),
"%dx%dx%d", &width, &height, &disparities)) {
794 ROS_ERROR(
"Reconfigure: malformed resolution string: \"%s\"", dyn.resolution.c_str());
801 if ((resolutionChange =
changeResolution(cfg, width, height, disparities))) {
807 if (Status_Ok != status) {
808 ROS_ERROR(
"Reconfigure: failed to get enabled streams: %s",
809 Channel::statusString(status));
813 if (Status_Ok != status) {
814 ROS_ERROR(
"Reconfigure: failed to stop streams for a resolution change: %s",
815 Channel::statusString(status));
829 if (Status_Ok != status)
830 ROS_ERROR(
"Reconfigure: failed to set image config: %s",
831 Channel::statusString(status));
834 if (Status_Ok != status)
835 ROS_ERROR(
"Reconfigure: failed to query image config: %s",
836 Channel::statusString(status));
844 if (resolutionChange) {
847 if (Status_Ok != status)
848 ROS_ERROR(
"Reconfigure: failed to restart streams after a resolution change: %s",
849 Channel::statusString(status));
virtual Status startStreams(DataSource mask)=0
void setStereoPostFilterStrength(float s)
virtual Status getEnabledStreams(DataSource &mask)=0
virtual Status setMotorSpeed(float rpm)=0
void setAutoWhiteBalanceThresh(float t)
void setAutoWhiteBalanceDecay(uint32_t d)
virtual Status stopStreams(DataSource mask)=0
void setResolution(uint32_t w, uint32_t h)
uint32_t disparities() const
virtual Status networkTimeSynchronization(bool enabled)=0
bool setDutyCycle(float percent)
virtual Status ptpTimeSynchronization(bool enabled)=0
virtual Status getVersionInfo(system::VersionInfo &v)=0
virtual Status getImuConfig(uint32_t &samplesPerMessage, std::vector< imu::Config > &c)=0
virtual Status setImuConfig(bool storeSettingsInFlash, uint32_t samplesPerMessage, const std::vector< imu::Config > &c)=0
void setExposure(uint32_t e)
virtual Status setTriggerSource(TriggerSource s)=0
void setFlash(bool onOff)
uint32_t hardwareRevision
virtual Status getDeviceModes(std::vector< system::DeviceMode > &m)=0
void setAutoExposure(bool e)
void setDisparities(uint32_t d)
virtual Status setLightingConfig(const lighting::Config &c)=0
virtual Status setImageConfig(const image::Config &c)=0
void setAutoExposureMax(uint32_t m)
void setWhiteBalance(float r, float b)
VersionType sensorFirmwareVersion
virtual Status setTransmitDelay(const image::TransmitDelay &c)=0
virtual Status getDeviceInfo(system::DeviceInfo &info)=0
void setAutoExposureDecay(uint32_t d)
void setAutoWhiteBalance(bool e)
void setAutoExposureThresh(float t)
virtual Status getImageConfig(image::Config &c)=0
void setCameraProfile(const CameraProfile &profile)