network tables and the raspberry pi

well, the title is self explanatory, anyone know how to include the network tables, and more importantly, get them to work “properly”

I am not sure if you have seen this yet: https://github.com/robotpy/pynetworktables/tree/master/samples.
It pretty much has everything you need to know to use the network tables on the raspberry pi, from installation to sample code.

1 Like

There are a few threads on the subject here, but if you just want code, please feel free to look at our 2016 pi-tracker in github: https://github.com/frc5687/pi-tracker.

Also included is the networktables jar file.

There’s not much documentation on github, but the code itself should be fairly clear. You’re also welcome to PM me with questions.

I assumed java…but of course if you were looking for python, go with jchau’s reply above!

If you do choose to go with python, you can get more information about installation as well as the API reference here: http://pynetworktables.readthedocs.io/en/latest/.

alright, thanks for the quick info, ill give this a shot!

Python example: https://github.com/GarnetSquardon4901/rpi-vision-processing/blob/master/wait_for_shutdown.py

Here’s 832’s brand new OpenCV code using python and pynetworktables:

If you’re using the Pi for Vision Processing, you can also just copy the whole thing, as long as you follow the instructions in the README

I see its been updated to eliminate NT and use UDP, did the NT code work? Any landmines that you recall?

We encountered substantially more lag with NetworkTables than with straight UDP. Plus, we would occasionally see odd behavior in the NT version that may or may not have been caused by NT bugs. Values would change at unexpected times, etc. I think we were just pushing more data through NT than it was designed for, so rather than debug we switched to UDP and the problems went away.

Do you have a good source of code for reading the UDP into a robot program?

Interesting. With our vision solution, we were fine with NT, and we were even able to use PID control on it.

I’ll let you judge whether it’s “good” or not, but we do have both ends of the UDP communication in our github.

On the pi, we run pi-tracker and communicaton with the rio is through RobotProxy. RobotProxy starts a thread to listen for incoming UDP packets from the rio, and expose the incoming values. It also provides the Send method to send updates to the rio.

On the rio, the robot code uses the PiTrackerProxy exactly the same way: it starts a thread to listen for incoming packets from the pi while providing the collect method to send packets to the pi.

Note that the reason for this complicated mechanism was to more precisely correlate the timing of images to the position the robot was in when the picture was taken. For more on this, see Team 254’s video and presentation.

We then compute a new “target” pose based on the image and pose when the image was taken, and use PID to get us there.

The biggest drawback to NT, is the update frequency, the fastest you can configure them to update is 100ms. Does that hurt, depends on how you use it. Faster doesn’t always mean better. But when you add in the delay of the co-processor to process the image, and include in the NT delay, it can quickly become a problem.

In our code, NT was fine, but UDP would have been better and reduced oscillation during targeting. But with NT we could fire in about 3s (turn and elevate), and hit 80-90%. We will look at UDP in the future, but NT are a good V1.0 option, just understand the limitations.

I see in the link the NT receive, do you have your code from the pi to send? Did you have any trouble loading NT libraries onto the Pi?

I seen a lot of post about raspberry pi and its usage in FRC… Most posts are over my head as they are reffering to some support or coding example request.

Is there an actual post, white papers or other resources that “dummie” it down so I could understand what and how they are use?

Trying to learn, but yet to find a good resources showing what we could do with them.

Thanks a bunch!

We just loaded GRIP onto an Odroid to track the target. Here’s the pipeline.

I feel your pain that it seems like the support all assume you know certain things, so I’m happy to help. I can’t speak for every team, but mine is working on 2 different Pi based projects.

One is controlling an FRC robot off a pi. This is in less than an infancy stage and there is no progress to report. This wouldn’t be used for competition, but would let us keep last year’s robot in service for demos without buying more RoboRio’s. And its also a potential teaching tool for rookies.

The second, and the one I’m working on and asking about here is using it as a vision coprocessor. This is for doing things like recognizing the retroflective tape around the goals in the Stronghold game. To accomplish the recognition, a camera has to take in the image, and the processor has to perform a number of filtering operations on it. This is a very computing intensive exercise, so doing it on board the RoboRio can slow down the whole Robot. By putting a Pi on as a coprocessor, the RoboRio can keep doing its robot thing, while the Pi does nothing but chew on image data. Here in this thread, I am looking for help with getting the processed data from the Pi to the RoboRio and useful in robot code. FRC pushes this method called Network Tables. It seems fairly straightforward but I’m still learning it myself. You basically call a function that says put this data into a network table with this name. Then in your robot code you call a function that says look for a network table with this name, and assign it to some variable.

If I’m still over your head, feel free to shoot me a private message and I would be happy to help further. Or visit team5401.org and email the team and ask for Kevin and I’ll get it.

Love the explanation ! thank you very much!

So I am assuming that the NT just like a small database available on the RIO?

Any tutorial on using them?

I’m just learning them myself. There are some screensteps things, but I’ve found those have a lot of those assumptions about what the reader knows - and I often don’t.

My understanding of a Network Table is that its an array variable out on the network. Depending on your code, you can create one or read one.