LibMultiSense
LibMultiSense Documentation
Loading...
Searching...
No Matches
configuration_test.cc
Go to the documentation of this file.
1
37#include <gtest/gtest.h>
38
39#include <details/legacy/configuration.hh>
40
41using namespace multisense::legacy;
42
43multisense::MultiSenseConfig create_valid_config(uint32_t width, uint32_t height)
44{
45 using namespace multisense;
46 using namespace std::chrono_literals;
47
48 MultiSenseConfig::StereoConfig stereo_config{0.8};
49
50 MultiSenseConfig::ManualExposureConfig manual_exposure{2.0, 500us};
51
52 MultiSenseConfig::AutoExposureConfig auto_exposure{600us,
53 6,
54 0.6,
55 0.95,
56 3.0,
57 {10, 20, 400, 300}};
58
59 MultiSenseConfig::ManualWhiteBalanceConfig manual_white_balance{2.2, 3.3};
60
61 MultiSenseConfig::AutoWhiteBalanceConfig auto_white_balance{4, 0.7};
62
63 MultiSenseConfig::ImageConfig image_config{1.2,
64 false,
65 manual_exposure,
66 auto_exposure,
67 true,
68 manual_white_balance,
69 auto_white_balance};
70
71 MultiSenseConfig::AuxConfig aux_config{image_config, true, 10.0, 80};
72
74
76
77 return MultiSenseConfig{width,
78 height,
79 MultiSenseConfig::MaxDisparities::D256,
80 11.0,
81 stereo_config,
82 image_config,
83 aux_config,
84 std::make_optional(time),
85 std::make_optional(network),
86 std::nullopt,
87 std::nullopt};
88}
89
102
104{
105 using namespace multisense;
106
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}};
109
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}};
112
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}};
115
116 return MultiSenseInfo::ImuInfo{MultiSenseInfo::ImuInfo::Source{"accelerometer", "bmi160", accel_rates, accel_ranges},
117 MultiSenseInfo::ImuInfo::Source{"gyroscope", "bmi160", gyro_rates, gyro_ranges},
118 MultiSenseInfo::ImuInfo::Source{"magnetometer", "bmi160", mag_rates, mag_ranges}};
119}
120
121
123{
124 using namespace crl::multisense::details;
125
126 wire::CamConfig config;
127 config.width = 1920;
128 config.height = 1200;
129 config.disparities = 256;
130 config.stereoPostFilterStrength = 0.8;
131 config.gain = 2.0;
132 config.exposure = 500;
133
134 config.autoExposure = 0;
135 config.autoExposureMax = 600;
136 config.autoExposureDecay = 6;
137 config.autoExposureTargetIntensity = 0.6;
138 config.autoExposureThresh = 0.95;
139 config.gainMax = 3.0;
140 config.autoExposureRoiX = 10;
141 config.autoExposureRoiY = 20;
142 config.autoExposureRoiWidth = 400;
143 config.autoExposureRoiHeight = 300;
144
145 config.autoWhiteBalance = 1;
146 config.whiteBalanceRed = 2.2;
147 config.whiteBalanceBlue = 3.3;
148 config.autoWhiteBalanceDecay = 4;
149 config.autoWhiteBalanceThresh = 0.7;
150
151 config.gamma = 1.2;
152
153 return config;
154}
155
157{
158 using namespace crl::multisense::details;
159
160 wire::AuxCamConfig config;
161 config.gain = 2.0;
162 config.exposure = 500;
163
164 config.autoExposure = 0;
165 config.autoExposureMax = 600;
166 config.autoExposureDecay = 6;
167 config.autoExposureTargetIntensity = 0.6;
168 config.autoExposureThresh = 0.95;
169 config.gainMax = 3.0;
170 config.autoExposureRoiX = 10;
171 config.autoExposureRoiY = 20;
172 config.autoExposureRoiWidth = 400;
173 config.autoExposureRoiHeight = 300;
174
175 config.autoWhiteBalance = 1;
176 config.whiteBalanceRed = 2.2;
177 config.whiteBalanceBlue = 3.3;
178 config.autoWhiteBalanceDecay = 4;
179 config.autoWhiteBalanceThresh = 0.7;
180
181 config.sharpeningEnable = true;
182 config.sharpeningPercentage = 10.0;
183 config.sharpeningLimit = 80;
184
185 return config;
186}
187
189{
190 using namespace crl::multisense::details;
191
193 delay.enable = true;
194
195 return delay;
196}
197
199{
200 using namespace crl::multisense::details;
201
202 wire::ImuConfig config;
203
204 config.storeSettingsInFlash = false;
205 config.samplesPerMessage = 300;
206
207 config.configs.resize(3);
208
209 config.configs[0].name = "accelerometer";
210 config.configs[0].flags = 0;
211 config.configs[0].rateTableIndex = 1;
212 config.configs[0].rangeTableIndex = 0;
213
214 config.configs[1].name = "gyroscope";
215 config.configs[1].flags = 1;
216 config.configs[1].rateTableIndex = 0;
217 config.configs[1].rangeTableIndex = 1;
218
219 config.configs[2].name = "magnetometer";
220 config.configs[2].flags = 1;
221 config.configs[2].rateTableIndex = 1;
222 config.configs[2].rangeTableIndex = 1;
223
224 return config;
225}
226
228{
229 using namespace crl::multisense::details;
230
231 wire::LedStatus config;
232
233 config.available = 1 | 1<<1 | 1<<2;
234
235 config.intensity[0] = 255;
236 config.intensity[1] = 128;
237 config.intensity[2] = 1;
238
239 config.flash = 1;
240 config.led_delay_us = 0;
241 config.number_of_pulses = 1;
242 config.invert_pulse = 0;
243 config.rolling_shutter_led = 1;
244
245 return config;
246}
247
250{
251 using namespace multisense;
252
253 ASSERT_EQ(config.width, res.width);
254 ASSERT_EQ(config.height, res.height);
255
256 switch(config.disparities)
257 {
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;}
261 }
262}
263
264template <typename ConfigT, typename ControlT>
265void check_equal(const ConfigT &config,
266 const ControlT &control)
267{
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);
271
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);
279
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);
284
285 if (config.manual_white_balance)
286 {
287 ASSERT_FLOAT_EQ(config.manual_white_balance->red, control.whiteBalanceRed);
288 ASSERT_FLOAT_EQ(config.manual_white_balance->blue, control.whiteBalanceBlue);
289 }
290
291 if (config.auto_white_balance)
292 {
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);
296 }
297
298 ASSERT_EQ(config.gamma, control.gamma);
299}
300
303{
304 using namespace multisense;
305
306 ASSERT_FLOAT_EQ(config.frames_per_second, control.framesPerSecond);
307
308 check_equal(config.image_config, control);
309
310 ASSERT_FLOAT_EQ(config.stereo_config.postfilter_strength, control.stereoPostFilterStrength);
311}
312
315{
316 using namespace multisense;
317
318 ASSERT_TRUE(static_cast<bool>(config.aux_config));
319
320 check_equal(config.aux_config->image_config, control);
321
322 ASSERT_EQ(config.aux_config->sharpening_enabled, control.sharpeningEnable);
323 ASSERT_FLOAT_EQ(config.aux_config->sharpening_percentage, control.sharpeningPercentage);
324 ASSERT_FLOAT_EQ(config.aux_config->sharpening_limit, control.sharpeningLimit);
325}
326
329{
330 using namespace multisense;
331
332 ASSERT_FLOAT_EQ(config.stereo_config.postfilter_strength, wire_config.stereoPostFilterStrength);
333
334 ASSERT_EQ(config.width, wire_config.width);
335 ASSERT_EQ(config.height, wire_config.height);
336
337 switch(config.disparities)
338 {
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;}
342 }
343
344 ASSERT_EQ(config.frames_per_second, wire_config.framesPerSecond);
345
346 check_equal(config.image_config, wire_config);
347}
348
351{
352 check_equal(config.image_config, wire_config);
353
354 ASSERT_EQ(config.sharpening_enabled, wire_config.sharpeningEnable);
355 ASSERT_FLOAT_EQ(config.sharpening_percentage, wire_config.sharpeningPercentage);
356 ASSERT_FLOAT_EQ(config.sharpening_limit, wire_config.sharpeningLimit);
357}
358
360 const multisense::ImuRate &rate1)
361{
362 ASSERT_FLOAT_EQ(rate0.sample_rate, rate1.sample_rate);
363 ASSERT_FLOAT_EQ(rate0.bandwith_cutoff, rate1.bandwith_cutoff);
364}
365
367 const multisense::ImuRange &range1)
368{
369 ASSERT_FLOAT_EQ(range0.range, range1.range);
370 ASSERT_FLOAT_EQ(range0.resolution, range1.resolution);
371}
372
376{
377 using namespace crl::multisense::details;
378
379 ASSERT_EQ(config.samples_per_frame, wire_config.samplesPerMessage);
380
381 ASSERT_EQ(static_cast<bool>(imu_info.accelerometer), static_cast<bool>(config.accelerometer));
382 ASSERT_EQ(static_cast<bool>(imu_info.gyroscope), static_cast<bool>(config.gyroscope));
383 ASSERT_EQ(static_cast<bool>(imu_info.magnetometer), static_cast<bool>(config.magnetometer));
384
385 ASSERT_GT(wire_config.configs.size(), 2);
386
387 for (size_t i = 0 ; i < wire_config.configs.size() ; ++i)
388 {
389 const auto &wire = wire_config.configs[i];
390
391 if (imu_info.accelerometer && wire.name == imu_info.accelerometer->name)
392 {
393 const auto rate = imu_info.accelerometer->rates[wire.rateTableIndex];
394 const auto range = imu_info.accelerometer->ranges[wire.rangeTableIndex];
395
396 ASSERT_EQ(config.accelerometer->enabled, static_cast<bool>(wire.flags & wire::imu::Config::FLAGS_ENABLED));
397
398 check_equal(config.accelerometer->rate, rate);
399 check_equal(config.accelerometer->range, range);
400 }
401 else if (imu_info.gyroscope && wire.name == imu_info.gyroscope->name)
402 {
403 const auto rate = imu_info.gyroscope->rates[wire.rateTableIndex];
404 const auto range = imu_info.gyroscope->ranges[wire.rangeTableIndex];
405
406 ASSERT_EQ(config.gyroscope->enabled, static_cast<bool>(wire.flags & wire::imu::Config::FLAGS_ENABLED));
407
408 check_equal(config.gyroscope->rate, rate);
409 check_equal(config.gyroscope->range, range);
410 }
411 else if (imu_info.magnetometer && wire.name == imu_info.magnetometer->name)
412 {
413 const auto rate = imu_info.magnetometer->rates[wire.rateTableIndex];
414 const auto range = imu_info.magnetometer->ranges[wire.rangeTableIndex];
415
416 ASSERT_EQ(config.magnetometer->enabled, static_cast<bool>(wire.flags & wire::imu::Config::FLAGS_ENABLED));
417
418 check_equal(config.magnetometer->rate, rate);
419 check_equal(config.magnetometer->range, range);
420 }
421 else
422 {
423 ASSERT_TRUE(false);
424 }
425 }
426}
427
430{
431 using namespace multisense;
432
433 if (config.internal)
434 {
435 ASSERT_FLOAT_EQ(config.internal->intensity, wire.intensity[0] / 255.0f * 100.0f);
436 ASSERT_EQ(wire.led_delay_us, 0);
437 ASSERT_EQ(wire.number_of_pulses, 1);
438 ASSERT_EQ(wire.invert_pulse, 0);
439 ASSERT_EQ(config.internal->flash, wire.flash != 0);
440 }
441
442 if (config.external)
443 {
444 ASSERT_FLOAT_EQ(config.external->intensity, wire.intensity[0] / 255.0f * 100.0f);
445 ASSERT_EQ(wire.led_delay_us, config.external->startup_time.count());
446 ASSERT_EQ(wire.number_of_pulses, config.external->pulses_per_exposure);
447 ASSERT_EQ(wire.invert_pulse, 0);
448
449 switch (config.external->flash)
450 {
451 case MultiSenseConfig::LightingConfig::ExternalConfig::FlashMode::NONE:
452 {
453 ASSERT_EQ(wire.flash, 0);
454 ASSERT_EQ(wire.rolling_shutter_led, 0);
455 break;
456 }
457 case MultiSenseConfig::LightingConfig::ExternalConfig::FlashMode::SYNC_WITH_MAIN_STEREO:
458 {
459 ASSERT_EQ(wire.flash, 1);
460 ASSERT_EQ(wire.rolling_shutter_led, 0);
461 break;
462 }
463 case MultiSenseConfig::LightingConfig::ExternalConfig::FlashMode::SYNC_WITH_AUX:
464 {
465 ASSERT_EQ(wire.flash, 1);
466 ASSERT_EQ(wire.rolling_shutter_led, 1);
467 break;
468 }
469 }
470 }
471}
472
475{
476 using namespace crl::multisense::details;
477 using namespace multisense;
478
479 if (config.internal)
480 {
481 for (size_t i = 0 ; i < wire::MAX_LIGHTS ; ++i)
482 {
483 ASSERT_FLOAT_EQ(config.internal->intensity, wire.intensity[i] / 255.0f * 100.0f);
484 ASSERT_EQ(wire.mask & 1<<i, 1<<i);
485 }
486
487 ASSERT_EQ(wire.led_delay_us, 0);
488 ASSERT_EQ(wire.number_of_pulses, 1);
489 ASSERT_EQ(wire.invert_pulse, 0);
490 ASSERT_EQ(config.internal->flash, wire.flash != 0);
491 }
492
493 if (config.external)
494 {
495 for (size_t i = 0 ; i < wire::MAX_LIGHTS ; ++i)
496 {
497 ASSERT_FLOAT_EQ(config.external->intensity, wire.intensity[i] / 255.0f * 100.0f);
498 ASSERT_EQ(wire.mask & 1<<i, 1<<i);
499 }
500
501 ASSERT_EQ(wire.led_delay_us, config.external->startup_time.count());
502 ASSERT_EQ(wire.number_of_pulses, config.external->pulses_per_exposure);
503 ASSERT_EQ(wire.invert_pulse, 0);
504
505 switch (config.external->flash)
506 {
507 case MultiSenseConfig::LightingConfig::ExternalConfig::FlashMode::NONE:
508 {
509 ASSERT_EQ(wire.flash, 0);
510 ASSERT_EQ(wire.rolling_shutter_led, 0);
511 break;
512 }
513 case MultiSenseConfig::LightingConfig::ExternalConfig::FlashMode::SYNC_WITH_MAIN_STEREO:
514 {
515 ASSERT_EQ(wire.flash, 1);
516 ASSERT_EQ(wire.rolling_shutter_led, 0);
517 break;
518 }
519 case MultiSenseConfig::LightingConfig::ExternalConfig::FlashMode::SYNC_WITH_AUX:
520 {
521 ASSERT_EQ(wire.flash, 1);
522 ASSERT_EQ(wire.rolling_shutter_led, 1);
523 break;
524 }
525 }
526 }
527}
528
531{
532 ASSERT_EQ(config.packet_delay_enabled, packet_delay.enable);
533}
534
535TEST(equality, equal)
536{
537 using namespace multisense;
538
539 const auto config = create_valid_config(1920, 1200);
540
541 ASSERT_TRUE(config == config);
542}
543
544TEST(equality, not_equal)
545{
546 using namespace multisense;
547
548 const auto config0 = create_valid_config(1920, 1200);
549 const auto config1 = create_valid_config(1920, 1201);
550
551 ASSERT_FALSE(config0 == config1);
552}
553
554TEST(convert, cam_resolution_full_res)
555{
556 using namespace crl::multisense::details;
557 using namespace multisense;
558
559 const auto config = create_valid_config(1920, 1200);
560
561 const auto wire_resolution = convert<wire::CamSetResolution>(config);
562
563 check_equal(config, wire_resolution);
564}
565
566TEST(convert, cam_control)
567{
568 using namespace crl::multisense::details;
569 using namespace multisense;
570
571 const auto config = create_valid_config(1920, 1200);
572
573 const auto cam_control = convert<wire::CamControl>(config);
574
575 check_equal(config, cam_control);
576}
577
578TEST(convert, aux_cam_control)
579{
580 using namespace crl::multisense::details;
581 using namespace multisense;
582
583 const auto config = create_valid_config(1920, 1200);
584
585 ASSERT_TRUE(static_cast<bool>(config.aux_config));
586
587 const auto cam_control = convert(config.aux_config.value());
588
589 check_equal(config, cam_control);
590}
591
592
593TEST(convert, cam_config)
594{
595 const auto wire_config = create_valid_wire_config();
596 const auto wire_aux_config = create_valid_wire_aux_config();
597 const auto packet_config = create_wire_packet_delay();
598
599 const auto config = convert(wire_config,
600 wire_aux_config,
601 std::nullopt,
602 std::nullopt,
603 packet_config,
604 false,
605 create_device_info(1920, 1200),
607
608 ASSERT_TRUE(static_cast<bool>(config.aux_config));
609
610 check_equal(config, wire_config);
611 check_equal(config.aux_config.value(), wire_aux_config);
612}
613
614TEST(convert, cam_config_invalid_aux)
615{
616 const auto wire_config = create_valid_wire_config();
617 const auto packet_config = create_wire_packet_delay();
618
619 const auto config = convert(wire_config,
620 std::nullopt,
621 std::nullopt,
622 std::nullopt,
623 packet_config,
624 false,
625 create_device_info(1920, 1200),
627
628 ASSERT_FALSE(static_cast<bool>(config.aux_config));
629
630 check_equal(config, wire_config);
631}
632
633TEST(convert, cam_config_invalid_imu)
634{
635 const auto wire_config = create_valid_wire_config();
636 const auto packet_config = create_wire_packet_delay();
637
638 const auto config = convert(wire_config,
639 std::nullopt,
640 std::nullopt,
641 std::nullopt,
642 packet_config,
643 false,
644 create_device_info(1920, 1200),
646
647 ASSERT_FALSE(static_cast<bool>(config.imu_config));
648
649 check_equal(config, wire_config);
650
651 ASSERT_TRUE(static_cast<bool>(config.network_config));
652 check_equal(config.network_config.value(), packet_config);
653}
654
655TEST(convert, cam_config_invalid_led)
656{
657 const auto wire_config = create_valid_wire_config();
658 const auto packet_config = create_wire_packet_delay();
659
660 const auto config = convert(wire_config,
661 std::nullopt,
662 std::nullopt,
663 std::nullopt,
664 packet_config,
665 false,
666 create_device_info(1920, 1200),
668
669 ASSERT_FALSE(static_cast<bool>(config.lighting_config));
670
671 check_equal(config, wire_config);
672
673 ASSERT_TRUE(static_cast<bool>(config.network_config));
674 check_equal(config.network_config.value(), packet_config);
675}
676
677TEST(convert, cam_config_valid_led_but_no_lights)
678{
679 const auto wire_config = create_valid_wire_config();
680
681 auto lighting_config = create_valid_lighting_wire_config();
682 lighting_config.available = 0;
683
684 const auto packet_config = create_wire_packet_delay();
685
686 const auto config = convert(wire_config,
687 std::nullopt,
688 std::nullopt,
689 std::make_optional(lighting_config),
690 packet_config,
691 false,
692 create_device_info(1920, 1200),
694
695 ASSERT_FALSE(static_cast<bool>(config.lighting_config));
696
697 check_equal(config, wire_config);
698
699 ASSERT_TRUE(static_cast<bool>(config.network_config));
700 check_equal(config.network_config.value(), packet_config);
701}
702
703TEST(convert, imu_config_round_trip)
704{
705 const auto wire_config = create_valid_imu_wire_config();
706 const auto info = create_imu_info();
707
708 const auto round_trip = convert(convert(convert(wire_config, info), info, 10000), info);
709
710 check_equal(round_trip, wire_config, info);
711}
712
713TEST(convert, imu_config_limit_messages)
714{
715 const auto wire_config = create_valid_imu_wire_config();
716 const auto info = create_imu_info();
717
718 //
719 // Limit the number of samples to one less than our initialized value
720 //
721 const auto round_trip = convert(convert(wire_config, info), info, wire_config.samplesPerMessage - 1);
722
723 ASSERT_EQ(round_trip.samplesPerMessage, wire_config.samplesPerMessage - 1);
724}
725
726TEST(convert, lighting_config_round_trip)
727{
728 const auto wire_config = create_valid_lighting_wire_config();
729
730 const auto config = convert(wire_config, multisense::MultiSenseInfo::DeviceInfo::LightingType::EXTERNAL);
731
732 check_equal(config, wire_config);
733 check_equal(config, convert(config));
734}
735
736TEST(convert, network_config)
737{
738 using namespace crl::multisense::details;
739
740 const auto wire_config = create_valid_wire_config();
741 const auto packet_config = create_wire_packet_delay();
742
743 const auto config = convert(wire_config,
744 std::nullopt,
745 std::nullopt,
746 std::nullopt,
747 packet_config,
748 false,
749 create_device_info(1920, 1200),
751
752 ASSERT_TRUE(static_cast<bool>(config.network_config));
753 check_equal(config.network_config.value(),
754 convert<wire::SysPacketDelay>(config.network_config.value()));
755
756}
TEST(equality, equal)
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.
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,...
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...
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.