2015 Software

Source Code

The 2015 robot code is available for current team members to access and create.  See the robot code notes below for details on how to do this.

Robot Code

We use the git source code control system for the robot code and gerrit for code review.  You can browse the git code repository by going to https://robotics.mvla.net/gerrit and using your team svn account credentials.  Log in to gerrit and add your name and email address to your account.  Then, have Austin or Brian add you to the '971 Software Developers' group.  Ask one of them to do this at a team meeting or email them.  If you don't see the 971-Robot-Code project on gerrit, then you have not been added to the '971 Software Developers' group.


Here's a list of some basic terminology related to the code which is helpful for gaining a basic understanding.

  • commit (git) = A snapshot of all of the source code with an author, commit message, data, and some other metadata.
    • Commits are commonly refererred to by their SHA1 hash, which is unique for each. These look like 4a644e44e66ec7af982d145cdc861338d02de462 (complete) or 4a644e4 (abbreviated; any unique prefix works most places that want a commit ID).
  • repository (git) = A folder with git commits and branches, and possibly a "currently checked out" copy of the code.
    • This "currently checked out" version of the code is called a "working tree".
    • One unique part of git is that the repository on each person's computer that they work from is 
  • branch (git) = A "sticky note" referring to a commit.
    • Many of the git tools default to your "currently checked out" branch. This means they do things like update it when you make new commits.
    • gerrit:master is the branch we generally work off of.
    • Each repository has its own set of branches, possibly with overlapping names, so in order to uniquely identify a branch you have to identify the repository it's in too. gerrit/master and gerrit:master are two common ways to do that.
    • Branches under the gerrit:/unreviewed/{username}/ namespace are "scratch" branches by each user that have not necessarily been reviewed or anything. These are useful for sharing work-in-progress code.
  • patch/diff = The differences between two sets of files.
    • This is generally between two commits, often different patch sets of the same change.
  • change (Gerrit) = A single logical modification to the code. This will eventually end up as a single commit in the git history.
    • A change has one or more patch sets (see below).
    • Each change has an ID, which shows up in the commit message for each patch set and looks like I8ee4ac19705aeba179124c44f9b53d53b450ca49.
    • They also have a number, which increases by 1 for each new one (like 336).
    • Accessible with URLs like https://robotics.mvla.net/gerrit/#/c/336/.
  • patch set (Gerrit) = A git commit (see above) representing a specific version of a change (see above).
    • Each patch set for a single change is a whole new version; they do not build on top of each other.
    • The change ID needs to be in the message of each commit because this is how Gerrit knows that they are part of the same change.
    • Each one has a number which starts at 1.
    • You can access a specific one with a URL like https://robotics.mvla.net/gerrit/#/c/336/8. The version without the last number goes to the latest one.

Late breaking news on the build system.  I don't know how this works with all of the material below, but I do know that it is important.

2015-11-01: Building code with Bazel + Jessie - From Brian

We've got all of the code building with Bazel on Debian Jessie now. We're planning to migrate away from Gyp on Wheezy soon. The README.md in the git repository has directions for setting up a computer (to download the 971 team software, build/compile it, and download it to a robot - Michael). I would like to get everybody migrated off of Gyp soon so we can remove it and stop having to worry about updating two sets of build system files.
Some context for anybody who doesn't know already: we've been using Gyp for couple of years because it was the best build system we could find. However, since then, Google has released their internal build tool (called Bazel) which is nicer in many ways.
We're migrating build systems and operating system versions at the same time because it's easier to only have two supported combinations vs four.
The Bazel infrastructure doesn't currently support all of the configurations the Gyp one does, which I'm working on. I want to finish that before getting rid of the Gyp stuff. Austin has successfully used Bazel to download code to a robot though.
Upgrading a Debian machine is generally pretty easy, and they have good instructions. Some people prefer reinstalling from scratch too.
I recently created a bazel mirror on our Gerrit to keep track of which version we're using. We might do some reviews there, but my release process is mostly picking a version and then cherry-picking/reverting a few commits so it works.
Feel free to contact me with any questions,
Brian Silverman
2015-11-01: Follow on to Austin's 2015-10-28 message - From Phil Schrader
I've updated the Vagrantfile to install the packages (including bazel) that Austin's mentioned.
Find it here: https://robotics.mvla.net/svn/frc971/2016/trunk/src/vagrant_dev_vm

If anyone has a chance, to try it out, please let me know!

I have not yet tried building robot code, but I should get around to that tonight or tomorrow.

