Revision: 7308
          http://playerstage.svn.sourceforge.net/playerstage/?rev=7308&view=rev
Author:   rtv
Date:     2009-01-28 09:05:20 +0000 (Wed, 28 Jan 2009)

Log Message:
-----------
improved fasr example. working on reparenting ready for gripper - not yet 
functional

Modified Paths:
--------------
    code/stage/trunk/examples/ctrl/fasr.cc
    code/stage/trunk/libstage/CMakeLists.txt
    code/stage/trunk/libstage/ancestor.cc
    code/stage/trunk/libstage/canvas.cc
    code/stage/trunk/libstage/charger.cc
    code/stage/trunk/libstage/model.cc
    code/stage/trunk/libstage/model_callbacks.cc
    code/stage/trunk/libstage/model_fiducial.cc
    code/stage/trunk/libstage/model_load.cc
    code/stage/trunk/libstage/stage.hh
    code/stage/trunk/libstage/world.cc
    code/stage/trunk/worlds/fasr.world

Modified: code/stage/trunk/examples/ctrl/fasr.cc
===================================================================
--- code/stage/trunk/examples/ctrl/fasr.cc      2009-01-27 08:59:09 UTC (rev 
7307)
+++ code/stage/trunk/examples/ctrl/fasr.cc      2009-01-28 09:05:20 UTC (rev 
7308)
@@ -1,17 +1,18 @@
 #include "stage.hh"
 using namespace Stg;
 
+const bool verbose = false;
+
+// navigation control params
 const double cruisespeed = 0.4; 
 const double avoidspeed = 0.05; 
 const double avoidturn = 0.5;
 const double minfrontdistance = 0.7;  
 const double stopdist = 0.5;
-const bool verbose = false;
 const int avoidduration = 10;
 const int workduration = 20;
 const int payload = 4;
 
-
 double have[4][4] = { 
   { 90, 180, 180, 180 },
   { 90, -90, 0, -90 },
@@ -25,10 +26,11 @@
   { -90, -90, 180, 180 },
   { -90, -180, -90, -90 }
 };
-  
 
-typedef struct
+
+class Robot
 {
+private:
   ModelPosition* pos;
   ModelLaser* laser;
   ModelRanger* ranger;
@@ -37,56 +39,72 @@
   Model *source, *sink;
   int avoidcount, randcount;
   int work_get, work_put;
+  
+  static int LaserUpdate( ModelLaser* mod, Robot* robot );
+  static int PositionUpdate( ModelPosition* mod, Robot* robot );
+  static int FiducialUpdate( ModelFiducial* mod, Robot* robot );
 
-} robot_t;
+public:
+  Robot( ModelPosition* pos, 
+                       ModelLaser* laser, 
+                       ModelRanger* ranger, 
+                       ModelFiducial* fiducial, 
+                       ModelBlobfinder* blob,
+                       Model* source,
+                       Model* sink ) 
+        : pos(pos), 
+               laser(laser), 
+               ranger(ranger), 
+               blobfinder(blobfinder), 
+               fiducial(fiducial), 
+               source(source), 
+               sink(sink), 
+               avoidcount(0), 
+               randcount(0), 
+               work_get(0), 
+               work_put(0)
+  {
+        // need at least these models to get any work done
+        assert( pos );
+        assert( laser );
+        
+        pos->AddUpdateCallback( (stg_model_callback_t)PositionUpdate, this );
+        laser->AddUpdateCallback( (stg_model_callback_t)LaserUpdate, this );
 
-int LaserUpdate( Model* mod, robot_t* robot );
-int PositionUpdate( Model* mod, robot_t* robot );
+        if( fiducial ) // optional
+               fiducial->AddUpdateCallback( 
(stg_model_callback_t)FiducialUpdate, this );
+  }
+};
 
 
+
 // Stage calls this when the model starts up
 extern "C" int Init( Model* mod )
 {  
-  robot_t* robot = new robot_t;
-  robot->work_get = 0;
-  robot->work_put = 0;
-  
-  robot->pos = (ModelPosition*)mod;
-
-  robot->laser = (ModelLaser*)mod->GetUnusedModelOfType( MODEL_TYPE_LASER );
-  assert( robot->laser );
-  robot->laser->Subscribe();
-
-  robot->fiducial = (ModelFiducial*)mod->GetUnusedModelOfType( 
MODEL_TYPE_FIDUCIAL );
-  assert( robot->fiducial );
-  robot->fiducial->Subscribe();
-
-  robot->ranger = (ModelRanger*)mod->GetUnusedModelOfType( MODEL_TYPE_RANGER );
-  assert( robot->ranger );
-  //robot->ranger->Subscribe();
-
-  robot->avoidcount = 0;
-  robot->randcount = 0;
-  
-  robot->laser->AddUpdateCallback( (stg_model_callback_t)LaserUpdate, robot );
-  robot->pos->AddUpdateCallback( (stg_model_callback_t)PositionUpdate, robot );
-
-  robot->source = mod->GetWorld()->GetModel( "source" );
-  assert(robot->source);
-
-  robot->sink = mod->GetWorld()->GetModel( "sink" );
-  assert(robot->sink);
+  Robot* robot = new Robot( (ModelPosition*)mod,
+                                                                        
(ModelLaser*)mod->GetUnusedModelOfType( MODEL_TYPE_LASER ),
+                                                                        
(ModelRanger*)mod->GetUnusedModelOfType( MODEL_TYPE_RANGER ),
+                                                                        
(ModelFiducial*)mod->GetUnusedModelOfType( MODEL_TYPE_FIDUCIAL ),
+                                                                        NULL,
+                                                                        
mod->GetWorld()->GetModel( "source" ),
+                                                                        
mod->GetWorld()->GetModel( "sink" ) );
     
   return 0; //ok
 }
 
 // inspect the laser data and decide what to do
