|
|||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Object lejos.robotics.proposal.DifferentialPilot
public class DifferentialPilot
The DifferentialPilot class is a software abstraction of the Pilot mechanism of a
NXT robot. It contains methods to control robot movements: travel forward or
backward in a straight line or a circular path or rotate to a new direction.
Note: this class will only work with two independently controlled motors to
steer differentially, so it can rotate within its own footprint (i.e. turn on
one spot).
It can be used with robots that have reversed motor design: the robot moves
in the direction opposite to the the direction of motor rotation. Uses the
TachoMotor class, which regulates motor speed using the NXT motor's built in
tachometer.
It automatically updates the Pose of a robot if the Pose calls the
addMoveListener() method on this class.
Some methods optionally return immediately so the thread that called the
method can monitor sensors, get current pose, and call stop() if necessary.
Example:
PdifferentialPilot pilot = new DifferentialPilot(2.1f, 4.4f, Motor.A, Motor.C, true); // parameters in inches
pilot.setRobotSpeed(10); // inches per second
pilot.travel(12); // inches
pilot.rotate(-90); // degree clockwise
pilot.travel(-12,true);
while(pilot.isMoving())Thread.yield();
pilot.rotate(-90);
pilot.rotateTo(270);
pilot.steer(-50,180,true);
while(pilot.isMoving())Thread.yield();
pilot.steer(100);
try{Thread.sleep(1000);}
catch(InterruptedException e){}
pilot.stop();
Field Summary | |
---|---|
protected boolean |
_alert
should be true if an immediate return movement is in progress. |
protected TachoMotor |
_left
Left motor. |
protected float |
_leftDegPerDistance
Left motor degrees per unit of travel. |
protected float |
_leftTurnRatio
Left motor revolutions for 360 degree rotation of robot (motors running in opposite directions). |
protected float |
_leftWheelDiameter
Diameter of left wheel. |
protected float |
_minRadius
|
protected int |
_motorSpeed
Motor speed degrees per second. |
protected Movement.MovementType |
_moveType
type of the current movement |
protected byte |
_parity
Motor rotation forward makes robot move forward if parity == 1. |
protected boolean |
_regulating
If true, motor speed regulation is turned on. |
protected TachoMotor |
_right
Right motor. |
protected float |
_rightDegPerDistance
Right motor degrees per unit of travel. |
protected float |
_rightTurnRatio
Right motor revolutions for 360 degree rotation of robot (motors running in opposite directions). |
protected float |
_rightWheelDiameter
Diameter of right wheel. |
protected float |
_robotMoveSpeed
Speed of robot for moving in wheel diameter units per seconds. |
protected float |
_robotTurnSpeed
Speed of robot for turning in degree per seconds. |
protected float |
_trackWidth
Distance between wheels. |
protected ArrayList<MoveListener> |
listeners
the pilot listeners |
Constructor Summary | |
---|---|
DifferentialPilot(float leftWheelDiameter,
float rightWheelDiameter,
float trackWidth,
TachoMotor leftMotor,
TachoMotor rightMotor,
boolean reverse)
Allocates a TachoPilot object, and sets the physical parameters of the NXT robot. |
|
DifferentialPilot(float wheelDiameter,
float trackWidth,
TachoMotor leftMotor,
TachoMotor rightMotor)
Allocates a TachoPilot object, and sets the physical parameters of the NXT robot. Assumes Motor.forward() causes the robot to move forward. |
|
DifferentialPilot(float wheelDiameter,
float trackWidth,
TachoMotor leftMotor,
TachoMotor rightMotor,
boolean reverse)
Allocates a TachoPilot object, and sets the physical parameters of the NXT robot. |
Method Summary | |
---|---|
void |
addMoveListener(MoveListener aListener)
Adds a MoveListener that will be notified of all movement events. |
void |
arc(float radius)
Starts the NXT robot moving along an arc with a specified radius. |
Movement |
arc(float radius,
float angle)
Moves the NXT robot along an arc with a specified radius and angle, after which the robot stops moving. |
Movement |
arc(float radius,
float angle,
boolean immediateReturn)
Moves the NXT robot along an arc with a specified radius and angle, after which the robot stops moving. |
void |
backward()
Moves the NXT robot backward until stop() is called. |
protected boolean |
continueMoving()
This method can be overridden by subclasses to stop the robot if a hazard is detected |
void |
forward()
Moves the NXT robot forward until stop() is called. |
float |
getAngle()
|
float |
getAngleIncrement()
|
TachoMotor |
getLeft()
|
int |
getLeftActualSpeed()
|
int |
getLeftCount()
|
float |
getMinRadius()
The minimum steering radius this vehicle is capable of when traveling in an arc. |
float |
getMoveMaxSpeed()
|
Movement |
getMovement()
|
float |
getMovementIncrement()
|
float |
getMoveSpeed()
|
TachoMotor |
getRight()
|
int |
getRightActualSpeed()
|
int |
getRightCount()
|
float |
getTravelDistance()
|
float |
getTurnMaxSpeed()
|
float |
getTurnRatio()
|
float |
getTurnSpeed()
|
boolean |
isMoving()
true if the robot is moving |
protected void |
movementStart()
|
protected void |
movementStop()
|
void |
reset()
Resets tacho count for both motors. |
Movement |
rotate(float angle)
Rotates the NXT robot through a specific angle. |
Movement |
rotate(float angle,
boolean immediateReturn)
Rotates the NXT robot through a specific angle. |
void |
setMinRadius(float radius)
Set the radius of the minimum turning circle |
void |
setMoveSpeed(float speed)
also sets _motorSpeed |
void |
setSpeed(int speed)
Sets speed of both motors, as well as moveSpeed and turnSpeed. |
protected void |
setSpeed(int leftSpeed,
int rightSpeed)
|
void |
setTurnSpeed(float speed)
|
void |
steer(float turnRate)
|
Movement |
steer(float turnRate,
float angle)
|
Movement |
steer(float turnRate,
float angle,
boolean immediateReturn)
|
Movement |
stop()
Stops the NXT robot. |
Movement |
travel(float distance)
Moves the NXT robot a specific distance in an (hopefully) straight line. A positive distance causes forward motion, a negative distance moves backward. |
Movement |
travel(float distance,
boolean immediateReturn)
Moves the NXT robot a specific distance in an (hopefully) straight line. A positive distance causes forward motion, a negative distance moves backward. |
Movement |
travelArc(float radius,
float distance)
Moves the NXT robot a specified distance along an arc mof specified radius, after which the robot stops moving. |
Movement |
travelArc(float radius,
float distance,
boolean immediateReturn)
Moves the NXT robot a specified distance along an arc of specified radius, after which the robot stops moving. |
protected int |
turnRate(float radius)
Calculates the turn rate corresponding to the turn radius; use as the parameter for steer() negative argument means center of turn is on right, so angle of turn is negative |
Methods inherited from class java.lang.Object |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
Field Detail |
---|
protected boolean _alert
protected ArrayList<MoveListener> listeners
protected Movement.MovementType _moveType
protected final TachoMotor _left
protected final TachoMotor _right
protected final float _leftDegPerDistance
protected final float _rightDegPerDistance
protected final float _leftTurnRatio
protected final float _rightTurnRatio
protected float _robotMoveSpeed
protected float _robotTurnSpeed
protected int _motorSpeed
protected byte _parity
protected boolean _regulating
protected final float _trackWidth
protected final float _leftWheelDiameter
protected final float _rightWheelDiameter
protected float _minRadius
Constructor Detail |
---|
public DifferentialPilot(float wheelDiameter, float trackWidth, TachoMotor leftMotor, TachoMotor rightMotor)
wheelDiameter
- Diameter of the tire, in any convenient units (diameter in mm
is usually printed on the tire).trackWidth
- Distance between center of right tire and center of left tire,
in same units as wheelDiameter.leftMotor
- The left Motor (e.g., Motor.C).rightMotor
- The right Motor (e.g., Motor.A).public DifferentialPilot(float wheelDiameter, float trackWidth, TachoMotor leftMotor, TachoMotor rightMotor, boolean reverse)
wheelDiameter
- Diameter of the tire, in any convenient units (diameter in mm
is usually printed on the tire).trackWidth
- Distance between center of right tire and center of left tire,
in same units as wheelDiameter.leftMotor
- The left Motor (e.g., Motor.C).rightMotor
- The right Motor (e.g., Motor.A).reverse
- If true, the NXT robot moves forward when the motors are
running backward.public DifferentialPilot(float leftWheelDiameter, float rightWheelDiameter, float trackWidth, TachoMotor leftMotor, TachoMotor rightMotor, boolean reverse)
leftWheelDiameter
- Diameter of the left wheel, in any convenient units (diameter
in mm is usually printed on the tire).rightWheelDiameter
- Diameter of the right wheel. You can actually fit
intentionally wheels with different size to your robot. If you
fitted wheels with the same size, but your robot is not going
straight, try swapping the wheels and see if it deviates into
the other direction. That would indicate a small difference in
wheel size. Adjust wheel size accordingly. The minimum change
in wheel size which will actually have an effect is given by
minChange = A*wheelDiameter*wheelDiameter/(1-(A*wheelDiameter)
where A = PI/(moveSpeed*360). Thus for a moveSpeed of 25
cm/second and a wheelDiameter of 5,5 cm the minChange is about
0,01058 cm. The reason for this is, that different while sizes
will result in different motor speed. And that is given as an
integer in degree per second.trackWidth
- Distance between center of right tire and center of left tire,
in same units as wheelDiameter.leftMotor
- The left Motor (e.g., Motor.C).rightMotor
- The right Motor (e.g., Motor.A).reverse
- If true, the NXT robot moves forward when the motors are
running backward.Method Detail |
---|
public void addMoveListener(MoveListener aListener)
MovementProvider
addMoveListener
in interface MovementProvider
aListener
- the move listenerpublic TachoMotor getLeft()
public TachoMotor getRight()
public int getLeftCount()
public int getRightCount()
public int getLeftActualSpeed()
public int getRightActualSpeed()
public float getTurnRatio()
public void setSpeed(int speed)
speed
- The wanted speed in degrees per second.protected void setSpeed(int leftSpeed, int rightSpeed)
public void setMoveSpeed(float speed)
setMoveSpeed
in interface BasicPilot
Pilot.setMoveSpeed(float)
public float getMoveSpeed()
getMoveSpeed
in interface BasicPilot
Pilot.getMoveSpeed()
public float getMoveMaxSpeed()
getMoveMaxSpeed
in interface BasicPilot
Pilot.getMoveMaxSpeed()
public void setTurnSpeed(float speed)
setTurnSpeed
in interface RotatePilot
Pilot.setTurnSpeed(float)
public float getTurnSpeed()
getTurnSpeed
in interface RotatePilot
Pilot.getTurnSpeed()
public float getTurnMaxSpeed()
getTurnMaxSpeed
in interface RotatePilot
Pilot.getTurnMaxSpeed()
public boolean isMoving()
BasicPilot
isMoving
in interface BasicPilot
public float getTravelDistance()
public float getAngle()
public void reset()
public void forward()
forward
in interface BasicPilot
public void backward()
backward
in interface BasicPilot
public Movement rotate(float angle)
rotate
in interface RotatePilot
angle
- The wanted angle of rotation in degrees. Positive angle rotate
left (clockwise), negative right.public Movement rotate(float angle, boolean immediateReturn)
rotate
in interface RotatePilot
angle
- The wanted angle of rotation in degrees. Positive angle rotate
left (clockwise), negative right.immediateReturn
- If true this method returns immediately.protected boolean continueMoving()
public Movement stop()
stop
in interface BasicPilot
public Movement travel(float distance)
travel
in interface BasicPilot
distance
- The distance to move. Unit of measure for distance must be
same as wheelDiameter and trackWidth.public Movement travel(float distance, boolean immediateReturn)
travel
in interface BasicPilot
distance
- The distance to move. Unit of measure for distance must be
same as wheelDiameter and trackWidth.immediateReturn
- If true this method returns immediately.public void steer(float turnRate)
public Movement steer(float turnRate, float angle)
public Movement steer(float turnRate, float angle, boolean immediateReturn)
public void arc(float radius)
ArcPilot
If radius
is positive, the robot arcs left, and the center of the turning circle is on the left side of the robot.
If radius
is negative, the robot arcs right, and the center of the turning circle is on the right side of the robot.
If radius
is zero, the robot rotates in place.
Postcondition: Motor speeds are unpredictable.
Note: If you have specified a drift correction in the constructor it will not be applied in this method.
arc
in interface ArcPilot
radius
- of the arc path. If positive, the left side of the robot is on the inside of the turn. If negative, the left
side of the robot is on the outside of the turn.public Movement arc(float radius, float angle)
ArcPilot
angle
degrees along the arc.
If radius
is positive, the robot arcs left, and the center of the turning circle is on the left side of the robot.
If radius
is negative, the robot arcs right, and the center of the turning circle is on the right side of the robot.
If radius
is zero, is zero, the robot rotates in place.
Robot will stop when the degrees it has moved along the arc equals angle
.
If angle
is positive, the robot will move travel forwards.
If angle
is negative, the robot will move travel backwards.
If angle
is zero, the robot will not move and the method returns immediately.
Postcondition: Motor speeds are unpredictable.
Note: If you have specified a drift correction in the constructor it will not be applied in this method.
arc
in interface ArcPilot
radius
- of the arc path. If positive, the left side of the robot is on the inside of the turn. If negative, the left
side of the robot is on the outside of the turn.angle
- The sign of the angle determines the direction of robot motion. Positive drives the robot forward, negative drives it backward.ArcPilot.travelArc(float, float)
public Movement arc(float radius, float angle, boolean immediateReturn)
ArcPilot
immediateReturn
parameter.
If radius
is positive, the robot arcs left, and the center of the turning circle is on the left side of the robot.
If radius
is negative, the robot arcs right, and the center of the turning circle is on the right side of the robot.
If radius
is zero, is zero, the robot rotates in place.
The robot will stop when the degrees it has moved along the arc equals angle
.
If angle
is positive, the robot will move travel forwards.
If angle
is negative, the robot will move travel backwards.
If angle
is zero, the robot will not move and the method returns immediately.
Postcondition: Motor speeds are unpredictable.
Note: If you have specified a drift correction in the constructor it will not be applied in this method.
arc
in interface ArcPilot
radius
- of the arc path. If positive, the left side of the robot is on the inside of the turn. If negative, the left
side of the robot is on the outside of the turn.angle
- The sign of the angle determines the direction of robot motion. Positive drives the robot forward, negative drives it backward.immediateReturn
- If immediateReturn is true then the method returns immediately and your code MUST call
updatePostion() when the robot has stopped. Otherwise, the robot position is lost.ArcPilot.travelArc(float, float, boolean)
public Movement travelArc(float radius, float distance)
ArcPilot
distance
along the arc. The units (inches, cm) for distance
must be the same as the units used for radius
.
If radius
is positive, the robot arcs left, and the center of the turning circle is on the left side of the robot.
If radius
is negative, the robot arcs right, and the center of the turning circle is on the right side of the robot.
If radius
is zero, the robot rotates in place
The robot will stop when it has moved along the arc distance
units.
If distance
is positive, the robot will move travel forwards.
If distance
is negative, the robot will move travel backwards.
If distance
is zero, the robot will not move and the method returns immediately.
Postcondition: Motor speeds are unpredictable.
Note: If you have specified a drift correction in the constructor it will not be applied in this method.
travelArc
in interface ArcPilot
radius
- of the arc path. If positive, the left side of the robot is on the inside of the turn. If negative, the left
side of the robot is on the outside of the turn.distance
- to travel, in same units as radius
. The sign of the distance determines the direction of robot motion. Positive drives the robot forward, negative drives it backward.ArcPilot.arc(float, float)
public Movement travelArc(float radius, float distance, boolean immediateReturn)
ArcPilot
immediateReturn
parameter.
The units (inches, cm) for distance
should be the same as the units used for radius
.
Warning: Your code must call updatePostion() when the robot has stopped,
otherwise, the robot position is lost.
If radius
is positive, the robot arcs left, and the center of the turning circle is on the left side of the robot.
If radius
is negative, the robot arcs right, and the center of the turning circle is on the right side of the robot.
If radius
is zero, ...
The robot will stop when it has moved along the arc distance
units.
If distance
is positive, the robot will move travel forwards.
If distance
is negative, the robot will move travel backwards.
If distance
is zero, the robot will not move and the method returns immediately.
Postcondition: Motor speeds are unpredictable.
Note: If you have specified a drift correction in the constructor it will not be applied in this method.
travelArc
in interface ArcPilot
radius
- of the arc path. If positive, the left side of the robot is on the inside of the turn. If negative, the left
side of the robot is on the outside of the turn.distance
- to travel, in same units as radius
. The sign of the distance determines the direction of robot motion. Positive drives the robot forward, negative drives it backward.immediateReturn
- If immediateReturn is true then the method returns immediately and your code MUST call
updatePostion() when the robot has stopped. Otherwise, the robot position is lost.ArcPilot.arc(float, float, boolean)
protected int turnRate(float radius)
radius
-
protected void movementStart()
protected void movementStop()
public void setMinRadius(float radius)
ArcPilot
setMinRadius
in interface ArcPilot
radius
- the radius in degreespublic float getMinRadius()
ArcPilot
getMinRadius
in interface ArcPilot
public Movement getMovement()
getMovement
in interface MovementProvider
public float getMovementIncrement()
getMovementIncrement
in interface BasicPilot
public float getAngleIncrement()
getAngleIncrement
in interface RotatePilot
|
|||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |