Recent Updates
-
Updated on: Jan 20, 2023
PIDSubsystems for built-in PID control
If a mechanism uses a sensor for feedback then most often a PID controller will be used to control the motor speed or position. Examples of subsystems that might use PID control are: elevators with potentiometers to track the height, shooters with encoders to measure the speed, wrists with potentiometers to measure the joint angle, etc.
There is a PIDController class built into WPILib, but to simplify its use for command based programs there is a PIDSubsystem. A PIDSubsystem is a normal subsystem with the PIDController built in and exposes the required methods for operation.
Manual Command based programming -
Updated on: Jan 20, 2023
Simple subsystems
Subsystems are the parts of your robot that are independently controller like collectors, shooters, drive bases, elevators, arms, wrists, grippers, etc. Each subsystem is coded as an instance of the Subsystem class. Subsystems should have methods that define the operation of the actuators and sensors but not more complex behavior that happens over time.
Manual Command based programming -
Updated on: Jan 20, 2023
Creating groups of commands
Once you have created commands to operate the mechanisms in your robot, they can be grouped together to get more complex operations. These groupings of commands are called CommandGroups and are easily defined as shown in this article.
Manual Command based programming -
Updated on: Jan 20, 2023
Writing a simple NetworkTables program in C++ and Java with a Java client (PC side)
NetworkTables is an implementation of a distributed "dictionary". That is named values are created either on the robot, driver station, or potentially an attached coprocessor, and the values are automatically distributed to all the other participants. For example, a driver station laptop might receive camera images over the network, perform some vision processing algorithm, and come up with some values to sent back to the robot. The values might be an X, Y, and Distance. By writing these results to NetworkTable values called "X", "Y", and "Distance" they can be read by the robot shortly after being written. Then the robot can act upon them.
NetworkTables can be used by programs on the robot in either C++, Java or LabVIEW and is built into each version of WPILib.
Manual WPILib programming -
Updated on: Jan 20, 2023
Setting the project to automatically build in Wind River Workbench
WindRiver Workbench can automatically rebuild projects as files are edited and saved. This is often convenient to get more immediate feedback as the project is changed.
Manual Getting started with C++ -
Updated on: Jan 20, 2023
Operating the robot with feedback from sensors (PID control)
Without feedback the robot is limited to using timing to determine if it's gone far enough, turned enough, or is going fast enough. And for mechanisms, without feedback it's almost impossible to get arms at the right angle, elevators at the right height, or shooters to the right speed. There are a number of ways of getting these mechanisms to operate in a predictable way. The most common is using PID (Proportional, Integral, and Differential) control. The basic idea is that you have a sensor like a potentiometer or encoder that can measure the variable you're trying to control with a motor. In the case of an arm you might want to control the angle - so you use a potentiometer to measure the angle. The potentiometer is an analog device, it returns a voltage that is proportional to the shaft angle of the arm.
To move the arm to a preset position, say for scoring, you predetermine what the potentiometer voltage should be at that preset point, then read the arms current angle (voltage). The different between the current value and the desired value represents how far the arm needs to move and is called the error. The idea is to run the motor in a direction that reduces the error, either clockwise or counterclockwise. And the amount of error (distance from your setpoint) determines how fast the arm should move. As it gets closer to the setpoint, it slows down and finally stops moving when the error is near zero.
The WPILib PIDController class is designed to accept the sensor values and output motor values. Then given a setpoint, it generates a motor speed that is appropriate for its calculated error value.
Manual WPILib programming -
Updated on: Jan 20, 2023
Building with a custom version of the WPILib source code
This document details how to build your own custom version of the WPILibJ library, then use that library to build your robot program.
Manual Getting started with Java -
Updated on: Jan 20, 2023
Pointers and addresses
There are two ways of declaring an object variable: either as an instance of the object or a pointer to an instance of the object. In the former case the variable holds the object and the object is created (“instantiated”) at the same time. In the latter case the variable only has space to hold the address of the object. It takes another step to create the object instance using the new operator and assign its address to the variable.
Manual Getting started with C++ -
Updated on: Jan 20, 2023
Debugging a robot program
You can monitor, control, and manipulate cRIO processes using the debugger. This section will describe how to set up a debug session for a robot control program. (See the Wind River Workbench User’s Guide for complete documentation on how to use the debugger: Help > Help Contents > Wind River Documentation > Guides > Host Tools > Wind River Workbench User’s Guide.)
Manual Getting started with C++ -
Updated on: Jan 20, 2023
Building and downloading a robot project to the cRIO
Using the C++ IDE there are two ways to load programs onto the cRIO
- "Deploy" it onto the cRIO flash and run it on a reboot. This will keep the program in the cRIO's persistent memory and will load it each time the device reboots, but will not allow any of the debugging discussed above. This method is covered in this article
- Attach to the cRIO and run the program using the debugger from your development system directly to the cRIO memory. This method will allow you to set breakpoints, step through code, view variable values and perform other debugging operations, however the code will not persist when the cRIO is rebooted. When the cRIO reboots, no code will be running! This method is covered in the next article, "Debugging a Robot Program".
For tournaments you should always Deploy the program so that it will be there when the robot is restarted and the match is played.
Manual Getting started with C++