SLAM/Examples/RuntimeEvaluation.mo
Download original .moGitHub source
Documentation: SLAM.Examples.RuntimeEvaluation
within SLAM.Examples;
// Evaluation-only initial-heading map. This source never supplies observations
// or corrections to the estimator. The caller owns previousSquaredError and
// sampleCount so replay/reset and missing-truth frames stay explicit.
model RuntimeEvaluation
input Real worldPosition[3] = {0.0,0.0,1.5};
input Real worldQuaternion[4] = {1.0,0.0,0.0,0.0};
input Real originPosition[3] = {0.0,0.0,1.5};
input Real originQuaternion[4] = {1.0,0.0,0.0,0.0};
input Real estimatePosition[3] = {0.0,0.0,0.0};
input Real estimateQuaternion[4] = {1.0,0.0,0.0,0.0};
input Real previousSquaredError = 0.0;
input Real sampleCount = 1.0;
output Real referencePosition[3];
output Real referenceQuaternion[4];
output Real nextSquaredError;
output Real currentError;
output Real ate;
output Real orientationError;
protected
Real originYaw; Real c; Real s; Real hc; Real hs;
Real squaredDistance; Real quaternionDot;
equation
originYaw = atan2(2.0*(originQuaternion[1]*originQuaternion[4]+originQuaternion[2]*originQuaternion[3]),
originQuaternion[1]^2+originQuaternion[2]^2-originQuaternion[3]^2-originQuaternion[4]^2);
c = cos(originYaw); s = sin(originYaw);
hc = cos(originYaw/2.0); hs = sin(originYaw/2.0);
referencePosition[1] = c*(worldPosition[1]-originPosition[1])+s*(worldPosition[2]-originPosition[2]);
referencePosition[2] = -s*(worldPosition[1]-originPosition[1])+c*(worldPosition[2]-originPosition[2]);
referencePosition[3] = worldPosition[3]-originPosition[3];
referenceQuaternion = {hc*worldQuaternion[1]+hs*worldQuaternion[4],
hc*worldQuaternion[2]+hs*worldQuaternion[3],hc*worldQuaternion[3]-hs*worldQuaternion[2],
hc*worldQuaternion[4]-hs*worldQuaternion[1]};
squaredDistance = sum((estimatePosition[i]-referencePosition[i])^2 for i in 1:3);
currentError = sqrt(squaredDistance);
nextSquaredError = previousSquaredError+squaredDistance;
ate = sqrt(nextSquaredError/sampleCount);
quaternionDot = abs(sum(estimateQuaternion[i]*referenceQuaternion[i] for i in 1:4));
orientationError = 2.0*acos(min(1.0,quaternionDot))*180.0/3.141592653589793;
end RuntimeEvaluation;