Revision: 7334
          http://playerstage.svn.sourceforge.net/playerstage/?rev=7334&view=rev
Author:   rtv
Date:     2009-02-15 23:44:46 +0000 (Sun, 15 Feb 2009)

Log Message:
-----------
cleaning up gripper and adding visualization

Modified Paths:
--------------
    code/stage/trunk/examples/ctrl/fasr.cc
    code/stage/trunk/libstage/gl.cc
    code/stage/trunk/libstage/model_gripper.cc
    code/stage/trunk/libstage/model_laser.cc
    code/stage/trunk/libstage/stage.hh
    code/stage/trunk/worlds/fasr.world

Modified: code/stage/trunk/examples/ctrl/fasr.cc
===================================================================
--- code/stage/trunk/examples/ctrl/fasr.cc      2009-02-13 18:55:58 UTC (rev 
7333)
+++ code/stage/trunk/examples/ctrl/fasr.cc      2009-02-15 23:44:46 UTC (rev 
7334)
@@ -115,7 +115,7 @@
   void Dock()
   {
         // close the grippers so they can be pushed into the charger
-        ModelGripper::data_t gripper_data = gripper->GetData();
+        ModelGripper::config_t gripper_data = gripper->GetConfig();
   
         if( gripper_data.paddles != ModelGripper::PADDLE_CLOSED )
                gripper->CommandClose();
@@ -183,7 +183,7 @@
                pos->SetXSpeed( 0.0 );
   
         // once we have backed off a bit, open and lower the gripper
-        ModelGripper::data_t gripper_data = gripper->GetData();
+        ModelGripper::config_t gripper_data = gripper->GetConfig();
         if( charger_range > gripper_distance )
                {
                  if( gripper_data.paddles != ModelGripper::PADDLE_OPEN )
@@ -284,7 +284,7 @@
                {
                  if( verbose ) puts( "Cruise" );
                
-                 ModelGripper::data_t gdata = gripper->GetData();
+                 ModelGripper::config_t gdata = gripper->GetConfig();
                                         
                  //avoidcount = 0;
                  pos->SetXSpeed( cruisespeed );          
@@ -303,7 +303,7 @@
                  if( y < 0 ) y = 0;
                
                  double a_goal = 
-                        dtor( ( pos->GetFlagCount() || gdata.stack_count ) ? 
have[y][x] : need[y][x] );
+                        dtor( ( pos->GetFlagCount() || gdata.gripped ) ? 
have[y][x] : need[y][x] );
                
                  // if we are low on juice - find the direction to the 
recharger instead
                  if( Hungry() )                 
@@ -481,8 +481,8 @@
 
   static int GripperUpdate( ModelGripper* grip, Robot* robot )
   {
-        ModelGripper::data_t gdata = grip->GetData();
-
+        ModelGripper::config_t gdata = grip->GetConfig();
+        
         printf( "BREAKBEAMS %s %s\n",
                                gdata.beam[0] ? gdata.beam[0]->Token() : 
"<null>", 
                                gdata.beam[1] ? gdata.beam[1]->Token() : 
"<null>" );

Modified: code/stage/trunk/libstage/gl.cc
===================================================================
--- code/stage/trunk/libstage/gl.cc     2009-02-13 18:55:58 UTC (rev 7333)
+++ code/stage/trunk/libstage/gl.cc     2009-02-15 23:44:46 UTC (rev 7334)
@@ -50,6 +50,11 @@
        glEnd();
 }
 
+void Stg::Gl::draw_centered_rect( float x, float y, float dx, float dy )
+{
+  glRectf( x-0.5*dx, y-0.5*dy, x+0.5*dx, y+0.5*dy );
+}
+
 void Stg::Gl::draw_vector( double x, double y, double z )
 {
   glBegin( GL_LINES );

Modified: code/stage/trunk/libstage/model_gripper.cc
===================================================================
--- code/stage/trunk/libstage/model_gripper.cc  2009-02-13 18:55:58 UTC (rev 
7333)
+++ code/stage/trunk/libstage/model_gripper.cc  2009-02-15 23:44:46 UTC (rev 
7334)
@@ -27,10 +27,12 @@
 gripper
 (
   # gripper properties
-  <none>
+  paddle_size [ 0.66 0.1 0.4 ]
+  paddle_state [ "open" "down" ]
+  autosnatch 0
 
   # model properties
-  size [0.12 0.28]
+  size [ 0.2 0.3 0.2 ]
 )
 @endverbatim
 
@@ -38,6 +40,12 @@
 
 @par Details
 
+- autosnatch < 0 or 1>\n
+  iff 1, gripper will close automatically when break beams are broken
+- paddle_size [ <float x> <float y < float z> ]\n
+  Gripper paddle size as a proportion of the model's body size (0.0 to 1.0)
+- paddle_state [ <string open/close> <string up/down> ]\n
+  Gripper arms state, either "open" or "closed", and lift state, either "up" 
or "down"
 */
 
 
@@ -47,6 +55,9 @@
 #include "worldfile.hh"
 using namespace Stg;
 
+#include "option.hh"
+Option ModelGripper::showData( "Gripper data", "show_gripper_data", "", true, 
NULL );
+
 // TODO - simulate energy use when moving grippers
 
 ModelGripper::ModelGripper( World* world, 
@@ -66,8 +77,7 @@
   cfg.lift_position = 0.0;
   cfg.paddles_stalled = false;
   cfg.autosnatch = false;
-  cfg.grip_stack = NULL;
-  cfg.grip_stack_size = 1;
+  cfg.gripped = NULL;
 
   // place the break beam sensors at 1/4 and 3/4 the length of the paddle 
   cfg.break_beam_inset[0] = 3.0/4.0 * cfg.paddle_size.x;
@@ -88,10 +98,10 @@
   geom.size.y = 0.3;
   geom.size.z = 0.2;
   SetGeom( geom );
-
-  //Startup();
  
   PositionPaddles();  
+
+  registerOption( &showData );
 }
 
 ModelGripper::~ModelGripper()
@@ -108,8 +118,8 @@
   cfg.paddle_size.y = wf->ReadTupleFloat( wf_entity, "paddle_size", 1, 
cfg.paddle_size.y );
   cfg.paddle_size.z = wf->ReadTupleFloat( wf_entity, "paddle_size", 2, 
cfg.paddle_size.z );
   
-  const char* paddles =  wf->ReadTupleString( wf_entity, "paddles", 0, NULL );
-  const char* lift =     wf->ReadTupleString( wf_entity, "paddles", 1, NULL );
+  const char* paddles =  wf->ReadTupleString( wf_entity, "paddle_state", 0, 
NULL );
+  const char* lift =     wf->ReadTupleString( wf_entity, "paddle_state", 1, 
NULL );
 
   if( paddles && strcmp( paddles, "closed" ) == 0 )
         {
@@ -135,8 +145,6 @@
                cfg.lift = LIFT_DOWN;
         }
           
-  cfg.grip_stack_size = wf->ReadInt( wf_entity , "stack_size", 
cfg.grip_stack_size );
-  
   FixBlocks();
   
   // do this at the end to ensure that the blocks are resize correctly
@@ -149,14 +157,10 @@
 
   wf->WriteTupleFloat( wf_entity, "paddle_size", 0, cfg.paddle_size.x );
   wf->WriteTupleFloat( wf_entity, "paddle_size", 1, cfg.paddle_size.y );
-  wf->WriteTupleFloat( wf_entity, "paddle_size", 2, cfg.paddle_size.z );
-    
-  wf->WriteInt( wf_entity , "stack_size", cfg.grip_stack_size );
-}
+  wf->WriteTupleFloat( wf_entity, "paddle_size", 2, cfg.paddle_size.z );    
 
-void ModelGripper::DataVisualize( Camera* cam )
-{
-  /* do nothing */
+  wf->WriteTupleString( wf_entity, "paddle_state", 0, (cfg.paddles == 
PADDLE_CLOSED ) ? "closed" : "open" );
+  wf->WriteTupleString( wf_entity, "paddle_state", 1, (cfg.lift == LIFT_UP ) ? 
"up" : "down" );
 }
 
 void ModelGripper::FixBlocks()
@@ -259,16 +263,15 @@
                         cfg.paddles = PADDLE_OPEN; // change state
                  }
                
-               // drop the thing at the head of the stack
-               if( cfg.grip_stack &&  
+               
+               // drop the thing we're carrying
+               if( cfg.gripped &&
                         (cfg.paddle_position == 0.0 || cfg.paddle_position < 
cfg.close_limit ))
                  {
-                        Model* head = (Model*)cfg.grip_stack->data;
-                        cfg.grip_stack = g_list_remove( cfg.grip_stack, head );
-                        
                         // move it to the new location
-                        head->SetParent( NULL );             
-                        head->SetPose( this->GetGlobalPose() );
+                        cfg.gripped->SetParent( NULL );              
+                        cfg.gripped->SetPose( this->GetGlobalPose() );
+                        cfg.gripped = NULL;
                         
                         cfg.close_limit = 1.0;
                  }
@@ -327,37 +330,8 @@
   Model::Update();
 }
 
-ModelGripper::data_t ModelGripper::GetData()
-{
-  data_t data;
-  
-  data.paddles = cfg.paddles;
-  data.paddle_position = cfg.paddle_position;
-  data.lift = cfg.lift;
-  data.lift_position = cfg.lift_position;
-  data.beam[0] = cfg.beam[0];
-  data.beam[1] = cfg.beam[1];
 
-  data.contact[0] = cfg.contact[0];
-  data.contact[1] = cfg.contact[1];
-
-  if( cfg.grip_stack )
-        data.stack_count = g_list_length( cfg.grip_stack );
-  else
-        data.stack_count = 0;
-    
-   data.paddles_stalled = cfg.paddles_stalled;
        
-       return data;
-}
-
-
-void ModelGripper::SetConfig( config_t & cfg )
-{
-  this->cfg = cfg;
-}
-
-       
 static bool gripper_raytrace_match( Model* hit, 
                                                                                
                Model* finder,
                                                                                
                const void* dummy )
@@ -473,8 +447,7 @@
                         if( !hit )
                                hit = cfg.contact[1];
                         
-                        if( cfg.grip_stack_size > 0 && 
-                                 (g_list_length( cfg.grip_stack ) < 
cfg.grip_stack_size) )
+                        if( cfg.gripped == NULL ) // if we're not carrying 
something already
                                {
                                  // get the global pose of the gripper for 
calculations of the gripped object position
                                  // and move it to be right between the paddles
@@ -489,7 +462,7 @@
                                  hit->SetParent( this );
                                  hit->SetPose( Pose(0,0, -1.0 * geom.size.z 
,0) );
                                  
-                                 cfg.grip_stack = g_list_prepend( 
cfg.grip_stack, hit );
+                                 cfg.gripped = hit;
                                  
                                  //       // calculate how far closed we can 
get the paddles now
                                  double puckw = hitgeom.size.y;
@@ -500,189 +473,76 @@
         }
 }
 
-// int gripper_render_data(  stg_model_t* mod, void* userp )
-// {
-//   //puts( "gripper render data" );
 
-//   // only draw if someone is using the gripper
-//   if( mod->subs < 1 )
-//     return 0;
-
-//   stg_rtk_fig_t* fig = stg_model_get_fig( mod, "gripper_data_fig" );  
+void ModelGripper::DataVisualize( Camera* cam )
+{
+  // only draw if someone is using the gripper
+  if( subs < 1 )
+        return;
   
-//   if( ! fig )
-//     {
-//       fig = stg_model_fig_create( mod, "gripper_data_fig", "top", 
STG_LAYER_GRIPPERDATA );
-//       //stg_rtk_fig_color_rgb32( fig, gripper_col );
-//       stg_rtk_fig_color_rgb32( fig, 0xFF0000 ); // red
-  
-//     }
-//   else
-//     stg_rtk_fig_clear( fig );
+  if( ! showData )
+        return;
 
-//   //printf( "SUBS %d\n", mod->subs );
-  
-//   stg_gripper_data_t* data = (stg_gripper_data_t*)mod->data;
-//   assert(data);
-  
-//   stg_gripper_config_t *cfg = (stg_gripper_config_t*)mod->cfg;
-//   assert(cfg);
+       // outline the sensor lights in black
+       PushColor( 0,0,0,1.0 ); // black
+       glTranslatef( 0,0, geom.size.z * cfg.paddle_size.z );
+       glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
 
-//   stg_geom_t *geom = &mod->geom;  
-  
-//   //stg_rtk_fig_rectangle( gui->data, 0,0,0, geom.size.x, geom.size.y, 0 );
-  
-//   // different x location for each beam
-//   double ibbx =  (geom->size.x - cfg->inner_break_beam_inset * 
geom->size.x) - geom->size.x/2.0;
-//   double obbx =  (geom->size.x - cfg->outer_break_beam_inset * 
geom->size.x) - geom->size.x/2.0;
-  
-//   // common y position
-//   double bby = 
-//     (1.0-data->paddle_position) * 
((geom->size.y/2.0)-(geom->size.y*cfg->paddle_size.y));
-  
-//   // size of the paddle indicator lights
-//   double led_dx = cfg->paddle_size.y * 0.5 * geom->size.y;
-  
-  
-//   if( data->inner_break_beam )
-//     {
-//       stg_rtk_fig_rectangle( fig, ibbx, bby+led_dx, 0, led_dx, led_dx, 1 );
-//       stg_rtk_fig_rectangle( fig, ibbx, -bby-led_dx, 0, led_dx, led_dx, 1 );
-//     }
-//       else
-//     {
-//       stg_rtk_fig_line( fig, ibbx, bby, ibbx, -bby );
-//       stg_rtk_fig_rectangle( fig, ibbx, bby+led_dx, 0, led_dx, led_dx, 0 );
-//       stg_rtk_fig_rectangle( fig, ibbx, -bby-led_dx, 0, led_dx, led_dx, 0 );
-//     }
-      
-//       if( data->outer_break_beam )
-//     {
-//       stg_rtk_fig_rectangle( fig, obbx, bby+led_dx, 0, led_dx, led_dx, 1 );
-//       stg_rtk_fig_rectangle( fig, obbx, -bby-led_dx, 0, led_dx, led_dx, 1 );
-//     }
-//       else
-//     {
-//       stg_rtk_fig_line( fig, obbx, bby, obbx, -bby );
-//       stg_rtk_fig_rectangle( fig, obbx, bby+led_dx, 0, led_dx, led_dx, 0 );
-//       stg_rtk_fig_rectangle( fig, obbx, -bby-led_dx, 0, led_dx, led_dx, 0 );
-//     }
-      
-//       // draw the contact indicators
-//       stg_rtk_fig_rectangle( fig, 
-//                          ((1.0 - cfg->paddle_size.x/2.0) * geom->size.x) - 
geom->size.x/2.0,
-//                          (1.0 - cfg->paddle_position) * 
((geom->size.y/2.0)-(geom->size.y*cfg->paddle_size.y)),
-//                          0.0,
-//                          cfg->paddle_size.x * geom->size.x,
-//                          cfg->paddle_size.y/6.0 * geom->size.y, 
-//                          data->paddle_contacts[0] );
-      
-//       stg_rtk_fig_rectangle( fig, 
-//                          ((1.0 - cfg->paddle_size.x/2.0) * geom->size.x) - 
geom->size.x/2.0,
-//                          (1.0 - cfg->paddle_position) * 
-((geom->size.y/2.0)-(geom->size.y*cfg->paddle_size.y)),
-//                          0.0,
-//                          cfg->paddle_size.x * geom->size.x,
-//                          cfg->paddle_size.y/6.0 * geom->size.y, 
-//                          data->paddle_contacts[1] );
-      
-//       //stg_rtk_fig_color_rgb32( fig,  gripper_col );      
+   // different x location for each beam
+   double ibbx =  (geom.size.x - cfg.break_beam_inset[0] * geom.size.x) - 
geom.size.x/2.0;
+   double obbx =  (geom.size.x - cfg.break_beam_inset[1] * geom.size.x) - 
geom.size.x/2.0;
+       
+       // common y position
+       double invp = 1.0 - cfg.paddle_position;
+   double bby = 
+     invp * ((geom.size.y/2.0)-(geom.size.y*cfg.paddle_size.y));
+       
+       //   // size of the paddle indicator lights
+   double led_dx = cfg.paddle_size.y * 0.5 * geom.size.y;
+               
+       // paddle break beams
+       Gl::draw_centered_rect( ibbx, bby+led_dx, led_dx, led_dx );
+       Gl::draw_centered_rect( ibbx, -bby-led_dx, led_dx, led_dx );
+       Gl::draw_centered_rect( obbx, bby+led_dx, led_dx, led_dx );
+       Gl::draw_centered_rect( obbx, -bby-led_dx, led_dx, led_dx );
+       
+       // paddle contacts
+       double cx = ((1.0 - cfg.paddle_size.x/2.0) * geom.size.x) - 
geom.size.x/2.0;
+       double cy = (geom.size.y/2.0)-(geom.size.y * 0.8 * cfg.paddle_size.y);
+       double plen = cfg.paddle_size.x * geom.size.x;
+       double pwidth = 0.4 * cfg.paddle_size.y * geom.size.y;  
+       
+       Gl::draw_centered_rect( cx, invp * +cy, plen, pwidth ); 
+       Gl::draw_centered_rect( cx, invp * -cy, plen, pwidth );
+       
+       // if the gripper detects anything, fill the lights in with yellow
+       if( cfg.beam[0] || cfg.beam[1] || cfg.contact[0] || cfg.contact[1] )
+         {
+                PushColor( 1,1,0,1.0 ); // yellow
+                glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
+                
+                if( cfg.contact[0] )
+                       Gl::draw_centered_rect( cx, invp * +cy, plen, pwidth ); 
+                
+                if( cfg.contact[1] )
+                       Gl::draw_centered_rect( cx, invp * -cy, plen, pwidth ); 
+                
+                if( cfg.beam[0] )
+                       {
+                         Gl::draw_centered_rect( ibbx, bby+led_dx, led_dx, 
led_dx );
+                         Gl::draw_centered_rect( ibbx, -bby-led_dx, led_dx, 
led_dx );  
+                       }
+                
+                if( cfg.beam[1] )                        
+                       {
+                         Gl::draw_centered_rect( obbx, bby+led_dx, led_dx, 
led_dx );
+                         Gl::draw_centered_rect( obbx, -bby-led_dx, led_dx, 
led_dx );  
+                       }
 
-//       return 0; 
-// }
+                PopColor(); // yellow    
+         }
+               
+         PopColor(); // black
+ }
 
 
-// int gripper_render_cfg( stg_model_t* mod, void* user )
-// { 
-//   puts( "gripper render cfg" );
-//   stg_rtk_fig_t* fig = stg_model_get_fig( mod, "gripper_cfg_fig" );  
-  
-//   if( ! fig )
-//     {
-//       fig = stg_model_fig_create( mod, "gripper_cfg_fig", "top", 
-//                               STG_LAYER_GRIPPERCONFIG );
-      
-//       stg_rtk_fig_color_rgb32( fig, stg_lookup_color( STG_GRIPPER_CFG_COLOR 
));
-//     }
-//   else
-//     stg_rtk_fig_clear( fig );
-  
-//   stg_geom_t geom;
-//   stg_model_get_geom( mod, &geom );
-  
-//   // get the config and make sure it's the right size
-//   stg_gripper_config_t* cfg = (stg_gripper_config_t*)mod->cfg;
-//   assert( mod->cfg_len == sizeof(stg_gripper_config_t) );
-  
-//   // different x location for each beam
-//   double ibbx = (cfg->inner_break_beam_inset) * geom.size.x - 
geom.size.x/2.0;
-//   double obbx = (cfg->outer_break_beam_inset) * geom.size.x - 
geom.size.x/2.0;
-  
-//   // common y position
-//   double bby = 
-//     (1.0-cfg->paddle_position) * 
((geom.size.y/2.0)-(geom.size.y*cfg->paddle_size.y));
-  
-//   // draw the position of the break beam sensors
-//   stg_rtk_fig_rectangle( fig, ibbx, bby, 0, 0.01, 0.01, 0 );
-//   stg_rtk_fig_rectangle( fig, obbx, bby, 0, 0.01, 0.01, 0 );
-
-//   return 0; //ok
-// }
-
-
-// int gripper_startup( stg_model_t* mod )
-// { 
-//   PRINT_DEBUG( "gripper startup" );
-//   stg_model_set_watts( mod, STG_GRIPPER_WATTS );
-//   return 0; // ok
-// }
-
-// int gripper_shutdown( stg_model_t* mod )
-// { 
-//   PRINT_DEBUG( "gripper shutdown" );
-//   stg_model_set_watts( mod, 0 );
-  
-//   // unrender the break beams & lights
-//   stg_model_fig_clear( mod, "gripper_data_fig" );
-//   return 0; // ok
-// }
-
-// void stg_print_gripper_config( stg_gripper_config_t* cfg ) 
-// {
-//   char* pstate;
-//   switch( cfg->paddles )
-//     {
-//     case STG_GRIPPER_PADDLE_OPEN: pstate = "OPEN"; break;
-//     case STG_GRIPPER_PADDLE_CLOSED: pstate = "CLOSED"; break;
-//     case STG_GRIPPER_PADDLE_OPENING: pstate = "OPENING"; break;
-//     case STG_GRIPPER_PADDLE_CLOSING: pstate = "CLOSING"; break;
-//     default: pstate = "*unknown*";
-//     }
-  
-//   char* lstate;
-//   switch( cfg->lift )
-//     {
-//     case STG_GRIPPER_LIFT_UP: lstate = "UP"; break;
-//     case STG_GRIPPER_LIFT_DOWN: lstate = "DOWN"; break;
-//     case STG_GRIPPER_LIFT_DOWNING: lstate = "DOWNING"; break;
-//     case STG_GRIPPER_LIFT_UPPING: lstate = "UPPING"; break;
-//     default: lstate = "*unknown*";
-//     }
-  
-//   printf("gripper state: paddles(%s)[%.2f] lift(%s)[%.2f] stall(%s)\n", 
-//      pstate, cfg->paddle_position, lstate, cfg->lift_position,
-//      cfg->paddles_stalled ? "true" : "false" );
-// }
-
-
-// int gripper_unrender_data( stg_model_t* mod, void* userp )
-// {
-//   stg_model_fig_clear( mod, "gripper_data_fig" );
-//   return 1; // callback just runs one time
-// }
-
-// int gripper_unrender_cfg( stg_model_t* mod, void* userp )
-// {
-//   stg_model_fig_clear( mod, "gripper_cfg_fig" );
-//   return 1; // callback just runs one time
-// }
-

