CogniPilot

MODELICA LIBRARY · ENGINEERING REFERENCE

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;