Revision: 7973
          http://playerstage.svn.sourceforge.net/playerstage/?rev=7973&view=rev
Author:   rtv
Date:     2009-07-10 02:53:47 +0000 (Fri, 10 Jul 2009)

Log Message:
-----------
added a ranger-based pioneer wander demo

Added Paths:
-----------
    code/stage/trunk/examples/ctrl/wander_pioneer.cc

Added: code/stage/trunk/examples/ctrl/wander_pioneer.cc
===================================================================
--- code/stage/trunk/examples/ctrl/wander_pioneer.cc                            
(rev 0)
+++ code/stage/trunk/examples/ctrl/wander_pioneer.cc    2009-07-10 02:53:47 UTC 
(rev 7973)
@@ -0,0 +1,171 @@
+/////////////////////////////////
+// File: stest.c
+// Desc: Stage library test program
+// Created: 2004.9.15
+// Author: Richard Vaughan <[email protected]>
+// CVS: $Id: stest.cc,v 1.3 2008-02-01 03:11:02 rtv Exp $
+// License: GPL
+/////////////////////////////////
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "stage.hh"
+using namespace Stg;
+
+typedef struct
+{
+  ModelLaser* laser;
+  ModelPosition* position;
+  ModelRanger* ranger;
+  ModelFiducial* fiducial;
+
+  ModelFiducial::Fiducial* closest;  
+  stg_radians_t closest_bearing;
+  stg_meters_t closest_range;
+  stg_radians_t closest_heading_error; 
+
+} robot_t;
+
+
+const double VSPEED = 0.3; // meters per second
+const double WGAIN = 0.3; // turn speed gain
+const double SAFE_DIST = 1.0; // meters
+const double SAFE_ANGLE = 0.5; // radians
+
+
+// forward declare
+int RangerUpdate( ModelRanger* mod, robot_t* robot );
+int FiducialUpdate( ModelFiducial* fid, robot_t* robot );
+
+// Stage calls this when the model starts up
+extern "C" int Init( Model* mod )
+{
+  robot_t* robot = new robot_t;
+  robot->position = (ModelPosition*)mod;
+
+  // subscribe to the ranger, which we use for navigating
+  robot->ranger = (ModelRanger*)mod->GetModel( "ranger:0" );
+  assert( robot->ranger );
+  robot->ranger->Subscribe();
+  
+  // ask Stage to call into our ranger update function
+  robot->ranger->AddUpdateCallback( (stg_model_callback_t)RangerUpdate, robot 
);
+ 
+  robot->fiducial = (ModelFiducial*)mod->GetModel( "fiducial:0" ) ;
+  assert( robot->fiducial );
+  robot->fiducial->AddUpdateCallback( (stg_model_callback_t)FiducialUpdate, 
robot );
+  robot->fiducial->Subscribe();
+
+  // subscribe to the laser, though we don't use it for navigating
+  //robot->laser = (ModelLaser*)mod->GetModel( "laser:0" );
+  //assert( robot->laser );
+  //robot->laser->Subscribe();
+
+  return 0; //ok
+}
+
+int RangerUpdate( ModelRanger* rgr, robot_t* robot )
+{      
+  // compute the vector sum of the sonar ranges              
+  double dx=0, dy=0;
+  
+  // use the front-facing sensors only
+  for( unsigned int i=0; i < 8; i++ )
+        {
+               ModelRanger::Sensor& s = rgr->sensors[i];
+               dx += s.range * cos( s.pose.a );
+               dy += s.range * sin( s.pose.a );
+               
+               //printf( "sensor %d angle= %.2f\n", s, rgr->sensors[s].pose.a 
);        
+        }
+  
+  if( (dx == 0) || (dy == 0) )
+        return 0;
+    
+  double resultant_angle = atan2( dy, dx );
+  double forward_speed = 0.0;
+  double side_speed = 0.0;        
+  double turn_speed = WGAIN * resultant_angle;
+  
+  //printf( "resultant %.2f turn_speed %.2f\n", resultant_angle, turn_speed );
+  
+  // if the front is clear, drive forwards
+  if( (rgr->sensors[3].range > SAFE_DIST) && // forwards
+               (rgr->sensors[4].range > SAFE_DIST) &&
+               (rgr->sensors[5].range > SAFE_DIST/2.0) && //
+               (rgr->sensors[6].range > SAFE_DIST/4.0) && 
+               (rgr->sensors[2].range > SAFE_DIST/2.0) && 
+               (rgr->sensors[1].range > SAFE_DIST/4.0) && 
+               (fabs( resultant_angle ) < SAFE_ANGLE) )
+        {
+               forward_speed = VSPEED;
+
+               // and steer to match the heading of the nearest robot
+               if( robot->closest )
+                 turn_speed = WGAIN * robot->closest_heading_error;
+        }
+  
+  robot->position->SetSpeed( forward_speed, side_speed, turn_speed );
+
+  return 0;
+}
+
+
+int FiducialUpdate( ModelFiducial* fid, robot_t* robot )
+{      
+  // find the closest teammate
+
+  //puts( "fiducial update" );
+    
+  double dist = 1e6; // big
+  
+  robot->closest = NULL;
+  
+  FOR_EACH( it, fid->GetFiducials() )
+        {
+               ModelFiducial::Fiducial* other = &(*it);
+               
+               if( other->range < dist )
+                 {
+                        dist = other->range;
+                        robot->closest = other;
+                 }                             
+        }
+  
+  if( robot->closest ) // if we saw someone
+        {
+               //printf( "model %s see closest %s\n", fid->Token(), 
robot->closest->mod->Token() );
+
+               robot->closest_bearing = robot->closest->bearing;
+               robot->closest_range = robot->closest->range;
+               robot->closest_heading_error = robot->closest->geom.a;
+        }
+    
+//   if( (dx == 0) || (dy == 0) )
+//      return 0;
+    
+//   double resultant_angle = atan2( dy, dx );
+//   double forward_speed = 0.0;
+//   double side_speed = 0.0;     
+//   double turn_speed = WGAIN * resultant_angle;
+  
+//   //printf( "resultant %.2f turn_speed %.2f\n", resultant_angle, turn_speed 
);
+  
+//   // if the front is clear, drive forwards
+//   if( (rgr->sensors[3].range > SAFE_DIST) && // forwards
+//             (rgr->sensors[4].range > SAFE_DIST) &&
+//             (rgr->sensors[5].range > SAFE_DIST/2.0) && //
+//             (rgr->sensors[6].range > SAFE_DIST/4.0) && 
+//             (rgr->sensors[2].range > SAFE_DIST/2.0) && 
+//             (rgr->sensors[1].range > SAFE_DIST/4.0) && 
+//             (fabs( resultant_angle ) < SAFE_ANGLE) )
+//      {
+//             forward_speed = VSPEED;
+//      }
+  
+//   robot->position->SetSpeed( forward_speed, side_speed, turn_speed );
+
+  return 0;
+}


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

------------------------------------------------------------------------------
Enter the BlackBerry Developer Challenge  
This is your chance to win up to $100,000 in prizes! For a limited time, 
vendors submitting new applications to BlackBerry App World(TM) will have
the opportunity to enter the BlackBerry Developer Challenge. See full prize  
details at: http://p.sf.net/sfu/Challenge
_______________________________________________
Playerstage-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/playerstage-commit

Reply via email to