-int LaserUpdate( Model* mod, robot_t* robot )
+int Robot::LaserUpdate( ModelLaser* laser, Robot* robot )
 {
-  // get the data
+  if( laser->power_pack && laser->power_pack->charging )
+        printf( "model %s power pack @%p is charging\n",
+                               laser->Token(), laser->power_pack );
+  
+  // Get the data
   uint32_t sample_count=0;
-  stg_laser_sample_t* scan = robot->laser->GetSamples( &sample_count );
-  assert(scan);
+  stg_laser_sample_t* scan = laser->GetSamples( &sample_count );
+
+  if( scan == NULL )
+        return 0;
   
   bool obstruction = false;
   bool stop = false;
@@ -194,9 +212,9 @@
   return 0;
 }
 
-int PositionUpdate( Model* mod, robot_t* robot )
+int Robot::PositionUpdate( ModelPosition* pos, Robot* robot )
 {  
-  Pose pose = robot->pos->GetPose();
+  Pose pose = pos->GetPose();
   
   //printf( "Pose: [%.2f %.2f %.2f %.2f]\n",
   //  pose.x, pose.y, pose.z, pose.a );
@@ -204,7 +222,7 @@
   //pose.z += 0.0001;
   //robot->pos->SetPose( pose );
   
-  if( robot->pos->GetFlagCount() < payload && 
+  if( pos->GetFlagCount() < payload && 
       hypot( -7-pose.x, -7-pose.y ) < 2.0 )
     {
       if( ++robot->work_get > workduration )
@@ -213,7 +231,7 @@
                         robot->source->Lock();
 
                         // transfer a chunk from source to robot
-                        robot->pos->PushFlag( robot->source->PopFlag() );
+                        pos->PushFlag( robot->source->PopFlag() );
                         robot->source->Unlock();
 
                         robot->work_get = 0;
@@ -229,7 +247,7 @@
 
                         //puts( "dropping" );
                         // transfer a chunk between robot and goal
-                        robot->sink->PushFlag( robot->pos->PopFlag() );
+                        robot->sink->PushFlag( pos->PopFlag() );
                         robot->sink->Unlock();
 
                         robot->work_put = 0;
@@ -240,3 +258,27 @@
   return 0; // run again
 }
 
+
+
+int Robot::FiducialUpdate( ModelFiducial* mod, Robot* robot )
+{    
+  for( unsigned int i = 0; i < mod->fiducial_count; i++ )
+        {
+               stg_fiducial_t* f = &mod->fiducials[i];
+               
+               //printf( "fiducial %d is %d at %.2f m %.2f radians\n",
+               //        i, f->id, f->range, f->bearing );
+               
+               if( f->range < 1 )
+                 {
+                        printf( "attempt to grab model @%p %s\n",
+                                               f->mod, f->mod->Token() );
+                               
+                        // working on picking up models
+                        //robot->pos->BecomeParentOf( f->mod );
+                 }
+               
+        }                                                
+  
+  return 0; // run again
+}

Modified: code/stage/trunk/libstage/CMakeLists.txt
===================================================================
--- code/stage/trunk/libstage/CMakeLists.txt    2009-01-27 08:59:09 UTC (rev 
7307)
+++ code/stage/trunk/libstage/CMakeLists.txt    2009-01-28 09:05:20 UTC (rev 
7308)
@@ -28,6 +28,7 @@
        options_dlg.cc
        options_dlg.hh
        powerpack.cc
+       puck.cc
        region.cc
        resource.cc
        stage.cc

Modified: code/stage/trunk/libstage/ancestor.cc
===================================================================
--- code/stage/trunk/libstage/ancestor.cc       2009-01-27 08:59:09 UTC (rev 
7307)
+++ code/stage/trunk/libstage/ancestor.cc       2009-01-28 09:05:20 UTC (rev 
7308)
@@ -1,15 +1,14 @@
 #include "stage.hh"
 using namespace Stg;
 
-Ancestor::Ancestor()
+Ancestor::Ancestor() :
+  children( NULL ),
+  debug( false ),
+  puck_list( NULL ),
+  token( NULL )
 {
-       token = NULL;
-       children = NULL;
-       
-       for( int i=0; i<MODEL_TYPE_COUNT; i++ )
-         child_type_counts[i] = 0;
-
-       debug = false;
+  for( int i=0; i<MODEL_TYPE_COUNT; i++ )
+        child_type_counts[i] = 0;
 }
 
 Ancestor::~Ancestor()
@@ -20,8 +19,7 @@
                        delete (Model*)it->data;
 
                g_list_free( children );
-       }
-
+       }       
 }
 
 void Ancestor::AddChild( Model* mod )