2015-10-28: Building on a vagrant machine notes - From Austin
You need to install openjdk8 (I used Peloton's packages) and bazel from somewhere.
Then, you need to add the following to /etc/apt/sources.list.d/llvm-3.6.list
$ cat /etc/apt/sources.list.d/llvm-3.6.list 
# llvm-3.6
deb  http://llvm.org/apt/jessie/ llvm-toolchain-jessie-3.6 main
deb-src  http://llvm.org/apt/jessie/ llvm-toolchain-jessie-3.6 main
Then, install
sudo apt-get install git clang-3.6 ruby clang-format-3.5
  (Brian added a comment on the packages: You also need python (and maybe python3) (I know python is necessary for downloading) unless something else drags that in already)

You should then be ready to check out the repo and build.

Ben Fredrickson short cheat sheet of commands is:

<text> means you should type something specific here

Get the code on a new computer:
git clone https://<username>@robotics.mvla.net/gerrit/971-Robot-Code

If you get an "error: server certificate verification failed. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none while accessing https://<username>@robotics.mvla.net/gerrit/971-Robot-Code/info/refs" error, turn off GNOME Keyring control with
You can put this in your ~/.bashrc file if you want to. 

If you get "error: server certificate verification failed. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none while accessing https://michael@robotics.mvla.net/gerrit/971-Robot-Code/info/refs" error, you can turn off SLL certificate verification for GIT by using
     export GIT_SSL_NO_VERIFY=1
This can be put in ~/.bashrc if you want. 

Before making any changes in the code, make new branch to work on:
git checkout -b <username>/<project title>
The project title can be anything you want.  It is local to your copy of the git project. 

Add your new and changed files:
git add <list of file names>

Commit changes locally:
git commit -m "<project title>: <description>"

Push your changes to the server for backup and sharing:
git push origin HEAD:unreviewed/<username>/<project title>

To get these changes from the server to work on, 
git fetch origin unreviewed/<username>/<project title>
git checkout -b new_branch_name # where new_branch_name is whatever local name you want to give this branch.

Making a code review:

Make sure your master is up to date and you are on your branch. 

git co master
git pull origin master
git co -

Rebase all your changes onto master:
git rebase -i master
Here you should squash all your commits into a single commit for review. In the menu that pops up change all the commit line to "squash" except the first line which should be left as "pick".

Now push your commit  for review:
git push origin HEAD:refs/for/master

If this works you are done.

If the following command is in the error:
gitdir=$(git rev-parse --git-dir); scp -p -P 29418 <username>@robotics.mvla.net:hooks/commit-msg ${gitdir}/hooks/
you can use it if the network you are on will allow port 29418 access to the school.  If it does not work, then run this one instead:
gitdir=$(git rev-parse --git-dir) && curl --insecure -u <username> -o ${gitdir}/hooks/commit-msg https://robotics.mvla.net/gerrit/tools/hooks/commit-msg && chmod +x ${gitdir}/hooks/commit-msg
The first one works for anybody who has a gerrit account and the scp part of the command connects to the gerrit ssh server on port 29418.  Port 29418 is not available on some corporate networks and the NASA guest network so use the second option with https for those networks.  Jack opened port 29418 for the team to use to on February 7, 2015.
Then run:
git commit --amend
And try the push again:
git push origin HEAD:refs/for/master

Adding changes to existing code review:  (TODO this part is incomplete. git rebase master again?)
git checkout <your branch that is in review>
Make your changes.
git add <files>
git commit --amend
git push origin HEAD:refs/for/master 

Brian gave me the following command as I was trying to change code on the robot and needed to do a git update.
   `git add` any changes you want to keep, then `git stash --keep-index` 

Checking out the latest code

Ask Brian or Austin what code you should be using.  They will give you a link like 
Browse to that link and click on the "Download" tab in the upper right hand corner of the page.  Then copy the downlaod checkout command by clicking on the copy to clipboard icon on the right.  Paste that into your linux terminal.  This will "fetch" the version you want and checkout the code. 

The outstanding changes can be viewed on Gerrit here.  

Building the code

From the top level, run build.sh to compile the code for your laptop running amd64 and the roboRIO running arm.

Running the code on the robot

Parker and Michael suspect that you run 
  frc971/prime/build.sh deploy
to copy the code to the robot.  We think there might be some options to choose which robot to compile and download code to.  Once the code is deployed, the robot will restart itself  If the "Robot Code" light on the driver's station turns red, reboot the roborio (that's a known issue that Brian will work on some time).

If the code does not start up when the robot is turned on, Austin says "You need to run the frcEnableTBLStartupApp.sh

script in /usr/local/frc/bin".  It will enable starting code when the robot is turned on.

