public bool ClearanceGranted(int edgeId, TimeSpan time)
        {
            if (!IsUnclearedEdgeAvailable(edgeId))
            {
                return(false);
            }

            var t = (time - Created).TotalSeconds;

            // determine status at time of clearance granting
            GetStatus(t, out var initialAcceleration, out var initialVelocity, out var initialDistance, out _, out _);

            // Get all constraints starting from initial distance. First constraint will be shortened
            var trimmedConstraintsList = GetConstraintsFrom(initialDistance);

            // Get constraints until
            var clearedConstraintsList = trimmedConstraintsList.TakeUntil(c => c.CorrespondingEdge.Id == edgeId);

            if (clearedConstraintsList.Last().CorrespondingEdge.Id != edgeId)
            {
                _logger?.LogDebug($"Clearance granted WTF: Edge-{edgeId} => {string.Join(",", clearedConstraintsList.Select(c => c.CorrespondingEdge.Id))}");
            }

            _logger?.LogDebug($"Clearance granted: Edge-{edgeId} => {string.Join(",", clearedConstraintsList.Select(c => c.CorrespondingEdge.Id))}");

            // create new motion profile
            _jointMotionProfile                = new JointMotionProfile(_parameters, initialAcceleration, initialVelocity, clearedConstraintsList);
            _jointMotionProfileCreatedTime     = t;
            _jointMotionProfileCreatedDistance = initialDistance;

            // increase cleared length
            ClearedLength = initialDistance + clearedConstraintsList.Last().End;

            return(true);
        }
示例#2
0
        public void StartAndEndStatusAreCorrect()
        {
            var jmp = new JointMotionProfile(_parameters,
                                             new VelocityConstraint(0, 1000, 500),
                                             new VelocityConstraint(1000, 1000, 200),
                                             new VelocityConstraint(2000, 1000, 800));

            jmp.GetStatus(0, out _, out var v0, out var s0);

            Assert.Equal(0.0, v0);
            Assert.Equal(0.0, s0);
            Assert.NotEqual(0.0, jmp.TotalDuration);

            jmp.GetStatus(jmp.TotalDuration, out _, out var vEnd, out var sEnd);

            Assert.Equal(0.0, vEnd);
            Assert.Equal(3000.0, sEnd);
        }