@@ -73,3 +71,12 @@
        }
 }
 
+
+
+void Ancestor::Load( Worldfile* wf, int section )
+{
+}
+
+void Ancestor::Save( Worldfile* wf, int section )
+{
+}

Modified: code/stage/trunk/libstage/canvas.cc
===================================================================
--- code/stage/trunk/libstage/canvas.cc 2009-01-27 08:59:09 UTC (rev 7307)
+++ code/stage/trunk/libstage/canvas.cc 2009-01-28 09:05:20 UTC (rev 7308)
@@ -804,6 +804,9 @@
   if( showBBoxes )
         DrawBoundingBoxes();
   
+  
+  LISTMETHOD( world->puck_list, Puck*, Draw );
+
   // TODO - finish this properly
   //LISTMETHOD( models_sorted, Model*, DrawWaypoints );
   

Modified: code/stage/trunk/libstage/charger.cc
===================================================================
--- code/stage/trunk/libstage/charger.cc        2009-01-27 08:59:09 UTC (rev 
7307)
+++ code/stage/trunk/libstage/charger.cc        2009-01-28 09:05:20 UTC (rev 
7308)
@@ -13,7 +13,7 @@
 Charger::Charger( World* world ) 
   : world( world ), watts( 1000.0 )
 {
-  printf( "Charger constructed" );
+  //printf( "Charger constructed" );
 }
 
 void Charger::ChargeIfContained( PowerPack* pp, Pose pose )

