コード例 #1
0
        public void EqualTest()
        {
            var robotVector1 = new RobotVector(ZeroZero(), Heading.North);
            var robotVector2 = new RobotVector(ZeroZero(), Heading.North);

            Assert.IsTrue(robotVector1 == robotVector2);
        }
コード例 #2
0
        private void UpdateUI(object sender, KUKA.FrameReceivedEventArgs args)
        {
            RobotVector actualPosition      = args.Position;
            RobotVector targetPosition      = Robot.TargetPosition;
            RobotVector theoreticalPosition = Robot.TheoreticalPosition;

            positionChart.Update(new double[] {
                actualPosition.X, targetPosition.X, theoreticalPosition.X,
                actualPosition.Y, targetPosition.Y, theoreticalPosition.Y,
                actualPosition.Z, targetPosition.Z, theoreticalPosition.Z,
                actualPosition.A, targetPosition.A, theoreticalPosition.A,
                actualPosition.B, targetPosition.B, theoreticalPosition.B,
                actualPosition.C, targetPosition.C, theoreticalPosition.C,
            });

            Dispatcher.Invoke(() => {
                actualPositionX.Text = actualPosition.X.ToString("F3");
                actualPositionY.Text = actualPosition.Y.ToString("F3");
                actualPositionZ.Text = actualPosition.Z.ToString("F3");
                actualPositionA.Text = actualPosition.A.ToString("F3");
                actualPositionB.Text = actualPosition.B.ToString("F3");
                actualPositionC.Text = actualPosition.C.ToString("F3");

                targetPositionX.Text = targetPosition.X.ToString("F3");
                targetPositionY.Text = targetPosition.Y.ToString("F3");
                targetPositionZ.Text = targetPosition.Z.ToString("F3");
                targetPositionA.Text = targetPosition.A.ToString("F3");
                targetPositionB.Text = targetPosition.B.ToString("F3");
                targetPositionC.Text = targetPosition.C.ToString("F3");
            });

            velocityChart.Update(Robot.Velocity.ToArray());
            accelerationChart.Update(Robot.Acceleration.ToArray());
        }
コード例 #3
0
        public void CanParseAStartingLocation(string startingLocation)
        {
            var         locationParser = new LocationParser();
            RobotVector location       = locationParser.Parse(startingLocation);

            Assert.That(location.ToString(), Is.EqualTo(startingLocation));
        }
コード例 #4
0
        public void NotSameHeadingTests()
        {
            var robotVector1 = new RobotVector(ZeroZero(), Heading.North);
            var robotVector2 = new RobotVector(ZeroZero(), Heading.South);

            Assert.IsTrue(robotVector1 != robotVector2);
        }
コード例 #5
0
        public void CanReadBackVectorValues()
        {
            var position    = new Position(0, 0);
            var heading     = Heading.North;
            var robotVector = new RobotVector(position, heading);

            Assert.That(robotVector.Position, Is.EqualTo(position));
            Assert.That(robotVector.Heading, Is.EqualTo(heading));
        }
コード例 #6
0
        public void MoveForwardWhenFacingNorth(int startXCord, int startYCord)
        {
            const Heading startingHeading = Heading.North;

            var         command = new MoveForwards();
            RobotVector result  = command.GenerateNewVector(new RobotVector(new Position(startXCord, startYCord), startingHeading));

            AssertHasOnlyMovedNorth(startXCord, startYCord, result, startingHeading);
        }
コード例 #7
0
        public void TurnRightWhenFacingNorth(int startXCord, int startYCord)
        {
            const Heading startingHeading = Heading.North;

            var         command = new TurnRight();
            RobotVector result  = command.GenerateNewVector(new RobotVector(new Position(startXCord, startYCord), startingHeading));

            DirectionAssertions.AssertHasTurnedToFaceEast(startXCord, startYCord, result);
        }
コード例 #8
0
        public void TurnLeftWhenFacingWest(int startXCord, int startYCord)
        {
            const Heading startingHeading = Heading.West;

            var         command = new TurnLeft();
            RobotVector result  = command.GenerateNewVector(new RobotVector(new Position(startXCord, startYCord), startingHeading));

            DirectionAssertions.AssertHasTurnedToFaceSouth(startXCord, startYCord, result);
        }
