public void FitMeasurementOnlyTranslation()
        {
            PRM3DMeasurer measurer = new PRM3DMeasurer();
            Pose3D        pose0    = Pose3D.Identity;

            var measurement = new PixelRangeMeasurement(0, 0, 1);

            double[] landmark = new double[3] {
                0, 0, 2.5
            };

            Pose3D fitted = measurer.FitToMeasurement(pose0, measurement, landmark);

            Pose3D expected = new Pose3D(new double[3] {
                0, 0, 1.5
            }, Quaternion.Identity);

            Assert.IsTrue(expected.Equals(fitted, 1e-5));
        }
        public void FitMeasurementGeneral()
        {
            PRM3DMeasurer measurer = new PRM3DMeasurer();
            Pose3D        pose0    = new Pose3D(new double[3] {
                2.0, 0.2, 0.1
            },
                                                new Quaternion(1, 2, 3, 4).Normalize());

            var measurement = new PixelRangeMeasurement(-120, 50, 1.3);

            double[] landmark = new double[3] {
                0.1, -1.0, 1.2
            };

            Pose3D fpose = measurer.FitToMeasurement(pose0, measurement, landmark);

            var measured = measurer.MeasurePerfect(fpose, landmark);

            Assert.IsTrue(measurement.ToLinear().IsEqual(measured.ToLinear(), 1e-5));
        }
        public void FitMeasurementUnmeasurableLandmark()
        {
            PRM3DMeasurer measurer = new PRM3DMeasurer();
            Pose3D        pose0    = Pose3D.Identity;

            var measurement = new PixelRangeMeasurement(0, 0, 1);

            double[] landmark = new double[3] {
                0, 1, 0
            };

            Pose3D fitted = measurer.FitToMeasurement(pose0, measurement, landmark);

            Quaternion rotation = new Quaternion(Math.Cos(Math.PI / 2 / 2),
                                                 (-Math.Sin(Math.PI / 2 / 2)).Multiply(new double[3] {
                1, 0, 0
            }));

            Pose3D expected = new Pose3D(new double[3] {
                0, 0, 0
            }, rotation);

            Assert.IsTrue(expected.Equals(fitted, 1e-5));
        }