Modified: code/stage/trunk/libstage/model.cc
===================================================================
--- code/stage/trunk/libstage/model.cc  2009-01-27 08:59:09 UTC (rev 7307)
+++ code/stage/trunk/libstage/model.cc  2009-01-28 09:05:20 UTC (rev 7308)
@@ -126,6 +126,37 @@
 uint32_t Model::count = 0;
 GHashTable* Model::modelsbyid = g_hash_table_new( NULL, NULL );
 
+
+void Size::Load( Worldfile* wf, int section, const char* keyword )
+{
+  x = wf->ReadTupleLength( section, keyword, 0, x );
+  y = wf->ReadTupleLength( section, keyword, 1, y );
+  z = wf->ReadTupleLength( section, keyword, 2, z );
+}
+
+void Size::Save( Worldfile* wf, int section, const char* keyword )
+{
+  wf->WriteTupleLength( section, keyword, 0, x );
+  wf->WriteTupleLength( section, keyword, 1, y );
+  wf->WriteTupleLength( section, keyword, 2, z );
+}
+
+void Pose::Load( Worldfile* wf, int section, const char* keyword )
+{
+  x = wf->ReadTupleLength( section, keyword, 0, x );
+  y = wf->ReadTupleLength( section, keyword, 1, y );
+  z = wf->ReadTupleLength( section, keyword, 2, z );
+  a = wf->ReadTupleAngle(  section, keyword, 3, a );
+}
+
+void Pose::Save( Worldfile* wf, int section, const char* keyword )
+{
+  wf->WriteTupleLength( section, keyword, 0, x );
+  wf->WriteTupleLength( section, keyword, 1, y );
+  wf->WriteTupleLength( section, keyword, 2, z );
+  wf->WriteTupleAngle(  section, keyword, 3, a );
+}
+
 Visibility::Visibility() : 
   blob_return( true ),
   fiducial_key( 0 ),
@@ -166,7 +197,7 @@
 // constructor
 Model::Model( World* world,
              Model* parent,
-             const stg_model_type_t type )
+                                 const stg_model_type_t type )
   : Ancestor(),         
     access_mutex(NULL),
     blinkenlights( g_ptr_array_new() ),
@@ -177,7 +208,7 @@
     color( 0xFFFF0000 ), // red
     data_fresh(false),
     disabled(false),
-       custom_visual_list( NULL ),
+        custom_visual_list( NULL ),
     flag_list(NULL),
     geom(),
     has_default_block( true ),
@@ -705,7 +736,7 @@
 {
   return( world->sim_time  >= (last_update + interval) );
 }
- 
+
 void Model::Update( void )
 {
   //   printf( "[%llu] %s update (%d subs)\n", 
@@ -1748,3 +1779,15 @@
 {
   blockgroup.UnMap();
 }
+
+void Model::BecomeParentOf( Model* child )
+{
+  if( child->parent )
+        child->parent->RemoveChild( child );
+  
+  child->parent = this;
+  
+  this->AddChild( child );
+  
+  world->dirty = true; 
+}

Modified: code/stage/trunk/libstage/model_callbacks.cc
===================================================================
--- code/stage/trunk/libstage/model_callbacks.cc        2009-01-27 08:59:09 UTC 
(rev 7307)
+++ code/stage/trunk/libstage/model_callbacks.cc        2009-01-28 09:05:20 UTC 
(rev 7308)
@@ -73,8 +73,12 @@
        {
                //puts( "callback was not installed" );
        }
+       
+       // return the number of callbacks now in the list. Useful for
+       // detecting when the list is empty.
+       //return g_list_length( cb_list );
 
-       return 0; //ok
+       return 0;
 }
 
 

Modified: code/stage/trunk/libstage/model_fiducial.cc
===================================================================
--- code/stage/trunk/libstage/model_fiducial.cc 2009-01-27 08:59:09 UTC (rev 
7307)
+++ code/stage/trunk/libstage/model_fiducial.cc 2009-01-28 09:05:20 UTC (rev 
7308)
@@ -177,46 +177,44 @@
                                                                                
                          NULL,
                                                                                
                          false );
        
