RoboRIO

Overview: 
Explore basic Java concepts such as program structure, naming rules, variables, data types and statements.
Overview: 
Explore the concept of Statements in a programming language and how they are used in Java.
Objectives: 

Understand the concept of statements and in particular how statements are used in Java. Understand using variables and statements to perform basic math operations.

Content: 

Statements are the work horse construct of any text based programming language. Statements are where action happens and where you encode your algorithm into instructions for your robot. Statements fall into two categories, actions with assignment of a resulting value to a variable and actions that do not assign a result:

Note there is always only one item, a variable, on the left side of the assignment operator. You cannot have operations on the left side of the = sign: think ‘assignment’ not equals.

Operators are used to manipulate variables or constants (called operands) in a statement. Operators have an order of evaluation called precdence (more), at the same parenthetic level. You can control the order of operations by enclosing them within parenthesis which can be nested. In the above example, in the first statment, 2 * 3 is done first (due to multiplication having a higher precedence than addition), resulting in 5 + 2 + 6. These are then added up and the result is 13. In the second statement, 2 + 2 is done first due to the parenthesis resulting in 4. Now you have 5 + 4 * 3. Multiplication is done before (precedes) addition so 4 is multiplied by 3 resulting in 12. Now you have 5 + 12. Finally the 5 and 12 are added to give the result 17. Watch this video up to comparison operators (discussed later). The various math operators available are discussed here and here (arithmetic and assignment sections).

Statements are also used to make decisions about what your program should do next (Flow Control) and to call Methods. More on both of these topics later. Statements can span more than one line and continue until terminated with a semicolon. Statements, except for variable declarations, only appear inside Methods. Variable declaration statements can appear inside or outside of Methods, but always inside of a Class. We will discuss all of this a bit later.

Click the next arrow for a quiz on variable assignment statements.

 

Navigation:

Overview: 
Explore the concept of Data Types and in particular the data types in Java.
Objectives: 

Understand Data Types in general and the specific data types available in Java.

Content: 

As discussed in the previous lesson, variables in Java are typed, that is, we specify what kind of data can be contained in the variable. Java has two categories of data type, primitive types and reference types. Java has eight primitive types. Primitive types are also called value types. Reference types allow you define your own data types (objects). The primitive data types are:

boolean stores only the idea of 'true' or 'false'
int stores a signed integer value 32 bits in size
short stores a signed integer value 16 bits in size
long
stores a signed integer value 64 bits in size
double stores a high precision decimal number
float stores a lower precision decimal number
byte stores a signed integer value 8 bits in size
char stores a single text symbol 16 bits in size

Primitive data types contain the simple numeric value of the appropriate type. Selecting a data type depends on the type of data you wish to store in a variable and also its numeric range or size. Primitive types default to a value of zero (false for boolean) if not initialized when created. Besides defining the type of data a variable can hold, the type also determines the memory space allocated for the variable. Typically, we only use int, double, float and boolean in robotics. Primitive types can be used in math operatons since the primitives are basicall all numbers.

As you can see, there is some repetition among the types of data different primitives can be used for. In general, int will work for most tasks we have working with whole numbers, and double will work well for any decimal operations. It is possible to do nearly all of your programming without using the different sizes of data. Recall that when creating a variable, Java uses the type to decide how big the memory storage location should be. As should make sense, if you try to take a piece of data stored in a long type and put it into a variable with type int, there will be an error. The same goes for any mismatch of the size limitations of the different primitives.

The Java compiler and JVM will watch for type mismatches, that is, trying to put an incompatible value into a variable, like trying to set an int to a double value like this:  int x = 3.2; The compiler will flag this as an error and at run time this would result in an exception (run time error).

Watch this video for more about variables and data types. Go here, here or here for detailed discussions of each data type.

Reference data types contain references or pointers to more complex data like objects. We will learn more about objects and reference data types a bit later. Reference variables default to a special Java value called null if they are not initialized. For reference variables, which are supposed to point to a more complex data object, null means the variable is not pointing to anything. Normally you cannot use a reference variable in a math expression as objects typically are not single numbers.

Strings of characters (text) are stored in a special object, acting like both a primitive and reference data type. A String contains a list of characters and can be treated somewhat like a primitive data type in that Java supports adding two strings together, which concatenates them into a new single string. Strings also support methods that can be called to perform operations on the string of characters contained in the string. Go here and here for detailed discussions of Strings. Note that a String variable may not be pointing to anything, meaning it is un-initialized or null. A String variable may also point to an actual string object, which happens to contain no characters, which is called an empty or zero length string. Null and empty do not mean the same thing.

Navigation:

Overview: 
Explore Variables in Java.
Objectives: 

Understand what Variables are and why they exist. Understand how variables are defined and used in Java. Understand variable scoping.

Content: 

