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 #ifndef Objects_C_DEFINED
00039 #define Objects_C_DEFINED
00040
00041 #include "Image/DrawOps.H"
00042 #include "Image/MathOps.H"
00043
00044 #include "Image/Kernels.H"
00045 #include "Image/FilterOps.H"
00046 #include "Image/Transforms.H"
00047 #include "Image/fancynorm.H"
00048 #include "Image/Convolutions.H"
00049 #include "Image/MatrixOps.H"
00050 #include "Simulation/SimEventQueue.H"
00051 #include "plugins/SceneUnderstanding/Objects.H"
00052 #include "GUI/DebugWin.H"
00053 #include <math.h>
00054 #include <fcntl.h>
00055 #include <limits>
00056 #include <string>
00057
00058 const ModelOptionCateg MOC_Objects = {
00059 MOC_SORTPRI_3, "Objects-Related Options" };
00060
00061
00062 const ModelOptionDef OPT_ObjectsShowDebug =
00063 { MODOPT_ARG(bool), "ObjectsShowDebug", &MOC_Objects, OPTEXP_CORE,
00064 "Show debug img",
00065 "Objects-debug", '\0', "<true|false>", "false" };
00066
00067
00068
00069 Objects::Objects(OptionManager& mgr, const std::string& descrName,
00070 const std::string& tagName) :
00071 SimModule(mgr, descrName, tagName),
00072 SIMCALLBACK_INIT(SimEventGeons3DOutput),
00073 SIMCALLBACK_INIT(SimEventSaveOutput),
00074 SIMCALLBACK_INIT(SimEventUserInput),
00075 itsShowDebug(&OPT_ObjectsShowDebug, this),
00076 itsProb(0)
00077 {
00078
00079 initRandomNumbers();
00080
00081 Table* table = new Table();
00082 table->pos = Point3D<double>(-3.60,-7.30,-5.00);
00083 table->rotation = Point3D<double>(0.31,-0.15,0.31);
00084 table->tableWidth = 6.01;
00085 table->tableLength = 4.50;
00086 table->legHeight = 4.00;
00087 table->legWidth = 0.50;
00088
00089
00090 itsObjectsState.push_back(table);
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102 }
00103
00104
00105 Objects::~Objects()
00106 {
00107 }
00108
00109
00110 void Objects::onSimEventGeons3DOutput(SimEventQueue& q,
00111 rutz::shared_ptr<SimEventGeons3DOutput>& e)
00112 {
00113 itsGeons = e->getGeons();
00114 itsProb = e->getProb();
00115 evolve(q);
00116
00117
00118
00119 }
00120
00121
00122 void Objects::onSimEventSaveOutput(SimEventQueue& q, rutz::shared_ptr<SimEventSaveOutput>& e)
00123 {
00124 if (itsShowDebug.getVal())
00125 {
00126
00127
00128 nub::ref<FrameOstream> ofs =
00129 dynamic_cast<const SimModuleSaveInfo&>(e->sinfo()).ofs;
00130 Layout<PixRGB<byte> > disp = getDebugImage(q);
00131 ofs->writeRgbLayout(disp, "Objects", FrameInfo("Objects", SRC_POS));
00132 }
00133 }
00134
00135
00136 void Objects::onSimEventUserInput(SimEventQueue& q, rutz::shared_ptr<SimEventUserInput>& e)
00137 {
00138
00139 LINFO("Got event %s %ix%i key=%i",
00140 e->getWinName(),
00141 e->getMouseClick().i,
00142 e->getMouseClick().j,
00143 e->getKey());
00144
00145 if (e->getMouseClick().isValid())
00146 {
00147 }
00148
00149 ObjectState* object = itsObjectsState[0];
00150 Table* table = (Table*)object;
00151 switch(e->getKey())
00152 {
00153 case 98:
00154 object->pos.x -= 0.1;
00155 break;
00156 case 104:
00157 object->pos.x += 0.1;
00158 break;
00159 case 100:
00160 object->pos.y -= 0.1;
00161 break;
00162 case 102:
00163 object->pos.y += 0.1;
00164 break;
00165 case 21:
00166 object->pos.z += 0.1;
00167 break;
00168 case 20:
00169 object->pos.z -= 0.1;
00170 break;
00171 case 38:
00172 object->rotation.x += 1*(M_PI/180);
00173 break;
00174 case 52:
00175 object->rotation.x -= 1*(M_PI/180);
00176 break;
00177 case 39:
00178 object->rotation.y += 1*(M_PI/180);
00179 break;
00180 case 53:
00181 object->rotation.y -= 1*(M_PI/180);
00182 break;
00183 case 40:
00184 object->rotation.z += 1*(M_PI/180);
00185 break;
00186 case 54:
00187 object->rotation.z -= 1*(M_PI/180);
00188 break;
00189
00190 case 10:
00191 table->legHeight -= 0.1;
00192 break;
00193 case 24:
00194 table->legHeight += 0.1;
00195 break;
00196 case 11:
00197 table->tableWidth += 0.01;
00198 break;
00199 case 25:
00200 table->tableWidth -= 0.01;
00201 break;
00202 case 12:
00203 table->tableLength += 0.01;
00204 break;
00205 case 26:
00206 table->tableLength -= 0.01;
00207 break;
00208 }
00209
00210 LINFO("Pos(%0.2f,%0.2f,%0.2f), rotation((%0.2f,%0.2f,%0.2f), size(%0.2f,%0.2f,%0.2f)",
00211 object->pos.x, object->pos.y, object->pos.z,
00212 object->rotation.x, object->rotation.y, object->rotation.z,
00213 table->tableWidth, table->tableLength,table->legHeight);
00214
00215
00216 evolve(q);
00217
00218 }
00219
00220 void Objects::calcObjectLikelihood(ObjectState& object)
00221 {
00222
00223 }
00224
00225
00226 std::vector<Geons3D::GeonState> Objects::getPrior(ObjectState* object)
00227 {
00228
00229 std::vector<Geons3D::GeonState> geons;
00230
00231 switch(object->type)
00232 {
00233 case TABLE:
00234 Table* table = (Table*)object;
00235
00236 float legXOffset = table->tableWidth/2 - table->legWidth/2;
00237 float legYOffset = table->tableLength/2 - table->legWidth/2;
00238
00239 geons.push_back(
00240 Geons3D::GeonState(Geons3D::BOX,
00241 Point3D<double>(0, 0, 0+table->legHeight/2),
00242
00243 Point3D<double>(0,0,0),
00244
00245 Point3D<double>(1, 1, 1),
00246 Point3D<double>(table->tableWidth,table->tableLength,0.40) ));
00247 geons.push_back(
00248 Geons3D::GeonState(Geons3D::BOX,
00249 Point3D<double>(0-legXOffset, 0-legYOffset,0),
00250
00251 Point3D<double>(0,0,0),
00252 Point3D<double>(1, 1, 1),
00253 Point3D<double>(table->legWidth,table->legWidth,table->legHeight) ));
00254 geons.push_back(
00255 Geons3D::GeonState(Geons3D::BOX,
00256 Point3D<double>(0+legXOffset, 0-legYOffset,0),
00257
00258 Point3D<double>(0,0,0),
00259 Point3D<double>(1, 1, 1),
00260 Point3D<double>(table->legWidth,table->legWidth,table->legHeight) ));
00261 geons.push_back(
00262 Geons3D::GeonState(Geons3D::BOX,
00263 Point3D<double>(0-legXOffset, 0+legYOffset,0),
00264
00265 Point3D<double>(0,0,0),
00266 Point3D<double>(1, 1, 1),
00267 Point3D<double>(table->legWidth,table->legWidth,table->legHeight) ));
00268 geons.push_back(
00269 Geons3D::GeonState(Geons3D::BOX,
00270 Point3D<double>(0+legXOffset, 0+legYOffset,0),
00271
00272 Point3D<double>(0,0,0),
00273 Point3D<double>(1, 1, 1),
00274 Point3D<double>(table->legWidth,table->legWidth,table->legHeight) ));
00275 break;
00276 }
00277
00278 return geons;
00279
00280 }
00281
00282 Objects::ObjectState* Objects::proposeState(ObjectState* object)
00283 {
00284
00285
00286 object->lastSample = (object->lastSample +1)%2;
00287
00288
00289
00290
00291 Table* table = new Table();
00292 table->pos = Point3D<double>(-3.60,-7.30,-5.00);
00293 table->rotation = Point3D<double>(0.31,-0.15,0.31);
00294 table->tableWidth = 6.01;
00295 table->tableLength = 4.50;
00296 table->legHeight = 4.00;
00297 table->legWidth = 0.50;
00298
00299 switch(object->lastSample)
00300 {
00301 case 0:
00302 {
00303 Point3D<double> randLoc(
00304 randomDoubleFromNormal(0.10),
00305 randomDoubleFromNormal(0.10),
00306 randomDoubleFromNormal(0.10));
00307 table->pos += randLoc;
00308 }
00309 break;
00310 case 1:
00311 {
00312 Point3D<double> randRot(
00313 randomDoubleFromNormal(0.5)*M_PI/180,
00314 randomDoubleFromNormal(0.5)*M_PI/180,
00315 randomDoubleFromNormal(0.5)*M_PI/180);
00316 table->rotation += randRot;
00317 }
00318 break;
00319 case 2:
00320
00321
00322
00323 break;
00324 case 3:
00325
00326
00327
00328 break;
00329 }
00330
00331 return table;
00332
00333 }
00334
00335
00336
00337 void Objects::evolve(SimEventQueue& q)
00338 {
00339
00340
00341 for(uint i=0; i<itsObjectsState.size(); i++)
00342 {
00343 ObjectState* newObject = proposeState(itsObjectsState[i]);
00344
00345
00346
00347
00348
00349
00350
00351 std::vector<Geons3D::GeonState> geons = getPrior(newObject);
00352 q.post(rutz::make_shared(new SimEventGeons3DPrior(this, geons,
00353 newObject->pos, newObject->rotation)));
00354
00355 delete newObject;
00356 }
00357 }
00358
00359
00360
00361 Layout<PixRGB<byte> > Objects::getDebugImage(SimEventQueue& q)
00362 {
00363
00364 Layout<PixRGB<byte> > outDisp;
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386 return outDisp;
00387
00388 }
00389
00390
00391
00392
00393
00394
00395
00396
00397 #endif
00398