Update of /cvsroot/playerstage/code/stage/examples/ctrl
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv14549/examples/ctrl

Added Files:
        Makefile.am Makefile.libtool wander.cc 
Log Message:
added controller directory in examples

--- NEW FILE: wander.cc ---
#include "stage.hh"
using namespace Stg;

const double cruisespeed = 0.4; 
const double avoidspeed = 0.05; 
const double avoidturn = 1.0;
const double minfrontdistance = 0.8;  
const bool verbose = false;

typedef struct
{
  StgModelPosition* pos;
  StgModelLaser* laser;
  int avoidcount, randcount;
} robot_t;

int LaserUpdate( StgModel* mod, robot_t* robot );
int PositionUpdate( StgModel* mod, robot_t* robot );

// Stage calls this when the model starts up
extern "C" int Init( StgModel* mod )
{
  robot_t* robot = new robot_t;
 
  robot->pos = (StgModelPosition*)mod;
  robot->laser = (StgModelLaser*)mod->GetModel( "laser:0" );
  robot->avoidcount = 0;
  robot->randcount = 0;

  assert( robot->laser );
  robot->laser->Subscribe();
  
  robot->laser->AddUpdateCallback( (stg_model_callback_t)LaserUpdate, robot );
  //robot->pos->AddUpdateCallback( (stg_model_callback_t)PositionUpdate, robot 
);
  return 0; //ok
}

// inspect the laser data and decide what to do
int LaserUpdate( StgModel* mod, robot_t* robot )
{
  // get the data
  uint32_t sample_count=0;
  stg_laser_sample_t* scan = robot->laser->GetSamples( &sample_count );
  assert(scan);
  
  double newturnrate=0.0, newspeed=0.0;  
  bool obstruction = false;
  
  // find the closest distance to the left and right and check if
  // there's anything in front
  double minleft = 1e6;
  double minright = 1e6;
  
  for (uint32_t i = 0; i < sample_count; i++)
    {
      if( scan[i].range < minfrontdistance)
        obstruction = true;
      
      if( i > sample_count/2 )
        minleft = MIN( minleft, scan[i].range );
      else      
        minright = MIN( minright, scan[i].range );
    }
  
  if( obstruction || robot->avoidcount )
    {
      if( verbose ) puts( "Avoid" );

      robot->pos->SetXSpeed( avoidspeed );
      
      /* once we start avoiding, select a turn direction and stick
         with it for a few iterations */
      if( robot->avoidcount == 0 )
        {
          if( verbose ) puts( "Avoid START" );
          robot->avoidcount = 5;
          
          if( minleft < minright  )
            robot->pos->SetTurnSpeed( -avoidturn );
          else
            robot->pos->SetTurnSpeed( +avoidturn );
        }

      robot->avoidcount--;
    }
  else
    {
      if( verbose ) puts( "Cruise" );

      robot->avoidcount = 0;
      robot->pos->SetXSpeed( cruisespeed );       
      
      /* update turnrate every few updates */
      if( robot->randcount == 0 )
        {
          if( verbose )puts( "Random turn" );
          
          /* make random int tween -30 and 30 */
          //newturnrate = dtor( rand() % 61 - 30 );
          
          robot->randcount = 20;
          
          robot->pos->SetTurnSpeed(  dtor( rand() % 11 - 5 ) );
        }
      
      robot->randcount--;
    }
  
  return 0;
}

int PositionUpdate( StgModel* mod, robot_t* robot )
{
  stg_pose_t pose = robot->pos->GetPose();

  printf( "Pose: [%.2f %.2f %.2f %.2f]\n",
          pose.x, pose.y, pose.z, pose.a );

  return 0; // run again
}


--- NEW FILE: Makefile.am ---
# $Id: Makefile.am,v 1.1 2008/02/22 21:20:47 rtv Exp $

# system-wide compile flags - target-specific flags are added to each target 
below
AM_CPPFLAGS = -Wall -I. -I../../libstage -I$(top_srcdir)/replace  
@PIXBUF_CFLAGS@ @FLTK_CFLAGS@ -DRGBFILE=\"$(RGB)\"


lib_LTLIBRARIES = wander.la

# WANDER CONTROLLER
wander_la_SOURCES = wander.cc ../../libstage/stage.hh
wander_la_LDFLAGS = -module 


--- NEW FILE: Makefile.libtool ---
#
# An example of how to build a Stage controller plugin with libtool
#

CXX = g++
CXXLD = g++
LIBTOOL = libtool
STAGE_CFLAGS = `pkg-config --cflags stage`

all: wander.la

wander.la: wander.lo
        $(LIBTOOL) --mode=link $(CXXLD) -rpath $(INSTALL_DIR) -module 
-export-dynamic -version-info 0:0:0 $^ -o $@

%.lo: %.cc
        $(LIBTOOL) --mode=compile $(CXX) $(STAGE_CFLAGS) -c $<

clean:
        rm -rf *.o *.lo *.la .libs  


-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Playerstage-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/playerstage-commit

Reply via email to