-       range = ray.range;
+       //range = ray.range;
        Model* hitmod = ray.mod;
 
 //     printf( "ray hit %s and was seeking LOS to %s\n",
 //                       hitmod ? hitmod->Token() : "null",
 //                       him->Token() );
 
-       //assert( ! (hitmod == this) );
-
        // if it was him, we can see him
        if( hitmod == him )
-       {
-               Geom hisgeom = him->GetGeom();
+         {
+                Geom hisgeom = him->GetGeom();
+                
+                // record where we saw him and what he looked like
+                stg_fiducial_t fid;
+                fid.mod = him;
+                fid.range = range;
+                fid.bearing = dtheta;
+                fid.geom.x = hisgeom.size.x;
+                fid.geom.y = hisgeom.size.y;
+                fid.geom.a = normalize( hispose.a - mypose.a);
+                
+                // store the global pose of the fiducial (mainly for the GUI)
+                memcpy( &fid.pose, &hispose, sizeof(fid.pose));
 
-               // record where we saw him and what he looked like
-               stg_fiducial_t fid;
-               fid.range = range;
-               fid.bearing = dtheta;
-               fid.geom.x = hisgeom.size.x;
-               fid.geom.y = hisgeom.size.y;
-               fid.geom.a = normalize( hispose.a - mypose.a);
-
-               // store the global pose of the fiducial (mainly for the GUI)
-               memcpy( &fid.pose, &hispose, sizeof(fid.pose));
-
-               // if he's within ID range, get his fiducial.return value, else
-               // we see value 0
-               fid.id = range < max_range_id ? hitmod->vis.fiducial_return : 0;
-
-               PRINT_DEBUG2( "adding %s's value %d to my list of fiducials",
-                               him->Token(), him->vis.fiducial_return );
-
-               g_array_append_val( data, fid );
-       }
-
+                // if he's within ID range, get his fiducial.return value, else
+                // we see value 0
+                fid.id = range < max_range_id ? hitmod->vis.fiducial_return : 
0;
+                
+                PRINT_DEBUG2( "adding %s's value %d to my list of fiducials",
+                                                       him->Token(), 
him->vis.fiducial_return );
+                
+                g_array_append_val( data, fid );
+         }
+       
        fiducials = (stg_fiducial_t*)data->data;
        fiducial_count = data->len;
 }
 
-
 ///////////////////////////////////////////////////////////////////////////
 // Update the beacon data
 //
@@ -265,22 +263,22 @@
                return;
        
        // draw the FOV
-       //    GLUquadric* quadric = gluNewQuadric();
+          GLUquadric* quadric = gluNewQuadric();
 
-       //    PushColor( 0,0,0,0.2  );
+          PushColor( 0,0,0,0.2  );
 
-       //    gluQuadricDrawStyle( quadric, GLU_SILHOUETTE );
+          gluQuadricDrawStyle( quadric, GLU_SILHOUETTE );
 
-       //    gluPartialDisk( quadric,
-       //                 0, 
-       //                 max_range_anon,
-       //                 20, // slices        
-       //                 1, // loops
-       //                 rtod( M_PI/2.0 + fov/2.0), // start angle
-       //                 rtod(-fov) ); // sweep angle
+          gluPartialDisk( quadric,
+                          0, 
+                          max_range_anon,
+                          20, // slices        
+                          1, // loops
+                          rtod( M_PI/2.0 + fov/2.0), // start angle
+                          rtod(-fov) ); // sweep angle
 
-       //    gluDeleteQuadric( quadric );
-       //    PopColor();
+          gluDeleteQuadric( quadric );
+          PopColor();
 
        if( data->len == 0 )
                return;