Modified: code/stage/trunk/libstage/model_laser.cc
===================================================================
--- code/stage/trunk/libstage/model_laser.cc    2009-02-13 18:55:58 UTC (rev 
7333)
+++ code/stage/trunk/libstage/model_laser.cc    2009-02-15 23:44:46 UTC (rev 
7334)
@@ -24,7 +24,6 @@
 static const bool DEFAULT_FILLED = true;
 static const stg_watts_t DEFAULT_WATTS = 17.5;
 static const Size DEFAULT_SIZE( 0.15, 0.15, 0.2 );
-static const stg_meters_t DEFAULT_MINRANGE = 0.0;
 static const stg_meters_t DEFAULT_MAXRANGE = 8.0;
 static const stg_radians_t DEFAULT_FOV = M_PI;
 static const unsigned int DEFAULT_SAMPLES = 180;
@@ -35,6 +34,8 @@
 //TODO make instance attempt to register an option (as customvisualizations do)
 Option ModelLaser::showLaserData( "Laser scans", "show_laser", "", true, NULL 
);
 Option ModelLaser::showLaserStrikes( "Laser strikes", "show_laser_strikes", 
"", false, NULL );
+Option ModelLaser::showLaserFov( "Laser FOV", "show_laser_fov", "", false, 
NULL );
+Option ModelLaser::showLaserBeams( "Laser beams", "show_laser_beams", "", 
false, NULL );
 
 /**
 @ingroup model
@@ -52,7 +53,6 @@
 (
   # laser properties
   samples 180
-  range_min 0.0
   range_max 8.0
   fov 3.14159
   resolution 1
@@ -67,8 +67,6 @@
  
 - samples <int>\n
   the number of laser samples per scan
-- range_min <float>\n
-  the minimum range reported by the scanner, in meters. The scanner will 
detect objects closer than this, but report their range as the minimum.
 - range_max <float>\n
   the maximum range reported by the scanner, in meters. The scanner will not 
detect objects beyond this range.
 - fov <float>\n
@@ -84,7 +82,6 @@
        data_dirty( true ),
        samples( NULL ),        // don't allocate sample buffer memory until 
Update() is called
        sample_count( DEFAULT_SAMPLES ),
-       range_min( DEFAULT_MINRANGE ),
        range_max( DEFAULT_MAXRANGE ),
        fov( DEFAULT_FOV ),
        resolution( DEFAULT_RESOLUTION )
@@ -113,6 +110,8 @@
        
   registerOption( &showLaserData );
   registerOption( &showLaserStrikes );
+  registerOption( &showLaserFov );
+  registerOption( &showLaserBeams );
 }
 
 
@@ -128,7 +127,6 @@
 void ModelLaser::Load( void )
 {  
   sample_count = wf->ReadInt( wf_entity, "samples", sample_count );
-  range_min = wf->ReadLength( wf_entity, "range_min", range_min);
   range_max = wf->ReadLength( wf_entity, "range_max", range_max );
   fov       = wf->ReadAngle( wf_entity, "fov",  fov );
   resolution = wf->ReadInt( wf_entity, "resolution",  resolution );
@@ -149,7 +147,6 @@
 { 
   stg_laser_cfg_t cfg;
   cfg.sample_count = sample_count;
-  cfg.range_bounds.min = range_min;
   cfg.range_bounds.max = range_max;
   cfg.fov = fov;
   cfg.resolution = resolution;
@@ -159,7 +156,6 @@
 
 void ModelLaser::SetConfig( stg_laser_cfg_t cfg )
 { 
-  range_min = cfg.range_bounds.min;
   range_max = cfg.range_bounds.max;
   fov = cfg.fov;
   resolution = cfg.resolution;
@@ -309,8 +305,8 @@
 {
   if( ! (samples && sample_count) )
     return;
-
-  if ( ! (showLaserData || showLaserStrikes) )
+  
+  if ( ! (showLaserData || showLaserStrikes || showLaserFov || showLaserBeams 
) )
     return;
     
   glPushMatrix();
@@ -379,7 +375,43 @@
                         glDrawArrays( GL_POINTS, 0, sample_count+1 );
                         PopColor();
                  }
+
+               if( showLaserFov )
+                 {
+                        for( unsigned int s=0; s<sample_count; s++ )
+                               {
+                                 double ray_angle = (s * (fov / 
(sample_count-1))) - fov/2.0;
+                                 pts[2*s+2] = (float)(range_max * 
cos(ray_angle) );
+                                 pts[2*s+3] = (float)(range_max * 
sin(ray_angle) );                     
+                               }
+
+                        glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
+                        PushColor( 0, 0, 1, 0.5 );             
+                        glDrawArrays( GL_POLYGON, 0, sample_count+1 );
+                        PopColor();
+                        //                      glPolygonMode( 
GL_FRONT_AND_BACK, GL_LINE );
+
+                 }                      
                
+               if( showLaserBeams )
+                 {
+                        PushColor( 0, 0, 1, 0.5 );             
+                        glBegin( GL_LINES );
+                        
+                        for( unsigned int s=0; s<sample_count; s++ )
+                               {
+                                 
+                                 glVertex2f( 0,0 );
+                                 double ray_angle = (s * (fov / 
(sample_count-1))) - fov/2.0;
+                                 glVertex2f( samples[s].range * 
cos(ray_angle), 
+                                                                 
samples[s].range * sin(ray_angle) );
+                                 
+                               }
+                        glEnd();
+                        PopColor();
+                 }     
+
+               
       glDepthMask( GL_TRUE );
       glEndList();
     } // end if ( data_dirty )

Modified: code/stage/trunk/libstage/stage.hh
===================================================================
--- code/stage/trunk/libstage/stage.hh  2009-02-13 18:55:58 UTC (rev 7333)
+++ code/stage/trunk/libstage/stage.hh  2009-02-15 23:44:46 UTC (rev 7334)
@@ -466,6 +466,8 @@
         void draw_octagon( float w, float h, float m );
         void draw_vector( double x, double y, double z );
         void draw_origin( double len );
+        /** Draws a rectangle with center at x,y, with sides of length dx,dy */
+        void draw_centered_rect( float x, float y, float dx, float dy );
   }
 
 