"Then copy the aos/config/robotCommand script to /home/lvuser"

The robot code can be started by hand with: 
 ssh admin@roboRIO-9971.local PATH=$PATH:robot_code starter_exe robot_code/start_list.txt

To restart the robot code run:
touch /home/admin/robot_code/core 

Running the code

Create a fresh log file on the robot with
  touch ~/robot_code/binary_log_writer

Use this to rebot the robot:
   shutdown -r now 

Commands for looking at the robot logs
   cd /media/sda1    # Use "mount" to figure out where the external USB drive for logs is mounted.
   ~/robot_code/log_displayer -f -l DEBUG -n fridge | fgrep .Position

# actually, you probably want something from .Status .  Depends if you want encoder value, potetiometer value, zeroed value, or something else.  I used the following to check the elevator height zeroing.  The elevator timing belt teeth are 0.009 m apart (9 mm).  Errors in the elevator height that are multiples of this are due to the timing belt skipping.
   ~/robot_code/log_displayer -f -l DEBUG -n fridge | fgrep .Status 

# Use the following to see a list of flags for the log_displayer routine.
~/robot_code/log_displayer --help

~/robot_code/log_displayer -f    # Shows the log file. 
# log_displayer -f will show you edges on the buttons
# The "-f" says to follow the log file as it is being generated.  This is useful for seeing what is going on on the robot as you are view the log file output.  If the 2014 shooter is e-stopped, the output will say so repeatedly in the "-f" output.
# If you want to see the current state of the buttons every time it gets read, then run
log_displayer -f -l DEBUG -n wpilib_interface.DSReader | joystick_state

We use PNY Turbo 64GB USB 3.0 Flash Drive - P-FD64GTBOP-GE for the log files.  They cost $20 each.

Working with and Changing robot code

To change the height of the fridge after the robot deposits a stack on the platform or make some other such change.  Looking in files like frc971/joystick_reader.cc and/or frc971/actors/score_actor.cc.  The first one passes parameters (i.e. the ending height of the elevator) to the score_actor.cc code which uses them to move the robot elevator and arm around.


Configuring a Debian Computer to Connect to the roboRIO

To be able to connect to the 2015 robot, the router must be running mdns (bonjour) also called zero-conf according to Phil.

The Bonjour Support page says to install it with 
     sudo apt-get install avahi-daemon libavahi-compat-libdnssd1 mdns-scan

# Use mdns-scan to search the network for devices.

# Use ssh to connect to the admin user on the robot.  The password is blank.
     ssh admin@roboRIO-9971.local

# To configure the computer so that the wireless network is the default network, add the line "never-default=true" to the IPV4 section of the file
   /etc/NetworkManager/system-connections/Wired\ connection\ 1

Restart the network with
    /etc/init.d/network-manager restart

This will put the entry at the bottom of the resolv.conf file:
     cat /etc/resolv.conf

# Generated by NetworkManager

I found this approach described in the Setting Default Ubuntu eth port post.

In a pinch, the default route can be set by hand.  Check the default route with
    ip route default

    default via dev wlan0  proto static dev eth0  proto kernel  scope link  src dev wlan0  proto kernel  scope link  src 

Change the default route by deleting it and then remaking it.

     ip route del default
     ip route add default via

Use the following command to set up the eth0 network:
sudo /sbin/ifconfig ethp netmask

To let Brian login to a laptop that is behind a firewall, run
ssh -R 2222:localhost:22 michael@robotics.mvla.net -f -N
This will start a connection that will stay active as long as the network stays up.  Brian can then login to robotics.mvla.net and connect to his "brian" account on the laptop behind the firewall with:
ssh -p 2222 brian@localhost


Configuring the Driver Station and Linksys Router

It appears that there needs to be a DHCP server running for the networking to work.  Parker and Michael were able to do this on 3/23/15 by using the National Instruments Bridge Configuration Utility and setting the SSID to 9971 and the password to Axxxxx15.  We set the router to have the same settings using AES only and Wireless N only.  The driver station was set to use DHCP too.

General Notes