A Variable is a memory location, or 'slot', reserved by your program into which you will store data. It is called a variable because we can change it as needed as the program executes. When we define variables we assign them meaningful names instead of having to work with actual memory addresses. Here are some examples:

Notice the Java keyword int. Java is a strongly typed language which means that when a variable is defined, we assign a specific data type to that variable. Different kinds of data will require different amounts of memory space to store. So, when we first create the slot in memory for the variable to use, we must tell the compiler what type of data we will be putting in that slot. This allows the compiler and the JVM to check that we only put the correct data into the variable and to some extent, that we use it correctly. In the example, the variables are all assigned the int (or integer) data type. (We will discuss data types in depth in the next lesson). When data of the wrong type is stored in a variable, you will encounter an error.

When we define a variable, we can initialize it (put a value in it right away) like we did in the case of myVar2, or we can separate the definition from the initialization, doing that later in the program in a statement as we did for myVar1. The first line of this code simply told the computer to create a slot in memory called myVar1 that will hold data of type “int”. The last line then says, “put the value 7 into the slot I labeled myVar1”. Before the last line, myVar1 is zero (the default), and when we put something into a variable for the first time, it is called ‘initialization’. Sometimes it is more convenient to initialize our variable as soon as we define it, like we did in the case of myVar2. That line says, “create a slot called myVar2 that can hold an int and put 3 in it”.

Notice that the fourth line of code does not include ‘int’ in front of myVar1. This is because myVar1 has already been defined in the code we have written. It is only necessary to define the type of a variable the first time we create it. Once it has been created, the compiler will have set aside the appropriate space to store an integer in that location in memory, so we do not have to restate that myVar1 is an integer. It is important not to restate the data type, because doing so will influence the scope of that variable depending on where it is stated (see below).

Variables are used in statements, which are the actual processing steps the program will execute. Variables change by appearing on the left side of the assignment operator  =. So = does not mean “is equal to”, but means “evaluate what is on the right of this symbol and put the result in the variable on the left”. We will discuss statements and operators in more detail a bit later.

Variables can be used below where they are defined but not above and must be used in a class or method. Variables can only be used inside the code block (class/method) in which they are defined. This is called the scope of the variable:

There is an exception to general variable scoping. Variables defined in a class at the class level can be accessed outside the class. We will discuss this further in the lesson on object variables.

Note the keyword final on the definition of myVar4. Final means the value of variable cannot be changed once it is initialized. Such a variable is used to store a constant value. Constants are values that do not change and are used in place of literally stating values in statements. This is very important when you reuse the same number many times in code, such as the diameter of a wheel. If you use a literal value and that value later changes, you will have to manually change each place the literal value is used. Here are two code snippets showing how a constant is used:

If for some reason, we later realize that the conversion was wrong for some reason, we would have to go back and find every 12 and change it. As code becomes more complex, it is easy to miss an instance of using that number. If you use a constant, changes to the definition of the constant will be carried through the rest of your code, making modifications much simpler and less error-prone. Here is the same code as above, written with a constant for the number of inches in a foot.

Watch this video for more about variables.

Watch this video for more about the final keyword and constants.
 
In the Java world, variables are commonly called "attributes", "members" or "fields".
 

Navigation:

Overview: 
Explore the basic syntax of Java.
Objectives: 

Understand the syntax rules of Java, basic program structure, naming conventions, code blocks and comments.

Content: 

As we move forward, we will start to acquire new vocabulary at an increasing rate. It is normal for vocabulary to take a while to stick, so don’t give up! Additionally, syntax is something you will learn by doing (and messing up!). Syntax is a challenge that you will always be getting better at, and is something nobody is perfect at.

Java programs consist of one or more classes (templates defining the characteristics and functions of an object). Classes consist of one or more class level variables (or constants) and one or more methods.
 
Variables are memory locations in which we can store data, like a number or string of characters. Variables can be changed as the program executes. Constants are variables that are set to an initial value and are not changed during execution.
 
Methods consist of one or more method local variables (or constants) and one or more statements.
 
Statements are code that change the state of the variables in a program and are how the program performs computations or make decisions about what to do next.
 
Here is what this looks like:

All of these things (other than statements) have names. Names in Java (also called identifiers) follow these rules:

  • Start with a letter, $ or _ (underscore). After the first character, you may use any combination of characters.
  • Java Keywords cannot be used as names.
  • Names are case sensitive. That means MyName is not the same as myname or myName.

While not requred by Java, most programmers follow this convention:

  • Class names start with an upper case letter. (MyClass rather than myClass)
  • Variable and method names start with a lower case letter. (myVariable rather than MyVariable)
  • When names are made up compound words, the first letter of the second word is upper case: MyClass, myVariable, myMethod.
  • Upper case all words in a constant and separate compound words with an underscore: MY_CONSTANT, WHEEL_DIAMETER, CAMERA_IP.

