SLAM/Localization/RGBDVisualRelativeObservation.mo
Download original .moGitHub source
Documentation: SLAM.Localization.RGBDVisualRelativeObservation
within SLAM.Localization;
// Review composition: full calibrated visual frontend plus its registration
// noise model. Compile together with RGBDVisualObservation, RGBDFeatureMatching,
// RigidPointRegistration, RGBDRelativePose and RGBDRegistrationUncertainty.
// This source has not yet passed a connected source-issued numerical gate.
model RGBDVisualRelativeObservation
import RGBDRegistrationSandwich = SLAM.Localization.RGBDRegistrationSandwich;
import RGBDVisualObservation = SLAM.Localization.RGBDVisualObservation;
extends RGBDVisualObservation;
// Retain these with the reference image rather than substituting the current
// image calibration. The noise model assumes a common stereo baseline and
// disparity sigma for the pair; changing those requires a new noise model.
input Real referenceRgbFocal[2];
input Real referenceNoiseReferenceFx;
parameter Real localizationSigma = 0.5;
parameter Real depthInflation = 1.0;
parameter Real uncertaintyCoordinateLimit = 100.0;
parameter Real uncertaintyMinimumPivot = 1e-10;
output Real currentFromReference[3,3];
output Real currentFromReferenceTranslation[3];
output Real relativeCovariance[6,6]
"Optical translation and optical left-angle perturbation; use with Schmidt update";
output Real conditionalObservationCovariance[6,6]
"Conditional on retained reference pose; not independent absolute noise";
output Real relativeValid;
output Real uncertaintyRejectionReason;
output Real uncertaintyValidCount;
output Real uncertaintyInvalidCount;
protected
// Registration and uncertainty consume exactly the same complete sparse
// pair domain. matching.count is not a prefix extent.
Real uncertaintyValid;
Real normalMatrix[6,6];
Real noiseMatrix[6,6];
Real observationJacobian[6,6];
Real minimumScaledPivot;
equation
// Call the existing function so per-frame calibrated noise remains a runtime
// input; it must not initialize a parameter from a varying input binding.
(uncertaintyValid,uncertaintyRejectionReason,uncertaintyValidCount,
uncertaintyInvalidCount,relativeCovariance,conditionalObservationCovariance,
normalMatrix,noiseMatrix,observationJacobian,minimumScaledPivot) =
RGBDRegistrationSandwich(matching.sourcePoint,matching.targetPoint,
matching.pairEnabled,featureCapacity,valid,registration.rotation,
registration.translation,referenceBodyRotation,opticalToBody,
cameraOriginBody,referenceRgbFocal,{rgbCalibration[1],rgbCalibration[2]},
referenceNoiseReferenceFx,noiseReferenceFx,baseline,localizationSigma,
disparityNoise,depthInflation,uncertaintyCoordinateLimit,uncertaintyMinimumPivot);
currentFromReference = registration.rotation;
currentFromReferenceTranslation = registration.translation;
relativeValid = if noEvent(valid > 0.5 and uncertaintyValid > 0.5) then 1.0 else 0.0;
end RGBDVisualRelativeObservation;