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:
public class Robot extends IterativeRobot {
//Beaglebone Communications
DatagramSocket serverSocket;
byte] receiveData;
byte] sendData;
Code for robot init
try {
serverSocket = new DatagramSocket(9876);
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
receiveData = new byte[1024];
sendData = new byte[1024];
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);
}
From the documentation for DatagramSocket.receive():
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:
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!
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!