37#include <gtest/gtest.h>
39#include <details/legacy/configuration.hh>
41using namespace multisense::legacy;
46 using namespace std::chrono_literals;
79 MultiSenseConfig::MaxDisparities::D256,
84 std::make_optional(time),
85 std::make_optional(network),
107 std::vector<ImuRate> accel_rates{{1.0f, 2.0f}, {3.0f, 4.4f}, {5.5f, 6.7f}};
108 std::vector<ImuRange> accel_ranges{{1.1f, 3.0f}, {3.1f, 4.5f}, {5.6f, 6.8f}};
110 std::vector<ImuRate> gyro_rates{{1.1f, 2.1f}, {3.1f, 5.4f}, {5.6f, 7.7f}};
111 std::vector<ImuRange> gyro_ranges{{2.1f, 3.1f}, {4.1f, 5.5f}, {6.6f, 7.8f}};
113 std::vector<ImuRate> mag_rates{{2.1f, 3.1f}, {4.1f, 6.4f}, {6.6f, 8.7f}};
114 std::vector<ImuRange> mag_ranges{{3.1f, 4.1f}, {5.1f, 5.6f}, {6.7f, 8.8f}};
209 config.
configs[0].name =
"accelerometer";
211 config.
configs[0].rateTableIndex = 1;
212 config.
configs[0].rangeTableIndex = 0;
214 config.
configs[1].name =
"gyroscope";
216 config.
configs[1].rateTableIndex = 0;
217 config.
configs[1].rangeTableIndex = 1;
219 config.
configs[2].name =
"magnetometer";
221 config.
configs[2].rateTableIndex = 1;
222 config.
configs[2].rangeTableIndex = 1;
258 case MultiSenseConfig::MaxDisparities::D64: {ASSERT_EQ(64, res.
disparities);
break;}
259 case MultiSenseConfig::MaxDisparities::D128: {ASSERT_EQ(128, res.
disparities);
break;}
260 case MultiSenseConfig::MaxDisparities::D256: {ASSERT_EQ(256, res.
disparities);
break;}
264template <
typename ConfigT,
typename ControlT>
266 const ControlT &control)
268 ASSERT_TRUE(
static_cast<bool>(config.manual_exposure));
269 ASSERT_FLOAT_EQ(config.manual_exposure->gain, control.gain);
270 ASSERT_EQ(config.manual_exposure->exposure_time.count(), control.exposure);
272 ASSERT_TRUE(
static_cast<bool>(config.auto_exposure));
273 ASSERT_EQ(config.auto_exposure_enabled, control.autoExposure);
274 ASSERT_EQ(config.auto_exposure->max_exposure_time.count(), control.autoExposureMax);
275 ASSERT_EQ(config.auto_exposure->decay, control.autoExposureDecay);
276 ASSERT_FLOAT_EQ(config.auto_exposure->target_threshold, control.autoExposureThresh);
277 ASSERT_FLOAT_EQ(config.auto_exposure->target_intensity, control.autoExposureTargetIntensity);
278 ASSERT_FLOAT_EQ(config.auto_exposure->max_gain, control.gainMax);
280 ASSERT_EQ(config.auto_exposure->roi.top_left_x_position, control.autoExposureRoiX);
281 ASSERT_EQ(config.auto_exposure->roi.top_left_y_position, control.autoExposureRoiY);
282 ASSERT_EQ(config.auto_exposure->roi.width, control.autoExposureRoiWidth);
283 ASSERT_EQ(config.auto_exposure->roi.height, control.autoExposureRoiHeight);
285 if (config.manual_white_balance)
287 ASSERT_FLOAT_EQ(config.manual_white_balance->red, control.whiteBalanceRed);
288 ASSERT_FLOAT_EQ(config.manual_white_balance->blue, control.whiteBalanceBlue);
291 if (config.auto_white_balance)
293 ASSERT_EQ(config.auto_white_balance_enabled, control.autoWhiteBalance);
294 ASSERT_EQ(config.auto_white_balance->decay, control.autoWhiteBalanceDecay);
295 ASSERT_EQ(config.auto_white_balance->threshold, control.autoWhiteBalanceThresh);
298 ASSERT_EQ(config.gamma, control.gamma);
318 ASSERT_TRUE(
static_cast<bool>(config.
aux_config));
339 case MultiSenseConfig::MaxDisparities::D64: {ASSERT_EQ(64, wire_config.
disparities);
break;}
340 case MultiSenseConfig::MaxDisparities::D128: {ASSERT_EQ(128, wire_config.
disparities);
break;}
341 case MultiSenseConfig::MaxDisparities::D256: {ASSERT_EQ(256, wire_config.
disparities);
break;}
382 ASSERT_EQ(
static_cast<bool>(imu_info.
gyroscope),
static_cast<bool>(config.
gyroscope));
385 ASSERT_GT(wire_config.
configs.size(), 2);
387 for (
size_t i = 0 ; i < wire_config.
configs.size() ; ++i)
389 const auto &wire = wire_config.
configs[i];
393 const auto rate = imu_info.
accelerometer->rates[wire.rateTableIndex];
394 const auto range = imu_info.
accelerometer->ranges[wire.rangeTableIndex];
396 ASSERT_EQ(config.
accelerometer->enabled,
static_cast<bool>(wire.flags & wire::imu::Config::FLAGS_ENABLED));
403 const auto rate = imu_info.
gyroscope->rates[wire.rateTableIndex];
404 const auto range = imu_info.
gyroscope->ranges[wire.rangeTableIndex];
406 ASSERT_EQ(config.
gyroscope->enabled,
static_cast<bool>(wire.flags & wire::imu::Config::FLAGS_ENABLED));
413 const auto rate = imu_info.
magnetometer->rates[wire.rateTableIndex];
414 const auto range = imu_info.
magnetometer->ranges[wire.rangeTableIndex];
416 ASSERT_EQ(config.
magnetometer->enabled,
static_cast<bool>(wire.flags & wire::imu::Config::FLAGS_ENABLED));
435 ASSERT_FLOAT_EQ(config.
internal->intensity, wire.
intensity[0] / 255.0f * 100.0f);
444 ASSERT_FLOAT_EQ(config.
external->intensity, wire.
intensity[0] / 255.0f * 100.0f);
451 case MultiSenseConfig::LightingConfig::ExternalConfig::FlashMode::NONE:
453 ASSERT_EQ(wire.
flash, 0);
457 case MultiSenseConfig::LightingConfig::ExternalConfig::FlashMode::SYNC_WITH_MAIN_STEREO:
459 ASSERT_EQ(wire.
flash, 1);
463 case MultiSenseConfig::LightingConfig::ExternalConfig::FlashMode::SYNC_WITH_AUX:
465 ASSERT_EQ(wire.
flash, 1);
481 for (
size_t i = 0 ; i < wire::MAX_LIGHTS ; ++i)
483 ASSERT_FLOAT_EQ(config.
internal->intensity, wire.
intensity[i] / 255.0f * 100.0f);
484 ASSERT_EQ(wire.
mask & 1<<i, 1<<i);
495 for (
size_t i = 0 ; i < wire::MAX_LIGHTS ; ++i)
497 ASSERT_FLOAT_EQ(config.
external->intensity, wire.
intensity[i] / 255.0f * 100.0f);
498 ASSERT_EQ(wire.
mask & 1<<i, 1<<i);
507 case MultiSenseConfig::LightingConfig::ExternalConfig::FlashMode::NONE:
509 ASSERT_EQ(wire.
flash, 0);
513 case MultiSenseConfig::LightingConfig::ExternalConfig::FlashMode::SYNC_WITH_MAIN_STEREO:
515 ASSERT_EQ(wire.
flash, 1);
519 case MultiSenseConfig::LightingConfig::ExternalConfig::FlashMode::SYNC_WITH_AUX:
521 ASSERT_EQ(wire.
flash, 1);
541 ASSERT_TRUE(config == config);
551 ASSERT_FALSE(config0 == config1);
554TEST(convert, cam_resolution_full_res)
561 const auto wire_resolution = convert<wire::CamSetResolution>(config);
573 const auto cam_control = convert<wire::CamControl>(config);
585 ASSERT_TRUE(
static_cast<bool>(config.aux_config));
587 const auto cam_control = convert(config.aux_config.value());
599 const auto config = convert(wire_config,
608 ASSERT_TRUE(
static_cast<bool>(config.aux_config));
611 check_equal(config.aux_config.value(), wire_aux_config);
614TEST(convert, cam_config_invalid_aux)
619 const auto config = convert(wire_config,
628 ASSERT_FALSE(
static_cast<bool>(config.aux_config));
633TEST(convert, cam_config_invalid_imu)
638 const auto config = convert(wire_config,
647 ASSERT_FALSE(
static_cast<bool>(config.imu_config));
651 ASSERT_TRUE(
static_cast<bool>(config.network_config));
652 check_equal(config.network_config.value(), packet_config);
655TEST(convert, cam_config_invalid_led)
660 const auto config = convert(wire_config,
669 ASSERT_FALSE(
static_cast<bool>(config.lighting_config));
673 ASSERT_TRUE(
static_cast<bool>(config.network_config));
674 check_equal(config.network_config.value(), packet_config);
677TEST(convert, cam_config_valid_led_but_no_lights)
682 lighting_config.available = 0;
686 const auto config = convert(wire_config,
689 std::make_optional(lighting_config),
695 ASSERT_FALSE(
static_cast<bool>(config.lighting_config));
699 ASSERT_TRUE(
static_cast<bool>(config.network_config));
700 check_equal(config.network_config.value(), packet_config);
703TEST(convert, imu_config_round_trip)
708 const auto round_trip = convert(convert(convert(wire_config, info), info, 10000), info);
713TEST(convert, imu_config_limit_messages)
721 const auto round_trip = convert(convert(wire_config, info), info, wire_config.samplesPerMessage - 1);
723 ASSERT_EQ(round_trip.samplesPerMessage, wire_config.samplesPerMessage - 1);
726TEST(convert, lighting_config_round_trip)
743 const auto config = convert(wire_config,
752 ASSERT_TRUE(
static_cast<bool>(config.network_config));
754 convert<wire::SysPacketDelay>(config.network_config.value()));
uint16_t autoExposureRoiY
uint16_t autoExposureRoiWidth
uint16_t autoExposureRoiHeight
float autoWhiteBalanceThresh
uint16_t autoExposureRoiX
uint32_t autoExposureDecay
float autoExposureTargetIntensity
uint32_t autoWhiteBalanceDecay
float sharpeningPercentage
float sharpeningPercentage
uint32_t autoExposureDecay
uint32_t autoWhiteBalanceDecay
float autoExposureTargetIntensity
uint16_t autoExposureRoiHeight
uint16_t autoExposureRoiX
float autoWhiteBalanceThresh
uint16_t autoExposureRoiWidth
uint16_t autoExposureRoiY
float stereoPostFilterStrength
float stereoPostFilterStrength
uint8_t storeSettingsInFlash
uint32_t samplesPerMessage
std::vector< imu::Config > configs
uint8_t rolling_shutter_led
uint32_t number_of_pulses
uint8_t intensity[MAX_LIGHTS]
uint32_t number_of_pulses
uint8_t intensity[MAX_LIGHTS]
uint8_t rolling_shutter_led
crl::multisense::details::wire::ImuConfig create_valid_imu_wire_config()
multisense::MultiSenseConfig create_valid_config(uint32_t width, uint32_t height)
void check_equal(const multisense::MultiSenseConfig &config, const crl::multisense::details::wire::CamSetResolution &res)
multisense::MultiSenseInfo::DeviceInfo create_device_info(uint32_t imager_width, uint32_t imager_height)
crl::multisense::details::wire::LedStatus create_valid_lighting_wire_config()
crl::multisense::details::wire::CamConfig create_valid_wire_config()
crl::multisense::details::wire::AuxCamConfig create_valid_wire_aux_config()
multisense::MultiSenseInfo::ImuInfo create_imu_info()
crl::multisense::details::wire::SysPacketDelay create_wire_packet_delay()
The range for each sensor along with the corresponding sampling resolution.
float resolution
The min resolution the sensor can return.
float range
The max value the sensor can return.
A sample rate, and what impact it has on bandwidth.
float sample_rate
The sample rate for the sensor in Hz.
float bandwith_cutoff
The bandwith cutoff for a given IMU mode in Hz.
Auto-exposure specific configuration.
Auto white balance specific configuration.
Image specific configuration for the Aux imager.
bool sharpening_enabled
Enable sharpening.
uint8_t sharpening_limit
The maximum difference in pixels that sharpening is is allowed to change between neighboring pixels.
ImageConfig image_config
Image configuration for the Aux imager.
float sharpening_percentage
The percentage strength of the sharpening gain to apply to the aux image Valid range is [0,...
Image specific configuration.
Config for the IMU sensor.
std::optional< OperatingMode > accelerometer
Configuration for the onboard accelerometer.
std::optional< OperatingMode > gyroscope
Configuration for the onboard gyroscope.
std::optional< OperatingMode > magnetometer
Configuration for the onboard magnetometer.
uint32_t samples_per_frame
The number of IMU samples which should be included in a IMU frame.
Lighting configuration for the camera.
std::optional< InternalConfig > internal
The internal lighting config.
std::optional< ExternalConfig > external
The external lighting config.
Manual exposure specific configuration.
Manual white balance specific configuration.
Config for transmitting packets from the MultiSense to the host.
bool packet_delay_enabled
Add a small delay between the transmission of each packet to hopefully interact better with slower cl...
Stereo specific configuration.
float postfilter_strength
This is used to filter low confidence stereo data before it is sent to the host.
Config for time-based controls.
Complete configuration object for configuring the MultiSense.
uint32_t height
The operating height of the MultiSense in pixels.
MaxDisparities disparities
The max number of pixels the MultiSense searches when computing the disparity output.
ImageConfig image_config
The image configuration to use for the main stereo pair.
float frames_per_second
The target framerate the MultiSense should operate at.
StereoConfig stereo_config
The stereo configuration to use.
std::optional< AuxConfig > aux_config
The image configuration to use for the aux camera if present.
uint32_t width
The operating width of the MultiSense in pixels.
The Device information associated with the MultiSense.
LightingType lighting_type
The type of lighting used in the MultiSense.
uint32_t imager_width
The native width of the primary imager.
HardwareRevision hardware_revision
The hardware revision of the MultiSense.
uint32_t imager_height
The native height of the primary imager.
@ EXTERNAL
Drive lights via an external output.
Info about the available IMU configurations.
Information about the IMU onboard the MultiSense.
std::optional< Source > magnetometer
Configuration specific to the magnetometer.
std::optional< Source > accelerometer
Configuration specific to the accelerometer.
std::optional< Source > gyroscope
Configuration specific to the gyroscope.