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 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));
        }