00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef __GT2005HeadControl_h__
00013 #define __GT2005HeadControl_h__
00014
00015 #include "../Xabsl2HeadControl.h"
00016
00017 #include "GT2005HeadPathPlanner.h"
00018 #include "GT2005HeadControlSymbols.h"
00019 #include "GT2005HeadControlBasicBehaviors.h"
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 class GT2005HeadControl : public Xabsl2HeadControl
00032 {
00033 public:
00034
00035
00036
00037
00038 GT2005HeadControl(HeadControlInterfaces& interfaces);
00039
00040
00041 ~GT2005HeadControl(){}
00042
00043
00044 virtual void execute();
00045
00046
00047
00048
00049
00050
00051 virtual bool handleMessage(InMessage& message);
00052
00053
00054 virtual void registerSymbolsAndBasicBehaviors();
00055
00056
00057 GT2005HeadPathPlanner headPathPlanner;
00058
00059
00060 bool lastScanWasLeft;
00061
00062
00063 bool headPanIsLeft();
00064
00065
00066 void getSensorHeadAngles(Vector3<double>& pos);
00067
00068
00069 double headPositionDistanceToActualPosition(Vector3<double> comp,bool leftSide);
00070
00071
00072 HeadControlMode::HeadControlModes lastHeadControlMode;
00073
00074
00075 CameraInfo cameraInfo;
00076
00077
00078 GT2005HeadControlSymbols symbols;
00079
00080
00081 GT2005HeadControlBasicBehaviors basicBehaviors;
00082
00083
00084 enum {minHeadSpeed=4000};
00085
00086
00087
00088
00089
00090
00091 void setJoints(double tilt, double pan, double roll, double speed=0, double mouth=0);
00092
00093
00094 void setJointsDirect(double tilt, double pan, double roll, double mouth=0);
00095
00096 void simpleLookAtPointRelativeToRobot(const Vector3<double> pos, Vector2<int> offset, double& neckTilt, double& headPan, double& headTilt);
00097
00098
00099
00100
00101
00102 void simpleLookAtPointOnField(const Vector3<double> pos, Vector2<int> offset, double& neckTilt, double& headPan, double& headTilt);
00103
00104
00105
00106 bool simpleLookAtPointFixNeckTilt(const Vector3<double> &aim, const double& tilt1, double& headPan, double& headTilt);
00107
00108
00109
00110
00111
00112 void lookAtPoint(const Vector3<double> &pos,const Vector2<int> &offset,double& tilt,double& pan,double& roll);
00113
00114
00115
00116 bool lookAtPointFixHeadTilt(const Vector3<double> &aim, const double& xtan, const double& ytan, double& tilt1, double& pan, const double& tilt2);
00117
00118
00119
00120 bool lookAtPointFixNeckTilt(const Vector3<double> &aim, const double& xtan, const double& ytan, const double& tilt, double& pan, double& tilt2);
00121
00122
00123
00124
00125
00126
00127 int calculateClosestLandmark(Pose2D pose, double direction, double nextLeftOrRight, bool disregardFieldMarkings = false);
00128 int calculateClosestLandmark(double direction = 0, double nextLeftOrRight = 0);
00129
00130
00131
00132 void aimAtLandmark(int landmark, double& neckTilt, double& headPan, double& headTilt);
00133
00134
00135 void getLookAtBallAngles(const Vector2<double> ballOnField, double& neckTilt, double& headPan, double& headTilt);
00136
00137
00138 int setJointsIsCloseToDestination;
00139
00140
00141 bool setJointsMaxPanReached;
00142
00143
00144 void setupMainAngles();
00145
00146
00147
00148 Vector3<double> headLeft;
00149 Vector3<double> headRight;
00150 Vector3<double> headMiddleLeft;
00151 Vector3<double> headMiddleLeftDown;
00152 Vector3<double> headMiddleRight;
00153 Vector3<double> headMiddleRightDown;
00154 Vector3<double> headRightDown;
00155 Vector3<double> headLeftDown;
00156 Vector3<double> headUp;
00157 Vector3<double> headDown;
00158
00159
00160 double speedNeckTilt;
00161 double speedHeadPan;
00162 double speedHeadTilt;
00163
00164
00165
00166 void calibrateHeadSpeed();
00167
00168
00169
00170 bool useCommunicatedBall;
00171
00172 enum
00173 {
00174 calibrationStateStart,
00175 calibrationStateLeft,
00176 calibrationStateLeftWait,
00177 calibrationStateRight,
00178 calibrationStateRightWait,
00179 calibrationStateDownTilt1,
00180 calibrationStateDownTilt1Wait,
00181 calibrationStateUpTilt1,
00182 calibrationStateUpTilt1Wait,
00183 calibrationStateDownTilt2,
00184 calibrationStateDownTilt2Wait,
00185 calibrationStateUpTilt2,
00186 calibrationStateUpTilt2Wait,
00187 calibrationStateUseResults,
00188 calibrationStateReady
00189 } calibrationState;
00190
00191 long calibrationTime;
00192 int calibrationTimeOutsTilt1,calibrationTimeOutsPan,calibrationTimeOutsTilt2;
00193 int calibrationRoundCount,calibrationSuccessfulRounds;
00194
00195 void calibrationReset()
00196 {
00197 calibrationTimeOutsTilt1 = 0;
00198 calibrationTimeOutsPan = 0;
00199 calibrationTimeOutsTilt2 = 0;
00200 calibrationState = calibrationStateStart;
00201 }
00202
00203 bool headPositionReached(Vector3<double> pos)
00204 {
00205 return headPathPlanner.headPositionReached(pos);
00206 }
00207
00208
00209 int getLastSeenBeaconIndex();
00210
00211
00212 long getTimeOfLastSeenBeacon(int index);
00213
00214
00215 long getTimeBetweenSeen2LastBeacons(int index);
00216
00217
00218 bool isTimedOut()
00219 {
00220 return (SystemCall::getTimeSince(calibrationTime)>2500);
00221 }
00222
00223 bool calibrateHeadSpeedIsReady()
00224 {
00225 return (calibrationState==calibrationStateReady);
00226 }
00227
00228
00229 void searchForBallLeft();
00230 void searchForBallRight();
00231
00232
00233 void beginBallSearchAt(Vector2<double> ballPosition2d);
00234
00235 private:
00236 void showVisualizationQuality();
00237 Range<double> jointRangeNeckTilt, jointRangeHeadPan, jointRangeHeadTilt;
00238
00239
00240 OdometryData lastOdometryData;
00241 RobotPose lastRobotPose;
00242 };
00243
00244 #endif //__GT2005HeadControl_h__