@@ -2233,7 +2235,8 @@
 
 
   // LASER MODEL --------------------------------------------------------
-
+  
+  // TODO - move these into the class definition, like the gripper
   /** laser sample packet
        */
   typedef struct
@@ -2261,12 +2264,14 @@
 
         stg_laser_sample_t* samples;
         uint32_t sample_count;
-        stg_meters_t range_min, range_max;
+        stg_meters_t range_max;
         stg_radians_t fov;
         uint32_t resolution;
   
         static Option showLaserData;
         static Option showLaserStrikes;
+        static Option showLaserFov;
+        static Option showLaserBeams;
   
   public:
         static const char* typestr;
@@ -2304,6 +2309,14 @@
   {
   public:
 
+       //  class Viz : public CustomVisualizer
+//      {
+               
+
+//      };
+
+//      static Viz viz;
+
         enum paddle_state_t {
                PADDLE_OPEN = 0, // default state
                PADDLE_CLOSED, 
@@ -2326,7 +2339,7 @@
                CMD_DOWN    
         };
         
-
+        
         /** gripper configuration 
          */
         struct config_t
@@ -2339,12 +2352,11 @@
                double paddle_position; ///< 0.0 = full open, 1.0 full closed
                double lift_position; ///< 0.0 = full down, 1.0 full up
                
+               Model* gripped;
+
                bool paddles_stalled; // true iff some solid object stopped
                // the paddles closing or opening
                
-               GList*grip_stack;  ///< stack of items gripped
-               int grip_stack_size; ///< maximum number of objects in stack, 
or -1 for unlimited
-               
                double close_limit; ///< How far the gripper can close. If < 
1.0, the gripper has its mouth full.               
                bool autosnatch; ///< if true, cycle the gripper through 
open-close-up-down automatically
 
@@ -2353,28 +2365,7 @@
       Model* beam[2]; ///< points to a model detected by the beams
       Model* contact[2]; ///< pointers to a model detected by the contacts     
        
         };
