210 likes | 398 Views
How to Control a Robot. Kickoff 2011. Why, How, Where?. Sense, think, act Robot, laptop, your brain. Game. Robot. Human. Internal Sensors. Game State. External Sensors. Robot’s Software. Robot’s Actions. Score. Human Senses. Drivers Brain. User Interface. Moving in a Circle.
E N D
How to Control a Robot Kickoff 2011
Why, How, Where? • Sense, think, act • Robot, laptop, your brain Game Robot Human Internal Sensors Game State External Sensors Robot’s Software Robot’s Actions Score Human Senses Drivers Brain User Interface
Moving in a Circle public void UserControlledCode() { while (true) { if (robot.isAutonomous == false) { lock (studentLock) { if (true) { //Ignore leftMotor.motorSpeed = 100; rightMotor.motorSpeed = -50; } Robot’s Software Robot’s Actions
Types and Variables • Declare : double x; • Assign : x = 3.5; • Use : int y = x; z = 8 - y + x; x = x + y; • = is assignment (not equals) • C#: Value type vs. Reference type • C# is case sensitive
Avoiding Obstacles Button = new InputPort((Cpu.Pin)FEZ_Pin.Digital.IO4, true, Port.ResistorMode.PullUp); if (Button.Read()) { leftMotor.motorSpeed = -60; rightMotor.motorSpeed = -30; Thread.Sleep(1000); }
More Avoiding Obstacles External Sensors Robot’s Software Robot’s Actions
Program Flow • Decision • Consequences Code Code Should I fire the balls? Should I fire the balls? True True False False Fire the Balls Reload the Shooter Fire the Balls More Code More Code
Program Flow if (isFiring) {shooter.shoot()} if (isFiring) {shooter.shoot()} else {shooter.reload()} if (condition1) {consequent1} else if (condition2) {cosequent2} else {alternative} • Use to change behavior depending on input
Tank Drive //-100<=motorSpeed<=100 //0<=Joystick values<=255 leftMotor.motorSpeed = ((double)(robot.UIAnalogVals[1] - 128) * 100 / (double)128); rightMotor.motorSpeed = ((double)(robot.UIAnalogVals[3] - 128) * 100 / (double)128);
More Tank Drive External Sensors Robot’s Software Robot’s Actions Human Senses Drivers Brain User Interface
Using Objects Cat john = new Cat(10); intjohnsMass = john.Eat(5); john.Purr(); john.name = "Johnny"; john.name = "John"; Console.WriteLine(john.name); Console.WriteLine(johnsMass);
More Objects • To create: new Type(arguments, ...); • Field or Property: variableName.member • Methods: variableName.member(argument,...)
Robotic Objects • Declare Objects here public class StudentCode { // Variables private Robot robot; private SimpleMotorControllerrightMotor; private InputPort Button; //More code
More Robotic Objects • Instantiate Objects here public StudentCode(Robot robot) { Button = new InputPort((Cpu.Pin)FEZ_Pin.Digital.IO4, true, Port.ResistorMode.PullUp); leftMotor = new SimpleMotorController(robot, "COM1", 13); rightMotor.motorBrake = 0;
Arrays myArray[] • To Create: int[] myArray = new int[5]; • To access elements: variableName[index]; • Size: myArray.Length • myArray[0] = 12; • Arrays are 0 indexed myArray[0] myArray[1] myArray[2] myArray[3] myArray[4]
Relational and Equality Operators • Turn numbers into booleans
Boolean Operators Exercise: (!(12-3 > 8) && (3*5 == 15)) || ( !(17 < 18) || true) if ( (time <= 30) && !(mode == 2) ) { driveForward(); }
Tracing a Polygon inti = 0; while (i < 5) { leftMotor.motorSpeed = 50; rightMotor.motorSpeed = 50; Thread.Sleep(1000); leftMotor.motorSpeed = -50; Thread.Sleep(500); i++; }
Tracing a Polygon for (inti = 0; i < 5; i++) { leftMotor.motorSpeed = 50; rightMotor.motorSpeed = 50; Thread.Sleep(1000); leftMotor.motorSpeed = -50; Thread.Sleep(500); }
Loops initialize while (condition) { body postBody } for (initialize; condition; postbody) { body }
User Controlled Code public void UserControlledCode() { if (robot.isAutonomous == false) { lock (studentLock) { //All code for the teleoperated period goes here. It is in an infinite while loop so it is continuously executed. } } }