Modified: code/stage/trunk/libstage/model_load.cc
===================================================================
--- code/stage/trunk/libstage/model_load.cc     2009-01-27 08:59:09 UTC (rev 
7307)
+++ code/stage/trunk/libstage/model_load.cc     2009-01-28 09:05:20 UTC (rev 
7308)
@@ -99,49 +99,38 @@
   if( wf->PropertyExists( wf_entity, "origin" ) )
     {
       Geom geom = GetGeom();
-      geom.pose.x = wf->ReadTupleLength(wf_entity, "origin", 0, geom.pose.x );
-      geom.pose.y = wf->ReadTupleLength(wf_entity, "origin", 1, geom.pose.y );
-      geom.pose.z = wf->ReadTupleLength(wf_entity, "origin", 2, geom.pose.z );
-      geom.pose.a =  wf->ReadTupleAngle(wf_entity, "origin", 3, geom.pose.a );
-      this->SetGeom( geom );
+               geom.pose.Load( wf, wf_entity, "origin" );
+      SetGeom( geom );
     }
-
+  
   if( wf->PropertyExists( wf_entity, "size" ) )
     {
       Geom geom = GetGeom();
-      geom.size.x = wf->ReadTupleLength(wf_entity, "size", 0, geom.size.x );
-      geom.size.y = wf->ReadTupleLength(wf_entity, "size", 1, geom.size.y );
-      geom.size.z = wf->ReadTupleLength(wf_entity, "size", 2, geom.size.z );
-      this->SetGeom( geom );
+               geom.size.Load( wf, wf_entity, "size" );
+      SetGeom( geom );
     }
-
+  
   if( wf->PropertyExists( wf_entity, "pose" ))
     {
       Pose pose = GetPose();
-      pose.x = wf->ReadTupleLength(wf_entity, "pose", 0, pose.x );
-      pose.y = wf->ReadTupleLength(wf_entity, "pose", 1, pose.y );
-      pose.z = wf->ReadTupleLength(wf_entity, "pose", 2, pose.z );
-      pose.a =  wf->ReadTupleAngle(wf_entity, "pose", 3, pose.a );
-      this->SetPose( pose );
+               pose.Load( wf, wf_entity, "pose" );
+      SetPose( pose );
     }
-
+  
   if( wf->PropertyExists( wf_entity, "velocity" ))
     {
       Velocity vel = GetVelocity();
-      vel.x = wf->ReadTupleLength(wf_entity, "velocity", 0, vel.x );
-      vel.y = wf->ReadTupleLength(wf_entity, "velocity", 1, vel.y );
-      vel.z = wf->ReadTupleLength(wf_entity, "velocity", 2, vel.z );
-      vel.a = wf->ReadTupleAngle(wf_entity, "velocity", 3,  vel.a );
-      this->SetVelocity( vel );
+               vel.Load( wf, wf_entity, "velocity" );
+      SetVelocity( vel );
     }