コード例 #9
0
        public void StartAt(RobotVector staringPosition)
        {
            if (_arena == null)
            {
                throw new ArenaNotUploadedException();
            }

            _currentPosition  = staringPosition;
            _startLocationSet = true;
        }
コード例 #10
0
        public void ExecuteCommandList(IEnumerable <RobotCommand> commandList)
        {
            if (!_startLocationSet)
            {
                throw new StartLocationNotSetException();
            }

            foreach (var robotCommand in commandList)
            {
                _currentPosition = robotCommand.GenerateNewVector(_currentPosition);
            }
        }
コード例 #11
0
        public void CanReportARobotsPosition()
        {
            var startPosition = SimpleVector();

            var robot = new WarriorRobot();

            robot.UploadArena(new Arena(1, 1));
            robot.StartAt(startPosition);

            RobotVector reportedPosition = robot.ReportPosition();

            Assert.That(reportedPosition, Is.EqualTo(startPosition));
        }
コード例 #12
0
        private void ResetMoveToFields(object sender, RoutedEventArgs e)
        {
            if (robot.IsInitialized())
            {
                RobotVector actualPosition = robot.Position;

                moveToX.Text = actualPosition.X.ToString();
                moveToY.Text = actualPosition.Y.ToString();
                moveToZ.Text = actualPosition.Z.ToString();
                moveToA.Text = actualPosition.A.ToString();
                moveToB.Text = actualPosition.B.ToString();
                moveToC.Text = actualPosition.C.ToString();
            }
        }
コード例 #13
0
        public override RobotVector GenerateNewVector(RobotVector currentPosition)
        {
            if (currentPosition.Heading == Heading.North)
            {
                return(new RobotVector(currentPosition.Position + new YDimensionUnit(1), Heading.North));
            }
            if (currentPosition.Heading == Heading.East)
            {
                return(new RobotVector(currentPosition.Position + new XDimensionUnit(1), Heading.East));
            }
            if (currentPosition.Heading == Heading.West)
            {
                return(new RobotVector(currentPosition.Position - new XDimensionUnit(1), Heading.West));
            }

            return(new RobotVector(currentPosition.Position - new YDimensionUnit(1), Heading.South));
        }
コード例 #14
0
        public Ping_JuggleVertically(KUKARobot robot, Chart chart)
        {
            this.robot = robot;
            this.chart = chart;

            robot.FrameReceived += frame => {
                if (robotMoved && robot.IsTargetPositionReached)
                {
                    var robotPos = new RobotVector(robot.Position.X, robot.Position.Y, 290);
                    robot.MoveTo(robotPos, RobotVector.Zero, 1.5);

                    polyfitX.Values.Clear();
                    polyfitY.Values.Clear();
                    polyfitZ.Values.Clear();
                    timeOf3Pred.Clear();
                }
            };
        }
コード例 #15
0
        public void ExecutingASingleCommandUpdatesThePositionAsExpected()
        {
            var startPosition = new RobotVector(new Position(0, 0), Heading.North);

            var robot = new WarriorRobot();

            robot.UploadArena(new Arena(1, 1));
            robot.StartAt(startPosition);

            var commandList = new List <RobotCommand>();

            commandList.Add(new MoveForwards());
            robot.ExecuteCommandList(commandList);

            RobotVector reportedPosition = robot.ReportPosition();

            Assert.That(startPosition, Is.Not.EqualTo(reportedPosition));
        }
コード例 #16
0
        private void MoveTo(object sender, RoutedEventArgs e)
        {
            try {
                double x = double.Parse(moveToX.Text);
                double y = double.Parse(moveToY.Text);
                double z = double.Parse(moveToZ.Text);
                double a = double.Parse(moveToA.Text);
                double b = double.Parse(moveToB.Text);
                double c = double.Parse(moveToC.Text);

                double movementTime = Math.Max(double.Parse(moveToTime.Text), 2);
                moveToTime.Text = movementTime.ToString();

                RobotVector targetPosition = new RobotVector(x, y, z, a, b, c);
                robot.MoveTo(targetPosition, RobotVector.Zero, movementTime);
            } catch (Exception ex) {
                MainWindow.ShowErrorDialog("Unable to move robot to specified target position.", ex);
            }
        }
