2010 control systems all we are saying… …is give c a chance! presented by: frank larkin lansdale...

Post on 28-Dec-2015

214 Views

Category:

Documents

1 Downloads

Preview:

Click to see full reader

TRANSCRIPT

2010 Control Systems

All we are saying…

…is give C a chance!

Presented By:

Frank Larkin

Lansdale Catholic Robotics, Team 272

Radnor PA, Dec. 2010

Development Cycle

Joy

Pain

Time – Lots Of It!

A brief moment of optimism usually

followed by a crushing downfall!

Warning: DO NOT BE FOOLED!

Big Al says…

Goals• Get you to the other room if you

want to learn Labview. • Get a good understanding of what

the new control system can and cannot do.

• Get a good understanding of how to program in C++– Be able to create your own classes to

allow multiple threads for development.

• Get a good understanding of Wind River. – How to edit, debug and load new code

via Flash or FTP to the robot.

• Learn how to get autonomous working

How will we do it?• Discuss C++

– No rat holing on C++ theory. – Too much for this venue– 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.

• Hands On– Play utill it is time to leave.

Control System Overview

CompactRIO

WiFiBridge

SpeedController

SpeedController

SpikeRelay

DigitalSensor

AnalogSensor

DigitalSide Car

AnalogBumper

Solenoid

PneumaticsBumper

Software OverviewThe WPI Robotics Libraries

• Sensors– Accelerometer, Encoder, Gear Tooth, Gyro,

Compass, I2C, Ultrasonic

• Actuators– Compressor, Motor (Victor, Jaguar), Relay, Servo,

Solenoid

• I/O– Analog Channel, Analog Trigger, Digital Input,

Digital Output, PWM

• Driver Station– Joystick (Complete set of Axes and Buttons),

Analog Input, Digital Input, Digital Output, Driver Display, Mode, Alliance, Battery Voltage, Dashboard

• Utility– Counter, PID, Drive (Tank, Arcade, Holonomic),

Time, cRIO LED, cRIO Temperature

• Vision– Camera, Tracking, Image Processing

Modes Of Operation• Disabled Mode: Before a match

begins, robot outputs (motors) are not active. Robots can be programmed to initialize. Driver controls are active.

• Autonomous Mode: During the first 15 seconds of a match, driver inputs (joysticks) are not active. Robots can be programmed to use outputs (motors) and sensor inputs (encoders, gyros) for autonomous operation.

• Teleoperated Mode: During the remaining 120 seconds of a match, all inputs and outputs are active. Robots are programmed for driver control.

Program PhilosophyThe Big Loop

ReadDriverStation()

Process DataRobotThink()

WriteOutputs()

ReadSensors()

If (autonomous)doAuto()

C++• Software Development Cycle

– Create Source Code• Type ideas into files• Multiple authors of different components

– Compile and Link program• Compile – Read source code for each file,

create object .obj for it. • Linker - combine each object into and

executable file.

– Download Executable to RAM– Run and Debug

• LabVIEW Input/Output Available on vi Front Panel

• C++ WindRiver Debugger• C++ Output Available in Console

– Download Debugged Executable to Flash

– Reboot cRIO• Power Cycle or CTRL-X in Terminal

– Run

Quick Tour of C++• File extensions end in .cpp and .h• C++ can use classes

– Bundle all of a things, things into a single thing.

• Example: a joystick has, X, Y & Z variables and many buttons.

Joystick->GetX();

– You can get to those “things” if they are public or they can be private. You then use methods to set values, get values. start processes, stop processes etc.compressor->start();

• C++ uses static constants and functions which must be referred back to the original class they were part of.

• In C++: LCRobots::MacLeftMotor

• 3 Requirements to use variables– Define Servo *my_servo;

– Initialize my_servo = new Servo(5);

– Use my_servo->Set( my_leftStick->GetZ() );

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) : m_servo(5), m_leftStick(), m_rightStick(),

m_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

• Which is correct?IterativeDemo(void){

printf("IterativeDemo Constructor Started\n");

my.p_servo->set(0.0);

my.p_servo = new Servo(5);

};

• What happens if you do it wrong?– It will compile– The DS 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

Discoveries• Floating point power ranges

– Stated as range is -1.0 to 1.0 with 0.0 being stop.

• Declare: Victor p_LeftMotor; // pointer• Initialize: p_LeftMotor=> new Victor(2);• Use: p_LeftMotor->Set(0.0); //

stop

– Forward and Back are relative• 2 motors side set to (1.0) are running at

full power. But what direction?– All relative to the motors position.

– Turn one around who is forward and who is back.

– Joysticks Y axis • Backwards to what you might think?• Push forward get a value of -1.0. • Pull back get 1.0

– Easy to reverse motor in code.• f_WinchPower = .50;• p_RightWinch->Set(f_WinchPower);• p_LeftWinch->Set(-f_WinchPower);

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);

• Turns analog range of 1.0/ -1.0 to 0.0/1.0

• Use excel to help figure out value ranges

Discoveries• Using Wind River

– Put all you variables into a structure. Then the intellisense works.

typedef struct {Victor *p_FrontLeftMotor;Victor *p_FrontRightMotor;Victor *p_RearLeftMotor;Victor *p_RearRightMotor;

Joystick *p_RightDriverStick; Joystick *p_LeftDriverStick;

int i_FrontSonar;

float f_FrontLeftMotor;float f_FrontRightMotor;float f_RearLeftMotor;float f_RearRightMotor;

}struct_robotVars;

struct_robotVars my;

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 your done, get back and make it work!

top related