Keywords are reserved words used by Java. A list of the keywords can be found here. The meanings of the keywords will be discussed later. Note: when something is ‘reserved’ it means you cannot use it as a name of a variable or class. If you try to use a keyword in this way, the program will not compile.

Comments are used to document what your code is doing to aid both yourself and others in reading your code later on. Comments are important and should be used liberally. For example, there may be a complicated set of steps for a robot to lift an arm and open a gripper. In order to understand that is what is happening, someone would have to know what each step of your code does. A comment at the start of that set of steps that says “// lift arm and open gripper” makes things much easier for outsiders to utilize. Here is a discussion of the Java comment formats. Don't worry about JavaDoc (mentioned in the article), that is an advanced topic. 
 
It is important to note that even when legitimate code is written inside a comment, it will never run. The compiler always ignores the contents of any comment. This is a simple way to remove a portion of code from your program temporarily without having to copy and paste or re-type your code when finished.

Whitespace is also a form of commenting. Whitespace is blank lines, indents, extra spaces used to make your code easier to read. Again, this is both for yourself and others that may have to read your code. Use whitespace to separate operations, groups of statements and dense lines of code.

Note that braces { } are used to identify blocks of code that are treated as a group. All of the code for a class is enclosed in braces just as all code in a method is enclosed in braces. Just like a set of parentheses can have multiple layers like (x - (y-2)), so can braces. It is not uncommon for the end of a program to have many closing braces as each layer is closed off. Making sure each opening brace is paired with a closing brace is essential.

Finally, all statements end in a semicolon.

 

Navigation:

Overview: 
Explore the classic Hello World! first Java program example.
Objectives: 

Understand the most basic Java program and its component parts.

Content: 

The most common example of a first Java program is the famous Hello World! program. Before we get into the details of Hello World, I am going to introduce some of the supplemental resources we will be using.

TutorialsPoint is a programming instructional website and we will reference some of it's Java topics. In some topics there is a code window where you can execute examples of code discussed in the topic. They also have a Java coding website called CodingGround where you can write, compile and execute example code or your own code. We will use CodingGround to demonstrate topics in our lessons. In those cases, the code from our lesson will be loaded into the CodingGround code window and you can compile and execute that code right in your browser.

We will also link to videos on YouTube that give a different view of topics and show examples. 

We will refer to the official Oracle Java tutorial and documentation often and other Java resource sites when appropriate.

Now let's do some Java! Every programmer’s favorite program is one that will print “Hello World!” on the screen of the device you’re working on. That will be our first task.

In Java, everything is an object, also called a class, and all code must be contained in a class. A class is the description of an object. The terms object and class, while used interchangeably, are not quite the same thing. We will get into the details of objects and classes later. For now, just know that every Java program requires at least one object. This object's name is the same as name of your program, for example: HelloWorld. We define this object by creating the class HelloWorld and storing it in a file called HelloWorld.java. Our source code is always stored in a file with the .java extension and that file must have the same name as the class it contains.

The HelloWorld class must have a method (also called a function) called main. The main method allows the JVM to know where to start your program. We will discuss methods in more detail later. So the simplest Java program looks like this:

In this example the key thing to see is the statement that prints Hello World! on the system console. System.out is a built-in Java API and println( ) is a method in that API that prints text on the display.

Jump over (finish reading this paragraph first) to the Hello World example in CodingGround. You can run the example by clicking the Execute button. The Execute button runs the source code (HelloWorld.java) through the Java compiler javac (as you can see in the console window). Compiling produces the HelloWorld.class file. The .class file contains the bytecode the JVM will execute. The Execute button then runs the JVM and passes the name of the .class file to be executed and the output appears in the console window. Before you go, notice that the example main method is not quite correct. You can edit the code in the code window to correct the problem and create the result we want. After editing you will need to click compile to generate a new .class file with your changes.

A very important concept to keep in mind regardless of what code you are writing is that many steps in the programs that we write will not have visible results. In this example, the only thing that we end up actually seeing on the screen are the words we have put in the quotation marks inside the System.out.println( ) function. Simply looking at the output, we would not have been able to know exactly the steps that went into the original program. This is very important when trying to fix problems with a program that is not behaving as expected. When we get more complex programs, in order to even know which part of our program is executing we need to make sure to have some visual result (printing something to a screen, moving a motor or servo in a particular way) that will help us identify what step in the program is running. Don’t forget: steps in code can run without having any visible result, but that does not mean they did not happen.

 

Navigation:

Overview: 
Show a simple example of a Java program for RoboRio (FRC) robots. This is a preview of the type program the student will be learning about in subsequent lessons.
Objectives: 

Look at the example and know that soon you will understand what this Java code does, where it came from and how to create programs yourself. For now, just a preview.

