Revision: 6426
          http://playerstage.svn.sourceforge.net/playerstage/?rev=6426&view=rev
Author:   robotos
Date:     2008-05-11 18:22:45 -0700 (Sun, 11 May 2008)

Log Message:
-----------
Negative numbers in update rate will make the rendering or physics update rate 
dependent
one of each other. 
Change default behaviour of Gazebo from a 1:1 physics:rendering update to a 3:1
In most hardware this makes the simulation feel faster. 

Modified Paths:
--------------
    code/gazebo/trunk/doc/config_syntax.html
    code/gazebo/trunk/server/Simulator.cc
    code/gazebo/trunk/server/rendering/OgreAdaptor.cc

Modified: code/gazebo/trunk/doc/config_syntax.html
===================================================================
--- code/gazebo/trunk/doc/config_syntax.html    2008-05-12 00:09:57 UTC (rev 
6425)
+++ code/gazebo/trunk/doc/config_syntax.html    2008-05-12 01:22:45 UTC (rev 
6426)
@@ -183,6 +183,7 @@
 
 \verbatim
 <physics:ode>
+  <updateRate>0</updateRate>
   <stepTime>0.03</stepTime>
   <gravity>0 0 -9.8</gravity>
   <cfm>0.008</cfm>
@@ -193,7 +194,13 @@
 - gravity : Vector that describes the direction and magnitude of gravity.
 - cfm : The global constraint force mixing.
 - erp : The global error reduction parameter.
+- updateRate: number of times per second the physics simulation will try to 
update. This value is interpreted as:
+- 0 : as fast as possible
+- more than 0 : Maximum number of times the simulator will update physics each 
second (limit speed, save CPU, etc.)
+- less than 0 : How many rendering update cycles we will wait till we update 
one physic cycle
+The defaults are 0 physics updateRate (as fast as possible) and -3 render 
updateRate (update 3 times physics prior updating rendering)
 
+
 \section worldfile_gui GUI Syntax
 
 This declaration indicates what GUI to use, and some basic parameters such as 
size and position of the GUI.
@@ -265,6 +272,18 @@
 - linearStart : Distance from the camera to begin rendering fog
 - linearEnd : Distance from the camera to stop rendering fog
 
+The update rate (Frames Per Second) is specified using:
+\verbatim
+  <updateRate>0</updateRate>
+\endverbatim
+updateRate: number of times per second the rendering will try to update. This 
value is interpreted as:
+- 0 : as fast as possible
+- more than 0 : Maximum number of times the simulator will render each second 
(maximum Framerate)
+- less than 0 : How many physics update cycles we will wait till we update one 
render cycle
+The defaults are 0 physics updateRate (as fast as possible) and -3 render 
updateRate (update 3 times physics updates prior updating rendering)
+
+Note that if the limits of physics and rendering updating rates are not 
related, no lineal behaviour can be seen even when the simulation is lineal.
+
 OGRE resources are specified using the following (most people should only 
change the path information to match where they installed Gazebo):
 \verbatim
 <plugins path="/usr/local/lib/OGRE">

