00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #include "Component/ModelManager.H"
00039 #include "Component/ModelComponent.H"
00040 #include "Component/ModelParam.H"
00041 #include "Component/ModelOptionDef.H"
00042 #include "Raster/GenericFrame.H"
00043 #include "Image/Layout.H"
00044 #include "Media/FrameSeries.H"
00045 #include "Transport/FrameInfo.H"
00046 #include "Image/MatrixOps.H"
00047 #include "GUI/ImageDisplayStream.H"
00048 #include "GUI/XWinManaged.H"
00049 #include "Robots/IRobot/IRobotSim.H"
00050 #include "Ice/IceImageUtils.H"
00051 #include "Ice/ImageIce.ice.H"
00052 #include <Ice/Ice.h>
00053 #include <Ice/Service.h>
00054 #include "Ice/IRobot.ice.H"
00055
00056 #include <stdio.h>
00057 #include <stdlib.h>
00058 #include <sys/types.h>
00059 #include <sys/stat.h>
00060 #include <fcntl.h>
00061
00062 #define KEY_UP 98
00063 #define KEY_DOWN 104
00064 #define KEY_LEFT 100
00065 #define KEY_RIGHT 102
00066
00067 const ModelOptionCateg MOC_StimulatorData = {
00068 MOC_SORTPRI_3, "Stimulator Data related options" };
00069
00070 const ModelOptionDef OPT_StimulatorFilename =
00071 { MODOPT_ARG(std::string), "StimulatorFile", &MOC_StimulatorData, OPTEXP_CORE,
00072 "Path to the stimulator data input file",
00073 "stimulator-file", '\0', "", "" };
00074
00075
00076 class RobotBrainStimulator : public ModelComponent, public Robots::IRobot, public IceUtil::Thread
00077 {
00078 public:
00079 RobotBrainStimulator(ModelManager& mgr,
00080 nub::soft_ref<OutputFrameSeries> ofs,
00081 nub::soft_ref<InputFrameSeries> ifs,
00082 const std::string& descrName = "RobotBrainStimulator",
00083 const std::string& tagName = "RobotBrainStimulator") :
00084 ModelComponent(mgr, descrName, tagName),
00085 itsOfs(ofs),
00086 itsIfs(ifs),
00087 itsFilename(&OPT_StimulatorFilename, this, 0),
00088 itsCurrentSpeed(0),
00089 itsCurrentSteering(0)
00090 {
00091
00092 }
00093
00094 virtual void start1()
00095 {
00096 if((itsStimulatorFd = fopen(itsFilename.getVal().c_str(), "r")) == NULL)
00097 LFATAL("Can not open stimulator file %s", itsFilename.getVal().c_str());
00098 }
00099
00100 virtual void run()
00101 {
00102 while(true)
00103 {
00104
00105 }
00106
00107 }
00108
00109
00110 virtual float getSpeed(const Ice::Current&) { return itsCurrentSpeed; }
00111 virtual short setSpeed(const float speed, const Ice::Current&) { itsCurrentSpeed = speed; return 0; }
00112 virtual float getSteering(const Ice::Current&) { return itsCurrentSteering; }
00113 virtual short setSteering(const float steeringPos, const Ice::Current&) { itsCurrentSteering = steeringPos; return 0;}
00114
00115 virtual ImageIceMod::ImageIce getImageSensor(const short i, const bool color, const Ice::Current&)
00116 {
00117
00118
00119 GenericFrame input = itsIfs->readFrame();
00120 Image<PixRGB<byte> > img = input.asRgb();
00121 if (img.initialized())
00122 itsCurrentFrame = img;
00123
00124 return Image2Ice(itsCurrentFrame);
00125 }
00126 virtual ImageIceMod::DimsIce getImageSensorDims(const short i, const Ice::Current&)
00127 {
00128 ImageIceMod::DimsIce dims;
00129 dims.w = 0;
00130 dims.h = 0;
00131 return dims;
00132 }
00133 virtual float getSensorValue(const short i, const Ice::Current&){
00134 return 0;
00135 }
00136
00137 virtual bool getSensors(float &xPos, float &yPos, float &ori, const Ice::Current&)
00138 {
00139 return false;
00140 }
00141
00142 virtual bool getDistanceAngle(float &dist, float &ang, const Ice::Current&)
00143 {
00144
00145
00146 char* linePtr=NULL;
00147 size_t len=0;
00148
00149 ssize_t ret = getline(&linePtr, &len, itsStimulatorFd);
00150
00151 if (ret == -1)
00152 LFATAL("End of input reached");
00153
00154 std::string line(linePtr);
00155
00156 vector<string> fields;
00157 fields.clear();
00158 if(line.length() > 1) {
00159 string::size_type start = 0;
00160 string::size_type end = line.find_first_of(" ");
00161 while(end != string::npos) {
00162 fields.push_back(line.substr(start, end-start));
00163 start = line.find_first_not_of(" ", end+1);
00164 end = line.find_first_of(" ", start);
00165 }
00166 fields.push_back(line.substr(start, line.length()-start));
00167 }
00168
00169 if (fields.size() != 6)
00170 LFATAL("Bad data '%s'", line.c_str());
00171
00172 dist = atof(fields[2].c_str());
00173 ang = atof(fields[3].c_str());
00174
00175
00176 int frame = atoi(fields[5].c_str());
00177
00178 if (itsIfs->frame() != frame)
00179 LFATAL("Frame out of sync");
00180
00181 itsIfs->updateNext();
00182
00183
00184 usleep(200000);
00185
00186
00187 return true;
00188
00189 }
00190
00191
00192 virtual void motorsOff(const short i, const Ice::Current&){
00193 itsCurrentSpeed = 0;
00194 itsCurrentSteering = 0;
00195 }
00196 virtual void setMotor(const short i, const float val, const Ice::Current&){ }
00197 virtual short sendRawCmd(const std::string& data, const Ice::Current&) { return 0; }
00198 virtual void playSong(const short song, const Ice::Current&) { }
00199 virtual void shutdown(const Ice::Current&) { }
00200 virtual void sendStart(const Ice::Current&) { }
00201 virtual void setMode(const Robots::IRobotModes demo, const Ice::Current&) { }
00202 virtual void setDemo(const short demo, const Ice::Current&) { }
00203 virtual void setLED(const short led, const short color, const short intensity, const Ice::Current&) { }
00204
00205
00206 private:
00207 nub::soft_ref<OutputFrameSeries> itsOfs;
00208 nub::soft_ref<InputFrameSeries> itsIfs;
00209 OModelParam<std::string> itsFilename;
00210 Image<PixRGB<byte> > itsCurrentFrame;
00211 float itsCurrentSpeed;
00212 float itsCurrentSteering;
00213 FILE* itsStimulatorFd;
00214
00215 };
00216
00217
00218
00219 class RobotBrainStimulatorService : public Ice::Service {
00220 protected:
00221 virtual bool start(int, char*[]);
00222 private:
00223 Ice::ObjectAdapterPtr itsAdapter;
00224 ModelManager *itsMgr;
00225 };
00226
00227 bool RobotBrainStimulatorService::start(int argc, char* argv[])
00228 {
00229
00230 itsMgr = new ModelManager("Robot Brain Stimulator Service");
00231
00232 nub::ref<OutputFrameSeries> ofs(new OutputFrameSeries(*itsMgr));
00233 itsMgr->addSubComponent(ofs);
00234
00235 nub::ref<InputFrameSeries> ifs(new InputFrameSeries(*itsMgr));
00236 itsMgr->addSubComponent(ifs);
00237
00238
00239 nub::ref<RobotBrainStimulator> robotBrainStimulator(new RobotBrainStimulator(*itsMgr, ofs, ifs));
00240 itsMgr->addSubComponent(robotBrainStimulator);
00241
00242
00243 if (itsMgr->parseCommandLine(argc, argv, "", 0, 0) == false)
00244 return(1);
00245
00246 char endpointBuff[64];
00247 sprintf(endpointBuff, "default -p %d", 10000);
00248 itsAdapter = communicator()->createObjectAdapterWithEndpoints("RobotBrainStimulatorAdaptor", endpointBuff);
00249
00250 Ice::ObjectPtr object = robotBrainStimulator.get();
00251 Ice::ObjectPrx objectPrx = itsAdapter->add(object, communicator()->stringToIdentity("IRobotService"));
00252 itsAdapter->activate();
00253
00254 itsMgr->start();
00255
00256
00257
00258 LINFO("Started");
00259
00260 return true;
00261
00262 }
00263
00264
00265 int main(int argc, char** argv) {
00266 RobotBrainStimulatorService svc;
00267 return svc.main(argc, argv);
00268
00269 }
00270