-
+  
   if( wf->PropertyExists( wf_entity, "color" ))
     {      
       stg_color_t col = 0xFFFF0000; // red;
       const char* colorstr = wf->ReadString( wf_entity, "color", NULL );
       if( colorstr )
-       {
-         if( strcmp( colorstr, "random" ) == 0 )
+                 {
+                        if( strcmp( colorstr, "random" ) == 0 )
            {
              col = (uint32_t)random();
              col |= 0xFF000000; // set the alpha channel to max

Modified: code/stage/trunk/libstage/stage.hh
===================================================================
--- code/stage/trunk/libstage/stage.hh  2009-01-27 08:59:09 UTC (rev 7307)
+++ code/stage/trunk/libstage/stage.hh  2009-01-28 09:05:20 UTC (rev 7308)
@@ -220,7 +220,7 @@
   {
   public:
     stg_meters_t x, y, z;
-
+        
     Size( stg_meters_t x, 
          stg_meters_t y, 
          stg_meters_t z )
@@ -230,6 +230,9 @@
     /** default constructor uses default non-zero values */
     Size() : x( 0.1 ), y( 0.1 ), z( 0.1 )
     {/*empty*/}        
+
+        void Load( Worldfile* wf, int section, const char* keyword );
+        void Save( Worldfile* wf, int section, const char* keyword );
   };
   
   /** Specify a 3 axis position, in x, y and heading. */
@@ -270,6 +273,9 @@
       printf( "%s pose [x:%.3f y:%.3f z:%.3f a:%.3f]\n",
              prefix, x,y,z,a );
     }
+        
+        void Load( Worldfile* wf, int section, const char* keyword );
+        void Save( Worldfile* wf, int section, const char* keyword );
   };
   
   
@@ -778,8 +784,26 @@
   /** Define a callback function type that can be attached to a
       record within a model and called whenever the record is set.*/
   typedef int (*stg_model_callback_t)( Model* mod, void* user );
+  
+  class Puck
+  {
+  private:
+        void BuildDisplayList();
 
-
+  public:
+        stg_color_t color;
+        int displaylist;
+        stg_meters_t height;
+        Pose pose;
+        stg_meters_t radius;
+        
+        Puck();
+        void Load( Worldfile* wf, int section );
+        void Save( Worldfile* wf, int section );
+        
+        void Draw();  
+  };
+  
   // ANCESTOR CLASS
   /** Base class for Model and World */
   class Ancestor
@@ -788,9 +812,13 @@
         
   protected:
     GList* children;
+    bool debug;
+        GList* puck_list;
     char* token;
-    bool debug;
         
+        void Load( Worldfile* wf, int section );
+        void Save( Worldfile* wf, int section );
+        
   public:
         
     /** recursively call func( model, arg ) for each descendant */
@@ -810,7 +838,7 @@
     { return token; }
         
     void SetToken( const char* str )
-    { token = strdup( str ); } // teeny memory leak
+    { token = strdup( str ); } // little memory leak    
   };
 
   /** raytrace sample
@@ -906,6 +934,7 @@
     void LoadModel( Worldfile* wf, int entity, GHashTable* entitytable );
     void LoadBlock( Worldfile* wf, int entity, GHashTable* entitytable );
     void LoadBlockGroup( Worldfile* wf, int entity, GHashTable* entitytable );
+    void LoadPuck( Worldfile* wf, int entity, GHashTable* entitytable );
     void LoadCharger( Worldfile* wf, int entity );
 
     SuperRegion* AddSuperRegion( const stg_point_int_t& coord );
@@ -1591,8 +1620,6 @@
       global coordinate frame is the parent is NULL. */
   Pose pose;
 
-  /** Optional attached PowerPack, defaults to NULL */
-  PowerPack* power_pack;
 
   /** GData datalist can contain arbitrary named data items. Can be used
       by derived model types to store properties, and for user code
@@ -1620,6 +1647,9 @@
 
   Visibility vis;
 
+  /** Optional attached PowerPack, defaults to NULL */
+  PowerPack* power_pack;
+
   void Lock()
   { 
     if( access_mutex == NULL )
@@ -1795,7 +1825,8 @@
   /** remove user supplied visualization to a model - supply the same ptr 
passed to AddCustomVisualizer */
   void RemoveCustomVisualizer( CustomVisualizer* custom_visual );
 
-       
+  void BecomeParentOf( Model* child );
+
   void Load( Worldfile* wf, int wf_entity )
   {
     /** Set the worldfile and worldfile entity ID - must be called
@@ -2006,12 +2037,18 @@
        
   void RemoveSaveCallback( stg_model_callback_t cb )
   { RemoveCallback( &hooks.save, cb ); }
-       
+  
   void AddUpdateCallback( stg_model_callback_t cb, void* user )
-  { AddCallback( &hooks.update, cb, user ); }
+  { 
+        AddCallback( &hooks.update, cb, user ); 
+    Subscribe(); // if attaching a callback here, assume we want updates to 
happen
+  }
        
   void RemoveUpdateCallback( stg_model_callback_t cb )
-  { RemoveCallback( &hooks.update, cb ); }
+  { 
+        RemoveCallback( &hooks.update, cb ); 
+        Unsubscribe();
+  }
        
   /** named-property interface 
    */
@@ -2331,8 +2368,8 @@
   stg_radians_t bearing; ///< bearing to the target 
   Pose geom; ///< size and relative angle of the target
   Pose pose; ///< Absolute accurate position of the target in world 
coordinates (it's cheating to use this in robot controllers!)
-  int id; ///< the identifier of the target, or -1 if none can be detected.
-
+  Model* mod; ///< Pointer to the model (real fiducial detectors can't do 
this!)
+  int id; ///< the fiducial identifier of the target (i.e. its fiducial_return 
value), or -1 if none can be detected.  
 } stg_fiducial_t;
 
 /// %ModelFiducial class

Modified: code/stage/trunk/libstage/world.cc
===================================================================
--- code/stage/trunk/libstage/world.cc  2009-01-27 08:59:09 UTC (rev 7307)
+++ code/stage/trunk/libstage/world.cc  2009-01-28 09:05:20 UTC (rev 7308)
@@ -190,6 +190,19 @@
   mod->LoadBlock( wf, entity );
 }
 
