コード例 #1
0
        public EuclideanTransform Compute(
            DataPoints readingIn,
            DataPoints referenceIn,
            EuclideanTransform T_refIn_dataIn)
        {
            // Apply reference filters
            // reference is express in frame <refIn>
            referenceIn = this.ReferenceDataPointsFilters.Filter(referenceIn);

            // Create intermediate frame at the center of mass of reference pts cloud
            //  this help to solve for rotations
            var meanReference = VectorHelpers.Mean(referenceIn.points);
            EuclideanTransform T_refIn_refMean = new EuclideanTransform
            {
                translation = meanReference,
                rotation    = System.Numerics.Quaternion.Identity
            };

            // Reajust reference position:
            // from here reference is express in frame <refMean>
            // Shortcut to do T_refIn_refMean.inverse() * reference
            for (int i = 0; i < referenceIn.points.Length; i++)
            {
                referenceIn.points[i].point -= meanReference;
            }

            // Init matcher with reference points center on its mean
            var matcher = this.MatcherFactory.ConstructMatcher(referenceIn);

            return(computeWithTransformedReference(readingIn, referenceIn, matcher, T_refIn_refMean, T_refIn_dataIn));
        }
コード例 #2
0
        private float minDiffTransErr = 1.0f; //0.001f;

        // TODO: make params settable by constructor?

        public bool ShouldContinue(EuclideanTransform transform)
        {
            transforms.Add(transform);

            float rotErr = 0, transErr = 0;

            if (this.transforms.Count > smoothLength)
            {
                for (int i = transforms.Count - 1; i >= transforms.Count - smoothLength; i--)
                {
                    //Compute the mean derivative
                    rotErr   += Math.Abs(VectorHelpers.AngularDistance(transforms[i].rotation, transforms[i - 1].rotation));
                    transErr += (transforms[i].translation - transforms[i - 1].translation).Length();
                }

                if (rotErr / smoothLength < this.minDiffRotErr && transErr / smoothLength < this.minDiffTransErr)
                {
                    return(false);
                }
            }

            if (float.IsNaN(rotErr))
            {
                throw new ArithmeticException("abs rotation norm not a number");
            }
            if (float.IsNaN(transErr))
            {
                throw new ArithmeticException("abs translation norm not a number");
            }

            return(true);
        }