コード例 #17
0
ファイル: PingPanel.xaml.cs プロジェクト: kborowicz/PingPong2
        private void CopyMovements(object sender, MovementChangedEventArgs args)
        {
            RobotMovement[] movementsStack = new RobotMovement[args.MovementsStack.Length];

            for (int i = 0; i < args.MovementsStack.Length; i++)
            {
                RobotMovement movement = args.MovementsStack[i];
                RobotVector   tPos     = movement.TargetPosition;
                RobotVector   tVel     = movement.TargetVelocity;

                movementsStack[i] = new RobotMovement(
                    targetPosition: new RobotVector(tPos.Y, tPos.X / 2.0, tPos.Z, robot2.HomePosition.ABC),
                    targetVelocity: new RobotVector(0, 0, tVel.Z),
                    targetDuration: movement.TargetDuration
                    );
            }

            robot2.MoveTo(movementsStack);
        }
コード例 #18
0
        private void Shift(object sender, RoutedEventArgs e)
        {
            try {
                double x = double.Parse(shiftX.Text);
                double y = double.Parse(shiftY.Text);
                double z = double.Parse(shiftZ.Text);
                double a = double.Parse(shiftA.Text);
                double b = double.Parse(shiftB.Text);
                double c = double.Parse(shiftC.Text);

                double movementTime = Math.Max(double.Parse(shiftTime.Text), 0.5);
                shiftTime.Text = movementTime.ToString();

                RobotVector deltaPosition = new RobotVector(x, y, z, a, b, c);
                robot.Shift(deltaPosition, RobotVector.Zero, movementTime);

                ResetShiftFields(null, null);
            } catch (Exception ex) {
                MainWindow.ShowErrorDialog("Unable to shift robot by specified delta position.", ex);
            }
        }
コード例 #19
0
        private void Test()
        {
            RobotVector current = new RobotVector();
            RobotVector target  = new RobotVector(0, 0, 0);
            var         gen     = new TrajectoryGenerator5v2(current);
            Random      rand    = new Random();

            gen.SetTargetPosition(current, target, new RobotVector(150, 0, 0), 3.0);

            Task.Run(() => {
                for (int i = 0; i < 2000; i++)
                {
                    current = gen.GetNextValue(current);

                    if (!gen.IsTargetPositionReached)
                    {
                        //current += new RobotVector(rand.NextDouble() * 0.05, 0, 0);
                    }

                    //threadSafeChart1.AddPoint(current.X, gen.Velocity.X);
                    Thread.Sleep(4);
                }
            });
        }
コード例 #20
0
ファイル: MoveCommand.cs プロジェクト: kborowicz/PingPong
        public void Execute(CommandArgs args)
        {
            if (args.UserArgs.Length != 3)
            {
                args.CommandLine.Error($"3 arguments expected, get {args.UserArgs.Length}");
                return;
            }

            KUKARobot robot;

            switch (args.UserArgs[0])
            {
            case "robot1":
                robot = args.Robot1;
                break;

            case "robot2":
                robot = args.Robot2;
                break;

            default:
                args.CommandLine.Error($"'robot1' or 'robot2' expected, get '{args.UserArgs[0]}'");
                return;
            }

            if (robot == null || !robot.IsInitialized())
            {
                args.CommandLine.Error($"Selected robot is not initialized");
                return;
            }

            string[]    positionSplit = args.UserArgs[1].Trim().Split(',');
            RobotVector targetPosition;

            if (positionSplit.Length == 3)
            {
                if (double.TryParse(positionSplit[0], out double x) &&
                    double.TryParse(positionSplit[1], out double y) &&
                    double.TryParse(positionSplit[2], out double z))
                {
                    targetPosition = new RobotVector(x, y, z, robot.Position.ABC);
                }
                else
                {
                    args.CommandLine.Error($"Invalid XYZ position");
                    return;
                }
            }
            else if (positionSplit.Length == 6)
            {
                if (double.TryParse(positionSplit[0], out double x) &&
                    double.TryParse(positionSplit[1], out double y) &&
                    double.TryParse(positionSplit[2], out double z) &&
                    double.TryParse(positionSplit[3], out double a) &&
                    double.TryParse(positionSplit[4], out double b) &&
                    double.TryParse(positionSplit[5], out double c))
                {
                    targetPosition = new RobotVector(x, y, z, a, b, c);
                }
                else
                {
                    args.CommandLine.Error($"Invalid XYZ position or ABC angles");
                    return;
                }
            }
            else
            {
                args.CommandLine.Error($"(x, y, z) or (x, y, z, a, b, c) position expected, get ({args.UserArgs[1]})");
                return;
            }

            if (double.TryParse(args.UserArgs[2], out double movementDuration))
            {
                robot.MoveTo(targetPosition, RobotVector.Zero, movementDuration);
            }
            else
            {
                args.CommandLine.Error($"Invalid movement duration");
            }
        }
