Upload
hannah-hill
View
223
Download
0
Tags:
Embed Size (px)
Citation preview
2014 FRC Robot C++ and JAVA
Two languages saying the same thing but
differently!!!!
Presented By:
Frank Larkin
Lansdale Catholic Robotics, Team 272
Philadelphia PA, Dec. 2014
Goals• Get a good understanding of what
the new control system can and cannot do.
• Get a good understanding of how to program in C++ and JAVA– Be able to create your own classes to
allow multiple threads for development.
• See different programming designs for the FRC robot.
• Learn how to get autonomous working
How will we do it?• Eat donut holes and then lunch!• Discuss C++ and JAVA– No rat holing on theory. – Exchange cards, get phone numbers and
email• Review online resources– Forums, Wiki, bla bla• Review beta code to explore
possibilities– Get many flavors of the same thing. – Touches many of the approaches
available to you– See how other accomplished– Shamelessly steal their stuff.• Thought Games– I ask, you figure it out. Fun!!!! • Hands On– Play until it is time to leave.
FRC Robot Hardware
• Google:FRC robot control system picture
• https://decibel.ni.com/content/docs/DOC-30419
• http://team358.org/files/programming/ControlSystem2015-2019/
C++ and JAVA• Both languages are similar…
– Both are somewhat human readable.– Both follow a very similar syntax.– Both are object oriented
• Both allow you to declare variables– Integer, long, short, float, double
• All numbers that reserve different amounts of space. – Character, string
• A way to store letters and words. Not really used too much in robots but we can.
– Google: [language] operators• A million Internet sites discuss this topic.
• Both are extensible and use something called a class– Bundle all of a things, things into a
single thing.
– A class’s “things” can be public or they can be private. If private you use public methods to set values to them or get values from them.
– Classes can inherit other classes
Programming Lexicon• Object
– Objects are definitions of things you can use in programming you robot. All objects have state and behavior. They define behavior with the outside world through methods.
• Class– A class is the blueprint from which individual objects are
created.
• Inheritance– Different kinds of objects often have a certain amount in
common with each other. Object-oriented programming allows classes to inherit commonly used state and behavior from other classes.
• Interface (Java only) (just another class in C++)– In its most common form, an interface is a group of related
methods with empty bodies.
• Variable– A way to associate some information with a name that we
can use in our programs. Some variables are created as static and once created cannot be changed.
• Package (Java only) (header file (.h) in C++)– A package is a namespace that organizes a set of related
classes and interfaces. Conceptually you can think of packages as being similar to different folders on your computer.
Class Inheritance• One class can “inherit”
everything from another class
• People are several inherited classes.
• class mammal– Methods: GetAge(), SetAge(),
GetHeartBeat(“bpm”)
• class human extends mammal – Methods: GetName(), SetName()
• class student extends human– Methods: SetGrade(),
GetGrade()– Human.GetAge() still works.
How Many Classes?
• http://www.wbrobotics.com/javadoc/index.html?edu/wpi/first/wpilibj/package-summary.html
• http://wpilib.screenstepslive.com/s/3120/m/7912
FRC Class ExampleJoystick
Question??????• What “things” would you
expect from an object called a joystick?
FRC Class ExampleJoystick
• What “things” would you expect from an object called a joystick?– Buttons
• Trigger• Top• Other user buttons
– Various Axis controllers• X = side to side• Y = forward and back• Z = twist or variable level
KISS
• Class variables – Public – Everyone can get to them. – Private – You decide who gest to them
using set and get.
…a dazzling triumph for aerospace designer and maverick genius Burt Rutan. ... SpaceShipOne' s "pressuriza- tion" system is essentially a couple of corks.
Motor Basics: Java Examples
import edu.wpi.first.wpilibj.Jaguar;import edu.wpi.first.wpilibj.Victor;import edu.wpi.first.wpilibj.Relay;
// creating a Jaguar referenceJaguar motor1 = new Jaguar(1); // default digital module, channel 1// setting the desired speed (range of - 1.0 to 1.0)motor1.set(0.5);
// creating a Victor referenceVictor motor2 = new Victor(2); // default digital module, channel 2// setting the desired speed (range of - 1.0 to 1.0)motor2.set(0.25);
// creating a Relay reference// allowing forward direction only// default digital module, channel 1Relay motor3 = new Relay(1, kForward);;// setting the motor to on and offmotor3.set(kOn);motor3.set(kOff);
Motor Basics: C++ Examples
#include “WPILib.h”;#include <Jaguar.h>;#include <Victor.h>;#include <Relay.h>;
// creating a Jaguar reference// default digital module, Jaguar *motor1 = new Jaguar(1); //channel 1// setting the desired speed (range of - 1.0 to 1.0)motor1- >Set(0.5);
// creating a Victor referenceVictor *motor2 = new Victor(2); //channel 2// setting the desired speed (range of - 1.0 to 1.0)motor2- >Set(0.25);
// creating a Relay reference, // allowing forward direction only// default digital moduleRelay *motor3 = new Relay(1, Relay::kForward); // channel 1// setting the motor to on and offmotor3- >Set(Relay::kOn);motor3- >Set(Relay::kOff);
Sensor Basics: Java Examples
import edu.wpi.first.wpilibj.AnalogChannel;import edu.wpi.first.wpilibj.DigitalInput;
// Create a reference to an analog sensor// default analog module, channel 1AnalogChannel sensor1 = new AnalogChannel(1);
// Get the average voltage from the analog sensordouble voltage = sensor1.getAverageVoltage();
// Create a reference to a digital sensor// default digital module, channel 1DigitalInput sensor2 = new DigitalInput(1);
// Get the value from the sensorboolean value = sensor2.get();
Sensor Basics: C++ Examples
#include <AnalogChannel.h>#include <DigitalInput.h>
// Create variable pointers for sensorsAnalogChannel *sensor1;DigitalInput *sensor2;
// Initialize the analog sensor// default analog module, channel 1sensor1 = new AnalogChannel(1);
// Get the average voltage from the analog sensorfloat voltage = sensor1->GetAverageVoltage();
// Create a reference to a digital sensor// default digital module, channel 1sensor2 = new DigitalInput(1);
// Get the value from the sensorUINT32 value = sensor2->Get();
Differences between C++ and JAVA
• Java – Import
• Brings in external packages or classes to make it available to your code.
• C++– #include
• Preprocessor directive that brings in external definitions to make them available to your code
• Actual code is recompiled into libraries and linked in later
– C++ Variables must be declared and then initialized (2 steps)
– What is this ?? • ->
C++• Pointers vs Local Declarations
– Pointers – References to things in memory• Possibly looks cleaner• How most examples are being done.
– Declarations – The things in memory• No need for pointers but a little more complicated
– Why do I care?• You will see code described both ways. Do not be afraid
embrace them.
• Declaration Section:class IterativeDemo : public IterativeRobot
// Declare variable for the robot drive systemServo *p_servo;
Note: * means this is a pointer!
• Initialization Section:IterativeDemo(void)
printf("IterativeDemo Constructor Started\n");p_servo = new Servo(5);
• Usage:p_servo->Set(.50); p_servo->Set(p_leftStick->GetZ());
Declared Example• Declaration Section:class IterativeDemo : public IterativeRobot
// Declare variable for the robot drive systemServo m_servo;Joystick m_leftStick;Joystick m_RightStick;Joystick m_OperatorStick;
• Initialization Section:IterativeDemo(void) : servo(5), leftStick(), rightStick(),
operatorStick()
• Usage:m_servo.Set( leftStick.GetZ() );
• How do I keep it all straight?– Liberal use of variable prefixes can help.
• p_servo, p_leftJoystick; = pointers• i_count = integer (not a pointer)• ip_speed = integer pointer (may never see this).• f_motorPower = floating point variable• M_stuff = member variable (used in many beta
examples)– This should scare you…..
• p_servo.Set(5);
Death By Pointer
• Java uses pointers under the covers. http://javadude.com/articles/passbyvalue.htm
Java makes sure you cannot hurt yourself.
• What happens if you do it wrong?– It will compile– The Driver Station will show Ok– It will not run.– “Slow Blinking LED of Doom!”
Death By Pointer• Startup of program on cRIO
Exception current instruction address: 0x012eb5c8Machine Status Register: 0x0000b032Data Access Register: 0x537fb81bCondition Register: 0x20000048Data storage interrupt Register: 0x40000000Task: 0x1307e98 "FRCRobotTask"0x1307e98 (FRCRobotTask): task 0x1307e98 has had a
failure and has been stopped.
0x1307e98 (FRCRobotTask): fatal kernel task-level exception!
Welcome to LabVIEW Real-Time 8.5.1Indicator Mode changed... Slow Blink
• Driver Station shows correctly
• Do not panic over the slow blink of death!– May be a pointer issue. Do a code review
looking for illegal use of pointers.p_servo.Set(0.0); // p_ indicates pointer!!!p_servo->Set(0.0); // correct
Good Boot Up
• Startup of program on cRIO
Resync command from DS...Resync command from DS...Enabled!Booting watchdog!Indicator Mode changed... Steady OnWPILib was compiled from SVN revision 1330:1345Spawned FRCRobotTask (0x12f7b70)RobotIterativeBase Constructor StartRobotIterativeBase Constructor FinishIterativeDemo Constructor StartedIterativeDemo Constructor CompletedRobotIterativeBase StartCompetition() CommencedTeleop_Init() completed
Welcome to LabVIEW Real-Time 8.5.1
Making It All WorkInputs with Java
// Declaration and Initialization in one step
DriverStation m_Dstation = new DriverStation.getInstance();
Joystick m_DriverStick = new Joystick(1);
Joystick m_OperatorStick = new Joystick(2);
// Use
float f_DYAxis = m_DriverStick.getY();
float f_DXAxis = m_DriverStick.getX();
float f_DTrigger = m_DriverStick.getTrigger();
int i_AutoMode = m_Dstation.getAnalog(1);
Making It All WorkInputs with C++
// Declaration
DriverStation *p_DStation;
Joystick *p_DriverStick;
Joystick *p_OperatorStick;
int i_AutoMode;
float f_DYAxis, f_DXAxis; f_DTrigger;
// Initialization
p_DriverStick = new Joystick(1);
p_OperatorStick = new Joystick(2);
// Use
f_DYAxis = p_DriverStick->GetY();
f_DXAxis = p_DriverStick->GetX();
f_DTrigger = p_DriverStick->GetTrigger();
i_AutoMode = p_Dstation.GetAnalog(1);
Later inputs are fed to outputs.
Making It Work• Floating point power
ranges– Percentage of power
• Stated as range is -1.0 to 1.0 with 0.0 being stop.
– Forward and Back are relative• 2 motors side by side set to (1.0)
are running at full power. But what direction?
– All relative to the motors position, gearing, wheels surface top vs. bottom
– Joysticks Y axis • Backwards to what you might
think?• Push forward get a value of -1.0. • Pull back get 1.0
Inputs to Outputs
• Inputs are fed to outputs– JAVA
m_LeftDriveMotor.set(f_DYaxis)
– C++p_LeftDriveMotor->Set(f_DYaxis)
• What about the right motor?
Inputs to Outputs
• Right Motor– opposite side of the robot– Will normally have to go in
opposite direction to match left motor.
– JAVAm_LeftDriveMotor.set(f_DYaxis)
m_RightDriveMotor.set(-f_DYaxis)
– C++p_LeftDriveMotor->Set(f_DYaxis)
p_RightDriveMotor->Set(-f_DYaxis)
Cooking The Inputs
• Sometimes we “cook” the inputs– Joystick gives us percentage of
power. 1.0 to -1.0
float tmp = my_joystick.getY();
– Squaring: multiply input by itself
driverY = tmp * tmp;
– Qubing: multiplying input 3 times
driverY = tmp * tmp * tmp;
• What will this do?
Cooking The Inputs
Discoveries• Simple math is your friend!• Joystick “twist” comes in a
GetZ()– Range 1.0 to -1.0– What does this do?
my.f_Power = ((-my.p_LeftDriverStick->GetZ() / 2) + 0.5);
• Use excel to help figure out value ranges
Robot Class Types• SimpleRobot
– A simple robot base class that knows the standard FRC competition states (disabled, autonomous, or operator controlled).
– You can build a simple robot program off of this by overriding the robotinit(), disabled(), autonomous() and operatorControl() methods.
– The startCompetition() method will calls these methods (sometimes repeatedly). depending on the state of the competition.
– Alternatively you can override the robotMain() method and manage all aspects of the robot yourself.
• Google: frc2168 FRC robot
Robot Class Types• IterativeRobot (JAVA)
– implements a specific type of Robot Program framework, extending the RobotBase class.
– The IterativeRobot class is intended to be subclassed by a user creating a robot program. This class is intended to implement the "old style" default code.
import edu.wpi.first.wpilibj.IterativeRobot;
public class MyRobot extends IterativeRobot
public void robotInit() …
public void disabledInit() …
public void disabledContinuous() …
public void disabledPeriodic() …
public void autonomousInit() …
public void autonomousContinuous() …
public void autonomousPeriodic() …
public void teleopInit() …
public void teleopContinuous() …
public void teleopPeriodic() …
Robot Class Types• IterativeRobot (C++)class My2011Robot : public IterativeRobot
// data member declarations …
public:
MyRobot(void) // constructor
void RobotInit() // initialization
void DisabledInit() …
void DisabledContinious() …
void DisabledPeriodic() …
void AutonomousInit() …
void AutonomousContinious () …
void AutonomousPeriodic() …
void TeleopInit() …
void TeleopContinious () …
void TeleopPeriodic() …
// team-specific methods …
;
START_ROBOT_CLASS(My2011Robot);
Robot Class Types• IterativeRobot
– FMS tells code which mode be in at any time, disabled, autonomous or teleop.
– Code runs in fast loop• Too fast for sensors• Continuous routines are called in
every loop, good or bad?
– 50 times per second code drops into appropriate Periodic function. (Called polling)
• F-117 only polls 40 times per second!
– When FMS switches state, init function is run only once.
– When robot first boots up what state are we in?
LC Approach• Variables
– Put all your variables into structure (C++) or a class (Java).
– input – All your input variables– sensors – All non-driver station
sensors– fbw – Fly by wire. Inputs are
manipulated and saved in bfw structure
– Output – all outputs
• Major Code sections– GetDSInputs()
• Read in and cook DS variables into fbw variables
– GetRobotSensorInputs()• Read in all non DS sensors
– Robot Think()• Decide what to do. Manipulate
inputs to FBW variables– ProcessOutputs()
• Update outputs with fbw variables
LC ApproachTeleoperated
void LC2013::TeleopPeriodic(void)
// feed the user watchdog at every period
GetWatchdog().Feed();
GetDSInputs();
GetRobotSensorInputs();
RobotThink();
ProcessOutputs();
// increment the number of teleop periodic loops completed
tele_periodic_loops++;
LC ApproachAutonomous
void LC2013::AutonomousPeriodic(void)
// feed the user watchdog at every period
GetWatchdog().Feed();
m_autoPeriodicLoops++;
autoStatus.i_AutoLoops++;
ZeroDSInputs();// zero out inputs
GetRobotSensorInputs();// ask the robot what it sees
// figure out and run what auto program to set fbw values
AutoDispatcher();
RobotThink();// allow processing of settings just like normal
ProcessOutputs();// set the outputs
PrintDiag(1);// force diag to show autonomous.
Look At Other’s Code
• Google: frc399 james-bot– Many classes– Autonomous
Batch Files• Use batch files to quickly
change computer ethernet connection. – You must know what your
connection is called.
netsh Command• netsh – used to set network
parametersCommand: netsh /? To see
parameters
• Example: Set interface to Crio
Note: In the example above the netsh command is on the same line!
@echo offecho Setting the Ip to CRIO network 10.2.72.6.
netsh interface ip set address name="Local Area Connection" static 10.2.72.6 255.0.0.0
pause
Many batches• Set to camera
• Set to DHCP
Note: All the above commands are set on the same batch line.
netsh interface ip set address name="Local Area Connection" dhcp
netsh interface ip set address name="Local Area Connection" static 10.2.72.3 255.0.0.0
Final ThoughtUnlike baseball crying is allowed in
software development… but …
…when you’re done, get back and make it work!