CogniPilot

MODELICA LIBRARY · ENGINEERING REFERENCE

function

SLAM.PoseGraph.PGValidateGraph

Public declarations

Explicit source declarations; dimensions, modifications and defaults are shown as written, without evaluation.

RoleNameTypeDimensions / attributes / defaultDescription
inputpReal[:,3]
inputRReal[size(p,1),3,3]
inputnodeMaskReal[size(p,1)]
inputedgeMaskReal[:]
inputfromNodeReal[size(edgeMask,1)]
inputtoNodeReal[size(edgeMask,1)]
inputtranslationReal[size(edgeMask,1),3]
inputmeasuredRotationReal[size(edgeMask,1),3,3]
inputinformationReal[size(edgeMask,1),6,6]
outputsourceInteger[size(edgeMask,1)]
outputtargetInteger[size(edgeMask,1)]
outputstatusReal
outputactiveNodesReal
outputactiveEdgesReal

Modelica declarations and implementation

Show parameters, interfaces and source

Parameters, inputs, outputs, defaults and equations from the source file.

function PGValidateGraph
  import PGCholesky = SLAM.PoseGraph.PGCholesky;
  import PGProperRotation = SLAM.PoseGraph.PGProperRotation;

  input Real p[:,3]; input Real R[size(p,1),3,3]; input Real nodeMask[size(p,1)]; input Real edgeMask[:];
  input Real fromNode[size(edgeMask,1)]; input Real toNode[size(edgeMask,1)];
  input Real translation[size(edgeMask,1),3]; input Real measuredRotation[size(edgeMask,1),3,3];
  input Real information[size(edgeMask,1),6,6];
  output Integer source[size(edgeMask,1)]; output Integer target[size(edgeMask,1)];
  output Real status; output Real activeNodes; output Real activeEdges;
protected Boolean valid; Boolean proper; Boolean endpoints; Boolean factorValid;
  Real L[6,6]; Real reached[size(p,1)]; Integer i; Integer j;
algorithm
  source := fill(1,size(edgeMask,1)); target := fill(1,size(edgeMask,1)); reached := zeros(size(p,1));
  valid := size(p,1) >= 1 and size(p,1) <= 128 and size(edgeMask,1) >= 1 and size(edgeMask,1) <= 256 and nodeMask[1] == 1.0;
  proper := false; endpoints := false; factorValid := false; L := zeros(6,6); i := 1; j := 1;
  status := -1.0; activeNodes := 0.0; activeEdges := 0.0;
  for node in 1:size(p,1) loop
    valid := valid and (nodeMask[node] == 0.0 or nodeMask[node] == 1.0);
    for k in 1:3 loop valid := valid and (nodeMask[node] == 0.0 or abs(p[node,k]) <= 1e6); end for;
    proper := PGProperRotation(R[node,:,:]); valid := valid and (nodeMask[node] == 0.0 or proper);
    activeNodes := activeNodes+(if nodeMask[node] == 1.0 then 1.0 else 0.0);
  end for;
  status := if valid then -2.0 else status;
  for edge in 1:size(edgeMask,1) loop
    endpoints := edgeMask[edge] == 1.0 and fromNode[edge] >= 1.0 and fromNode[edge] <= size(p,1)
      and floor(fromNode[edge]) == fromNode[edge] and toNode[edge] >= 1.0 and toNode[edge] <= size(p,1)
      and floor(toNode[edge]) == toNode[edge] and fromNode[edge] <> toNode[edge];
    valid := valid and (edgeMask[edge] == 0.0 or (edgeMask[edge] == 1.0 and endpoints));
    source[edge] := if endpoints then integer(fromNode[edge]) else 1;
    target[edge] := if endpoints then integer(toNode[edge]) else 1;
    valid := valid and (edgeMask[edge] == 0.0 or (nodeMask[source[edge]] == 1.0 and nodeMask[target[edge]] == 1.0));
    for k in 1:3 loop valid := valid and (edgeMask[edge] == 0.0 or abs(translation[edge,k]) <= 1e6); end for;
    proper := PGProperRotation(measuredRotation[edge,:,:]);
    (L,factorValid) := PGCholesky(information[edge,:,:],1e-10);
    valid := valid and (edgeMask[edge] == 0.0 or (proper and factorValid));
    activeEdges := activeEdges+(if edgeMask[edge] == 1.0 then 1.0 else 0.0);
  end for;
  status := if valid then -3.0 else status; reached[1] := 1.0;
  for pass in 1:size(p,1) loop
    for edge in 1:size(edgeMask,1) loop
      if valid and edgeMask[edge] == 1.0 then
        i := source[edge]; j := target[edge];
        if reached[i] == 1.0 or reached[j] == 1.0 then reached[i] := 1.0; reached[j] := 1.0; end if;
      end if;
    end for;
  end for;
  for node in 1:size(p,1) loop valid := valid and (nodeMask[node] == 0.0 or reached[node] == 1.0); end for;
  status := if valid then 1.0 else status;
end PGValidateGraph;