CameraControl.C
Go to the documentation of this file.00001
00002
00003
00004
00005
00006 #include "Devices/CameraControl.H"
00007
00008 #include "Devices/ssc.H"
00009 #include "Util/Assert.H"
00010 #include <math.h>
00011 #include <signal.h>
00012 #include <unistd.h>
00013
00014 CameraControl::CameraControl(OptionManager& mgr,
00015 const std::string& descrName,
00016 const std::string& tagName,
00017 int setPort, bool setCam,
00018 int pPort, int tPort, int Port) :
00019 ModelComponent(mgr, descrName, tagName),
00020 ssc(new SSC(mgr))
00021 {
00022 addSubComponent(ssc);
00023
00024 panPort = pPort; tiltPort = tPort; serialPort = Port;
00025 if(setCam)
00026 {
00027 centerCamera();
00028 }
00029 currentPan = camera.Xcenter;
00030 currentTilt = camera.Ycenter;
00031 calibrate = false;
00032 }
00033
00034
00035
00036 CameraControl::~CameraControl()
00037 { }
00038
00039
00040
00041 float CameraControl::moveCamXYFrame(int X, int Y, int camNumber, bool simulate)
00042 {
00043 ASSERT((X >= 0) && ((unsigned)X < camera.Xpixel));
00044 ASSERT((Y >= 0) && ((unsigned)Y < camera.Ypixel));
00045
00046
00047 int gotoCY = abs(Y - (int)camera.Ypixel);
00048
00049 float panConv = ((float)camera.Xfield/(float)camera.Xpixel);
00050 float tiltConv = ((float)camera.Yfield/(float)camera.Ypixel);
00051
00052 float panOff = ((float)camera.Xpixel*.5)-X;
00053 float tiltOff = ((float)camera.Ypixel*.5)-gotoCY;
00054
00055 float travelPan = ((panOff*panConv)*camera.fieldAdjustmentX);
00056 float travelTilt = ((tiltOff*tiltConv)*camera.fieldAdjustmentY);
00057 if((fabs(travelPan) > camera.minMove) || (fabs(travelTilt) > camera.minMove))
00058 {
00059 panConv = currentPan+travelPan;
00060 tiltConv = currentTilt+travelTilt;
00061
00062 float travelPanEst = (camera.travelTime/90)*fabs(travelPan)
00063 + camera.minTravelTime;
00064 float travelTiltEst = (camera.travelTime/90)*fabs(travelTilt)
00065 + camera.minTravelTime;
00066
00067 if(panConv < camera.XlimitStart)
00068 {
00069 panConv = camera.XlimitStart;
00070 return -1;
00071 }
00072 if(panConv > camera.XlimitEnd)
00073 {
00074 panConv = camera.XlimitEnd;
00075 return -2;
00076 }
00077 if(tiltConv < camera.YlimitStart)
00078 {
00079 tiltConv = camera.YlimitStart;
00080 return -3;
00081 }
00082 if(tiltConv > camera.YlimitEnd)
00083 {
00084 tiltConv = camera.YlimitEnd;
00085 return -4;
00086 }
00087
00088 if(simulate == false)
00089 {
00090
00091 if(calibrate == true)
00092 {
00093 ssc->moveRawHack(panPort,
00094 (int)((panConv
00095 +camera.cameraCalibrationPan[camNumber])
00096 *camera.servoPixels),serialPort);
00097 ssc->moveRawHack(tiltPort,
00098 (int)((tiltConv
00099 +camera.cameraCalibrationTilt[camNumber])
00100 *camera.servoPixels),serialPort);
00101 }
00102 else
00103 {
00104 ssc->moveRawHack(panPort,
00105 (int)(panConv*camera.servoPixels),serialPort);
00106 ssc->moveRawHack(tiltPort,
00107 (int)(tiltConv*camera.servoPixels),serialPort);
00108 }
00109 currentPan = panConv;
00110 currentTilt = tiltConv;
00111 }
00112 simPan = panConv;
00113 simTilt = tiltConv;
00114
00115
00116 if(travelPanEst > travelTiltEst)
00117 return travelPanEst;
00118 else
00119 return travelTiltEst;
00120 }
00121 else
00122 {
00123 return -5;
00124 }
00125 }
00126
00127
00128
00129 float CameraControl::moveCamTPFrame(float theta, float phi, int camNumber)
00130 {
00131
00132 float panConv;
00133 float tiltConv;
00134
00135 panConv = currentPan-theta;
00136 tiltConv = currentTilt-phi;
00137
00138 float travelPanEst = (camera.travelTime/90)*fabs(panConv);
00139
00140 float travelTiltEst = (camera.travelTime/90)*fabs(tiltConv);
00141
00142
00143
00144 if(theta < camera.XlimitStart)
00145 {
00146 return -1;
00147 }
00148 if(theta > camera.XlimitEnd)
00149 {
00150 return -2;
00151 }
00152 if(phi < camera.YlimitStart)
00153 {
00154 return -3;
00155 }
00156 if(phi > camera.YlimitEnd)
00157 {
00158 return -4;
00159 }
00160
00161
00162 if(calibrate == true)
00163 {
00164 ssc->moveRawHack(panPort,
00165 (int)((theta+camera.cameraCalibrationPan[camNumber])
00166 *camera.servoPixels),serialPort);
00167 ssc->moveRawHack(tiltPort,
00168 (int)((phi+camera.cameraCalibrationTilt[camNumber])
00169 *camera.servoPixels),serialPort);
00170 }
00171 else
00172 {
00173 ssc->moveRawHack(panPort,
00174 (int)(theta*camera.servoPixels),serialPort);
00175 ssc->moveRawHack(tiltPort,
00176 (int)(phi*camera.servoPixels),serialPort);
00177 }
00178 currentPan = theta;
00179 currentTilt = phi;
00180
00181 if(travelPanEst > travelTiltEst)
00182 return travelPanEst;
00183 else
00184 return travelTiltEst;
00185
00186 }
00187
00188
00189 void CameraControl::centerCamera(int camNumber)
00190 {
00191 if(calibrate == true)
00192 {
00193 ssc->moveRawHack(panPort,
00194 (int)((camera.Xcenter
00195 +camera.cameraCalibrationPan[camNumber])
00196 *camera.servoPixels),serialPort);
00197 ssc->moveRawHack(tiltPort,
00198 (int)((camera.Ycenter
00199 +camera.cameraCalibrationTilt[camNumber])
00200 *camera.servoPixels),serialPort);
00201 }
00202 else
00203 {
00204 ssc->moveRawHack(panPort,
00205 (int)(camera.Xcenter*camera.servoPixels),serialPort);
00206 ssc->moveRawHack(tiltPort,
00207 (int)(camera.Ycenter*camera.servoPixels),serialPort);
00208 }
00209 }
00210
00211
00212
00213 void CameraControl::panRelative(float doPan)
00214 {
00215 float calcDoPan = getCurrentPan() + doPan;
00216 ASSERT((calcDoPan > camera.XlimitStart) && (calcDoPan > camera.XlimitEnd));
00217 ssc->move(camera.SSCXconnector,calcDoPan);
00218 }
00219
00220
00221
00222 void CameraControl::tiltRelative(float doTilt)
00223 {
00224 float calcDoTilt = getCurrentTilt() + doTilt;
00225 ASSERT((calcDoTilt > camera.YlimitStart) && (calcDoTilt > camera.YlimitEnd));
00226 ssc->move(camera.SSCYconnector,calcDoTilt);
00227 }
00228
00229
00230 void CameraControl::panAbsolute(float doPan)
00231 {
00232 ASSERT((doPan > camera.XlimitStart) && (doPan > camera.XlimitEnd));
00233 doPan = doPan - 10;
00234 ssc->move(camera.SSCXconnector,doPan);
00235 }
00236
00237
00238
00239 void CameraControl::tiltAbsolute(float doTilt)
00240 {
00241 ASSERT((doTilt > camera.YlimitStart) && (doTilt > camera.YlimitEnd));
00242 doTilt = doTilt - 10;
00243 ssc->move(camera.SSCYconnector,doTilt);
00244 }
00245
00246
00247
00248 void CameraControl::setImageSize(int X, int Y)
00249 {
00250 camera.Xpixel = X;
00251 camera.Ypixel = Y;
00252 }
00253
00254
00255
00256 void CameraControl::useCalibration(bool useIt)
00257 {
00258 calibrate = useIt;
00259 }
00260
00261
00262
00263 float CameraControl::getCurrentPan()
00264 {
00265
00266 return currentPan;
00267 }
00268
00269
00270
00271 float CameraControl::getCurrentTilt()
00272 {
00273
00274 return currentTilt;
00275 }
00276
00277
00278
00279 float CameraControl::getSimPan()
00280 {
00281 return simPan;
00282 }
00283
00284
00285
00286 float CameraControl::getSimTilt()
00287 {
00288 return simTilt;
00289 }
00290
00291
00292
00293
00294