Modified: code/gazebo/trunk/server/Simulator.cc
===================================================================
--- code/gazebo/trunk/server/Simulator.cc       2008-05-12 00:09:57 UTC (rev 
6425)
+++ code/gazebo/trunk/server/Simulator.cc       2008-05-12 01:22:45 UTC (rev 
6426)
@@ -211,19 +211,23 @@
 /// Main simulation loop, when this loop ends the simulation finish
 void Simulator::MainLoop()
 {
-  double maxPhysicsUpdateRate = 
World::Instance()->GetPhysicsEngine()->GetUpdateRate();
-  double maxRenderUpdateRate = OgreAdaptor::Instance()->GetUpdateRate();
+  double maxPhysicsUpdateTime = 
World::Instance()->GetPhysicsEngine()->GetUpdateRate();
+  double maxRenderUpdateTime = OgreAdaptor::Instance()->GetUpdateRate();
   double step = World::Instance()->GetPhysicsEngine()->GetStepTime();
  
-  if (maxPhysicsUpdateRate == 0)
+  if (maxPhysicsUpdateTime == 0)
     gzmsg(2) << "updating the physics at full speed";
+  else if (maxPhysicsUpdateTime > 0)
+    gzmsg(2) << "updating the physics " << 1/maxPhysicsUpdateTime << " times 
per second";  
   else
-    gzmsg(2) << "updating the physics " << 1/maxPhysicsUpdateRate << " 
times/seconds";  
+   gzmsg(2) << "updating the physics after " << -1/maxPhysicsUpdateTime << " 
visualization updates";  
 
-  if (maxRenderUpdateRate == 0)
+  if (maxRenderUpdateTime == 0)
     gzmsg(2) << "updating the visualization at full speed";
+  else if (maxRenderUpdateTime > 0)
+    gzmsg(2) << "updating the visualization " << 1/maxRenderUpdateTime << " 
times per second";  
   else
-    gzmsg(2) << "updating the visualization " << 1/maxRenderUpdateRate << " 
times/seconds";  
+   gzmsg(2) << "updating the visualization " << -1/maxRenderUpdateTime << " 
times per each physics updates";  
   std::cout.flush();
 
   while (!this->userQuit)
@@ -231,7 +235,8 @@
     bool updated=false;
      
     //During 3 seconds we want to keep balance between how time pass and 
update limits
-    //this is a time slot
+    //this is a time slot. We don't want to make this too big so we keep 
changing behaviour
+    // in new circunstances, nor too small so we have a good measure.
     if ((this->checkpoint + 3 )< this->GetRealTime())
     {
       this->checkpoint = this->GetRealTime();
@@ -239,11 +244,15 @@
       this->renderUpdates = 0; 
     }
 
-      // Update the physics engine
-      // maxPhysicsUpdateRate * physicsUpdates means how much we have 
_advanced_ in this time slot so far.
-      // getRealTime - ckeckpoint means our +current point_ in the slot, we 
only update if our current point has 
+    // Update the physics engine
+    // If  maxPhysicsUpdateTime is positive, we will update when our time has 
come
+      // maxPhysicsUpdateTime * physicsUpdates means how much we have 
_advanced_ in this time slot so far.
+      // getRealTime - ckeckpoint means our _current point_ in the slot, we 
only update if our current point has 
       // surpassed what we have already advanced.
-    if ((this->GetRealTime() - this->checkpoint) > (maxPhysicsUpdateRate * 
this->physicsUpdates)) 
+   // If maxPhysicsUpdateTime is negative, we update if we are below the times 
rendering was updated * the multiplier of the userPause
+   // note that the multiplier defined in the file is inverted when read so 
for instance -2 will become -0.5
+    if ((maxPhysicsUpdateTime >= 0) && ((this->GetRealTime() - 
this->checkpoint) > (maxPhysicsUpdateTime * this->physicsUpdates)) || \
+        ((maxPhysicsUpdateTime < 0) && (this->physicsUpdates < 
(-maxPhysicsUpdateTime * this->renderUpdates)))) 
     {
 
       if (!this->GetUserPause() && !this->GetUserStep() ||
@@ -265,9 +274,10 @@
       this->physicsUpdates++;
       updated=true;
     }
-
+      
     // Update the rendering and gui
-    if ((this->GetRealTime() - this->checkpoint) > (maxRenderUpdateRate * 
this->renderUpdates))
+    if (((maxRenderUpdateTime >= 0) && ((this->GetRealTime() - 
this->checkpoint) > (maxRenderUpdateTime * this->renderUpdates))) || \
+        ((maxRenderUpdateTime < 0) && (this->renderUpdates < 
(-maxRenderUpdateTime * this->physicsUpdates))))
     {
       gazebo::OgreAdaptor::Instance()->Render(); 
       this->gui->Update();
@@ -278,12 +288,15 @@
     if (!updated)
     {
       double nextUpdate;
-      nextUpdate=MIN(this->renderUpdates+maxRenderUpdateRate, 
this->renderUpdates+maxPhysicsUpdateRate);
-      int realStep = static_cast<int>(nextUpdate - this->GetRealTime());
-      struct timespec waiting;
-      waiting.tv_sec=0;
-      waiting.tv_nsec=realStep *1000000000; //nanoseconds to seconds
-      //nanosleep(&waiting,0);
+      nextUpdate=MIN(this->renderUpdates * maxRenderUpdateTime, 
this->renderUpdates * maxPhysicsUpdateTime);
+      double realStep = this->checkpoint + nextUpdate - this->GetRealTime();
+      if (realStep > 0)
+      {
+        struct timespec waiting;
+        waiting.tv_sec=0;
+        waiting.tv_nsec=static_cast<long int>(realStep *1000000000); 
//nanoseconds to seconds
+        nanosleep(&waiting,0);
+      }
     }
   }
 }

Modified: code/gazebo/trunk/server/rendering/OgreAdaptor.cc
===================================================================
--- code/gazebo/trunk/server/rendering/OgreAdaptor.cc   2008-05-12 00:09:57 UTC 
(rev 6425)
+++ code/gazebo/trunk/server/rendering/OgreAdaptor.cc   2008-05-12 01:22:45 UTC 
(rev 6426)
@@ -125,7 +125,7 @@
     gzthrow( "missing OGRE Rendering information" );
   }
  
-  int maxFPS = node->GetInt("updateRate", 0);
+  int maxFPS = node->GetInt("updateRate", -3);
   if (maxFPS == 0)
     this->updateRate=0;
   else


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

-------------------------------------------------------------------------
This SF.net email is sponsored by the 2008 JavaOne(SM) Conference 
Don't miss this year's exciting event. There's still time to save $100. 
Use priority code J8TL2D2. 
http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone
_______________________________________________
Playerstage-commit mailing list
Playerstage-commit@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/playerstage-commit

Reply via email to