{ "Devices": { "MBDV_Servo01": { "DeviceId": "right-wheel", "Enabled": true, "DeviceType": "CiA402Servo", "DeviceName": "Right Wheel Servo", "DriverName": "CiA402Servo", "DriverVersion": "1.0.0", "Description": "Right Wheel servo motor", "Connection": { "CanInterface": "can0", "NodeId": "1", "AutoReconnectEnabled": true, "ReconnectDelayMs": 3000, "MaxReconnectAttempts": 0, "PdoConfigRetryCount": 3, "PdoConfigRetryTimeoutMs": 1000, "UseHeartbeatCheck": true, "AllowedHomingMethods": [], "PdoMappings": { "_Comment": "CiA402 Object Dictionary Index Definitions: 0x6040=Controlword[WO UINT16] - State machine control (Enable/Disable/Fault Reset), 0x6041=Statusword[RO UINT16] - Motor status (Ready/Enabled/Fault), 0x6060=ModesOfOperation[RW INT8] - Operation mode (1=PP/3=PV/4=PT/6=HM/8=CSP/9=CSV/10=CST), 0x6061=ModesOfOperationDisplay[RO INT8] - Current active mode, 0x6064=PositionActualValue[RO INT32] - Actual position (encoder counts), 0x606C=VelocityActualValue[RO INT32] - Actual velocity (user units/s), 0x6071=TargetTorque[RW INT16] - Target torque (per-mille of rated torque), 0x607A=TargetPosition[RW INT32] - Target position (Profile Position mode), 0x6081=ProfileVelocity[RW UINT32] - Max profile velocity (user units/s), 0x6083=ProfileAcceleration[RW UINT32] - Profile acceleration (user units/s²), 0x6084=ProfileDeceleration[RW UINT32] - Profile deceleration (user units/s²), 0x60FF=TargetVelocity[RW INT32] - Target velocity (Profile Velocity mode). Wheel motors use Profile Velocity mode (mode 3).", "RPDO1": [ { "Index": "0x6040", "_Description": "Controlword - State machine control (Enable/Disable/Fault Reset/Quick Stop)", "SubIndex": 0, "BitLength": 16 }, { "Index": "0x6060", "_Description": "Modes of Operation - Operation mode (1=PP/3=PV/4=PT/6=HM/8=CSP/9=CSV/10=CST)", "SubIndex": 0, "BitLength": 8 } ], "RPDO2": [ { "Index": "0x6081", "_Description": "Profile Velocity - Max profile velocity for profile motion (user units/s)", "SubIndex": 0, "BitLength": 32 } ], "RPDO3": [ { "Index": "0x6083", "_Description": "Profile Acceleration - Profile acceleration for profile motion (user units/s²)", "SubIndex": 0, "BitLength": 32 }, { "Index": "0x6084", "_Description": "Profile Deceleration - Profile deceleration for profile motion (user units/s²)", "SubIndex": 0, "BitLength": 32 } ], "RPDO4": [ { "Index": "0x60FF", "_Description": "Target Velocity - Target velocity in Profile Velocity mode (user units/s)", "SubIndex": 0, "BitLength": 32 } ], "TPDO1": [ { "Index": "0x6041", "_Description": "Statusword - Motor status (Ready/Enabled/Fault/Warning/Target Reached)", "SubIndex": 0, "BitLength": 16 }, { "Index": "0x6061", "_Description": "Modes of Operation Display - Current active/running operation mode", "SubIndex": 0, "BitLength": 8 } ], "TPDO2": [ { "Index": "0x6064", "_Description": "Position Actual Value - Current actual position (encoder counts, real-time feedback)", "SubIndex": 0, "BitLength": 32 } ], "TPDO3": [ { "Index": "0x606C", "_Description": "Velocity Actual Value - Vận tốc thực tế hiện tại (user units/s hoặc RPM, real-time feedback)", "SubIndex": 0, "BitLength": 32 } ] }, "TPDOEventTimers": { "TPDO1": 0, "TPDO2": 0, "TPDO3": 50 }, "TPDOInhibitTimes": { "TPDO1": 100, "TPDO2": 10, "TPDO3": 10 } } }, "MBDV_Servo02": { "DeviceId": "left-wheel", "Enabled": true, "DeviceType": "CiA402Servo", "DeviceName": "Left Wheel Servo", "DriverName": "CiA402Servo", "DriverVersion": "1.0.0", "Description": "Left Wheel servo motor", "Connection": { "CanInterface": "can0", "NodeId": "2", "AutoReconnectEnabled": true, "ReconnectDelayMs": 3000, "MaxReconnectAttempts": 0, "PdoConfigRetryCount": 3, "PdoConfigRetryTimeoutMs": 1000, "UseHeartbeatCheck": true, "AllowedHomingMethods": [], "PdoMappings": { "_Comment": "CiA402 Object Dictionary Index Definitions: 0x6040=Controlword[WO UINT16] - State machine control (Enable/Disable/Fault Reset), 0x6041=Statusword[RO UINT16] - Motor status (Ready/Enabled/Fault), 0x6060=ModesOfOperation[RW INT8] - Operation mode (1=PP/3=PV/4=PT/6=HM/8=CSP/9=CSV/10=CST), 0x6061=ModesOfOperationDisplay[RO INT8] - Current active mode, 0x6064=PositionActualValue[RO INT32] - Actual position (encoder counts), 0x606C=VelocityActualValue[RO INT32] - Actual velocity (user units/s), 0x6071=TargetTorque[RW INT16] - Target torque (per-mille of rated torque), 0x607A=TargetPosition[RW INT32] - Target position (Profile Position mode), 0x6081=ProfileVelocity[RW UINT32] - Max profile velocity (user units/s), 0x6083=ProfileAcceleration[RW UINT32] - Profile acceleration (user units/s²), 0x6084=ProfileDeceleration[RW UINT32] - Profile deceleration (user units/s²), 0x60FF=TargetVelocity[RW INT32] - Target velocity (Profile Velocity mode). Wheel motors use Profile Velocity mode (mode 3).", "RPDO1": [ { "Index": "0x6040", "_Description": "Controlword - State machine control (Enable/Disable/Fault Reset/Quick Stop)", "SubIndex": 0, "BitLength": 16 }, { "Index": "0x6060", "_Description": "Modes of Operation - Operation mode (1=PP/3=PV/4=PT/6=HM/8=CSP/9=CSV/10=CST)", "SubIndex": 0, "BitLength": 8 } ], "RPDO2": [ { "Index": "0x6081", "_Description": "Profile Velocity - Max profile velocity for profile motion (user units/s)", "SubIndex": 0, "BitLength": 32 } ], "RPDO3": [ { "Index": "0x6083", "_Description": "Profile Acceleration - Profile acceleration for profile motion (user units/s²)", "SubIndex": 0, "BitLength": 32 }, { "Index": "0x6084", "_Description": "Profile Deceleration - Profile deceleration for profile motion (user units/s²)", "SubIndex": 0, "BitLength": 32 } ], "RPDO4": [ { "Index": "0x60FF", "_Description": "Target Velocity - Target velocity in Profile Velocity mode (user units/s)", "SubIndex": 0, "BitLength": 32 } ], "TPDO1": [ { "Index": "0x6041", "_Description": "Statusword - Motor status (Ready/Enabled/Fault/Warning/Target Reached)", "SubIndex": 0, "BitLength": 16 }, { "Index": "0x6061", "_Description": "Modes of Operation Display - Current active/running operation mode", "SubIndex": 0, "BitLength": 8 } ], "TPDO2": [ { "Index": "0x6064", "_Description": "Position Actual Value - Current actual position (encoder counts, real-time feedback)", "SubIndex": 0, "BitLength": 32 } ], "TPDO3": [ { "Index": "0x606C", "_Description": "Velocity Actual Value - Vận tốc thực tế hiện tại (user units/s hoặc RPM, real-time feedback)", "SubIndex": 0, "BitLength": 32 } ] }, "TPDOEventTimers": { "TPDO1": 0, "TPDO2": 0, "TPDO3": 50 }, "TPDOInhibitTimes": { "TPDO1": 100, "TPDO2": 10, "TPDO3": 10 } } }, "SickScanXdLidar01": { "DeviceId": "scan_1", "Enabled": true, "DeviceName": "SICK Scan XD LiDAR 1", "DeviceType": "Lidar", "DriverName": "SickScanXdLidarDriver", "DriverVersion": "1.0.0", "Description": "SICK Scan XD LiDAR Driver - TCP/IP SOPAS Protocol", "Connection": { "IpAddress": "192.168.254.11", "TcpPort": 2371, "ScannerType": "sick_tim_7xxS", "Protocol": "ColaB", "FrameId": "scan", "ConnectTimeoutMs": 5000, "CommandTimeoutMs": 5000, "ReadTimeoutMs": 5000, "AutoReconnectEnabled": true, "ReconnectDelayMs": 3000, "MaxReconnectAttempts": 0 } }, "SickScanXdLidar02": { "DeviceId": "scan_2", "Enabled": true, "DeviceName": "SICK Scan XD LiDAR 2", "DeviceType": "Lidar", "DriverName": "SickScanXdLidarDriver", "DriverVersion": "1.0.0", "Description": "SICK Scan XD LiDAR Driver - TCP/IP SOPAS Protocol", "Connection": { "IpAddress": "192.168.254.12", "TcpPort": 2372, "ScannerType": "sick_tim_7xxS", "Protocol": "ColaB", "FrameId": "scan", "ConnectTimeoutMs": 5000, "CommandTimeoutMs": 5000, "ReadTimeoutMs": 5000, "AutoReconnectEnabled": true, "ReconnectDelayMs": 3000, "MaxReconnectAttempts": 0 } }, "SickScanXdLidar03": { "DeviceId": "scan_3", "Enabled": true, "DeviceName": "SICK Scan XD LiDAR 3", "DeviceType": "Lidar", "DriverName": "SickScanXdLidarDriver", "DriverVersion": "1.0.0", "Description": "SICK Scan XD LiDAR Driver - TCP/IP SOPAS Protocol", "Connection": { "IpAddress": "192.168.254.13", "TcpPort": 2373, "ScannerType": "sick_tim_7xxS", "Protocol": "ColaB", "FrameId": "scan", "ConnectTimeoutMs": 5000, "CommandTimeoutMs": 5000, "ReadTimeoutMs": 5000, "AutoReconnectEnabled": true, "ReconnectDelayMs": 3000, "MaxReconnectAttempts": 0 } }, "Oleilidar": { "DeviceId": "olei-front", "Enabled": true, "DeviceName": "Olei", "DeviceType": "Lidar", "DriverName": "Olei2dLidarDriver", "DriverVersion": "1.0.0", "Description": "Olei Safety Scanner LiDAR with custom scan angle configuration", "Connection": { "UdpPort": 2368, "FrameId": "olei-front" } }, "WheeltecIMU": { "DeviceId": "wheetec-imu", "Enabled": true, "DeviceName": "Wheetec N100 IMU", "DeviceType": "IMU", "DriverName": "WheeltecN100IMU", "DriverVersion": "1.0.0", "Description": "IMU", "Connection": { "Port": "/dev/ttyUSB0", "BaudRate": 921600, "Timeout": 2000 } } }, "Motion": { "DifferentialDrive": { "Enable": true, "LeftWheel": { "DeviceId": "left-wheel", "Position": { "Position": { "X": 0.0, "Y": 0.23625, "Z": 0.0 }, "Orientation": { "X": 0.0, "Y": 0.0, "Z": 0.7071067, "W": 0.7071067 } }, "WheelDiameter": 0.2495, "PulsesPerRevolution": 100000, "IsReversed": false }, "RightWheel": { "DeviceId": "right-wheel", "Position": { "Position": { "X": 0.0, "Y": -0.23625, "Z": 0.0 }, "Orientation": { "X": 0.0, "Y": 0.0, "Z": -0.7071067, "W": 0.7071067 } }, "WheelDiameter": 0.2495, "PulsesPerRevolution": 100000, "IsReversed": true } }, "ManualControl": { "Enable": true, "UsingKeyboard": true, "MinLinearVelocity": 0.0, "MaxLinearVelocity": 0.5, "MinAngularVelocity": 0.0, "MaxAngularVelocity": 0.3, "UpdateRate": 20.0, "Acceleration": 0.5, "Deceleration": 0.5 } }, "Modules": { "LiftModule": { "Enable": false }, "RotationModule": { "Enable": false } }, "Cartographer": { "Enable": true, "Sensors": { "Lidars": [ { "DeviceId": "scan_1", "Enabled": false, "Transform": { "Translation": { "X": 0.7072, "Y": 0.28235, "Z": 0.0 }, "Rotation": { "X": 0.0, "Y": 0.0, "Z": -0.3826834, "W": 0.9238795 } }, "AngleMin": -40, "AngleMax": 220 }, { "DeviceId": "scan_2", "Enabled": true, "Transform": { "Translation": { "X": 0.7072, "Y": -0.28235, "Z": 0.0 }, "Rotation": { "X": 0.0, "Y": 0.0, "Z": -0.9238795, "W": 0.3826834 } }, "AngleMin": -40, "AngleMax": 220 }, { "DeviceId": "scan_3", "Enabled": false, "Transform": { "Translation": { "X": -0.1184, "Y": 0.0, "Z": 0.0 }, "Rotation": { "X": 0.0, "Y": 0.0, "Z": 0.7071068, "W": 0.7071068 } }, "AngleMin": -40, "AngleMax": 220 } ], "Imu": { "DeviceId": "wheetec-imu", "Enabled": true, "Transform": { "Translation": { "X": 0.0, "Y": 0.0, "Z": 0.0 }, "Rotation": { "X": 1.0, "Y": 0.0, "Z": 0.0, "W": 0.0 } } } }, "TrajectoryBuilder": { "Use2D": true, "MinRange": 0.1, "MaxRange": 18.0, "MinZ": -0.8, "MaxZ": 2.0, "MissingDataRayLength": 5.0, "VoxelFilterSize": 0.01, "NumAccumulatedRangeData": 1, "UseImuData": true, "UseOnlineCorrelativeScanMatching": true, "RealTimeCorrelativeScanMatcherOptions": { "LinearSearchWindow": 0.05, "AngularSearchWindow": 0.1745, "TranslationDeltaCostWeight": 1.0, "RotationDeltaCostWeight": 1.0, "NumThreads": 3 }, "CeresScanMatcherOptions": { "OccupiedSpaceWeight": 2.0, "TranslationWeight": 20.0, "RotationWeight": 60.0, "HighResOccupiedSpaceWeight": 2.0, "HighResTranslationWeight": 20.0, "HighResRotationWeight": 60.0, "LandmarkWeight": 0.0, "CeresSolverOptions": { "UseNonmonotonicSteps": true, "MaxNumIterations": 30, "NumThreads": 3 } }, "InitialPoseRealTimeCorrelativeScanMatcherOptions": { "_comment": "Enhanced scan matching for SetInitialPoseAsync - wider search window for relocalization", "LinearSearchWindow": 0.5, "AngularSearchWindow": 0.5, "TranslationDeltaCostWeight": 1.0, "RotationDeltaCostWeight": 1.0, "NumThreads": 3 }, "InitialPoseCeresScanMatcherOptions": { "_comment": "Stricter Ceres optimization for SetInitialPoseAsync - higher weights for better accuracy", "OccupiedSpaceWeight": 20.0, "TranslationWeight": 50.0, "RotationWeight": 10.0, "CeresSolverOptions": { "UseNonmonotonicSteps": true, "MaxNumIterations": 100, "NumThreads": 3, "FunctionTolerance": 0.0001, "GradientTolerance": 0.000001, "ParameterTolerance": 0.000001 } }, "MotionFilterOptions": { "MaxTimeSeconds": 5.0, "MaxDistanceMeters": 0.2, "MaxAngleRadians": 0.0175 }, "AdaptiveVoxelFilterOptions": { "MaxLength": 0.3, "MinNumPoints": 250, "MaxRange": 50.0 }, "LoopClosureAdaptiveVoxelFilterOptions": { "MaxLength": 0.9, "MinNumPoints": 100, "MaxRange": 50.0 }, "PoseExtrapolatorOptions": { "UseImuBased": true, "ConstantVelocity": { "ImuGravityTimeConstant": 10.0, "PoseQueueDuration": 0.001 }, "ImuBased": { "PoseQueueDuration": 5.0, "GravityConstant": 9.806, "PoseTranslationWeight": 1.0, "PoseRotationWeight": 1.0, "ImuAccelerationWeight": 1.0, "ImuRotationWeight": 1.0, "OdometryTranslationWeight": 1.0, "OdometryRotationWeight": 1.0, "SolverOptions": { "UseNonmonotonicSteps": false, "MaxNumIterations": 20, "NumThreads": 3, "FunctionTolerance": null, "GradientTolerance": null, "ParameterTolerance": null } }, "_comment_deprecated": "The following fields are DEPRECATED and IGNORED by PoseExtrapolator (removed in C++ port to match original Cartographer): VelocityThreshold, AccelerationThreshold, GravityDeviationThreshold, UseOdometryDirectly. They remain here for backward compatibility but have no effect.", "VelocityThreshold": 0.003, "AccelerationThreshold": 0.4, "GravityDeviationThreshold": 0.1, "UseOdometryDirectly": true }, "ScanMatchingDebugOptions": { "EnableDebugMode": true, "MinCostReductionPercent": 80.0, "MaxPoseChangeDistanceMeters": 0.5, "MaxPoseChangeRotationDegrees": 5.0 }, "SubmapsOptions": { "NumRangeData": 100, "GridOptions": { "GridType": 1, "Resolution": 0.025 }, "RangeDataInserterOptions": { "RangeDataInserterType": 1, "ProbabilityGridRangeDataInserterOptions": { "HitProbability": 0.6, "MissProbability": 0.45, "InsertFreeSpace": true }, "TsdfRangeDataInserterOptions": { "TruncationDistance": 0.3, "MaximumWeight": 10.0, "UpdateFreeSpace": false, "NormalEstimationOptions": { "NumNormalSamples": 4, "SampleRadius": 0.5 }, "ProjectSdfDistanceToScanNormal": true, "UpdateWeightRangeExponent": 0, "UpdateWeightAngleScanNormalToRayKernelBandwidth": 0.5, "UpdateWeightDistanceCellToHitKernelBandwidth": 0.5 } } }, "HighResGridOptions": { "GridType": 1, "Resolution": 0.025 }, "HighResAdaptiveVoxelFilterOptions": { "MaxLength": 0.5, "MinNumPoints": 200, "MaxRange": 50.0 }, "HighResVoxelFilterSize": 0.025, "LandmarkThreshold": { "MirrorLandmarkMatchingDistance": 0.5, "NewLandmarkDistance": 2.0, "LocalLandmarksHistory": 80 }, "NumDuplicateInsertToAccurateSubmap": 1, "TrueScoreCellThreshold": 0.75, "_comment_ProvideConfidenceScore": "When enabled, computes a confidence score for each pose estimate using RealTimeCorrelativeScanMatcher. The confidence score indicates how well the scan matches the current submap (0.0 = poor match, 1.0 = perfect match). Useful for detecting localization failures or low-quality pose estimates. Default: false (disabled for performance).", "ProvideConfidenceScore": true }, "MapBuilder": { "UseTrajectoryBuilder2D": true, "UseTrajectoryBuilder3D": null, "NumBackgroundThreads": 4, "CollateByTrajectory": true, "OptimizeEveryNNodes": 0, "MatcherTranslationWeight": 500.0, "MatcherRotationWeight": 1600.0, "MaxNumFinalIterations": 200, "GlobalSamplingRatio": 0.05, "LogResidualHistograms": false, "GlobalConstraintSearchAfterNSeconds": 30.0, "PoseGraphOptimizationProblemOptions": { "HuberScale": 10.0, "OdometryHuberScale": 1.0, "LocalSlamPoseHuberScale": 1.0, "AccelerationWeight": 110.0, "RotationWeight": 16000.0, "LocalSlamPoseTranslationWeight": 10.0, "LocalSlamPoseRotationWeight": 10.0, "OdometryTranslationWeight": 10.0, "OdometryRotationWeight": 10.0, "FixedFramePoseTranslationWeight": 10.0, "FixedFramePoseRotationWeight": 100.0, "FixedFramePoseUseTolerantLoss": false, "FixedFramePoseTolerantLossParamA": 1.0, "FixedFramePoseTolerantLossParamB": 1.0, "LogSolverSummary": false, "MaxNumIterations": 20, "CeresSolverOptions": { "UseNonmonotonicSteps": true, "MaxNumIterations": 50, "NumThreads": 3, "FunctionTolerance": 0.001, "GradientTolerance": 0.000001, "ParameterTolerance": 0.000001 } }, "ConstraintBuilderOptions": { "SamplingRatio": 0.1, "MaxConstraintDistance": 15.0, "MinScore": 0.5, "GlobalLocalizationMinScore": 0.55, "LoopClosureTranslationWeight": 11000.0, "LoopClosureRotationWeight": 100000.0, "LogMatches": false, "FastCorrelativeScanMatcherOptions": { "LinearSearchWindow": 3, "AngularSearchWindow": 3.1415, "BranchAndBoundDepth": 5, "LocalizationLinearSearchWindow": 3.0, "LocalizationAngularSearchWindow": 3.14159 }, "CeresScanMatcherOptions": { "OccupiedSpaceWeight": 20.0, "TranslationWeight": 10.0, "RotationWeight": 1.0, "HighResOccupiedSpaceWeight": 1.0, "HighResTranslationWeight": 10.0, "HighResRotationWeight": 40.0, "LandmarkWeight": 0.0, "CeresSolverOptions": { "UseNonmonotonicSteps": true, "MaxNumIterations": 50, "NumThreads": 3 } } }, "OverlappingSubmapsTrimmer2D": { "FreshSubmapsCount": 2, "MinCoveredArea": 1.0, "MinAddedSubmapsCount": 5 } }, "MapStorage": { "Directory": "./bin/maps", "OccupancyGridResolution": 0.05, "MapPadding": 0.5, "PngVisualizationOptions": { "ShowGrid": true, "ShowTrajectory": true, "GridColor": "#CCCCCC", "TrajectoryColor": "#FF0000" } }, "Mcl": { "_comment": "Monte Carlo Localization (xloc MCL). Params aligned with refs/xloc_cpp-main/configuration_files/mcl.yaml and MCLThread convergence (pose_change 0.03m, yaw 0.05rad, stable 0.3s, reliability>=0.9, mae<=0.12, timeout 3s).", "Enabled": true, "PrimaryLidarId": "sick-lidar-002", "InitialNoiseX": 1.0, "InitialNoiseY": 1.0, "InitialNoiseYaw": 0.3, "InitialNoiseWhenPoseGivenX": 0.15, "InitialNoiseWhenPoseGivenY": 0.15, "InitialNoiseWhenPoseGivenYaw": 0.05, "ParticlesNum": 1000, "UseAugmentedMcl": true, "AddRandomParticlesInResampling": true, "RandomParticlesRate": 0.1, "RandomParticlesNoise": [ 0.05, 0.05, 0.1 ], "OdomNoiseDdm": [ 1.0, 0.5, 0.5, 1.5 ], "OdomNoiseOdm": [ 4.0, 1.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 8.0 ], "UseOmniDirectionalModel": false, "MeasurementModelType": 2, "ScanStep": 10, "ZHit": 0.9, "ZShort": 0.2, "ZMax": 0.05, "ZRand": 0.05, "VarHit": 0.08, "LambdaShort": 1.0, "LambdaUnknown": 0.01, "KnownClassPrior": 0.5, "UnknownScanProbThreshold": 0.9, "AlphaSlow": 0.001, "AlphaFast": 0.99, "RejectUnknownScan": true, "ResampleThresholdEss": 0.5, "ResampleThresholds": [ 0.2, 0.2, 0.2, 0.02, -99999.0 ], "RelTransDdm": [ 0.0, 0.0 ], "RelTransOdm": [ 0.0, 0.0, 0.0 ], "ClassifierType": 0, "EstimateReliability": true, "FailureThreshold": 0.12, "UseGLPoseSampler": true, "GLSampledPoseTimeTH": 0.5, "GmmPositionalVariance": 0.1, "GmmAngularVariance": 0.1, "PredDistUnifRate": 0.05, "ConvergencePoseChangeThresholdMeters": 0.03, "ConvergenceYawChangeThresholdRad": 0.05, "ConvergenceStableDurationSeconds": 0.3, "ConvergenceReliabilityMin": 0.9, "ConvergenceMaeMaxMeters": 0.12, "ConvergenceTimeoutSeconds": 3.0, "ConvergenceMaxIterations": 300, "ConvergenceMinIterations": 10, "ReliabilityMonitoring": { "EnableReliabilityMonitoring": true, "MonitoringIntervalSeconds": 2.0, "MonitoringParticlesNum": 500, "MonitoringIterationsPerCycle": 5 } } }, "Detection": { "MarkerDetector": { "LidarDevices": [ { "DeviceId": "olei-front", "Position": { "X": 0.72, "Y": 0.0, "Z": 0.0 }, "Orientation": { "X": 1.0, "Y": 0.0, "Z": 0.0, "W": 0.0 } } ], "QrDevices": [] } } }