/// <summary>
        /// Creates the plan connecting coordinates by ramped lines.
        /// </summary>
        /// <param name="trajectory">Trajectory which plan will be created.</param>
        /// <returns>The created plan.</returns>
        public PlanBuilder CreateRampedPlan(Trajectory4D trajectory)
        {
            var planBuilder = new PlanBuilder();

            iterateDistances(trajectory, (p, u, v, x, y) => planBuilder.AddRampedLineUVXY(u, v, x, y, Configuration.MaxPlaneAcceleration, Configuration.MaxPlaneSpeed));
            return(planBuilder);
        }
示例#2
0
        private double getRampTime(PlanPart3D part)
        {
            if (!_rampTimeCache.TryGetValue(part, out var time))
            {
                var builder = new PlanBuilder();
                var diff    = PlanBuilder3D.GetStepDiff(part.StartPoint, part.EndPoint);
                builder.AddRampedLineUVXY(diff.U, diff.V, diff.X, diff.Y, part.AccelerationRamp, part.SpeedLimit);
                var instructions = builder.Build();

                var accumulator = 0.0;
                foreach (var instruction in instructions)
                {
                    var axes = instruction as Axes;
                    if (axes == null)
                    {
                        continue;
                    }

                    accumulator += axes.CalculateTotalTime() * 1.0 / Configuration.TimerFrequency;
                }
                _rampTimeCache[part] = time = accumulator;
            }

            return(time);
        }
示例#3
0
        internal IEnumerable <InstructionCNC> NextRampInstructions()
        {
            if (_currentInstructionOffset != 0)
            {
                throw new NotSupportedException("Cannot generate next instruction when offset is present");
            }

            var part = _plan[_currentIndex];
            var diff = PlanBuilder3D.GetStepDiff(part.StartPoint, part.EndPoint);

            var builder = new PlanBuilder();

            if (part.AccelerationRamp == null)
            {
                builder.AddConstantSpeedTransitionUVXY(diff.U, diff.V, part.SpeedLimit, diff.X, diff.Y, part.SpeedLimit);
                _currentConstantDistance += part.StartPoint.DistanceTo(part.EndPoint);
            }
            else
            {
                builder.AddRampedLineUVXY(diff.U, diff.V, diff.X, diff.Y, part.AccelerationRamp, part.SpeedLimit);
                _currentRampTime += getRampTime(part);
            }

            var plan = builder.Build();

            ++_currentIndex;
            _currentInstructionOffset = 0;
            return(plan);
        }
示例#4
0
        public IEnumerable <InstructionCNC> Build()
        {
            var builder = new PlanBuilder();

            foreach (var part in _plan)
            {
                var startSteps  = GetPositionRev(part.StartPoint);
                var targetSteps = GetPositionRev(part.EndPoint);

                var diffU = ToStep(targetSteps.U - startSteps.U);
                var diffV = ToStep(targetSteps.V - startSteps.V);
                var diffX = ToStep(targetSteps.X - startSteps.X);
                var diffY = ToStep(targetSteps.Y - startSteps.Y);

                if (part.AccelerationRamp == null)
                {
                    builder.AddConstantSpeedTransitionUVXY(diffU, diffV, part.SpeedLimit, diffX, diffY, part.SpeedLimit);
                }
                else
                {
                    builder.AddRampedLineUVXY(diffU, diffV, diffX, diffY, part.AccelerationRamp, part.SpeedLimit);
                }
            }

            return(builder.Build());
        }