+void World::LoadPuck( Worldfile* wf, int entity, GHashTable* entitytable )
+{ 
+//   // lookup the group in which this was defined
+//   Ancestor* anc = (Ancestor*)g_hash_table_lookup( entitytable, 
+//                                                                             
                                                  
(gpointer)wf->GetEntityParent( entity ) );
+  
+
+  Puck* puck = new Puck();
+  puck->Load( wf, entity );  
+  puck_list = g_list_prepend( puck_list, puck );
+}
+
+
 void World::LoadModel( Worldfile* wf, int entity, GHashTable* entitytable )
 { 
   int parent_entity = wf->GetEntityParent( entity );
@@ -321,10 +334,10 @@
                  {
                         /* do nothing here */
                  }
-      //else if( strcmp( typestr, "blockgroup" ) == 0 )
-      //LoadBlockGroup( wf, entity, entitytable );             
       else if( strcmp( typestr, "block" ) == 0 )
                  LoadBlock( wf, entity, entitytable );
+               else if( strcmp( typestr, "puck" ) == 0 )
+                 LoadPuck( wf, entity, entitytable );
                else if( strcmp( typestr, "charger" ) == 0 )
                  LoadCharger( wf, entity );
                else

Modified: code/stage/trunk/worlds/fasr.world
===================================================================
--- code/stage/trunk/worlds/fasr.world  2009-01-27 08:59:09 UTC (rev 7307)
+++ code/stage/trunk/worlds/fasr.world  2009-01-28 09:05:20 UTC (rev 7308)
@@ -22,9 +22,9 @@
 ( 
   size [ 600.000 599.000 ] 
 
-  center [ -0.424 -0.218 ] 
+  center [ 0.051 -0.204 ] 
   rotate [ 0 0 ]
-  scale 30.883 
+  scale 33.822 
 
   pcam_loc [ 0 -4.000 2.000 ]
   pcam_angle [ 70.000 0 ]
@@ -73,15 +73,20 @@
   ctrl "sink"
 )
 
+#puck( pose [ 0 0 0 0 ] )
+#puck( pose [ 1 0 0 0 ] )
+#puck( pose [ 2 0 0 0 ] )
+#puck( pose [ 3 0 0 0 ] )
+
 define autorob pioneer2dx                
 (               
  sicklaser( samples 32 range_max 5 laser_return 2 watts 30  )
- fiducial( ) 
  ctrl "fasr"
  joules 1000000 
  fiducial_return 1
 )
 
+#autorob( pose [4.116 6.107 0  -147.323]   fiducial( range_max 3 ) )
 autorob( pose [4.116 6.107 0  -147.323] )
 autorob( pose [6.471 5.304 0 14.941] )
 autorob( pose [5.937 4.858 0 -147.503] )


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:
SourcForge Community
SourceForge wants to tell your story.
http://p.sf.net/sfu/sf-spreadtheword
_______________________________________________
Playerstage-commit mailing list
Playerstage-commit@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/playerstage-commit

Reply via email to