コード例 #21
0
ファイル: RobotVector.cs プロジェクト: dgiddins/RobotWars
 //Resharper generated
 public bool Equals(RobotVector other)
 {
     return(_position.Equals(other._position) && _heading == other._heading);
 }
コード例 #22
0
 public RobotMovement(RobotVector targetPosition, RobotVector targetVelocity, double targetDuration)
 {
     TargetPosition = targetPosition;
     TargetVelocity = targetVelocity;
     TargetDuration = targetDuration;
 }
コード例 #23
0
 private static void AssertHasOnlyMovedWest(int startXCord, int startYCord, RobotVector result, Heading startingHeading)
 {
     Assert.That(result.Position.YCord, Is.EqualTo(startYCord));
     Assert.That(result.Position.XCord, Is.EqualTo(startXCord - 1));
     Assert.That(result.Heading, Is.EqualTo(startingHeading));
 }
コード例 #24
0
        public void ProcessOptiTrackData(OptiTrack.InputFrame data)
        {
            // Pozycja przekonwertowana z układu optitracka do układu odpowiedniej KUKI
            var    position = robot.OptiTrackTransformation.Convert(data.Position);
            double ballX    = position[0];
            double ballY    = position[1];
            double ballZ    = position[2];

            if (ballZ < 0)
            {
                ballFell = true;
            }

            // Zamiast zabawy w te ify trzeba ogarnac LabeledMarkers w optitracku zeby wykryc kiedy dokladnie widzimy pileczke a kiedy nie
            if (!ballFell && ballX < 1200 && ballX != 791.016 && ballY != 743.144 && ballZ != 148.319)
            {
                Console.WriteLine("cc");

                if (polyfitZ.Values.Count == maxPolyfitPoints)
                {
                    for (int i = 0; i < maxPolyfitPoints / 2; i++)
                    {
                        polyfitX.Values[i] = polyfitX.Values[2 * i];
                        polyfitY.Values[i] = polyfitY.Values[2 * i];
                        polyfitZ.Values[i] = polyfitZ.Values[2 * i];
                    }

                    polyfitX.Values.RemoveRange(maxPolyfitPoints / 2, maxPolyfitPoints / 2);
                    polyfitY.Values.RemoveRange(maxPolyfitPoints / 2, maxPolyfitPoints / 2);
                    polyfitZ.Values.RemoveRange(maxPolyfitPoints / 2, maxPolyfitPoints / 2);
                }

                polyfitX.AddPoint(elapsedTime, ballX);
                polyfitY.AddPoint(elapsedTime, ballY);
                polyfitZ.AddPoint(elapsedTime, ballZ);

                var xCoeffs = polyfitX.CalculateCoefficients();
                var yCoeffs = polyfitY.CalculateCoefficients();
                var zCoeffs = polyfitZ.CalculateCoefficients();
                var roots   = QuadraticSolver.SolveReal(zCoeffs[2], zCoeffs[1], zCoeffs[0] - zPositionAtHit);

                elapsedTime += data.FrameDeltaTime;

                if (roots.Length != 2)
                {
                    // No real roots
                    return;
                }

                double T = roots[1];

                chart.AddPoint(T, T);

                var ballTargetVelocity = Vector <double> .Build.DenseOfArray(new double[] { xCoeffs[1], yCoeffs[1], 2 * zCoeffs[2] * T + zCoeffs[1] });

                Vector <double> paddleNormal = Normalize(reflectionVector) - Normalize(ballTargetVelocity);

                if (IsTimeStable(T) && polyfitX.Values.Count >= 10)
                {
                    double timeToHit = T - elapsedTime;
                    double predX     = xCoeffs[1] * T + xCoeffs[0];
                    double predY     = yCoeffs[1] * T + yCoeffs[0];

                    Console.WriteLine("T: " + T + " X: " + predX + " Y: " + predY);

                    if (!ballHit && timeToHit >= 0.05)   // 0.1 DO SPRAWDZENIA!
                    {
                        double angleB = Math.Atan2(paddleNormal[0], paddleNormal[2]) * 180.0 / Math.PI;
                        double angleC = -90.0 - Math.Atan2(paddleNormal[1], paddleNormal[2]) * 180.0 / Math.PI;

                        RobotVector predictedHitPosition = new RobotVector(
                            predX, predY, zPositionAtHit, 0, angleB, angleC
                            );

                        //if (robot.Limits.WorkspaceLimits.CheckPosition(predictedHitPosition)) {
                        //    //predkosc na osiach w [mm/s]
                        //    // RobotVector velocity = new RobotVector(0, 0, 0);

                        //    // Dla odwaznych:
                        //    RobotVector velocity = new RobotVector(0, 0, 150);

                        //    robot.MoveTo(predictedHitPosition, velocity, timeToHit);
                        //    robotMoved = true;
                        //}
                    }
                }
            }
        }