The notes from here to the bottom of the page are from the 2014 season.  They will be updated for the 2015 season after I install the FRC software.
The first few times that I installed FRC software on team computes, I installed the NI software and the NI and WPI lib update as described in the second set of directions below.  On Sept 13, 2014, I read in the page that 
  • The Installing the 2014 FRC NI Update (for ALL TEAMS) page explains that all that is needed is the NI Update.  We don't have to install anything else to program the robot in C++, run the driver station, flash the cRIO, or run the FRC Bridge configuration tool.  I installed the NI "FRC 2014 Update Suite, Download Only" only from http://ni.com/frc. Installed it on a Windows 7 machine and it worked fine.  Use 00303x87M bkwds. 
  • This year the NI updates have been reconfigured into a single standalone installer. This means that the FRC Driver Station, cRIO Imaging Tool and other utilities such as the Camera Configuration Tool will all be bundled into a single installer which will not require any components from the DVD. The LabVIEW update is also included in this installer and will install if a LabVIEW installation is detected. To use the DS and Imaging tool all teams must install the 2014 NI Update.

  • The Programming your radio for home use guide shows how to use the 2013 FRC Bridge Configuration Tool software to configure your robot's wireless bridge for use outside of FRC events. b  It appears that they are using the 2013 tool for the 2014 season.  Somewhere it said the tool should be in the Start menu, but I did not find it there.  I did find it at C:\Program Files\National Instruments\LabVIEW 2013\project\FRC Bridge Tool\FRC Bridge Configuration Utility.exe.  When I ran it the first time, it took me to the Java download page and so I installed Java.  I made a link to this tool on the desktop.

Here are my notes from installing the FRC software before I figured out that I don't need to install the National Instruments or WPI Lib software (see my notes above).

The 2015 FRC Software Component Overview page directed me to the Installing the FRC 2015 Update Suite page to find the download and install instructions for the roboRIO imaging software and driver station software.  The Installing the FRC 2015 Update Suite page said that all we needed to install is the driver station software and utilities including the imaging tool.  It said that the FRC 2015 Update Suite includes the runtime parts needed to run the driver station software and utilities.  I installed the contents of the FRCUpdate2015.0.0.zip file on FRC 2014-4 on 2/11/15.
The FRC 2015 Update Suite directed me to the NI FRC page for more information.
2014 Notes:
The 2014 FIRST software consists of National Instruments Software and WPI/WindRiver software.  The National Instruments software has the driverstation program and cRIO imaging software in it.  The WPI/WindRiver software has the image FRC_2014_v52.zip image in it which is used to flash the cRIO from the NI software.  We roll our own C++ code so we don't use anything else from the WindRiver software.
For the 2014 season, we did the following to set up the laptop we use to image the cRIO and the drivers station laptops.
  • Uninstall the 2013 NI and WindRiver software.  The NI uninstaller is obvious but the WindRiver one is not.  The WindRiver uninstaller has the name "Maintenance Tool" and the WindRiver icon.  Some people recognize the icon.  If you can't find it, go to Start/WindRiver and use the uninstaller located there.
  • Install the "Vision" only half of the NI software from the DVD they sent us in the kit of parts.  I installed this software with the computer connected to the internet so that the software key would be validated.  Use the software key that is printed on the back of the envelope the software was shipped in.  I ran the update tool that came up automatically.  I installed the NI "FRC 2014 Update Suite, Download Only" only from http://ni.com/frc. Installed it on Win XP Pro machine and it worked fine.  If you only install the FRC 2014 Update Suite without installing the "Vision" software from the DVD, the cRIO imaging tool will see the cRIO and appear to be working but not get past the "Rebooting the cRIO" screen.  Again, use the software key that is printed on the back of the envelope that the software was shipped in for the update.
  • This WPI lib page has a link to the software update for WPILib Workbench  http://first.wpi.edu/FRC/c/update/Release/ .  The WindRiver software installs the FRC_2014_v52.zip image in /WindRiver/WPILib/cRIO_Images.  I copied it to my desktop.  On Aug 23, 2014, I downloaded WorkbenchUpdate20140325rev3887.exe with March 25, 2014 date.
  • I set the IP address to the download computer to and the netmask to and turned the firewall off so that the cRIO imaging software would find the cRIO.  The imaging tool was able to find the cRIO at with the computer at but could not communicate enough to get set up for the download.  It did show the IP address on the cRIO so I was able to reset the computer's network to the same subnet.

The 2013 FRC Bridge Configuration Tool software to configure your robot's wireless bridge for use outside of FRC events. This WPI page talks about it and tells how to download it.  It appears that they are using the 2013 tool for the 2014 season.  It said the tool should be in the Start menu, but I did not find it there.  I did find it at C:\Program Files\National Instruments\LabVIEW 2013\project\FRC Bridge Tool\FRC Bridge Configuration Utility.exe.  When I ran it the first time, it took me to the Java download page and so I installed Java.  I made a link to this tool on the desktop.


Michael Schuh
Feb 15, 2014
Aug 23, 2014 - installed on FRC 2014-4 Nickel and updated the install notes.  Added Bridge Configuration Tool notes.