-        
-        
-    /** gripper data packet
-     */
-    struct data_t
-    {
-      paddle_state_t paddles;
-      lift_state_t lift;
-
-      double paddle_position; ///< 0.0 = full open, 1.0 full closed
-      double lift_position; ///< 0.0 = full down, 1.0 full up
-
-
-      stg_bool_t paddles_stalled; // true iff some solid object stopped
-                               // the paddles closing or opening
-
-      Model* beam[2]; ///< points to a model detected by the beams
-      Model* contact[2]; ///< pointers to a model detected by the contacts     
        
-
-      int stack_count; ///< number of objects in stack
-    };
-
+                
   private:
         virtual void Update();
         virtual void DataVisualize( Camera* cam );
@@ -2390,6 +2381,8 @@
         Block* paddle_left;
         Block* paddle_right;
 
+        static Option showData;
+
   public:       
         static const char* typestr;
         static const Size size;
@@ -2403,13 +2396,11 @@
         virtual void Load();
         virtual void Save();
 
-        void SetConfig( config_t & newcfg );
-
-        /** Returns the static state of the gripper */
+        /** Configure the gripper */
+        void SetConfig( config_t & newcfg ){ this->cfg = cfg; FixBlocks(); }
+        
+        /** Returns the state of the gripper .*/
         config_t GetConfig(){ return cfg; };
