void mainLoop() { //while (mCurrentTrialTime < mTrialLength) while (true) { Ogre::Real elapsedSimTime = 0; Ogre::Real elapsedRealTime = 0; gEngine.update(elapsedSimTime, elapsedRealTime); handleInput(elapsedRealTime); if (gEngine.quitApp()) { return; } // Update sound effects at 50 Hz. const Ogre::Real soundUpdatePeriod = 0.02; static Ogre::Real soundUpdateTimer = 0; soundUpdateTimer -= elapsedSimTime; if (soundUpdateTimer <= 0) { gRobot->updateSoundEffects(soundUpdatePeriod); gCar->updateSoundEffects(soundUpdatePeriod); soundUpdateTimer = soundUpdatePeriod; } gRobot->updateVisuals(elapsedSimTime); updateOverlay(); gAgentDebugger->updateVisuals(); } //mAvgRewardPerStep = mAvgRewardPerStep * mPhysicsStepSize / // mCurrentTrialTime; //dataFile.storeData("trial", trial, (double)trial); //dataFile.storeData("avg reward per step", trial, // mAvgRewardPerStep); //printTrialAndRunStatus(run, trial, mAvgRewardPerStep); //std::cout << "Agent age = " << mPendulum->getAgent()->getAgeString() // << std::endl; //dataFile.printToFile("./results/pendulum-performance.dat"); }
void PendulumTest::startTest() { SimulationEngine engine; if (!engine.init()) { return; } // Get a pointer to the trial number overlay and make it visible. Ogre::OverlayManager::getSingleton().getByName("Verve/TrialNumber")->show(); engine.setUpdateMode(SimulationEngine::SIMULATE_REAL_TIME_MULTIPLE, 1); engine.setCameraMoveSpeed(5); //// Set to capture frames at 29.97 fps. //engine.setUpdateMode(SIMULATE_CONSTANT_CHUNK, 0.0333667); engine.getSimulator()->setStepSize(mPhysicsStepSize); engine.getSimulator()->setGravity(opal::Vec3r(0, -9.81, 0)); // Make sure we get notified at the end of each step. engine.getSimulator()->addPostStepEventHandler(this); // Create a static box for a ground plane. opal::Solid* boxSolid = engine.getSimulator()->createSolid(); boxSolid->setStatic(true); boxSolid->setPosition(0, -1.5, 0); opal::BoxShapeData data; data.dimensions.set(6, 3, 6); boxSolid->addShape(data); engine.createPhysicalEntity("ground", "Plastic/Gray", boxSolid); DataFile dataFile(mNumTrialsPerRun); opal::Matrix44r initialTransform; initialTransform.translate(0, 1.2, 0); assert(NULL == mPendulum); mPendulum = new Pendulum(engine, initialTransform); mAgentDebugger = new AgentVisualDebugger(engine.getSceneManager()); for (unsigned int run = 0; run < mNumRuns; ++run) { mPendulum->resetBodyAndCreateNewAgent(); mAgentDebugger->setAgent(mPendulum->getAgent()); for (unsigned int trial = 0; trial < mNumTrialsPerRun; ++trial) { updateOverlayData(trial); mPendulum->resetBodyAndSTM(); mPendulum->randomizeState(); mAvgRewardPerStep = 0; mCurrentTrialTime = 0; while (mCurrentTrialTime < mTrialLength) { Ogre::Real elapsedSimTime = 0; Ogre::Real elapsedRealTime = 0; engine.update(elapsedSimTime, elapsedRealTime); handleInput(elapsedRealTime, engine); if (engine.quitApp()) { return; } mAgentDebugger->updateVisuals(); } mAvgRewardPerStep = mAvgRewardPerStep * mPhysicsStepSize / mCurrentTrialTime; dataFile.storeData("trial", trial, (float)trial); dataFile.storeData("avg reward per step", trial, mAvgRewardPerStep); printTrialAndRunStatus(run, trial, mAvgRewardPerStep); //// Print value function data. //if (0 == run && // (trial == 0 || trial == 4 || trial == 19 || trial == 99)) //{ // char fileStr[1024]; // sprintf(fileStr, "./results/pendulum-trial%d-value.dat", trial); // mPendulum->getAgent()->saveValueData(400, fileStr); // sprintf(fileStr, "./results/pendulum-trial%d-RBF.dat", trial); // mPendulum->getAgent()->saveStateRBFData(fileStr); //} } std::cout << "Agent age = " << mPendulum->getAgent()->getAgeString() << std::endl; } dataFile.printToFile("./results/pendulum-performance.dat"); }