Revision: 6716 http://playerstage.svn.sourceforge.net/playerstage/?rev=6716&view=rev Author: rtv Date: 2008-06-30 13:54:05 -0700 (Mon, 30 Jun 2008)
Log Message: ----------- working on examples from SI paper Modified Paths: -------------- code/stage/trunk/examples/ctrl/CMakeLists.txt code/stage/trunk/libstage/canvas.cc code/stage/trunk/worlds/pioneer.inc code/stage/trunk/worlds/sick.inc code/stage/trunk/worlds/simple.world Added Paths: ----------- code/stage/trunk/examples/ctrl/swarmbenchmark.cc code/stage/trunk/worlds/swarmbenchmark/ code/stage/trunk/worlds/swarmbenchmark/cave.world Modified: code/stage/trunk/examples/ctrl/CMakeLists.txt =================================================================== --- code/stage/trunk/examples/ctrl/CMakeLists.txt 2008-06-30 19:25:25 UTC (rev 6715) +++ code/stage/trunk/examples/ctrl/CMakeLists.txt 2008-06-30 20:54:05 UTC (rev 6716) @@ -1,9 +1,11 @@ -SET( PLUGINS lasernoise source fasr sink ) +SET( PLUGINS lasernoise source fasr sink swarmbenchmark ) ADD_LIBRARY( lasernoise MODULE lasernoise.cc ) ADD_LIBRARY( source MODULE source.cc ) ADD_LIBRARY( fasr MODULE fasr.cc ) ADD_LIBRARY( sink MODULE sink.cc ) +ADD_LIBRARY( sink MODULE sink.cc ) +ADD_LIBRARY( swarmbenchmark MODULE swarmbenchmark.cc ) # link libstage to each plugin foreach( PLUGIN ${PLUGINS} ) Added: code/stage/trunk/examples/ctrl/swarmbenchmark.cc =================================================================== --- code/stage/trunk/examples/ctrl/swarmbenchmark.cc (rev 0) +++ code/stage/trunk/examples/ctrl/swarmbenchmark.cc 2008-06-30 20:54:05 UTC (rev 6716) @@ -0,0 +1,117 @@ +///////////////////////////////// +// 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; + +static double minfrontdistance = 0.750; +static double speed = 0.400; +static double turnrate = M_PI/3.0; + +typedef struct +{ + StgModelLaser* laser; + StgModelPosition* position; + StgModelRanger* ranger; +} robot_t; + +#define VSPEED 0.4 // meters per second +#define WGAIN 1.0 // turn speed gain +#define SAFE_DIST 0.6 // meters +#define SAFE_ANGLE 0.25 // radians + +// forward declare +int RangerUpdate( 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->position = (StgModelPosition*)mod; + + // subscribe to the ranger, which we use for navigating + robot->ranger = (StgModelRanger*)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 ); + + // subscribe to the laser, though we don't use it for navigating + robot->laser = (StgModelLaser*)mod->GetModel( "laser:0" ); + assert( robot->laser ); + //robot->laser->Subscribe(); + + return 0; //ok +} + +int RangerUpdate( StgModel* mod, robot_t* robot ) +{ + StgModelRanger* rgr = robot->ranger; + + if( rgr->samples == NULL ) + return 0; + + // compute the vector sum of the sonar ranges + double dx=0, dy=0; + + for( unsigned int s=0; s< rgr->sensor_count; s++ ) + { + double srange = rgr->samples[s]; + + dx += srange * cos( rgr->sensors[s].pose.a ); + dy += srange * sin( rgr->sensors[s].pose.a ); + } + + if( (dx == 0) || (dy == 0) ) + return 0; + + assert( dy != 0 ); + assert( dx != 0 ); + + double resultant_angle = atan2( dy, dx ); + double forward_speed = 0.0; + double side_speed = 0.0; + double turn_speed = WGAIN * resultant_angle; + + int forward = rgr->sensor_count/2 -1 ; + // if the front is clear, drive forwards + if( (rgr->samples[forward-1] > SAFE_DIST/5.0) && + (rgr->samples[forward ] > SAFE_DIST) && + (rgr->samples[forward+1] > SAFE_DIST/5.0) && + (fabs( resultant_angle ) < SAFE_ANGLE) ) + { + forward_speed = VSPEED; + } + + // // send a command to the robot + // stg_velocity_t vel; + // bzero(&vel,sizeof(vel)); + // vel.x = forward_speed; + // vel.y = side_speed; + // vel.z = 0; + // vel.a = turn_speed; + + //printf( "robot %s [%.2f %.2f %.2f %.2f]\n", + //robots[i].position->Token(), vel.x, vel.y, vel.z, vel.a ); + + // uint32_t bcount=0; + //stg_blobfinder_blob_t* blobs = robots[i].blobfinder->GetBlobs( &bcount ); + + //printf( "robot %s sees %u blobs\n", robots[i].blobfinder->Token(), bcount ); + + robot->position->SetSpeed( forward_speed, side_speed, turn_speed ); + + return 0; +} + Modified: code/stage/trunk/libstage/canvas.cc =================================================================== --- code/stage/trunk/libstage/canvas.cc 2008-06-30 19:25:25 UTC (rev 6715) +++ code/stage/trunk/libstage/canvas.cc 2008-06-30 20:54:05 UTC (rev 6716) @@ -646,12 +646,13 @@ PRINT_ERR1( "Unable to open %s", filename ); } - // write png header information + // create PNG data png_structp pp = png_create_write_struct(PNG_LIBPNG_VER_STRING, 0, 0, 0); assert(pp); png_infop info = png_create_info_struct(pp); assert(info); + // setup the output file png_init_io(pp, fp); // need to invert the image as GL and PNG disagree on the row order @@ -669,9 +670,9 @@ PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); - png_set_strip_alpha(pp); + png_write_png( pp, info, PNG_TRANSFORM_IDENTITY, NULL ); - png_write_png( pp, info, PNG_TRANSFORM_IDENTITY, NULL ); + // free the PNG data - we reuse the pixel data next time. png_destroy_write_struct(&pp, &info); fclose(fp); Modified: code/stage/trunk/worlds/pioneer.inc =================================================================== --- code/stage/trunk/worlds/pioneer.inc 2008-06-30 19:25:25 UTC (rev 6715) +++ code/stage/trunk/worlds/pioneer.inc 2008-06-30 20:54:05 UTC (rev 6716) @@ -127,7 +127,7 @@ block[3].point[2] [ -0.083 0.140 ] block[3].point[3] [ 0.083 0.140 ] block[3].z [0 0.165 ] - block[3].color "gray10" + block[3].color "gray15" # right wheel block[4].points 4 @@ -136,7 +136,7 @@ block[4].point[2] [ -0.083 -0.177 ] block[4].point[3] [ 0.083 -0.177 ] block[4].z [ 0 0.165 ] - block[4].color "gray10" + block[4].color "gray15" # castor block[5].points 4 @@ -145,7 +145,7 @@ block[5].point[1] [ -0.1825 -0.012 ] block[5].point[0] [ -0.2475 -0.012 ] block[5].z [ 0 0.065 ] - block[5].color "gray10" + block[5].color "gray15" # lid block[6].points 22 Modified: code/stage/trunk/worlds/sick.inc =================================================================== --- code/stage/trunk/worlds/sick.inc 2008-06-30 19:25:25 UTC (rev 6715) +++ code/stage/trunk/worlds/sick.inc 2008-06-30 20:54:05 UTC (rev 6716) @@ -51,7 +51,7 @@ block[3].point[2] [ 0.06 0.05 ] block[3].point[3] [ -0.02 0.05 ] block[3].z [0.02 0.12 ] - #block[3].color "darkgray" + block[3].color "gray10" ) Modified: code/stage/trunk/worlds/simple.world =================================================================== --- code/stage/trunk/worlds/simple.world 2008-06-30 19:25:25 UTC (rev 6715) +++ code/stage/trunk/worlds/simple.world 2008-06-30 20:54:05 UTC (rev 6716) @@ -15,57 +15,156 @@ resolution 0.02 interval_sim 100 # simulation timestep in milliseconds -interval_real 100 # real-time interval between simulation updates in milliseconds +interval_real 10 # real-time interval between simulation updates in milliseconds paused 0 # configure the GUI window -size [ 745.000 448.000 ] -center [-7.010 5.960] -rotate [ 0.920 -0.430 ] -scale 28.806 +window +( + size [ 1000.000 1000.000 ] + center [0.019 -0.121] + rotate [ 0.000 0.000 ] + scale 54.571 +) - # load an environment bitmap floorplan ( name "cave" - size3 [16 16 1.5] + size3 [16 16 0.5] pose [0.000 0.000 0.000] bitmap "bitmaps/cave.png" ) -define autorob fancypioneer2dx +define rob fancypioneer2dx ( - color "red" fancysicklaser( pose [ 0.040 0.000 0.000 ] samples 32 ) + #ctrl "wander" - - blinkenlight( pose [ 0.15 0.1 0 ] color "red" ) - blinkenlight( pose [ 0.15 0.0 0 ] color "green" ) - blinkenlight( pose [ 0.15 -0.1 0 ] color "blue" ) ) -autorob( pose [3.537 7.177 158.268] name "r0" ) -autorob( pose [4.142 -7.764 -52.629] ) -autorob( pose [6.320 3.775 22.445] ) -#autorob( pose [-1.915 3.332 156.191] ) -#autorob( pose [3.309 5.546 -109.062] ) -#autorob( pose [7.209 4.552 89.455] ) -#autorob( pose [-6.329 1.151 -164.935] ) -#autorob( pose [-6.320 -5.692 -103.425] ) -#autorob( pose [3.187 -7.170 -57.759] ) -#autorob( pose [7.407 2.058 -57.823] ) -#autorob( pose [-6.370 2.754 -113.456] ) -#autorob( pose [0.402 -6.819 -1.177] ) -#autorob( pose [-2.892 -0.583 46.585] ) -#autorob( pose [2.284 5.478 135.162] ) -#autorob( pose [-2.483 -1.567 -3.588] ) -#autorob( pose [-6.321 4.372 93.535] ) -#autorob( pose [-4.204 -5.882 -35.760] ) -#autorob( pose [-2.409 -4.979 -17.538] ) -#autorob( pose [-6.692 5.179 -23.903] ) -#autorob( pose [-1.958 0.013 -17.092] ) +define redrob rob( color "red" ) +define greenrob rob( color "green" ) +define magentarob rob( color "magenta" ) +define cyanrob rob( color "cyan" ) +define yellowrob rob( color "yellow" ) +define greenrob rob( color "green" ) +define bluerob rob( color "LightBlue" ) +define orangerob rob( color "orange" ) +define purplerob rob( color "purple" ) +define goldrob rob( color "gold" ) +define darkredrob rob( color "DarkRed" ) +redrob( pose [-5.845 4.401 158.268] ) +redrob( pose [-5.982 4.979 -52.629] ) +redrob( pose [-6.227 3.735 22.445] ) +redrob( pose [-6.567 4.915 156.191] ) +redrob( pose [-7.089 4.569 -109.062] ) +redrob( pose [-7.606 4.063 89.455] ) +redrob( pose [-7.638 4.786 -164.935] ) +redrob( pose [-5.401 3.923 -103.425] ) +redrob( pose [-6.487 4.205 -57.759] ) +redrob( pose [-6.997 3.895 -57.823] ) +bluerob( pose [-6.937 6.565 -113.456] ) +bluerob( pose [-6.243 5.709 -1.177] ) +bluerob( pose [-6.312 6.297 46.585] ) +bluerob( pose [-7.527 6.162 135.162] ) +bluerob( pose [-6.880 5.801 -3.588] ) +bluerob( pose [-7.611 6.835 93.535] ) +bluerob( pose [-7.624 5.532 -35.760] ) +bluerob( pose [-7.100 5.262 -17.538] ) +bluerob( pose [-7.415 7.485 -23.903] ) +bluerob( pose [-6.738 7.157 -17.092] ) + +greenrob( pose [-4.888 4.831 -97.306] ) +greenrob( pose [-5.545 5.497 2.962] ) +greenrob( pose [-5.419 4.931 -120.224] ) +greenrob( pose [-5.515 5.994 -82.019] ) +greenrob( pose [-4.890 5.974 -143.143] ) +greenrob( pose [-4.826 5.423 54.528] ) +greenrob( pose [-4.401 5.935 70.753] ) +greenrob( pose [-3.658 5.798 0.097] ) +greenrob( pose [-4.059 5.368 -52.433] ) +greenrob( pose [-4.262 4.774 163.390] ) + +magentarob( pose [-2.623 7.577 -37.146] ) +magentarob( pose [-2.740 6.912 -88.712] ) +magentarob( pose [-2.935 6.326 -17.092] ) +magentarob( pose [-2.114 7.596 160.525] ) +magentarob( pose [-2.193 7.049 108.959] ) +magentarob( pose [-2.271 6.521 -24.723] ) +magentarob( pose [-2.408 6.013 -157.467] ) +magentarob( pose [-3.013 5.759 -54.334] ) +magentarob( pose [-2.525 5.368 -17.092] ) +magentarob( pose [-3.111 5.192 -150.774] ) + +yellowrob( pose [-7.548 3.355 150.967] ) +yellowrob( pose [-6.961 3.277 108.959] ) +yellowrob( pose [-7.645 2.749 -85.847] ) +yellowrob( pose [-7.039 2.691 153.832] ) +yellowrob( pose [-6.375 3.199 91.770] ) +yellowrob( pose [-6.473 2.651 179.615] ) +yellowrob( pose [-5.769 3.218 120.418] ) +yellowrob( pose [-5.867 2.671 -62.929] ) +yellowrob( pose [-5.261 3.179 -137.413] ) +yellowrob( pose [-5.261 2.573 -62.929] ) + +goldrob( pose [-1.461 7.643 -32.379] ) +goldrob( pose [-0.849 7.618 63.122] ) +goldrob( pose [-1.527 7.120 80.311] ) +goldrob( pose [-0.921 7.085 60.257] ) +goldrob( pose [-1.484 6.566 156.697] ) +goldrob( pose [-0.899 6.611 162.426] ) +goldrob( pose [-1.716 6.058 -17.092] ) +goldrob( pose [-1.373 5.628 -17.092] ) +goldrob( pose [-1.969 5.606 -17.092] ) +goldrob( pose [-1.683 5.110 -17.092] ) + +darkredrob( pose [-7.567 2.065 -45.740] ) +darkredrob( pose [-6.883 2.026 -74.388] ) +darkredrob( pose [-6.258 2.007 177.714] ) +darkredrob( pose [-5.398 2.104 176.750] ) +darkredrob( pose [-7.587 1.362 68.852] ) +darkredrob( pose [-6.805 1.381 23.015] ) +darkredrob( pose [-6.121 1.322 -51.469] ) +darkredrob( pose [-5.320 1.322 -120.224] ) +darkredrob( pose [-4.616 1.811 -176.557] ) +darkredrob( pose [-4.577 1.283 -17.092] ) + +cyanrob( pose [-2.544 4.684 -166.061] ) +cyanrob( pose [-1.919 4.684 55.491] ) +cyanrob( pose [-2.525 4.117 -125.954] ) +cyanrob( pose [-1.919 4.078 -163.196] ) +cyanrob( pose [-2.564 3.472 137.607] ) +cyanrob( pose [-1.958 3.433 -153.638] ) +cyanrob( pose [-2.603 2.866 130.914] ) +cyanrob( pose [-1.958 2.886 149.066] ) +cyanrob( pose [-2.603 2.241 22.052] ) +cyanrob( pose [-1.997 2.202 8.691] ) + +orangerob( pose [-7.567 0.678 129.012] ) +orangerob( pose [-6.805 0.619 83.176] ) +orangerob( pose [-6.160 0.619 159.562] ) +orangerob( pose [-5.476 0.619 74.581] ) +orangerob( pose [-4.811 0.599 -94.441] ) +orangerob( pose [-7.606 0.130 48.798] ) +orangerob( pose [-6.942 0.033 -5.633] ) +orangerob( pose [-6.336 0.072 -105.900] ) +orangerob( pose [-5.671 0.091 28.745] ) +orangerob( pose [-4.987 0.072 -45.740] ) + +purplerob( pose [-3.873 1.694 -97.306] ) +purplerob( pose [-3.267 1.694 -177.520] ) +purplerob( pose [-3.912 1.127 -154.602] ) +purplerob( pose [-3.287 1.088 -114.495] ) +purplerob( pose [-4.049 0.599 -97.306] ) +purplerob( pose [-3.424 0.541 137.607] ) +purplerob( pose [-4.069 0.013 -117.360] ) +purplerob( pose [-3.365 -0.007 -60.064] ) +purplerob( pose [-2.623 1.635 -82.982] ) +purplerob( pose [-2.623 1.029 -17.092] ) + + Added: code/stage/trunk/worlds/swarmbenchmark/cave.world =================================================================== --- code/stage/trunk/worlds/swarmbenchmark/cave.world (rev 0) +++ code/stage/trunk/worlds/swarmbenchmark/cave.world 2008-06-30 20:54:05 UTC (rev 6716) @@ -0,0 +1,161 @@ +# cave.world - 100 robot test and benchmark world +# Authors: Richard Vaughan +# $id$ + +include "../pioneer.inc" +include "../map.inc" +include "../sick.inc" + +resolution 0.02 # resolution of the underlying raytrace mode +interval_sim 100 # simulation timestep in milliseconds +interval_real 10 # real-time interval between simulation updates in milliseconds + +paused 1 + +# configure the GUI window +window +( + size [ 1000.000 1000.000 ] + center [-0.932 -0.088] + rotate [ 0.000 0.000 ] + scale 51.828 +) + +floorplan +( + name "cave" + size3 [16 16 0.5] + pose [0.000 0.000 0.000] + bitmap "../bitmaps/cave.png" +) + +define rob fancypioneer2dx +( + fancysicklaser( pose [ 0.040 0.000 0.000 ] samples 180 ) + ctrl "swarmbenchmark" +) + + +define redrob rob( color "red" ) +define greenrob rob( color "green" ) +define magentarob rob( color "magenta" ) +define cyanrob rob( color "cyan" ) +define yellowrob rob( color "yellow" ) +define greenrob rob( color "green" ) +define bluerob rob( color "LightBlue" ) +define orangerob rob( color "orange" ) +define purplerob rob( color "purple" ) +define goldrob rob( color "gold" ) +define darkredrob rob( color "DarkRed" ) + +redrob( pose [-5.285 4.915 158.268] ) +redrob( pose [-4.464 5.679 -52.629] ) +redrob( pose [-5.518 4.157 22.445] ) +redrob( pose [-6.007 5.008 156.191] ) +redrob( pose [-5.559 3.371 -109.062] ) +redrob( pose [-6.932 3.655 89.455] ) +redrob( pose [-7.521 4.062 -164.935] ) +redrob( pose [-4.377 4.901 -103.425] ) +redrob( pose [-6.277 4.252 -57.759] ) +redrob( pose [-5.216 5.750 -57.823] ) + +bluerob( pose [-6.984 6.565 -113.456] ) +bluerob( pose [-6.243 5.709 -1.177] ) +bluerob( pose [-6.382 6.320 46.585] ) +bluerob( pose [-7.527 6.162 135.162] ) +bluerob( pose [-6.973 5.568 -3.588] ) +bluerob( pose [-7.611 6.835 93.535] ) +bluerob( pose [-7.601 5.135 -35.760] ) +bluerob( pose [-6.983 4.818 -17.538] ) +bluerob( pose [-7.415 7.485 -23.903] ) +bluerob( pose [-6.738 7.157 -17.092] ) + +greenrob( pose [-2.693 6.699 -97.306] ) +greenrob( pose [-3.304 5.100 2.962] ) +greenrob( pose [-2.477 6.075 -120.224] ) +greenrob( pose [-3.507 5.901 -82.019] ) +greenrob( pose [-2.462 7.492 -143.143] ) +greenrob( pose [-1.908 6.870 -5.633] ) +greenrob( pose [-1.583 6.080 -95.405] ) +greenrob( pose [-0.600 7.526 0.097] ) +greenrob( pose [-0.563 6.815 -52.433] ) +greenrob( pose [-1.367 7.506 163.390] ) + +magentarob( pose [1.702 7.364 -37.146] ) +magentarob( pose [2.628 6.716 -88.712] ) +magentarob( pose [2.686 5.754 -17.092] ) +magentarob( pose [3.723 7.426 160.525] ) +magentarob( pose [2.625 7.473 108.959] ) +magentarob( pose [3.460 6.754 -24.723] ) +magentarob( pose [3.418 5.967 -85.847] ) +magentarob( pose [0.349 7.510 0.097] ) +magentarob( pose [1.769 6.270 -17.092] ) +magentarob( pose [0.561 6.752 -27.588] ) + +yellowrob( pose [-7.548 3.117 150.967] ) +yellowrob( pose [-6.811 2.501 108.959] ) +yellowrob( pose [-7.632 2.151 -85.847] ) +yellowrob( pose [-7.089 1.777 153.832] ) +yellowrob( pose [-6.317 3.246 -140.278] ) +yellowrob( pose [-6.323 1.862 179.615] ) +yellowrob( pose [-5.979 2.590 -54.334] ) +yellowrob( pose [-5.358 1.495 -62.929] ) +yellowrob( pose [-5.279 2.419 0.097] ) +yellowrob( pose [-4.685 1.709 -62.929] ) + +goldrob( pose [5.734 7.537 -32.379] ) +goldrob( pose [7.335 7.494 63.122] ) +goldrob( pose [6.403 6.182 -19.957] ) +goldrob( pose [7.441 6.661 -88.712] ) +goldrob( pose [5.541 6.778 156.697] ) +goldrob( pose [6.593 6.929 162.426] ) +goldrob( pose [4.757 7.353 -17.092] ) +goldrob( pose [5.228 6.159 -17.092] ) +goldrob( pose [4.738 6.752 -17.092] ) +goldrob( pose [4.217 6.192 -17.092] ) + +darkredrob( pose [-7.630 0.425 -45.740] ) +darkredrob( pose [-7.571 1.112 -74.388] ) +darkredrob( pose [-6.158 1.168 177.714] ) +darkredrob( pose [-4.509 0.635 24.916] ) +darkredrob( pose [-7.625 -0.265 68.852] ) +darkredrob( pose [-6.805 0.167 23.015] ) +darkredrob( pose [-6.897 0.859 -51.469] ) +darkredrob( pose [-6.055 0.262 25.880] ) +darkredrob( pose [-5.195 0.771 -33.318] ) +darkredrob( pose [-5.483 -0.245 -17.092] ) + +cyanrob( pose [-2.544 4.684 -143.143] ) +cyanrob( pose [-0.542 3.423 32.573] ) +cyanrob( pose [-1.731 4.304 -125.954] ) +cyanrob( pose [-2.152 5.502 -94.441] ) +cyanrob( pose [-2.424 3.799 137.607] ) +cyanrob( pose [-1.440 3.502 -37.145] ) +cyanrob( pose [-2.603 2.866 130.914] ) +cyanrob( pose [-1.958 2.886 -5.633] ) +cyanrob( pose [-2.183 2.102 -3.731] ) +cyanrob( pose [-1.483 5.050 8.691] ) + +orangerob( pose [-7.692 -2.013 129.012] ) +orangerob( pose [-6.974 -2.159 83.176] ) +orangerob( pose [-6.795 -1.320 -120.224] ) +orangerob( pose [-7.641 -0.996 74.581] ) +orangerob( pose [-6.801 -0.515 -94.441] ) +orangerob( pose [-7.611 -3.107 -103.036] ) +orangerob( pose [-6.788 -3.163 -91.577] ) +orangerob( pose [-6.028 -2.820 -105.900] ) +orangerob( pose [-6.163 -1.853 -45.740] ) +orangerob( pose [-6.026 -0.817 65.987] ) + +purplerob( pose [-3.873 1.694 -97.306] ) +purplerob( pose [-2.893 1.951 -177.520] ) +purplerob( pose [-3.912 1.127 -19.957] ) +purplerob( pose [-3.152 1.184 -114.495] ) +purplerob( pose [-3.878 0.364 -88.712] ) +purplerob( pose [-3.058 0.453 -19.956] ) +purplerob( pose [-3.848 -0.468 -5.633] ) +purplerob( pose [-3.114 -0.386 -60.064] ) +purplerob( pose [-2.506 1.261 -82.982] ) +purplerob( pose [-4.611 -0.180 -17.092] ) + + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------- Check out the new SourceForge.net Marketplace. It's the best place to buy or sell services for just about anything Open Source. http://sourceforge.net/services/buy/index.php _______________________________________________ Playerstage-commit mailing list Playerstage-commit@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/playerstage-commit