-
-        /** Returns the dynamic state of the gripper */
-        data_t GetData();
         
         /** Set the current activity of the gripper. */
         void SetCommand( cmd_t cmd ) { this->cmd = cmd; }

Modified: code/stage/trunk/worlds/fasr.world
===================================================================
--- code/stage/trunk/worlds/fasr.world  2009-02-13 18:55:58 UTC (rev 7333)
+++ code/stage/trunk/worlds/fasr.world  2009-02-15 23:44:46 UTC (rev 7334)
@@ -22,9 +22,9 @@
 ( 
   size [ 1379.000 856.000 ] 
 
-  center [ 2.468 4.122 ] 
+  center [ 0.783 5.056 ] 
   rotate [ 0 0 ]
-  scale 91.508 
+  scale 355.764 
 
   pcam_loc [ 0 -4.000 2.000 ]
   pcam_angle [ 70.000 0 ]
@@ -72,7 +72,7 @@
 
 define autorob pioneer2dx                
 (               
- sicklaser( samples 32 range_max 5 laser_return 2 watts 30 )
+ sicklaser( samples 180 range_max 5 laser_return 2 watts 30 )
  ctrl "fasr"
  joules 100000 
  joules_capacity 400000 
@@ -151,7 +151,7 @@
 puck( pose [ 0.549 2.367 0 0 ] )
 puck( pose [ 0.162 2.983 0 0 ] )
 puck( pose [ 1.067 3.367 0 0 ] )
-puck( pose [ 1.577 3.488 0 0 ] )
+puck( pose [ 0.320 4.907 0 0 ] )
 
 autorob( pose [5.418 7.478 0 -163.478] joules 300000 )
 autorob( pose [7.574 6.269 0 -111.715] joules 100000 )
@@ -165,7 +165,7 @@
 autorob( pose [6.451 4.189 0 -61.453] joules 200000 )
 
 autorob( pose [5.060 6.868 0 -61.295] joules 300000 )
-autorob( pose [4.127 5.388 0 -147.713] joules 400000 )
+autorob( pose [1.095 5.276 0 -147.713] joules 400000 )
 autorob( pose [4.911 4.552 0 -125.236] joules 100000 )
 autorob( pose [3.985 6.474 0 -158.025] joules 200000 )
 autorob( pose [5.440 5.317 0 -26.545] joules 300000 )


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

------------------------------------------------------------------------------
Open Source Business Conference (OSBC), March 24-25, 2009, San Francisco, CA
-OSBC tackles the biggest issue in open source: Open Sourcing the Enterprise
-Strategies to boost innovation and cut costs with open source participation
-Receive a $600 discount off the registration fee with the source code: SFAD
http://p.sf.net/sfu/XcvMzF8H
_______________________________________________
Playerstage-commit mailing list
Playerstage-commit@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/playerstage-commit

Reply via email to