Chief Delphi

Chief Delphi (http://www.chiefdelphi.com/forums/index.php)
-   Java (http://www.chiefdelphi.com/forums/forumdisplay.php?f=184)
-   -   Robot will not drive when using UDP in autonomous (http://www.chiefdelphi.com/forums/showthread.php?t=153276)

ProfessorAlekM 09-01-2017 06:35

Robot will not drive when using UDP in autonomous
 
Hello!

I've wrote UDP code to communicate with a beaglebone from the roboRIO, however when the I put on autonomous mode and the UDP is used none of the motors work, and when I change back to teleop I still can't control anything.

Here is the code:

Code:

public class Robot extends IterativeRobot {
        //Beaglebone Communications
    DatagramSocket serverSocket;
    byte[] receiveData;
    byte[] sendData;

Code for robot init
Code:

try {
                        serverSocket = new DatagramSocket(9876);
                } catch (SocketException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
            receiveData = new byte[1024];
        sendData = new byte[1024];

Code:

public void autonomousPeriodic() {
           
            //Receive Data
        DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
        try {
                        serverSocket.receive(receivePacket);
                } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
        String sentence = new String( receivePacket.getData());
        System.out.println("RECEIVED: " + sentence);
        InetAddress IPAddress = receivePacket.getAddress();
        int port = receivePacket.getPort();

        //Return data
        String capitalizedSentence = sentence.toUpperCase();
        sendData = capitalizedSentence.getBytes();
        DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port);
        try {
                        serverSocket.send(sendPacket);
                } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
       
        switch (sentence) {
                case "a":
                        myRobot.tankDrive(0.5, 0.5);
                break;
               
                case "b":
                        myRobot.tankDrive(0,0);
                break;
        }

        Timer.delay(0.005);

    }

Thanks for any help!

euhlmann 09-01-2017 09:40

Re: Robot will not drive when using UDP in autonomous
 
Quote:

Originally Posted by ProfessorAlekM (Post 1627700)
Hello!

I've wrote UDP code to communicate with a beaglebone from the roboRIO, however when the I put on autonomous mode and the UDP is used none of the motors work, and when I change back to teleop I still can't control anything.

Here is the code:

Code:

public class Robot extends IterativeRobot {
        //Beaglebone Communications
    DatagramSocket serverSocket;
    byte[] receiveData;
    byte[] sendData;

Code for robot init
Code:

try {
                        serverSocket = new DatagramSocket(9876);
                } catch (SocketException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
            receiveData = new byte[1024];
        sendData = new byte[1024];

Code:

public void autonomousPeriodic() {
           
            //Receive Data
        DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
        try {
                        serverSocket.receive(receivePacket);
                } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
        String sentence = new String( receivePacket.getData());
        System.out.println("RECEIVED: " + sentence);
        InetAddress IPAddress = receivePacket.getAddress();
        int port = receivePacket.getPort();

        //Return data
        String capitalizedSentence = sentence.toUpperCase();
        sendData = capitalizedSentence.getBytes();
        DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port);
        try {
                        serverSocket.send(sendPacket);
                } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
       
        switch (sentence) {
                case "a":
                        myRobot.tankDrive(0.5, 0.5);
                break;
               
                case "b":
                        myRobot.tankDrive(0,0);
                break;
        }

        Timer.delay(0.005);

    }

Thanks for any help!

You may be running into a Java subtlety here.

Code:

boolean eq = ("abc" == "abc");
System.out.println(eq); // false!

I'm not entirely sure, but it may be the same problem in your switch statement. Try using String.equals in an if-else instead.

Otherwise, use the debugger to verify that sentence contains the "a" or "b" you need.

AustinShalit 09-01-2017 09:47

Re: Robot will not drive when using UDP in autonomous
 
From the documentation for DatagramSocket.receive():
Quote:

This method blocks until a datagram is received.
This means it will wait for information from the beaglebone before continuing with your user program. This waiting causes the motors to not be updated fast enough. I see two options to solve this:
We have a NetworkTables build for the beaglebone on the WPILib maven server (armhf):
http://first.wpi.edu/FRC/roborio/mav...NetworkTables/

Take a look at this document for more information:
http://wpilib.screenstepslive.com/s/...client-pc-side

AustinShalit 09-01-2017 09:50

Re: Robot will not drive when using UDP in autonomous
 
Quote:

Originally Posted by euhlmann (Post 1627769)
You may be running into a Java subtlety here.

Code:

boolean eq = ("abc" == "abc");
System.out.println(eq); // false!

I'm not entirely sure, but it may be the same problem in your switch statement. Try using String.equals in an if-else instead.

Otherwise, use the debugger to verify that sentence contains the "a" or "b" you need.

That looks ok to me. Take a look at this Oracle document: https://docs.oracle.com/javase/8/doc...gs-switch.html

ProfessorAlekM 09-01-2017 13:20

Re: Robot will not drive when using UDP in autonomous
 
As it turns out, the string being sent was not just a single letter, It was a single letter with another 1023 filler characters. When I made it split up the string based on spaces the switch function worked.

Also thank you for the networking table content, I will look into setting up a seperate thread because the robot "jitters" and moves a tiny bit every time a udp packet is received!

BenBernard 09-01-2017 14:23

Re: Robot will not drive when using UDP in autonomous
 
The beauty of NetworkTables is that they've dealt with the threading issues for you already. If you aren't familiar with/comfortable with multithreaded programming in Java, tread carefully on the UDP route!


All times are GMT -5. The time now is 13:00.

Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Copyright © Chief Delphi