00001 /*!@file RCBot/BotControl.C abstract robot control (can use corba) */ 00002 00003 // //////////////////////////////////////////////////////////////////// // 00004 // The iLab Neuromorphic Vision C++ Toolkit - Copyright (C) 2001 by the // 00005 // University of Southern California (USC) and the iLab at USC. // 00006 // See http://iLab.usc.edu for information about this project. // 00007 // //////////////////////////////////////////////////////////////////// // 00008 // Major portions of the iLab Neuromorphic Vision Toolkit are protected // 00009 // under the U.S. patent ``Computation of Intrinsic Perceptual Saliency // 00010 // in Visual Environments, and Applications'' by Christof Koch and // 00011 // Laurent Itti, California Institute of Technology, 2001 (patent // 00012 // pending; application number 09/912,225 filed July 23, 2001; see // 00013 // http://pair.uspto.gov/cgi-bin/final/home.pl for current status). // 00014 // //////////////////////////////////////////////////////////////////// // 00015 // This file is part of the iLab Neuromorphic Vision C++ Toolkit. // 00016 // // 00017 // The iLab Neuromorphic Vision C++ Toolkit is free software; you can // 00018 // redistribute it and/or modify it under the terms of the GNU General // 00019 // Public License as published by the Free Software Foundation; either // 00020 // version 2 of the License, or (at your option) any later version. // 00021 // // 00022 // The iLab Neuromorphic Vision C++ Toolkit is distributed in the hope // 00023 // that it will be useful, but WITHOUT ANY WARRANTY; without even the // 00024 // implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR // 00025 // PURPOSE. See the GNU General Public License for more details. // 00026 // // 00027 // You should have received a copy of the GNU General Public License // 00028 // along with the iLab Neuromorphic Vision C++ Toolkit; if not, write // 00029 // to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, // 00030 // Boston, MA 02111-1307 USA. // 00031 // //////////////////////////////////////////////////////////////////// // 00032 // 00033 // Primary maintainer for this file: Lior Elazary <elazary@usc.edu> 00034 // $HeadURL: svn://isvn.usc.edu/software/invt/trunk/saliency/src/RCBot/BotControl.C $ 00035 // $Id: BotControl.C 13993 2010-09-20 04:54:23Z itti $ 00036 // 00037 // ###################################################################### 00038 00039 #include "RCBot/BotControl.H" 00040 #include "Component/OptionManager.H" 00041 #include "Beobot/BeobotConfig.H" 00042 00043 BeobotConfig bbc; 00044 00045 // ###################################################################### 00046 BotControl::BotControl(OptionManager& mgr, const std::string& descrName, 00047 const std::string& tagName, RobotType inBotType) : 00048 ModelComponent(mgr, descrName, tagName), 00049 botType(inBotType) 00050 { 00051 // switch for the the actuator system 00052 switch(botType) 00053 { 00054 case RCBOT_JEEP: 00055 case RCBOT_TRUCK: 00056 sc8000 = nub::ref<SC8000>(new SC8000(mgr)); 00057 addSubComponent(sc8000); 00058 break; 00059 00060 case WIREBOT: 00061 ssc = nub::soft_ref<SSC>(new SSC(mgr)); 00062 addSubComponent(ssc); 00063 break; 00064 00065 case BEOBOT: 00066 bc = nub::soft_ref<BeoChip>(new BeoChip(mgr)); 00067 addSubComponent(bc); 00068 00069 // configure the BeoChip 00070 bc->setModelParamVal("BeoChipDeviceName", std::string("/dev/ttyS0")); 00071 break; 00072 00073 case SIMULATION: 00074 break; 00075 } 00076 00077 // for frame grabber: 00078 // --in=ieee1394 --framegrabber-mode=YUV44 --framegrabber-dims=160x120 00079 // 00080 // for mpg input: 00081 // --in=fname.mpg --rescale-input=160x120 --crop-input=x1,y1,x2,y2 00082 // 00083 // for raster series input: 00084 // --in=prefix#.ppm --rescale-input=160x120 --crop-input=x1,y1,x2,y2 00085 ifs = nub::ref<InputFrameSeries>(new InputFrameSeries(mgr)); 00086 addSubComponent(ifs); 00087 00088 // default is we do not display the image 00089 dispImg = true; 00090 } 00091 00092 // ###################################################################### 00093 void BotControl::setDisplay(bool sd) 00094 { 00095 if(dispImg != sd) 00096 { 00097 dispImg = sd; 00098 if(dispImg) 00099 xwin = new XWinManaged(Dims(width,height), -1, -1, "Bot Control"); 00100 else 00101 delete(xwin); 00102 } 00103 } 00104 00105 // ###################################################################### 00106 BotControl::~BotControl() 00107 { } 00108 00109 // ###################################################################### 00110 void BotControl::init() 00111 { 00112 LINFO("initializing BotControl"); 00113 switch(botType) 00114 { 00115 case RCBOT_JEEP: 00116 //set the servos 00117 speedServo = 3; 00118 steerServo = 1; 00119 00120 //calibrate the servos 00121 sc8000->calibrate(steerServo, 13650, 10800, 16000); //for steering 00122 sc8000->calibrate(speedServo, 14000, 12000, 16000); //for speed 00123 break; 00124 00125 case RCBOT_TRUCK: 00126 LINFO("RC TRUCK"); 00127 //set the servos 00128 speedServo = 3; 00129 steerServo = 4; 00130 00131 //calibrate the servos 00132 sc8000->calibrate(steerServo, 10000, 15000, 20000); //for steering 00133 sc8000->calibrate(speedServo, 10000, 15000, 19000); //for speed 00134 00135 sc8000->calibrate(1, 13000, 16000, 20000); //for speed 00136 sc8000->calibrate(2, 10000, 17000, 19000); //for speed 00137 sc8000->move(1, 0); 00138 sc8000->move(2, 0); 00139 break; 00140 00141 case WIREBOT: 00142 LINFO("Wire Bot"); 00143 //set the servos 00144 driveServoRight = 0; 00145 driveServoLeft = 1; 00146 00147 //calibrate the servos 00148 //FIXME ssc->calibrate(driveServoRight, 1157, 757, 1557); //for steering 00149 //FIXME ssc->calibrate(driveServoLeft, 1161, 761, 1561); //for speed 00150 00151 ssc->move(driveServoRight, 0); 00152 ssc->move(driveServoLeft, 0); 00153 break; 00154 00155 case BEOBOT: 00156 LINFO("BeoBot"); 00157 00158 // reset the beochip: 00159 LINFO("Resetting BeoChip..."); 00160 bc->resetChip(); sleep(1); 00161 00162 //set the servos 00163 speedServo = bbc.speedServoNum; 00164 steerServo = bbc.steerServoNum; 00165 00166 // keep the gear at the lowest speed/highest torque 00167 bc->setServoRaw(bbc.gearServoNum, bbc.gearMinVal); 00168 00169 // turn on the keyboard 00170 bc->debounceKeyboard(true); 00171 bc->captureKeyboard(true); 00172 00173 // calibrate the PWMs: 00174 bc->calibratePulse(0, 00175 bbc.pwm0NeutralVal, 00176 bbc.pwm0MinVal, 00177 bbc.pwm0MaxVal); 00178 bc->calibratePulse(1, 00179 bbc.pwm1NeutralVal, 00180 bbc.pwm1MinVal, 00181 bbc.pwm1MaxVal); 00182 bc->capturePulse(0, true); 00183 bc->capturePulse(1, true); 00184 break; 00185 00186 case SIMULATION: 00187 break; 00188 } 00189 00190 // reset fps 00191 avgtime = 0; avgn = 0; fps = 0.0F; 00192 timer.reset(); 00193 00194 width = ifs->getWidth(); 00195 height = ifs->getHeight(); 00196 xwin = new XWinManaged(Dims(width,height), -1, -1, "Bot Control"); 00197 } 00198 00199 // ###################################################################### 00200 float BotControl::getSpeed() 00201 { 00202 switch (botType) 00203 { 00204 case WIREBOT: 00205 return 0.0; 00206 case BEOBOT: 00207 return (bc->getServo(speedServo)); 00208 00209 case RCBOT_JEEP: 00210 case RCBOT_TRUCK: 00211 return sc8000->getPosition(speedServo); 00212 00213 case SIMULATION: 00214 // nothing to do 00215 return 0.0; 00216 } 00217 return 0.0; 00218 } 00219 00220 // ###################################################################### 00221 bool BotControl::setSpeed(const float speedPos) 00222 { 00223 speed = speedPos; 00224 switch (botType) 00225 { 00226 case WIREBOT: 00227 return (ssc->move(driveServoRight, -1*speed) 00228 && ssc->move(driveServoLeft, speed) ); 00229 case BEOBOT: 00230 return (bc->setServo(speedServo, speed)); 00231 00232 case RCBOT_JEEP: 00233 case RCBOT_TRUCK: 00234 return sc8000->move(speedServo, speed); 00235 00236 case SIMULATION: 00237 // nothing to do 00238 return false; 00239 } 00240 00241 return false; 00242 } 00243 00244 // ###################################################################### 00245 float BotControl::getSteering() 00246 { 00247 switch (botType) 00248 { 00249 case WIREBOT: 00250 return 0.0; 00251 case BEOBOT: 00252 return (bc->getServo(steerServo)); 00253 00254 case RCBOT_JEEP: 00255 case RCBOT_TRUCK: 00256 00257 return sc8000->getPosition(steerServo); 00258 00259 case SIMULATION: 00260 // nothing to do 00261 return 0.0; 00262 } 00263 return 0.0; 00264 } 00265 00266 // ###################################################################### 00267 bool BotControl::setSteering(const float steeringPos) 00268 { 00269 steering = steeringPos; 00270 00271 switch (botType) 00272 { 00273 case WIREBOT: 00274 return (ssc->move(driveServoRight, steeringPos) && 00275 ssc->move(driveServoLeft, steeringPos) ); 00276 00277 case BEOBOT: 00278 return (bc->setServo(steerServo, steering)); 00279 00280 case RCBOT_JEEP: 00281 case RCBOT_TRUCK: 00282 return sc8000->move(steerServo, steeringPos); 00283 00284 case SIMULATION: 00285 // nothing to do 00286 return false; 00287 } 00288 return false; 00289 } 00290 00291 // ###################################################################### 00292 Image<PixRGB<byte> > BotControl::getImageSensor(int i) 00293 { 00294 ifs->updateNext(); 00295 Image<PixRGB<byte> > img = ifs->readRGB(); 00296 00297 // compute frame rate 00298 avgtime += timer.getReset(); avgn ++; 00299 if (avgn == NAVG) 00300 { 00301 fps = 1000.0F / float(avgtime) * float(avgn); 00302 avgtime = 0; avgn = 0; 00303 } 00304 00305 if (img.initialized() && dispImg) showImg(img); 00306 return img; 00307 } 00308 00309 // ###################################################################### 00310 void BotControl::getImageSensorDims(short &w, short &h, int i) 00311 { 00312 w = width; 00313 h = height; 00314 } 00315 00316 // ###################################################################### 00317 void BotControl::setInfo(const char *info, Point2D<int> inTrackLoc, 00318 Point2D<int> inRecLoc) 00319 { 00320 extraInfo = strdup(info); 00321 trackLoc = inTrackLoc; 00322 recLoc = inRecLoc; 00323 } 00324 00325 // ###################################################################### 00326 void BotControl::showImg(Image<PixRGB<byte> > &img) 00327 { 00328 Image<PixRGB<byte> > disp = img; 00329 char info[255]; 00330 00331 if (recLoc.isValid()) 00332 drawDisk(disp, Point2D<int>(recLoc.i, recLoc.j), 00333 10, PixRGB<byte>(255, 255, 20)); 00334 if (trackLoc.isValid()) 00335 drawDisk(disp, Point2D<int>(trackLoc.i, trackLoc.j), 00336 6, PixRGB<byte>(20, 50, 255)); 00337 00338 sprintf(info, " %.1ffps %s", fps, extraInfo); 00339 00340 writeText(disp, Point2D<int>(0,220), info, 00341 PixRGB<byte>(255), PixRGB<byte>(127)); 00342 00343 xwin->drawImage(disp); 00344 } 00345 00346 // ###################################################################### 00347 int BotControl::getUserInput(Point2D<int> &loc) 00348 { 00349 loc = xwin->getLastMouseClick(); 00350 return xwin->getLastKeyPress(); 00351 } 00352 00353 // ###################################################################### 00354 /* So things look consistent in everyone's emacs... */ 00355 /* Local Variables: */ 00356 /* indent-tabs-mode: nil */ 00357 /* End: */