コード例 #25
0
        public override RobotVector GenerateNewVector(RobotVector currentPosition)
        {
            var newHeading = (currentPosition.Heading.GetHashCode() + 90) % 360;

            return(new RobotVector(currentPosition.Position, (Heading)newHeading));
        }
コード例 #26
0
        public void FormatsPositionCorrectly()
        {
            var vector = new RobotVector(new Position(1, 1), Heading.North);

            Assert.That(vector.ToString(), Is.EqualTo("1 1 N"));
        }
コード例 #27
0
        public void ToStringFormatsDirectionCorrectly(Heading heading, string expected)
        {
            var vector = new RobotVector(ZeroZero(), heading);

            Assert.That(vector.ToString(), Is.EqualTo(expected));
        }
コード例 #28
0
        public void ProcessOptiTrackData(OptiTrack.InputFrame data)
        {
            if (ballFell)
            {
                return;
            }

            if (ballSpotted)
            {
                elapsedTime += data.FrameDeltaTime;
            }

            var ballPosition = robot.OptiTrackTransformation.Convert(data.Position);

            if (ballPosition[0] < 1200.0 &&
                (ballPosition[0] != prevBallPosition[0] ||
                 ballPosition[1] != prevBallPosition[1] ||
                 ballPosition[2] != prevBallPosition[2])
                )
            {
                ballSpotted = true;

                if (ballPosition[2] <= ballFellHeight)
                {
                    ballFell = true;
                    return;
                }

                polyfitX.AddPoint(elapsedTime, ballPosition[0]);
                polyfitY.AddPoint(elapsedTime, ballPosition[1]);
                polyfitZ.AddPoint(elapsedTime, ballPosition[2]);

                if (polyfitZ.Values.Count == maxPolyfitPoints)
                {
                    ShiftPolyfitPoints();
                }

                double T = CalculatePredictedTimeOfFlight();

                chart.AddPoint(T, T);

                if (!ballHit && T > 0.1 && IsPredictedTimeStable(T))   // 0.1 mozna zwiekszyc - do przetestowania
                {
                    double timeToHit = T - elapsedTime;

                    if (timeToHit >= 0.05)
                    {
                        var xCoeffs = polyfitX.CalculateCoefficients();
                        var yCoeffs = polyfitY.CalculateCoefficients();

                        RobotVector predictedHitPosition = new RobotVector(
                            xCoeffs[1] * T + xCoeffs[0], // predicted x
                            yCoeffs[1] * T + yCoeffs[0], // predicted y
                            targetHitHeight,
                            robot.HomePosition.ABC
                            );

                        Console.WriteLine(predictedHitPosition);

                        if (robot.Limits.WorkspaceLimits.CheckPosition(predictedHitPosition))
                        {
                            robotMoved = true;
                            RobotVector velocity = new RobotVector(0, 0, 0);
                            //robot.MoveTo(predictedHitPosition, velocity, timeToHit);
                        }
                    }
                }
            }

            prevBallPosition = ballPosition;
        }
コード例 #29
0
 public static void AssertHasTurnedToFaceNorth(int startXCord, int startYCord, RobotVector result)
 {
     Assert.That(result.Position.YCord, Is.EqualTo(startYCord));
     Assert.That(result.Position.XCord, Is.EqualTo(startXCord));
     Assert.That(result.Heading, Is.EqualTo(Heading.North));
 }
コード例 #30
0
 public abstract RobotVector GenerateNewVector(RobotVector currentPosition);