Content: 

Here is a very simple Java program for RoboRio (FRC) robots. This is just to give you a preview of what we will be covering in the following lessons. We will show you what all of this means, where it comes from, how it works and examples of how this basic program is the basis of more complex programs that make robots move and respond to their environment.

Navigation:

Overview: 
Explore where a student's program fits in the hierarchy of programs that make up a robot's complete set of software.
Objectives: 

Understand where in the hierarchy of software layers that make up a robots code the student program sits and the scope what it needs to control.

Content: 

Software systems are typically made up of several layers of programs, each providing services to the layer above. Robots are no different. In a robot, there will be a layer below your program that provides services to the programs you will write. This layer below (an API) hides complexity or details that have already been programmed for you and you can ignore. There may also be a layer above your program that tells your program when to stop and start and may provide input. In that sense your program is providing a service to that higher layer. The layer at which your program sits and the things it needs to know about and control are its scope.

A way to think about this is to consider the example of the human body. If we think of the body, the body has a brain, nerves, neurons and limbs (arms, fingers). Comparing to a robot, the robots processor is the brain, the nerves are wires, the neurons are motor controllers and the limbs are motors. The brain does not need to know how the neurons work or how the limbs work, it just tells the neuron to move the hand and the neuron takes care of the details of hand movement. In a robot, we don’t worry about how the motor controller chooses the right voltage to make the motor turn, we can just tell the controller to move the motor.

During your learning how to program robots, there will be plenty things going on at lower and higher levels, which we will not discuss in detail but you typically don't need to know how these other levels work. Your program just asks the lower level to perform a function and may respond to a request from a higher level.

Navigation:

Overview: 
Explore the general ideas behind programming and how it applies to robots.
Objectives: 

Understand the general idea of what the programming activity is, how we do it and how a program is the result. Understand how these ideas apply to a robot.

Content: 

Simply put, a program is a set of instructions that describe the actions we want a computer to take to reach the desired output (result) from a set of input(s). That set of actions, taken as a whole, is also called an algorithm. The instructions to making a peanut butter and jelly sandwich qualify as an algorithm:

Take two slices of bread
Open jelly jar
Open peanut butter jar
Spread jelly on one side of one slice
Spread peanut butter on one side of the other slice
Place the two slices together so that the covered faces touch

Keep in mind that just like regular instructions, a program is written sequentially, and will run sequentially. In this silly example, I am assuming some pre-built instructions are in place that provide the small details of how you open a jar of peanut butter, and that you should use a knife when doing the action of “spreading”. This is a good example of the fact that we will not have to give every tiny instruction at the lowest level, but will be able to use some pre-built functions that are provided by the programming language or a robotics support library (these functions would be an API).

While the particular statements or program design we might use will vary with each language, generally the steps to achieve the output are the same. We can express these steps in English using normal language to define the steps and create an initial design for a program, without worrying about how a specific programming platform wants us to express a particular instruction. In effect, we write a program in English. This is called using pseudo code, that is, a made up computer language.

For example, lets say we want a robot to drive in a square pattern, for 3 seconds on each side. We could write this program in pseudo code as follows:

drive.forward
wait.3seconds
drive.stop
turn.right.90degrees
drive.forward
wait.3seconds
drive.stop
turn.right.90degrees
drive.forward
wait.3seconds
drive.stop
turn.right.90degrees
drive.forward
wait.3seconds
drive.stop

Notice that we just made up this "language", but it does express the idea of what the program has tell the robot to do to achieve the desired result. The function that we need in order to move forward may not be exactly “drive.forward”, but writing this pseudo code gave us a framework to think about what we are doing without worrying about the specifics of the language.

Lets do another example. Lets say we want a robot to drive forward until it hits an obstacle, using a touch sensor to detect the obstacle. When we contact an obstacle we want to back up a bit and stop. The touch sensor is on the front of the robot.

drive.forward
label:keepdriving
if touchsensor.istouching
    drive.stop
    drive.backward
    wait.1second
    drive.stop
otherwise
    go to keepdriving
end of question

We can use pseudo code to think through how we can produce the desired result of the program and design the steps or algorithm needed to achieve the result. Then we can use that pseudo code to as a guide to write the actual program in a real programming language.

Note that block or visual programming tools are based on this idea of designing programs in simplified terms and then these tools write the actual program for you.

Another powerful tool you can use to design a program is a Flowchart. We are not going discuss them here but flowcharts are very useful in designing algorithms to solve problems. You can create flowcharts online at draw.io.

There other techniques and tools available to help in program design but once the algorithm is designed, you will express those steps in an actual programming language to create your program.

As an exercise, write the pseudocode instructions to get from your classroom to your school's front office. What are the functions in the API that you used to write your pseudocode?

 

Navigation:

Pages