Screenshot instructions:
Windows
Mac
Red Hat Linux
Ubuntu
Click URL instructions:
Right-click on ad, choose "Copy Link", then paste here →
(This may not be possible with some types of ads)
You can subscribe to this list here.
2006 |
Jan
|
Feb
|
Mar
|
Apr
(85) |
May
(154) |
Jun
(108) |
Jul
(90) |
Aug
(150) |
Sep
(147) |
Oct
(57) |
Nov
(90) |
Dec
(160) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2007 |
Jan
(40) |
Feb
(54) |
Mar
(90) |
Apr
(86) |
May
(60) |
Jun
(80) |
Jul
(114) |
Aug
(198) |
Sep
(265) |
Oct
(298) |
Nov
(191) |
Dec
(161) |
2008 |
Jan
(77) |
Feb
(155) |
Mar
(64) |
Apr
(148) |
May
(95) |
Jun
(265) |
Jul
(259) |
Aug
(73) |
Sep
(68) |
Oct
(96) |
Nov
(129) |
Dec
(82) |
2009 |
Jan
(135) |
Feb
(69) |
Mar
(233) |
Apr
(96) |
May
(263) |
Jun
(295) |
Jul
(294) |
Aug
(106) |
Sep
(59) |
Oct
(117) |
Nov
(105) |
Dec
(61) |
2010 |
Jan
(71) |
Feb
(26) |
Mar
(83) |
Apr
(81) |
May
(186) |
Jun
(136) |
Jul
(84) |
Aug
(61) |
Sep
(83) |
Oct
(29) |
Nov
(40) |
Dec
(29) |
2011 |
Jan
(18) |
Feb
(4) |
Mar
(3) |
Apr
(2) |
May
(15) |
Jun
(6) |
Jul
(8) |
Aug
(8) |
Sep
(1) |
Oct
(5) |
Nov
(4) |
Dec
(2) |
2012 |
Jan
(6) |
Feb
(2) |
Mar
(6) |
Apr
(5) |
May
|
Jun
(1) |
Jul
(7) |
Aug
|
Sep
(3) |
Oct
(1) |
Nov
(7) |
Dec
(6) |
2013 |
Jan
(13) |
Feb
(2) |
Mar
|
Apr
(3) |
May
(1) |
Jun
(28) |
Jul
(2) |
Aug
(2) |
Sep
(1) |
Oct
(7) |
Nov
(13) |
Dec
(1) |
2014 |
Jan
(1) |
Feb
(5) |
Mar
(7) |
Apr
(8) |
May
(27) |
Jun
(16) |
Jul
(13) |
Aug
(6) |
Sep
(7) |
Oct
(3) |
Nov
(5) |
Dec
(3) |
2015 |
Jan
(1) |
Feb
(3) |
Mar
(6) |
Apr
(4) |
May
(6) |
Jun
(5) |
Jul
(3) |
Aug
(3) |
Sep
(1) |
Oct
|
Nov
(1) |
Dec
(1) |
2016 |
Jan
(3) |
Feb
(2) |
Mar
(4) |
Apr
(3) |
May
(8) |
Jun
(7) |
Jul
(11) |
Aug
(7) |
Sep
(3) |
Oct
(8) |
Nov
(5) |
Dec
(3) |
2017 |
Jan
|
Feb
|
Mar
|
Apr
(1) |
May
(2) |
Jun
(3) |
Jul
(4) |
Aug
(6) |
Sep
(4) |
Oct
|
Nov
(2) |
Dec
(5) |
2018 |
Jan
(4) |
Feb
(7) |
Mar
(30) |
Apr
(1) |
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
S | M | T | W | T | F | S |
---|---|---|---|---|---|---|
|
|
1
(9) |
2
(21) |
3
(9) |
4
(19) |
5
(5) |
6
(3) |
7
(35) |
8
(15) |
9
(8) |
10
(8) |
11
(15) |
12
(4) |
13
(3) |
14
(8) |
15
(10) |
16
(8) |
17
(4) |
18
(9) |
19
(1) |
20
(5) |
21
(8) |
22
(14) |
23
(7) |
24
(7) |
25
(7) |
26
(3) |
27
|
28
(2) |
29
(8) |
30
(3) |
31
(1) |
|
|
From: 钟文辉 <shanhu.dao@16...> - 2008-07-04 22:46:08
|
各位老总:您们好! 诚祝:您们在2008年里;有鼠不尽的快乐!鼠不尽的收获!鼠不尽的钞票! 鼠不尽的幸福!鼠不尽的美满生活!愿: 您们阖家欢乐!幸福安康! 我公司可以长期提供:出口报关单,核销单,等等一系列手续;代理:出口 报关,商检,境内外运输......等等;还可以代办:出口欧盟许可证,欧盟产地证; 并且还有(广州国际贸易交易会)的摊位可以转让;价格特别优惠;有意者请来邮件 或来电联系。谢谢合作! 电话:0755-81153047。 传真:0755-81172940。 手机:15817477278。 联系人:钟文辉。 电子邮箱:shanhu.dao@... 此致: 敬礼! |
From: <rtv@us...> - 2008-07-04 18:32:56
|
Revision: 6774 http://playerstage.svn.sourceforge.net/playerstage/?rev=6774&view=rev Author: rtv Date: 2008-07-04 18:33:02 -0700 (Fri, 04 Jul 2008) Log Message: ----------- working on proper recursive 3D poses - it's been a hack so far Modified Paths: -------------- code/stage/trunk/libstage/model.cc code/stage/trunk/libstage/worldgui.cc code/stage/trunk/worlds/swarmbenchmark/cave.world Modified: code/stage/trunk/libstage/model.cc =================================================================== --- code/stage/trunk/libstage/model.cc 2008-07-05 01:07:11 UTC (rev 6773) +++ code/stage/trunk/libstage/model.cc 2008-07-05 01:33:02 UTC (rev 6774) @@ -176,9 +176,10 @@ world->AddModel( this ); bzero( &pose, sizeof(pose)); - if( parent ) - pose.z = parent->geom.size.z; + if( parent) pose.z += parent->geom.size.z; + bzero( &global_pose, sizeof(global_pose)); + this->gpose_dirty = true; this->trail = g_array_new( false, false, sizeof(stg_trail_item_t) ); @@ -186,7 +187,6 @@ this->disabled = false; this->blocks = NULL; this->rebuild_displaylist = true; - this->gpose_dirty = true; this->say_string = NULL; this->subs = 0; this->stall = false; @@ -1268,6 +1268,9 @@ //PRINT_DEBUG5( "%s.SetPose(%.2f %.2f %.2f %.2f)", // this->token, pose->x, pose->y, pose->z, pose->a ); + if( parent ) + pose.z += parent->geom.size.z; + // if the pose has changed, we need to do some work if( memcmp( &this->pose, &pose, sizeof(stg_pose_t) ) != 0 ) { Modified: code/stage/trunk/libstage/worldgui.cc =================================================================== --- code/stage/trunk/libstage/worldgui.cc 2008-07-05 01:07:11 UTC (rev 6773) +++ code/stage/trunk/libstage/worldgui.cc 2008-07-05 01:33:02 UTC (rev 6774) @@ -125,10 +125,10 @@ "Part of the Player Project\n" "http://playerstage.org\n"; "\n" - "Copyright 2000-2008 Richard Vaughan, Brian Gerkey, " - "Andrew Howard, Reed Hedges, Toby Collett, " - "Alex Couture-Beil, Jeremy Asher " - "and contributors"; + "Copyright 2000-2008 Richard Vaughan,\n" + " Brian Gerkey, Andrew Howard, Reed Hedges, \n" + " Toby Collett, Alex Couture-Beil, Jeremy Asher \n" + " and contributors"; StgWorldGui::StgWorldGui(int W,int H,const char* L) : Fl_Window(W,H,L ) @@ -544,7 +544,7 @@ tbuf->append( "-" ); tbuf->append( VERSION ); tbuf->append( AboutText ); - textDisplay->wrap_mode( true, 50 ); + //textDisplay->wrap_mode( true, 50 ); textDisplay->buffer( tbuf ); Fl_Return_Button* button; Modified: code/stage/trunk/worlds/swarmbenchmark/cave.world =================================================================== --- code/stage/trunk/worlds/swarmbenchmark/cave.world 2008-07-05 01:07:11 UTC (rev 6773) +++ code/stage/trunk/worlds/swarmbenchmark/cave.world 2008-07-05 01:33:02 UTC (rev 6774) @@ -33,7 +33,7 @@ #define rob fancypioneer2dx # alternative with more complex polygons ( - sicklaser( pose [ 0.040 0.000 0.000 ] samples 180 ) + sicklaser( )#pose4 [ 0.040 0.000 0.01 0.000 ] samples 180 ) # alternative laser with more complex polygons # fancysicklaser( pose [ 0.040 0.000 0.000 ] samples 180 ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rtv@us...> - 2008-07-04 18:07:03
|
Revision: 6773 http://playerstage.svn.sourceforge.net/playerstage/?rev=6773&view=rev Author: rtv Date: 2008-07-04 18:07:11 -0700 (Fri, 04 Jul 2008) Log Message: ----------- adding authors Modified Paths: -------------- code/stage/trunk/AUTHORS code/stage/trunk/libstage/worldgui.cc Modified: code/stage/trunk/AUTHORS =================================================================== --- code/stage/trunk/AUTHORS 2008-07-05 00:59:26 UTC (rev 6772) +++ code/stage/trunk/AUTHORS 2008-07-05 01:07:11 UTC (rev 6773) @@ -8,3 +8,7 @@ Richard Vaughan (rtv@...) Andrew Howard (inspectorg@...) Brian Gerkey (gerkey@...) +Alex Couture-Beil +Jeremy Asher +Reed Hedges +Toby Collett \ No newline at end of file Modified: code/stage/trunk/libstage/worldgui.cc =================================================================== --- code/stage/trunk/libstage/worldgui.cc 2008-07-05 00:59:26 UTC (rev 6772) +++ code/stage/trunk/libstage/worldgui.cc 2008-07-05 01:07:11 UTC (rev 6773) @@ -119,11 +119,17 @@ #include <sstream> #include <iomanip> -// this should be set by CMake -#ifndef PACKAGE_STRING -#define PACKAGE_STRING "Stage-3.dev" -#endif +static const char* AboutText = + "\n" + "Part of the Player Project\n" + "http://playerstage.org\n"; + "\n" + "Copyright 2000-2008 Richard Vaughan, Brian Gerkey, " + "Andrew Howard, Reed Hedges, Toby Collett, " + "Alex Couture-Beil, Jeremy Asher " + "and contributors"; + StgWorldGui::StgWorldGui(int W,int H,const char* L) : Fl_Window(W,H,L ) { @@ -133,7 +139,8 @@ paused = false; // improve the title bar to say "Stage: <worldfile name>" - std::string title = "Stage: "; + std::string title = PROJECT; + title += ": "; title += L; label( title.c_str() ); @@ -506,8 +513,8 @@ fl_register_images(); - const int Width = 400; - const int Height = 220; + const int Width = 420; + const int Height = 300; const int Spc = 10; const int ButtonH = 25; const int ButtonW = 60; @@ -531,16 +538,13 @@ textDisplay->box( FL_NO_BOX ); textDisplay->color( win->color() ); win->callback( aboutCloseCb, textDisplay ); - - const char* AboutText = - "\n" - "Part of the Player Project\n" - "http://playerstage.sourceforge.net\n"; - "Copyright 2000-2008 Richard Vaughan and contributors"; - + Fl_Text_Buffer* tbuf = new Fl_Text_Buffer; - tbuf->text( PACKAGE_STRING ); + tbuf->text( PROJECT ); + tbuf->append( "-" ); + tbuf->append( VERSION ); tbuf->append( AboutText ); + textDisplay->wrap_mode( true, 50 ); textDisplay->buffer( tbuf ); Fl_Return_Button* button; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <alexcb@us...> - 2008-07-04 17:59:20
|
Revision: 6772 http://playerstage.svn.sourceforge.net/playerstage/?rev=6772&view=rev Author: alexcb Date: 2008-07-04 17:59:26 -0700 (Fri, 04 Jul 2008) Log Message: ----------- fixed picker bug introduced by camera model Modified Paths: -------------- code/stage/trunk/libstage/camera.cc code/stage/trunk/libstage/canvas.cc code/stage/trunk/libstage/stage.hh Modified: code/stage/trunk/libstage/camera.cc =================================================================== --- code/stage/trunk/libstage/camera.cc 2008-07-05 00:43:45 UTC (rev 6771) +++ code/stage/trunk/libstage/camera.cc 2008-07-05 00:59:26 UTC (rev 6772) @@ -105,18 +105,27 @@ } -void StgOrthoCamera::SetProjection( float pixels_width, float pixels_height, float y_min, float y_max ) const +void StgOrthoCamera::SetProjection( void ) const { glMatrixMode (GL_PROJECTION); glLoadIdentity (); - - glOrtho( -pixels_width/2.0 / _scale, pixels_width/2.0 / _scale, - -pixels_height/2.0 / _scale, pixels_height/2.0 / _scale, - y_min * _scale * 2, y_max * _scale * 2 ); - + + glOrtho( -_pixels_width/2.0 / _scale, _pixels_width/2.0 / _scale, + -_pixels_height/2.0 / _scale, _pixels_height/2.0 / _scale, + _y_min * _scale * 2, _y_max * _scale * 2 ); + glMatrixMode (GL_MODELVIEW); } +void StgOrthoCamera::SetProjection( float pixels_width, float pixels_height, float y_min, float y_max ) +{ + _pixels_width = pixels_width; + _pixels_height = pixels_height; + _y_min = y_min; + _y_max = y_max; + SetProjection(); +} + //TODO re-evaluate the way the camera is shifted when the mouse zooms - it might be possible to simplify void StgOrthoCamera::scale( float scale, float shift_x, float w, float shift_y, float h ) { Modified: code/stage/trunk/libstage/canvas.cc =================================================================== --- code/stage/trunk/libstage/canvas.cc 2008-07-05 00:43:45 UTC (rev 6771) +++ code/stage/trunk/libstage/canvas.cc 2008-07-05 00:59:26 UTC (rev 6772) @@ -93,8 +93,10 @@ glClearColor ( 1,1,1,1 ); // white glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glPolygonMode( GL_FRONT_AND_BACK, GL_FILL ); + glLoadIdentity(); + current_camera->SetProjection(); + current_camera->Draw(); - glDisable(GL_DITHER); glDisable(GL_BLEND); // turns off alpha blending, so we read back // exactly what we write to a pixel @@ -155,6 +157,8 @@ glEnable(GL_BLEND); glClearColor ( 0.7, 0.7, 0.8, 1.0); + Screenshot(); + return mod; } @@ -284,7 +288,6 @@ clicked_empty_space = ( mod == NULL ); empty_space_startx = startx; empty_space_starty = starty; - std::cout << "clicked: " << startx << " " << Fl::event_x() << std::endl; if( mod ) { // clicked a model if ( Fl::event_state( FL_SHIFT ) ) { Modified: code/stage/trunk/libstage/stage.hh =================================================================== --- code/stage/trunk/libstage/stage.hh 2008-07-05 00:43:45 UTC (rev 6771) +++ code/stage/trunk/libstage/stage.hh 2008-07-05 00:59:26 UTC (rev 6772) @@ -1791,6 +1791,7 @@ virtual ~StgCamera() { } virtual void Draw( void ) const = 0; + virtual void SetProjection( void ) const = 0; inline float yaw( void ) const { return _yaw; } inline float pitch( void ) const { return _pitch; } @@ -1857,10 +1858,16 @@ private: float _scale; + float _pixels_width; + float _pixels_height; + float _y_min; + float _y_max; + public: StgOrthoCamera( void ) : _scale( 15 ) { } virtual void Draw() const; - virtual void SetProjection( float pixels_width, float pixels_height, float y_min, float y_max ) const; + virtual void SetProjection( float pixels_width, float pixels_height, float y_min, float y_max ); + virtual void SetProjection( void ) const; inline void move( float x, float y ) { //convert screen points into world points This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jeremy_asher@us...> - 2008-07-04 17:43:36
|
Revision: 6771 http://playerstage.svn.sourceforge.net/playerstage/?rev=6771&view=rev Author: jeremy_asher Date: 2008-07-04 17:43:45 -0700 (Fri, 04 Jul 2008) Log Message: ----------- Fixed speech bubble positioning in perspective mode, scaling still off Modified Paths: -------------- code/stage/trunk/libstage/model.cc Modified: code/stage/trunk/libstage/model.cc =================================================================== --- code/stage/trunk/libstage/model.cc 2008-07-05 00:38:55 UTC (rev 6770) +++ code/stage/trunk/libstage/model.cc 2008-07-05 00:43:45 UTC (rev 6771) @@ -912,54 +912,65 @@ void StgModel::DrawStatus( StgCanvas* canvas ) { - // draw speech bubble - if( say_string ) - { - float stheta = -dtor( canvas->current_camera->pitch() ); - float sphi = dtor( canvas->current_camera->yaw() ); - float scale = canvas->camera.getScale(); - if( canvas->perspectiveCam == true ) { - sphi = atan2( - ( pose.x - canvas->current_camera->x() ) - , - ( pose.y - canvas->current_camera->y() ) - ); - stheta = -stheta; - } + if( say_string ) + { + float yaw, pitch, scale; + - glPushMatrix(); + float x,y,z; + x = canvas->current_camera->x() - pose.x; + y = canvas->current_camera->y() - pose.y; + z = canvas->current_camera->z() - pose.z - 0.5; + float dist = sqrt( exp2f(x) + exp2f(y) + exp2f(z) ); + printf("x: %f, y: %f, z: %f, dist: %f, scale: %f\n", x, y, z, dist, scale); - // move above the robot - glTranslatef( 0, 0, 0.5 ); + if ( canvas->perspectiveCam ) { + pitch = -canvas->current_camera->pitch(); + yaw = -canvas->current_camera->yaw(); + scale = 500/dist; + } + else { + pitch = canvas->current_camera->pitch(); + yaw = canvas->current_camera->yaw(); + scale = canvas->camera.getScale(); + } + + float robotAngle = -rtod(pose.a); - // rotate to face screen - glRotatef( -rtod(global_pose.a + sphi), 0,0,1 ); - glRotatef( rtod(stheta), 1,0,0 ); + - const float m = 4 / scale; // margin - float w = gl_width( this->say_string ) / scale; // scaled text width - float h = gl_height() / scale; // scaled text height + glPushMatrix(); + + // move above the robot + glTranslatef( 0, 0, 0.5 ); + + // rotate to face screen + glRotatef( robotAngle - yaw, 0,0,1 ); + glRotatef( -pitch, 1,0,0 ); + + const float m = 4 / scale; // margin + float w = gl_width( this->say_string ) / scale; // scaled text width + float h = gl_height() / scale; // scaled text height + + // draw inside of bubble + PushColor( BUBBLE_FILL ); + glPushAttrib( GL_POLYGON_BIT | GL_LINE_BIT ); + glPolygonMode( GL_FRONT, GL_FILL ); + glEnable( GL_POLYGON_OFFSET_FILL ); + glPolygonOffset( 1.0, 1.0 ); + gl_draw_octagon( w, h, m ); + glDisable( GL_POLYGON_OFFSET_FILL ); + PopColor(); + // draw outline of bubble + PushColor( BUBBLE_BORDER ); + glLineWidth( 1 ); + glEnable( GL_LINE_SMOOTH ); + glPolygonMode( GL_FRONT, GL_LINE ); + gl_draw_octagon( w, h, m ); + glPopAttrib(); + PopColor(); - // draw inside of bubble - PushColor( BUBBLE_FILL ); - glPushAttrib( GL_POLYGON_BIT | GL_LINE_BIT ); - glPolygonMode( GL_FRONT, GL_FILL ); - glEnable( GL_POLYGON_OFFSET_FILL ); - glPolygonOffset( 1.0, 1.0 ); - gl_draw_octagon( w, h, m ); - glDisable( GL_POLYGON_OFFSET_FILL ); - PopColor(); - // draw outline of bubble - PushColor( BUBBLE_BORDER ); - glLineWidth( 1 ); - glEnable( GL_LINE_SMOOTH ); - glPolygonMode( GL_FRONT, GL_LINE ); - gl_draw_octagon( w, h, m ); - glPopAttrib(); - PopColor(); - - // draw text PushColor( BUBBLE_TEXT ); glTranslatef( 0, 0, 0.1 ); // draw text forwards of bubble This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rtv@us...> - 2008-07-04 17:38:50
|
Revision: 6770 http://playerstage.svn.sourceforge.net/playerstage/?rev=6770&view=rev Author: rtv Date: 2008-07-04 17:38:55 -0700 (Fri, 04 Jul 2008) Log Message: ----------- fixed some bugs Modified Paths: -------------- code/stage/trunk/examples/ctrl/CMakeLists.txt code/stage/trunk/examples/ctrl/source.cc code/stage/trunk/examples/ctrl/wander.cc code/stage/trunk/examples/libstage/stest.cc code/stage/trunk/libstage/canvas.cc code/stage/trunk/libstage/model_laser.cc code/stage/trunk/libstage/model_load.cc code/stage/trunk/libstage/test.cc code/stage/trunk/libstage/worldgui.cc code/stage/trunk/libstageplugin/p_driver.cc code/stage/trunk/worlds/fasr.world code/stage/trunk/worlds/pioneer.inc code/stage/trunk/worlds/sick.inc code/stage/trunk/worlds/simple.world code/stage/trunk/worlds/swarmbenchmark/cave.world code/stage/trunk/worlds/worldgen.sh Added Paths: ----------- code/stage/trunk/examples/ctrl/expand.cc code/stage/trunk/worlds/hospital.world Removed Paths: ------------- code/stage/trunk/examples/ctrl/swarmbenchmark.cc Modified: code/stage/trunk/examples/ctrl/CMakeLists.txt =================================================================== --- code/stage/trunk/examples/ctrl/CMakeLists.txt 2008-07-05 00:31:17 UTC (rev 6769) +++ code/stage/trunk/examples/ctrl/CMakeLists.txt 2008-07-05 00:38:55 UTC (rev 6770) @@ -1,13 +1,18 @@ -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( swarmbenchmark MODULE swarmbenchmark.cc ) +SET( PLUGINS + expand + fasr + lasernoise + sink + source + wander +) -# link libstage to each plugin + +# create a library module for each plugin and link libstage to each + foreach( PLUGIN ${PLUGINS} ) + ADD_LIBRARY( ${PLUGIN} MODULE ${PLUGIN}.cc ) TARGET_LINK_LIBRARIES( ${PLUGIN} stage ) endforeach( PLUGIN ) Added: code/stage/trunk/examples/ctrl/expand.cc =================================================================== --- code/stage/trunk/examples/ctrl/expand.cc (rev 0) +++ code/stage/trunk/examples/ctrl/expand.cc 2008-07-05 00:38:55 UTC (rev 6770) @@ -0,0 +1,121 @@ +///////////////////////////////// +// File: stest.c +// Desc: Stage library test program +// Created: 2004.9.15 +// Author: Richard Vaughan <vaughan@...> +// 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 +{ + StgModelLaser* laser; + StgModelPosition* position; + StgModelRanger* ranger; +} robot_t; + +#define VSPEED 0.5 // meters per second +#define WGAIN 1.5 // turn speed gain +#define SAFE_DIST 0.6 // meters +#define SAFE_ANGLE 1 // 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 ); + + //printf( "sensor %d angle= %.2f\n", s, 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; + + //printf( "resultant %.2f turn_speed %.2f\n", resultant_angle, turn_speed ); + + int forward = 0 ; + // if the front is clear, drive forwards + if( (rgr->samples[0] > SAFE_DIST) && + (rgr->samples[1] > SAFE_DIST/2.0) && + (rgr->samples[2] > SAFE_DIST/5.0) && + (rgr->samples[15] > SAFE_DIST/2.0) && + (rgr->samples[14] > SAFE_DIST/5.0) && + (fabs( resultant_angle ) < SAFE_ANGLE) ) + { + forward_speed = VSPEED; + } + + //printf( "forward angle = %.2f\n", rgr->sensors[forward].pose.a ); + + // // 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/examples/ctrl/source.cc =================================================================== --- code/stage/trunk/examples/ctrl/source.cc 2008-07-05 00:31:17 UTC (rev 6769) +++ code/stage/trunk/examples/ctrl/source.cc 2008-07-05 00:38:55 UTC (rev 6770) @@ -5,12 +5,14 @@ int Update( StgModel* mod, void* dummy ); +const double flagsz = 0.4; + // Stage calls this when the model starts up extern "C" int Init( StgModel* mod ) { for( int i=0; i<5; i++ ) - mod->PushFlag( new StgFlag( stg_color_pack( 1,1,0,0 ), 0.5 ) ); + mod->PushFlag( new StgFlag( stg_color_pack( 1,1,0,0 ), flagsz ) ); mod->AddUpdateCallback( (stg_model_callback_t)Update, NULL ); @@ -22,7 +24,7 @@ { if( mod->GetWorld()->GetUpdateCount() % INTERVAL == 0 ) - mod->PushFlag( new StgFlag( stg_color_pack( 1,1,0,0), 0.5 ) ); + mod->PushFlag( new StgFlag( stg_color_pack( 1,1,0,0), flagsz ) ); return 0; // run again } Deleted: code/stage/trunk/examples/ctrl/swarmbenchmark.cc =================================================================== --- code/stage/trunk/examples/ctrl/swarmbenchmark.cc 2008-07-05 00:31:17 UTC (rev 6769) +++ code/stage/trunk/examples/ctrl/swarmbenchmark.cc 2008-07-05 00:38:55 UTC (rev 6770) @@ -1,121 +0,0 @@ -///////////////////////////////// -// File: stest.c -// Desc: Stage library test program -// Created: 2004.9.15 -// Author: Richard Vaughan <vaughan@...> -// 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 -{ - StgModelLaser* laser; - StgModelPosition* position; - StgModelRanger* ranger; -} robot_t; - -#define VSPEED 0.5 // meters per second -#define WGAIN 1.5 // turn speed gain -#define SAFE_DIST 0.6 // meters -#define SAFE_ANGLE 1 // 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 ); - - //printf( "sensor %d angle= %.2f\n", s, 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; - - //printf( "resultant %.2f turn_speed %.2f\n", resultant_angle, turn_speed ); - - int forward = 0 ; - // if the front is clear, drive forwards - if( (rgr->samples[0] > SAFE_DIST) && - (rgr->samples[1] > SAFE_DIST/2.0) && - (rgr->samples[2] > SAFE_DIST/5.0) && - (rgr->samples[15] > SAFE_DIST/2.0) && - (rgr->samples[14] > SAFE_DIST/5.0) && - (fabs( resultant_angle ) < SAFE_ANGLE) ) - { - forward_speed = VSPEED; - } - - //printf( "forward angle = %.2f\n", rgr->sensors[forward].pose.a ); - - // // 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/examples/ctrl/wander.cc =================================================================== --- code/stage/trunk/examples/ctrl/wander.cc 2008-07-05 00:31:17 UTC (rev 6769) +++ code/stage/trunk/examples/ctrl/wander.cc 2008-07-05 00:38:55 UTC (rev 6770) @@ -11,7 +11,6 @@ { StgModelPosition* pos; StgModelLaser* laser; - StgModelBlobfinder* blobfinder; int avoidcount, randcount; } robot_t; @@ -23,26 +22,14 @@ { robot_t* robot = new robot_t; - robot->pos = (StgModelPosition*)mod; - - robot->laser = (StgModelLaser*)mod->GetModel( "laser:0" ); - assert( robot->laser ); - robot->laser->Subscribe(); - - robot->blobfinder = (StgModelBlobfinder*)mod->GetModel( "blobfinder:0" ); - assert( robot->blobfinder ); - // robot->blobfinder->Subscribe(); - robot->avoidcount = 0; robot->randcount = 0; + robot->pos = (StgModelPosition*)mod; + robot->laser = (StgModelLaser*)mod->GetModel( "laser:0" ); robot->laser->AddUpdateCallback( (stg_model_callback_t)LaserUpdate, robot ); - //robot->pos->AddUpdateCallback( (stg_model_callback_t)PositionUpdate, robot ); + robot->laser->Subscribe(); // starts the laser - robot->pos->AddFlag( new StgFlag( (stg_color_t)0xFFAA00AA, 1.0)); - robot->pos->AddFlag( new StgFlag( (stg_color_t)0xFF0000AA, 0.5)); - robot->pos->AddFlag( new StgFlag( (stg_color_t)0xFFAA0000, 0.2)); - robot->pos->AddFlag( new StgFlag( (stg_color_t)0xFF00FFFF, 0.1)); return 0; //ok } Modified: code/stage/trunk/examples/libstage/stest.cc =================================================================== --- code/stage/trunk/examples/libstage/stest.cc 2008-07-05 00:31:17 UTC (rev 6769) +++ code/stage/trunk/examples/libstage/stest.cc 2008-07-05 00:38:55 UTC (rev 6770) @@ -16,7 +16,6 @@ #include "config.h" -double minfrontdistance = 0.750; double speed = 0.400; double turnrate = M_PI/3.0; @@ -31,7 +30,7 @@ #define VSPEED 0.4 // meters per second #define WGAIN 1.0 // turn speed gain -#define SAFE_DIST 0/8 // meters +#define SAFE_DIST 0.1 // meters #define SAFE_ANGLE 0.3 // radians int main( int argc, char* argv[] ) @@ -64,10 +63,10 @@ assert(robots[i].position); robots[i].position->Subscribe(); - robots[i].laser = (StgModelLaser*) - robots[i].position->GetUnsubscribedModelOfType( "laser" ); - assert(robots[i].laser); - robots[i].laser->Subscribe(); +// robots[i].laser = (StgModelLaser*) +// robots[i].position->GetUnsubscribedModelOfType( "laser" ); +// assert(robots[i].laser); +// robots[i].laser->Subscribe(); // robots[i].fiducial = (StgModelFiducial*) // robots[i].position->GetUnsubscribedModelOfType( "fiducial" ); Modified: code/stage/trunk/libstage/canvas.cc =================================================================== --- code/stage/trunk/libstage/canvas.cc 2008-07-05 00:31:17 UTC (rev 6769) +++ code/stage/trunk/libstage/canvas.cc 2008-07-05 00:38:55 UTC (rev 6770) @@ -1,6 +1,8 @@ /** canvas.cc Implement the main world viewing area in FLTK and OpenGL. - Author: Richard Vaughan (vaughan@...) + Authors: Richard Vaughan (vaughan@...) + Alex Couture-Beil (asc17@...) + Jeremy Asher (jra11@...) $Id: canvas.cc,v 1.12 2008-03-03 07:01:12 rtv Exp $ */ @@ -854,7 +856,6 @@ void StgCanvas::Save( Worldfile* wf, int sec ) { - printf( "canvas save section %d\n", sec ); wf->WriteFloat( sec, "scale", camera.getScale() ); wf->WriteTupleFloat( sec, "center", 0, camera.getX() ); Modified: code/stage/trunk/libstage/model_laser.cc =================================================================== --- code/stage/trunk/libstage/model_laser.cc 2008-07-05 00:31:17 UTC (rev 6769) +++ code/stage/trunk/libstage/model_laser.cc 2008-07-05 00:38:55 UTC (rev 6770) @@ -322,10 +322,10 @@ glTranslatef( 0,0, geom.size.z/2.0 ); // shoot the laser beam out at the right height // DEBUG - draw the origin of the laser beams - //glPointSize( 4.0 ); - //glBegin( GL_POINTS ); - //glVertex2f( 0,0 ); - //glEnd(); + glPointSize( 4.0 ); + glBegin( GL_POINTS ); + glVertex2f( 0,0 ); + glEnd(); // pack the laser hit points into a vertex array for fast rendering static float* pts = NULL; Modified: code/stage/trunk/libstage/model_load.cc =================================================================== --- code/stage/trunk/libstage/model_load.cc 2008-07-05 00:31:17 UTC (rev 6769) +++ code/stage/trunk/libstage/model_load.cc 2008-07-05 00:38:55 UTC (rev 6770) @@ -82,6 +82,7 @@ stg_pose_t pose = GetPose(); pose.x = wf->ReadTupleLength(wf_entity, "pose", 0, pose.x ); pose.y = wf->ReadTupleLength(wf_entity, "pose", 1, pose.y ); + pose.z = 0.0; pose.a = wf->ReadTupleAngle(wf_entity, "pose", 2, pose.a ); this->SetPose( pose ); } @@ -380,10 +381,10 @@ wf->WriteTupleLength( wf_entity, "pose", 1, this->pose.y); wf->WriteTupleAngle( wf_entity, "pose", 2, this->pose.a); - wf->WriteTupleLength( wf_entity, "pose3", 0, this->pose.x); - wf->WriteTupleLength( wf_entity, "pose3", 1, this->pose.y); - wf->WriteTupleLength( wf_entity, "pose3", 2, this->pose.z); - wf->WriteTupleAngle( wf_entity, "pose3", 3, this->pose.a); + wf->WriteTupleLength( wf_entity, "pose4", 0, this->pose.x); + wf->WriteTupleLength( wf_entity, "pose4", 1, this->pose.y); + wf->WriteTupleLength( wf_entity, "pose4", 2, this->pose.z); + wf->WriteTupleAngle( wf_entity, "pose4", 3, this->pose.a); // call any type-specific save callbacks this->CallCallbacks( &this->save_hook ); @@ -394,8 +395,8 @@ void StgModel::LoadControllerModule( char* lib ) { - printf( "[Ctrl \"%s\"", lib ); - fflush(stdout); + //printf( "[Ctrl \"%s\"", lib ); + //fflush(stdout); /* Initialise libltdl. */ int errors = lt_dlinit(); @@ -411,7 +412,7 @@ if(( handle = lt_dlopenext( lib ) )) { - printf( "]" ); + //printf( "]" ); this->initfunc = (ctrlinit_t*)lt_dlsym( handle, "Init" ); if( this->initfunc == NULL ) Modified: code/stage/trunk/libstage/test.cc =================================================================== --- code/stage/trunk/libstage/test.cc 2008-07-05 00:31:17 UTC (rev 6769) +++ code/stage/trunk/libstage/test.cc 2008-07-05 00:38:55 UTC (rev 6770) @@ -46,7 +46,7 @@ stg_geom_t geom; bzero( &geom, sizeof(geom) ); - if( 0 ) + if( 1 ) { StgModel mod( &world, NULL ); Modified: code/stage/trunk/libstage/worldgui.cc =================================================================== --- code/stage/trunk/libstage/worldgui.cc 2008-07-05 00:31:17 UTC (rev 6769) +++ code/stage/trunk/libstage/worldgui.cc 2008-07-05 00:38:55 UTC (rev 6770) @@ -1,3 +1,11 @@ +/** worldgui.cc + Implement a subclass of StgWorld that has an FLTK and OpenGL GUI + Authors: Richard Vaughan (vaughan@...) + Alex Couture-Beil (asc17@...) + Jeremy Asher (jra11@...) + $Id: canvas.cc,v 1.12 2008-03-03 07:01:12 rtv Exp $ +*/ + /** @defgroup worldgui World with Graphical User Interface The Stage window consists of a menu bar, a view of the simulated @@ -576,21 +584,20 @@ if ( wf ) { // worldfile loaded, ask to save - choice = fl_choice("Do you want to save?", + choice = fl_choice("Quitting Stage", "&Cancel", // ->0: defaults to ESC - "&Yes", // ->1 - "&No" // ->2 + "&Save, then quit", // ->1 + "&Quit without saving" // ->2 ); switch (choice) { - case 1: // Yes - if ( saveAsDialog() ) { - return true; - } - else { + case 1: // Save before quitting + if ( saveAsDialog() ) + return true; + else return false; - } - case 2: // No + + case 2: // Quit without saving return true; } Modified: code/stage/trunk/libstageplugin/p_driver.cc =================================================================== --- code/stage/trunk/libstageplugin/p_driver.cc 2008-07-05 00:31:17 UTC (rev 6769) +++ code/stage/trunk/libstageplugin/p_driver.cc 2008-07-05 00:38:55 UTC (rev 6770) @@ -170,7 +170,7 @@ // init static vars StgWorldGui* StgDriver::world = NULL; -int update_request = 0; +//int update_request = 0; /* need the extern to avoid C++ name-mangling */ extern "C" @@ -201,7 +201,7 @@ puts( copyright_notice ); } - table->AddDriver( "stage", StgDriver_Init); + table->AddDriver( (char*)"stage", StgDriver_Init); } int player_driver_init(DriverTable* table) Modified: code/stage/trunk/worlds/fasr.world =================================================================== --- code/stage/trunk/worlds/fasr.world 2008-07-05 00:31:17 UTC (rev 6769) +++ code/stage/trunk/worlds/fasr.world 2008-07-05 00:38:55 UTC (rev 6770) @@ -23,7 +23,7 @@ ( size [ 833.000 605.000 ] center [0.000 0.000] - rotate [ -47.500 -12.500 ] + rotate [ -45.500 4.000 ] scale 32.344 show_data 0 @@ -36,7 +36,7 @@ name "cave" size3 [16 16 0.6] pose [0.000 0.000 0.000] - bitmap "bitmaps/cave_compact.png" + bitmap "bitmaps/cave.png" ) zone @@ -69,7 +69,7 @@ ) -autorob( pose [1.633 4.021 1.930] ) +autorob( pose [3.273 4.908 1.930] ) #autorob( pose [6.635 6.458 -52.629] ) #autorob( pose [6.385 5.805 -87.082] ) #autorob( pose [7.004 5.327 170.536] ) Added: code/stage/trunk/worlds/hospital.world =================================================================== --- code/stage/trunk/worlds/hospital.world (rev 0) +++ code/stage/trunk/worlds/hospital.world 2008-07-05 00:38:55 UTC (rev 6770) @@ -0,0 +1,2065 @@ +# hospitale.world - large world file example +# Authors: Richard Vaughan +# $Id$ + +# defines 'map' object used for floorplans +include "map.inc" +include "pioneer.inc" + +# set the resolution of the underlying raytrace model in meters +resolution 0.02 + +interval_sim 100 # simulation timestep in milliseconds +interval_real 0 # real-time interval between simulation updates in milliseconds + +paused 1 + +quit_time 60 + +# configure the GUI window +window +( + size [ 640 480 ] + #center [929.990 -377.040] + #rotate [ 0.000 0.000 ] + #scale 20.806 + + show_data 0 +) + +# load an environment bitmap +floorplan +( + size3 [140 60 1] + pose [0.000 0.5 0.000] + bitmap "bitmaps/hospital.png" +) + +define swarmbot position +( + size3 [0.1 0.1 0.1] + color "red" + + #laser( size3 [ 0.05 0.05 0.05 ] ) + + ranger( pose4 [ 0 0 -0.01 0 ] + scount 12 + spose[0] [0 0 0] + spose[1] [0 0 30] + spose[2] [0 0 60] + spose[3] [0 0 90] + spose[4] [0 0 120] + spose[5] [0 0 150] + spose[6] [0 0 180] + spose[7] [0 0 210] + spose[8] [0 0 240] + spose[9] [0 0 270] + spose[10] [0 0 300] + spose[11] [0 0 330] + sview [ 0 2 30] ) + + #ctrl "expand" +) + + +swarmbot( name "r0" pose [ -59.000 -15.000 0 ] ) +swarmbot( name "r1" pose [ -59.000 -14.750 0 ] ) +swarmbot( name "r2" pose [ -59.000 -14.500 0 ] ) +swarmbot( name "r3" pose [ -59.000 -14.250 0 ] ) +swarmbot( name "r4" pose [ -59.000 -14.000 0 ] ) +swarmbot( name "r5" pose [ -58.750 -15.000 0 ] ) +swarmbot( name "r6" pose [ -58.750 -14.750 0 ] ) +swarmbot( name "r7" pose [ -58.750 -14.500 0 ] ) +swarmbot( name "r8" pose [ -58.750 -14.250 0 ] ) +swarmbot( name "r9" pose [ -58.750 -14.000 0 ] ) +swarmbot( name "r10" pose [ -58.500 -15.000 0 ] ) +swarmbot( name "r11" pose [ -58.500 -14.750 0 ] ) +swarmbot( name "r12" pose [ -58.500 -14.500 0 ] ) +swarmbot( name "r13" pose [ -58.500 -14.250 0 ] ) +swarmbot( name "r14" pose [ -58.500 -14.000 0 ] ) +swarmbot( name "r15" pose [ -58.250 -15.000 0 ] ) +swarmbot( name "r16" pose [ -58.250 -14.750 0 ] ) +swarmbot( name "r17" pose [ -58.250 -14.500 0 ] ) +swarmbot( name "r18" pose [ -58.250 -14.250 0 ] ) +swarmbot( name "r19" pose [ -58.250 -14.000 0 ] ) +swarmbot( name "r20" pose [ -58.000 -15.000 0 ] ) +swarmbot( name "r21" pose [ -58.000 -14.750 0 ] ) +swarmbot( name "r22" pose [ -58.000 -14.500 0 ] ) +swarmbot( name "r23" pose [ -58.000 -14.250 0 ] ) +swarmbot( name "r24" pose [ -58.000 -14.000 0 ] ) +swarmbot( name "r25" pose [ -57.750 -15.000 0 ] ) +swarmbot( name "r26" pose [ -57.750 -14.750 0 ] ) +swarmbot( name "r27" pose [ -57.750 -14.500 0 ] ) +swarmbot( name "r28" pose [ -57.750 -14.250 0 ] ) +swarmbot( name "r29" pose [ -57.750 -14.000 0 ] ) +swarmbot( name "r30" pose [ -57.500 -15.000 0 ] ) +swarmbot( name "r31" pose [ -57.500 -14.750 0 ] ) +swarmbot( name "r32" pose [ -57.500 -14.500 0 ] ) +swarmbot( name "r33" pose [ -57.500 -14.250 0 ] ) +swarmbot( name "r34" pose [ -57.500 -14.000 0 ] ) +swarmbot( name "r35" pose [ -57.250 -15.000 0 ] ) +swarmbot( name "r36" pose [ -57.250 -14.750 0 ] ) +swarmbot( name "r37" pose [ -57.250 -14.500 0 ] ) +swarmbot( name "r38" pose [ -57.250 -14.250 0 ] ) +swarmbot( name "r39" pose [ -57.250 -14.000 0 ] ) +swarmbot( name "r40" pose [ -57.000 -15.000 0 ] ) +swarmbot( name "r41" pose [ -57.000 -14.750 0 ] ) +swarmbot( name "r42" pose [ -57.000 -14.500 0 ] ) +swarmbot( name "r43" pose [ -57.000 -14.250 0 ] ) +swarmbot( name "r44" pose [ -57.000 -14.000 0 ] ) +swarmbot( name "r45" pose [ -56.750 -15.000 0 ] ) +swarmbot( name "r46" pose [ -56.750 -14.750 0 ] ) +swarmbot( name "r47" pose [ -56.750 -14.500 0 ] ) +swarmbot( name "r48" pose [ -56.750 -14.250 0 ] ) +swarmbot( name "r49" pose [ -56.750 -14.000 0 ] ) +swarmbot( name "r50" pose [ -56.500 -15.000 0 ] ) +swarmbot( name "r51" pose [ -56.500 -14.750 0 ] ) +swarmbot( name "r52" pose [ -56.500 -14.500 0 ] ) +swarmbot( name "r53" pose [ -56.500 -14.250 0 ] ) +swarmbot( name "r54" pose [ -56.500 -14.000 0 ] ) +swarmbot( name "r55" pose [ -56.250 -15.000 0 ] ) +swarmbot( name "r56" pose [ -56.250 -14.750 0 ] ) +swarmbot( name "r57" pose [ -56.250 -14.500 0 ] ) +swarmbot( name "r58" pose [ -56.250 -14.250 0 ] ) +swarmbot( name "r59" pose [ -56.250 -14.000 0 ] ) +swarmbot( name "r60" pose [ -56.000 -15.000 0 ] ) +swarmbot( name "r61" pose [ -56.000 -14.750 0 ] ) +swarmbot( name "r62" pose [ -56.000 -14.500 0 ] ) +swarmbot( name "r63" pose [ -56.000 -14.250 0 ] ) +swarmbot( name "r64" pose [ -56.000 -14.000 0 ] ) +swarmbot( name "r65" pose [ -55.750 -15.000 0 ] ) +swarmbot( name "r66" pose [ -55.750 -14.750 0 ] ) +swarmbot( name "r67" pose [ -55.750 -14.500 0 ] ) +swarmbot( name "r68" pose [ -55.750 -14.250 0 ] ) +swarmbot( name "r69" pose [ -55.750 -14.000 0 ] ) +swarmbot( name "r70" pose [ -55.500 -15.000 0 ] ) +swarmbot( name "r71" pose [ -55.500 -14.750 0 ] ) +swarmbot( name "r72" pose [ -55.500 -14.500 0 ] ) +swarmbot( name "r73" pose [ -55.500 -14.250 0 ] ) +swarmbot( name "r74" pose [ -55.500 -14.000 0 ] ) +swarmbot( name "r75" pose [ -55.250 -15.000 0 ] ) +swarmbot( name "r76" pose [ -55.250 -14.750 0 ] ) +swarmbot( name "r77" pose [ -55.250 -14.500 0 ] ) +swarmbot( name "r78" pose [ -55.250 -14.250 0 ] ) +swarmbot( name "r79" pose [ -55.250 -14.000 0 ] ) +swarmbot( name "r80" pose [ -55.000 -15.000 0 ] ) +swarmbot( name "r81" pose [ -55.000 -14.750 0 ] ) +swarmbot( name "r82" pose [ -55.000 -14.500 0 ] ) +swarmbot( name "r83" pose [ -55.000 -14.250 0 ] ) +swarmbot( name "r84" pose [ -55.000 -14.000 0 ] ) +swarmbot( name "r85" pose [ -54.750 -15.000 0 ] ) +swarmbot( name "r86" pose [ -54.750 -14.750 0 ] ) +swarmbot( name "r87" pose [ -54.750 -14.500 0 ] ) +swarmbot( name "r88" pose [ -54.750 -14.250 0 ] ) +swarmbot( name "r89" pose [ -54.750 -14.000 0 ] ) +swarmbot( name "r90" pose [ -54.500 -15.000 0 ] ) +swarmbot( name "r91" pose [ -54.500 -14.750 0 ] ) +swarmbot( name "r92" pose [ -54.500 -14.500 0 ] ) +swarmbot( name "r93" pose [ -54.500 -14.250 0 ] ) +swarmbot( name "r94" pose [ -54.500 -14.000 0 ] ) +swarmbot( name "r95" pose [ -54.250 -15.000 0 ] ) +swarmbot( name "r96" pose [ -54.250 -14.750 0 ] ) +swarmbot( name "r97" pose [ -54.250 -14.500 0 ] ) +swarmbot( name "r98" pose [ -54.250 -14.250 0 ] ) +swarmbot( name "r99" pose [ -54.250 -14.000 0 ] ) +swarmbot( name "r100" pose [ -54.000 -15.000 0 ] ) +swarmbot( name "r101" pose [ -54.000 -14.750 0 ] ) +swarmbot( name "r102" pose [ -54.000 -14.500 0 ] ) +swarmbot( name "r103" pose [ -54.000 -14.250 0 ] ) +swarmbot( name "r104" pose [ -54.000 -14.000 0 ] ) +swarmbot( name "r105" pose [ -53.750 -15.000 0 ] ) +swarmbot( name "r106" pose [ -53.750 -14.750 0 ] ) +swarmbot( name "r107" pose [ -53.750 -14.500 0 ] ) +swarmbot( name "r108" pose [ -53.750 -14.250 0 ] ) +swarmbot( name "r109" pose [ -53.750 -14.000 0 ] ) +swarmbot( name "r110" pose [ -53.500 -15.000 0 ] ) +swarmbot( name "r111" pose [ -53.500 -14.750 0 ] ) +swarmbot( name "r112" pose [ -53.500 -14.500 0 ] ) +swarmbot( name "r113" pose [ -53.500 -14.250 0 ] ) +swarmbot( name "r114" pose [ -53.500 -14.000 0 ] ) +swarmbot( name "r115" pose [ -53.250 -15.000 0 ] ) +swarmbot( name "r116" pose [ -53.250 -14.750 0 ] ) +swarmbot( name "r117" pose [ -53.250 -14.500 0 ] ) +swarmbot( name "r118" pose [ -53.250 -14.250 0 ] ) +swarmbot( name "r119" pose [ -53.250 -14.000 0 ] ) +swarmbot( name "r120" pose [ -53.000 -15.000 0 ] ) +swarmbot( name "r121" pose [ -53.000 -14.750 0 ] ) +swarmbot( name "r122" pose [ -53.000 -14.500 0 ] ) +swarmbot( name "r123" pose [ -53.000 -14.250 0 ] ) +swarmbot( name "r124" pose [ -53.000 -14.000 0 ] ) +swarmbot( name "r125" pose [ -52.750 -15.000 0 ] ) +swarmbot( name "r126" pose [ -52.750 -14.750 0 ] ) +swarmbot( name "r127" pose [ -52.750 -14.500 0 ] ) +swarmbot( name "r128" pose [ -52.750 -14.250 0 ] ) +swarmbot( name "r129" pose [ -52.750 -14.000 0 ] ) +swarmbot( name "r130" pose [ -52.500 -15.000 0 ] ) +swarmbot( name "r131" pose [ -52.500 -14.750 0 ] ) +swarmbot( name "r132" pose [ -52.500 -14.500 0 ] ) +swarmbot( name "r133" pose [ -52.500 -14.250 0 ] ) +swarmbot( name "r134" pose [ -52.500 -14.000 0 ] ) +swarmbot( name "r135" pose [ -52.250 -15.000 0 ] ) +swarmbot( name "r136" pose [ -52.250 -14.750 0 ] ) +swarmbot( name "r137" pose [ -52.250 -14.500 0 ] ) +swarmbot( name "r138" pose [ -52.250 -14.250 0 ] ) +swarmbot( name "r139" pose [ -52.250 -14.000 0 ] ) +swarmbot( name "r140" pose [ -52.000 -15.000 0 ] ) +swarmbot( name "r141" pose [ -52.000 -14.750 0 ] ) +swarmbot( name "r142" pose [ -52.000 -14.500 0 ] ) +swarmbot( name "r143" pose [ -52.000 -14.250 0 ] ) +swarmbot( name "r144" pose [ -52.000 -14.000 0 ] ) +swarmbot( name "r145" pose [ -51.750 -15.000 0 ] ) +swarmbot( name "r146" pose [ -51.750 -14.750 0 ] ) +swarmbot( name "r147" pose [ -51.750 -14.500 0 ] ) +swarmbot( name "r148" pose [ -51.750 -14.250 0 ] ) +swarmbot( name "r149" pose [ -51.750 -14.000 0 ] ) +swarmbot( name "r150" pose [ -51.500 -15.000 0 ] ) +swarmbot( name "r151" pose [ -51.500 -14.750 0 ] ) +swarmbot( name "r152" pose [ -51.500 -14.500 0 ] ) +swarmbot( name "r153" pose [ -51.500 -14.250 0 ] ) +swarmbot( name "r154" pose [ -51.500 -14.000 0 ] ) +swarmbot( name "r155" pose [ -51.250 -15.000 0 ] ) +swarmbot( name "r156" pose [ -51.250 -14.750 0 ] ) +swarmbot( name "r157" pose [ -51.250 -14.500 0 ] ) +swarmbot( name "r158" pose [ -51.250 -14.250 0 ] ) +swarmbot( name "r159" pose [ -51.250 -14.000 0 ] ) +swarmbot( name "r160" pose [ -51.000 -15.000 0 ] ) +swarmbot( name "r161" pose [ -51.000 -14.750 0 ] ) +swarmbot( name "r162" pose [ -51.000 -14.500 0 ] ) +swarmbot( name "r163" pose [ -51.000 -14.250 0 ] ) +swarmbot( name "r164" pose [ -51.000 -14.000 0 ] ) +swarmbot( name "r165" pose [ -50.750 -15.000 0 ] ) +swarmbot( name "r166" pose [ -50.750 -14.750 0 ] ) +swarmbot( name "r167" pose [ -50.750 -14.500 0 ] ) +swarmbot( name "r168" pose [ -50.750 -14.250 0 ] ) +swarmbot( name "r169" pose [ -50.750 -14.000 0 ] ) +swarmbot( name "r170" pose [ -50.500 -15.000 0 ] ) +swarmbot( name "r171" pose [ -50.500 -14.750 0 ] ) +swarmbot( name "r172" pose [ -50.500 -14.500 0 ] ) +swarmbot( name "r173" pose [ -50.500 -14.250 0 ] ) +swarmbot( name "r174" pose [ -50.500 -14.000 0 ] ) +swarmbot( name "r175" pose [ -50.250 -15.000 0 ] ) +swarmbot( name "r176" pose [ -50.250 -14.750 0 ] ) +swarmbot( name "r177" pose [ -50.250 -14.500 0 ] ) +swarmbot( name "r178" pose [ -50.250 -14.250 0 ] ) +swarmbot( name "r179" pose [ -50.250 -14.000 0 ] ) +swarmbot( name "r180" pose [ -50.000 -15.000 0 ] ) +swarmbot( name "r181" pose [ -50.000 -14.750 0 ] ) +swarmbot( name "r182" pose [ -50.000 -14.500 0 ] ) +swarmbot( name "r183" pose [ -50.000 -14.250 0 ] ) +swarmbot( name "r184" pose [ -50.000 -14.000 0 ] ) +swarmbot( name "r185" pose [ -49.750 -15.000 0 ] ) +swarmbot( name "r186" pose [ -49.750 -14.750 0 ] ) +swarmbot( name "r187" pose [ -49.750 -14.500 0 ] ) +swarmbot( name "r188" pose [ -49.750 -14.250 0 ] ) +swarmbot( name "r189" pose [ -49.750 -14.000 0 ] ) +swarmbot( name "r190" pose [ -49.500 -15.000 0 ] ) +swarmbot( name "r191" pose [ -49.500 -14.750 0 ] ) +swarmbot( name "r192" pose [ -49.500 -14.500 0 ] ) +swarmbot( name "r193" pose [ -49.500 -14.250 0 ] ) +swarmbot( name "r194" pose [ -49.500 -14.000 0 ] ) +swarmbot( name "r195" pose [ -49.250 -15.000 0 ] ) +swarmbot( name "r196" pose [ -49.250 -14.750 0 ] ) +swarmbot( name "r197" pose [ -49.250 -14.500 0 ] ) +swarmbot( name "r198" pose [ -49.250 -14.250 0 ] ) +swarmbot( name "r199" pose [ -49.250 -14.000 0 ] ) +swarmbot( name "r200" pose [ -49.000 -15.000 0 ] ) +swarmbot( name "r201" pose [ -49.000 -14.750 0 ] ) +swarmbot( name "r202" pose [ -49.000 -14.500 0 ] ) +swarmbot( name "r203" pose [ -49.000 -14.250 0 ] ) +swarmbot( name "r204" pose [ -49.000 -14.000 0 ] ) +swarmbot( name "r205" pose [ -48.750 -15.000 0 ] ) +swarmbot( name "r206" pose [ -48.750 -14.750 0 ] ) +swarmbot( name "r207" pose [ -48.750 -14.500 0 ] ) +swarmbot( name "r208" pose [ -48.750 -14.250 0 ] ) +swarmbot( name "r209" pose [ -48.750 -14.000 0 ] ) +swarmbot( name "r210" pose [ -48.500 -15.000 0 ] ) +swarmbot( name "r211" pose [ -48.500 -14.750 0 ] ) +swarmbot( name "r212" pose [ -48.500 -14.500 0 ] ) +swarmbot( name "r213" pose [ -48.500 -14.250 0 ] ) +swarmbot( name "r214" pose [ -48.500 -14.000 0 ] ) +swarmbot( name "r215" pose [ -48.250 -15.000 0 ] ) +swarmbot( name "r216" pose [ -48.250 -14.750 0 ] ) +swarmbot( name "r217" pose [ -48.250 -14.500 0 ] ) +swarmbot( name "r218" pose [ -48.250 -14.250 0 ] ) +swarmbot( name "r219" pose [ -48.250 -14.000 0 ] ) +swarmbot( name "r220" pose [ -48.000 -15.000 0 ] ) +swarmbot( name "r221" pose [ -48.000 -14.750 0 ] ) +swarmbot( name "r222" pose [ -48.000 -14.500 0 ] ) +swarmbot( name "r223" pose [ -48.000 -14.250 0 ] ) +swarmbot( name "r224" pose [ -48.000 -14.000 0 ] ) +swarmbot( name "r225" pose [ -47.750 -15.000 0 ] ) +swarmbot( name "r226" pose [ -47.750 -14.750 0 ] ) +swarmbot( name "r227" pose [ -47.750 -14.500 0 ] ) +swarmbot( name "r228" pose [ -47.750 -14.250 0 ] ) +swarmbot( name "r229" pose [ -47.750 -14.000 0 ] ) +swarmbot( name "r230" pose [ -47.500 -15.000 0 ] ) +swarmbot( name "r231" pose [ -47.500 -14.750 0 ] ) +swarmbot( name "r232" pose [ -47.500 -14.500 0 ] ) +swarmbot( name "r233" pose [ -47.500 -14.250 0 ] ) +swarmbot( name "r234" pose [ -47.500 -14.000 0 ] ) +swarmbot( name "r235" pose [ -47.250 -15.000 0 ] ) +swarmbot( name "r236" pose [ -47.250 -14.750 0 ] ) +swarmbot( name "r237" pose [ -47.250 -14.500 0 ] ) +swarmbot( name "r238" pose [ -47.250 -14.250 0 ] ) +swarmbot( name "r239" pose [ -47.250 -14.000 0 ] ) +swarmbot( name "r240" pose [ -47.000 -15.000 0 ] ) +swarmbot( name "r241" pose [ -47.000 -14.750 0 ] ) +swarmbot( name "r242" pose [ -47.000 -14.500 0 ] ) +swarmbot( name "r243" pose [ -47.000 -14.250 0 ] ) +swarmbot( name "r244" pose [ -47.000 -14.000 0 ] ) +swarmbot( name "r245" pose [ -46.750 -15.000 0 ] ) +swarmbot( name "r246" pose [ -46.750 -14.750 0 ] ) +swarmbot( name "r247" pose [ -46.750 -14.500 0 ] ) +swarmbot( name "r248" pose [ -46.750 -14.250 0 ] ) +swarmbot( name "r249" pose [ -46.750 -14.000 0 ] ) +swarmbot( name "r250" pose [ -46.500 -15.000 0 ] ) +swarmbot( name "r251" pose [ -46.500 -14.750 0 ] ) +swarmbot( name "r252" pose [ -46.500 -14.500 0 ] ) +swarmbot( name "r253" pose [ -46.500 -14.250 0 ] ) +swarmbot( name "r254" pose [ -46.500 -14.000 0 ] ) +swarmbot( name "r255" pose [ -46.250 -15.000 0 ] ) +swarmbot( name "r256" pose [ -46.250 -14.750 0 ] ) +swarmbot( name "r257" pose [ -46.250 -14.500 0 ] ) +swarmbot( name "r258" pose [ -46.250 -14.250 0 ] ) +swarmbot( name "r259" pose [ -46.250 -14.000 0 ] ) +swarmbot( name "r260" pose [ -46.000 -15.000 0 ] ) +swarmbot( name "r261" pose [ -46.000 -14.750 0 ] ) +swarmbot( name "r262" pose [ -46.000 -14.500 0 ] ) +swarmbot( name "r263" pose [ -46.000 -14.250 0 ] ) +swarmbot( name "r264" pose [ -46.000 -14.000 0 ] ) +swarmbot( name "r265" pose [ -45.750 -15.000 0 ] ) +swarmbot( name "r266" pose [ -45.750 -14.750 0 ] ) +swarmbot( name "r267" pose [ -45.750 -14.500 0 ] ) +swarmbot( name "r268" pose [ -45.750 -14.250 0 ] ) +swarmbot( name "r269" pose [ -45.750 -14.000 0 ] ) +swarmbot( name "r270" pose [ -45.500 -15.000 0 ] ) +swarmbot( name "r271" pose [ -45.500 -14.750 0 ] ) +swarmbot( name "r272" pose [ -45.500 -14.500 0 ] ) +swarmbot( name "r273" pose [ -45.500 -14.250 0 ] ) +swarmbot( name "r274" pose [ -45.500 -14.000 0 ] ) +swarmbot( name "r275" pose [ -45.250 -15.000 0 ] ) +swarmbot( name "r276" pose [ -45.250 -14.750 0 ] ) +swarmbot( name "r277" pose [ -45.250 -14.500 0 ] ) +swarmbot( name "r278" pose [ -45.250 -14.250 0 ] ) +swarmbot( name "r279" pose [ -45.250 -14.000 0 ] ) +swarmbot( name "r280" pose [ -45.000 -15.000 0 ] ) +swarmbot( name "r281" pose [ -45.000 -14.750 0 ] ) +swarmbot( name "r282" pose [ -45.000 -14.500 0 ] ) +swarmbot( name "r283" pose [ -45.000 -14.250 0 ] ) +swarmbot( name "r284" pose [ -45.000 -14.000 0 ] ) +swarmbot( name "r285" pose [ -44.750 -15.000 0 ] ) +swarmbot( name "r286" pose [ -44.750 -14.750 0 ] ) +swarmbot( name "r287" pose [ -44.750 -14.500 0 ] ) +swarmbot( name "r288" pose [ -44.750 -14.250 0 ] ) +swarmbot( name "r289" pose [ -44.750 -14.000 0 ] ) +swarmbot( name "r290" pose [ -44.500 -15.000 0 ] ) +swarmbot( name "r291" pose [ -44.500 -14.750 0 ] ) +swarmbot( name "r292" pose [ -44.500 -14.500 0 ] ) +swarmbot( name "r293" pose [ -44.500 -14.250 0 ] ) +swarmbot( name "r294" pose [ -44.500 -14.000 0 ] ) +swarmbot( name "r295" pose [ -44.250 -15.000 0 ] ) +swarmbot( name "r296" pose [ -44.250 -14.750 0 ] ) +swarmbot( name "r297" pose [ -44.250 -14.500 0 ] ) +swarmbot( name "r298" pose [ -44.250 -14.250 0 ] ) +swarmbot( name "r299" pose [ -44.250 -14.000 0 ] ) +swarmbot( name "r300" pose [ -44.000 -15.000 0 ] ) +swarmbot( name "r301" pose [ -44.000 -14.750 0 ] ) +swarmbot( name "r302" pose [ -44.000 -14.500 0 ] ) +swarmbot( name "r303" pose [ -44.000 -14.250 0 ] ) +swarmbot( name "r304" pose [ -44.000 -14.000 0 ] ) +swarmbot( name "r305" pose [ -43.750 -15.000 0 ] ) +swarmbot( name "r306" pose [ -43.750 -14.750 0 ] ) +swarmbot( name "r307" pose [ -43.750 -14.500 0 ] ) +swarmbot( name "r308" pose [ -43.750 -14.250 0 ] ) +swarmbot( name "r309" pose [ -43.750 -14.000 0 ] ) +swarmbot( name "r310" pose [ -43.500 -15.000 0 ] ) +swarmbot( name "r311" pose [ -43.500 -14.750 0 ] ) +swarmbot( name "r312" pose [ -43.500 -14.500 0 ] ) +swarmbot( name "r313" pose [ -43.500 -14.250 0 ] ) +swarmbot( name "r314" pose [ -43.500 -14.000 0 ] ) +swarmbot( name "r315" pose [ -43.250 -15.000 0 ] ) +swarmbot( name "r316" pose [ -43.250 -14.750 0 ] ) +swarmbot( name "r317" pose [ -43.250 -14.500 0 ] ) +swarmbot( name "r318" pose [ -43.250 -14.250 0 ] ) +swarmbot( name "r319" pose [ -43.250 -14.000 0 ] ) +swarmbot( name "r320" pose [ -43.000 -15.000 0 ] ) +swarmbot( name "r321" pose [ -43.000 -14.750 0 ] ) +swarmbot( name "r322" pose [ -43.000 -14.500 0 ] ) +swarmbot( name "r323" pose [ -43.000 -14.250 0 ] ) +swarmbot( name "r324" pose [ -43.000 -14.000 0 ] ) +swarmbot( name "r325" pose [ -42.750 -15.000 0 ] ) +swarmbot( name "r326" pose [ -42.750 -14.750 0 ] ) +swarmbot( name "r327" pose [ -42.750 -14.500 0 ] ) +swarmbot( name "r328" pose [ -42.750 -14.250 0 ] ) +swarmbot( name "r329" pose [ -42.750 -14.000 0 ] ) +swarmbot( name "r330" pose [ -42.500 -15.000 0 ] ) +swarmbot( name "r331" pose [ -42.500 -14.750 0 ] ) +swarmbot( name "r332" pose [ -42.500 -14.500 0 ] ) +swarmbot( name "r333" pose [ -42.500 -14.250 0 ] ) +swarmbot( name "r334" pose [ -42.500 -14.000 0 ] ) +swarmbot( name "r335" pose [ -42.250 -15.000 0 ] ) +swarmbot( name "r336" pose [ -42.250 -14.750 0 ] ) +swarmbot( name "r337" pose [ -42.250 -14.500 0 ] ) +swarmbot( name "r338" pose [ -42.250 -14.250 0 ] ) +swarmbot( name "r339" pose [ -42.250 -14.000 0 ] ) +swarmbot( name "r340" pose [ -42.000 -15.000 0 ] ) +swarmbot( name "r341" pose [ -42.000 -14.750 0 ] ) +swarmbot( name "r342" pose [ -42.000 -14.500 0 ] ) +swarmbot( name "r343" pose [ -42.000 -14.250 0 ] ) +swarmbot( name "r344" pose [ -42.000 -14.000 0 ] ) +swarmbot( name "r345" pose [ -41.750 -15.000 0 ] ) +swarmbot( name "r346" pose [ -41.750 -14.750 0 ] ) +swarmbot( name "r347" pose [ -41.750 -14.500 0 ] ) +swarmbot( name "r348" pose [ -41.750 -14.250 0 ] ) +swarmbot( name "r349" pose [ -41.750 -14.000 0 ] ) +swarmbot( name "r350" pose [ -41.500 -15.000 0 ] ) +swarmbot( name "r351" pose [ -41.500 -14.750 0 ] ) +swarmbot( name "r352" pose [ -41.500 -14.500 0 ] ) +swarmbot( name "r353" pose [ -41.500 -14.250 0 ] ) +swarmbot( name "r354" pose [ -41.500 -14.000 0 ] ) +swarmbot( name "r355" pose [ -41.250 -15.000 0 ] ) +swarmbot( name "r356" pose [ -41.250 -14.750 0 ] ) +swarmbot( name "r357" pose [ -41.250 -14.500 0 ] ) +swarmbot( name "r358" pose [ -41.250 -14.250 0 ] ) +swarmbot( name "r359" pose [ -41.250 -14.000 0 ] ) +swarmbot( name "r360" pose [ -41.000 -15.000 0 ] ) +swarmbot( name "r361" pose [ -41.000 -14.750 0 ] ) +swarmbot( name "r362" pose [ -41.000 -14.500 0 ] ) +swarmbot( name "r363" pose [ -41.000 -14.250 0 ] ) +swarmbot( name "r364" pose [ -41.000 -14.000 0 ] ) +swarmbot( name "r365" pose [ -40.750 -15.000 0 ] ) +swarmbot( name "r366" pose [ -40.750 -14.750 0 ] ) +swarmbot( name "r367" pose [ -40.750 -14.500 0 ] ) +swarmbot( name "r368" pose [ -40.750 -14.250 0 ] ) +swarmbot( name "r369" pose [ -40.750 -14.000 0 ] ) +swarmbot( name "r370" pose [ -40.500 -15.000 0 ] ) +swarmbot( name "r371" pose [ -40.500 -14.750 0 ] ) +swarmbot( name "r372" pose [ -40.500 -14.500 0 ] ) +swarmbot( name "r373" pose [ -40.500 -14.250 0 ] ) +swarmbot( name "r374" pose [ -40.500 -14.000 0 ] ) +swarmbot( name "r375" pose [ -40.250 -15.000 0 ] ) +swarmbot( name "r376" pose [ -40.250 -14.750 0 ] ) +swarmbot( name "r377" pose [ -40.250 -14.500 0 ] ) +swarmbot( name "r378" pose [ -40.250 -14.250 0 ] ) +swarmbot( name "r379" pose [ -40.250 -14.000 0 ] ) +swarmbot( name "r380" pose [ -40.000 -15.000 0 ] ) +swarmbot( name "r381" pose [ -40.000 -14.750 0 ] ) +swarmbot( name "r382" pose [ -40.000 -14.500 0 ] ) +swarmbot( name "r383" pose [ -40.000 -14.250 0 ] ) +swarmbot( name "r384" pose [ -40.000 -14.000 0 ] ) +swarmbot( name "r385" pose [ -39.750 -15.000 0 ] ) +swarmbot( name "r386" pose [ -39.750 -14.750 0 ] ) +swarmbot( name "r387" pose [ -39.750 -14.500 0 ] ) +swarmbot( name "r388" pose [ -39.750 -14.250 0 ] ) +swarmbot( name "r389" pose [ -39.750 -14.000 0 ] ) +swarmbot( name "r390" pose [ -39.500 -15.000 0 ] ) +swarmbot( name "r391" pose [ -39.500 -14.750 0 ] ) +swarmbot( name "r392" pose [ -39.500 -14.500 0 ] ) +swarmbot( name "r393" pose [ -39.500 -14.250 0 ] ) +swarmbot( name "r394" pose [ -39.500 -14.000 0 ] ) +swarmbot( name "r395" pose [ -39.250 -15.000 0 ] ) +swarmbot( name "r396" pose [ -39.250 -14.750 0 ] ) +swarmbot( name "r397" pose [ -39.250 -14.500 0 ] ) +swarmbot( name "r398" pose [ -39.250 -14.250 0 ] ) +swarmbot( name "r399" pose [ -39.250 -14.000 0 ] ) +swarmbot( name "r400" pose [ -39.000 -15.000 0 ] ) +swarmbot( name "r401" pose [ -39.000 -14.750 0 ] ) +swarmbot( name "r402" pose [ -39.000 -14.500 0 ] ) +swarmbot( name "r403" pose [ -39.000 -14.250 0 ] ) +swarmbot( name "r404" pose [ -39.000 -14.000 0 ] ) +swarmbot( name "r405" pose [ -38.750 -15.000 0 ] ) +swarmbot( name "r406" pose [ -38.750 -14.750 0 ] ) +swarmbot( name "r407" pose [ -38.750 -14.500 0 ] ) +swarmbot( name "r408" pose [ -38.750 -14.250 0 ] ) +swarmbot( name "r409" pose [ -38.750 -14.000 0 ] ) +swarmbot( name "r410" pose [ -38.500 -15.000 0 ] ) +swarmbot( name "r411" pose [ -38.500 -14.750 0 ] ) +swarmbot( name "r412" pose [ -38.500 -14.500 0 ] ) +swarmbot( name "r413" pose [ -38.500 -14.250 0 ] ) +swarmbot( name "r414" pose [ -38.500 -14.000 0 ] ) +swarmbot( name "r415" pose [ -38.250 -15.000 0 ] ) +swarmbot( name "r416" pose [ -38.250 -14.750 0 ] ) +swarmbot( name "r417" pose [ -38.250 -14.500 0 ] ) +swarmbot( name "r418" pose [ -38.250 -14.250 0 ] ) +swarmbot( name "r419" pose [ -38.250 -14.000 0 ] ) +swarmbot( name "r420" pose [ -38.000 -15.000 0 ] ) +swarmbot( name "r421" pose [ -38.000 -14.750 0 ] ) +swarmbot( name "r422" pose [ -38.000 -14.500 0 ] ) +swarmbot( name "r423" pose [ -38.000 -14.250 0 ] ) +swarmbot( name "r424" pose [ -38.000 -14.000 0 ] ) +swarmbot( name "r425" pose [ -37.750 -15.000 0 ] ) +swarmbot( name "r426" pose [ -37.750 -14.750 0 ] ) +swarmbot( name "r427" pose [ -37.750 -14.500 0 ] ) +swarmbot( name "r428" pose [ -37.750 -14.250 0 ] ) +swarmbot( name "r429" pose [ -37.750 -14.000 0 ] ) +swarmbot( name "r430" pose [ -37.500 -15.000 0 ] ) +swarmbot( name "r431" pose [ -37.500 -14.750 0 ] ) +swarmbot( name "r432" pose [ -37.500 -14.500 0 ] ) +swarmbot( name "r433" pose [ -37.500 -14.250 0 ] ) +swarmbot( name "r434" pose [ -37.500 -14.000 0 ] ) +swarmbot( name "r435" pose [ -37.250 -15.000 0 ] ) +swarmbot( name "r436" pose [ -37.250 -14.750 0 ] ) +swarmbot( name "r437" pose [ -37.250 -14.500 0 ] ) +swarmbot( name "r438" pose [ -37.250 -14.250 0 ] ) +swarmbot( name "r439" pose [ -37.250 -14.000 0 ] ) +swarmbot( name "r440" pose [ -37.000 -15.000 0 ] ) +swarmbot( name "r441" pose [ -37.000 -14.750 0 ] ) +swarmbot( name "r442" pose [ -37.000 -14.500 0 ] ) +swarmbot( name "r443" pose [ -37.000 -14.250 0 ] ) +swarmbot( name "r444" pose [ -37.000 -14.000 0 ] ) +swarmbot( name "r445" pose [ -36.750 -15.000 0 ] ) +swarmbot( name "r446" pose [ -36.750 -14.750 0 ] ) +swarmbot( name "r447" pose [ -36.750 -14.500 0 ] ) +swarmbot( name "r448" pose [ -36.750 -14.250 0 ] ) +swarmbot( name "r449" pose [ -36.750 -14.000 0 ] ) +swarmbot( name "r450" pose [ -36.500 -15.000 0 ] ) +swarmbot( name "r451" pose [ -36.500 -14.750 0 ] ) +swarmbot( name "r452" pose [ -36.500 -14.500 0 ] ) +swarmbot( name "r453" pose [ -36.500 -14.250 0 ] ) +swarmbot( name "r454" pose [ -36.500 -14.000 0 ] ) +swarmbot( name "r455" pose [ -36.250 -15.000 0 ] ) +swarmbot( name "r456" pose [ -36.250 -14.750 0 ] ) +swarmbot( name "r457" pose [ -36.250 -14.500 0 ] ) +swarmbot( name "r458" pose [ -36.250 -14.250 0 ] ) +swarmbot( name "r459" pose [ -36.250 -14.000 0 ] ) +swarmbot( name "r460" pose [ -36.000 -15.000 0 ] ) +swarmbot( name "r461" pose [ -36.000 -14.750 0 ] ) +swarmbot( name "r462" pose [ -36.000 -14.500 0 ] ) +swarmbot( name "r463" pose [ -36.000 -14.250 0 ] ) +swarmbot( name "r464" pose [ -36.000 -14.000 0 ] ) +swarmbot( name "r465" pose [ -35.750 -15.000 0 ] ) +swarmbot( name "r466" pose [ -35.750 -14.750 0 ] ) +swarmbot( name "r467" pose [ -35.750 -14.500 0 ] ) +swarmbot( name "r468" pose [ -35.750 -14.250 0 ] ) +swarmbot( name "r469" pose [ -35.750 -14.000 0 ] ) +swarmbot( name "r470" pose [ -35.500 -15.000 0 ] ) +swarmbot( name "r471" pose [ -35.500 -14.750 0 ] ) +swarmbot( name "r472" pose [ -35.500 -14.500 0 ] ) +swarmbot( name "r473" pose [ -35.500 -14.250 0 ] ) +swarmbot( name "r474" pose [ -35.500 -14.000 0 ] ) +swarmbot( name "r475" pose [ -35.250 -15.000 0 ] ) +swarmbot( name "r476" pose [ -35.250 -14.750 0 ] ) +swarmbot( name "r477" pose [ -35.250 -14.500 0 ] ) +swarmbot( name "r478" pose [ -35.250 -14.250 0 ] ) +swarmbot( name "r479" pose [ -35.250 -14.000 0 ] ) +swarmbot( name "r480" pose [ -35.000 -15.000 0 ] ) +swarmbot( name "r481" pose [ -35.000 -14.750 0 ] ) +swarmbot( name "r482" pose [ -35.000 -14.500 0 ] ) +swarmbot( name "r483" pose [ -35.000 -14.250 0 ] ) +swarmbot( name "r484" pose [ -35.000 -14.000 0 ] ) +swarmbot( name "r485" pose [ -34.750 -15.000 0 ] ) +swarmbot( name "r486" pose [ -34.750 -14.750 0 ] ) +swarmbot( name "r487" pose [ -34.750 -14.500 0 ] ) +swarmbot( name "r488" pose [ -34.750 -14.250 0 ] ) +swarmbot( name "r489" pose [ -34.750 -14.000 0 ] ) +swarmbot( name "r490" pose [ -34.500 -15.000 0 ] ) +swarmbot( name "r491" pose [ -34.500 -14.750 0 ] ) +swarmbot( name "r492" pose [ -34.500 -14.500 0 ] ) +swarmbot( name "r493" pose [ -34.500 -14.250 0 ] ) +swarmbot( name "r494" pose [ -34.500 -14.000 0 ] ) +swarmbot( name "r495" pose [ -34.250 -15.000 0 ] ) +swarmbot( name "r496" pose [ -34.250 -14.750 0 ] ) +swarmbot( name "r497" pose [ -34.250 -14.500 0 ] ) +swarmbot( name "r498" pose [ -34.250 -14.250 0 ] ) +swarmbot( name "r499" pose [ -34.250 -14.000 0 ] ) +swarmbot( name "r500" pose [ -34.000 -15.000 0 ] ) +swarmbot( name "r501" pose [ -34.000 -14.750 0 ] ) +swarmbot( name "r502" pose [ -34.000 -14.500 0 ] ) +swarmbot( name "r503" pose [ -34.000 -14.250 0 ] ) +swarmbot( name "r504" pose [ -34.000 -14.000 0 ] ) +swarmbot( name "r505" pose [ -33.750 -15.000 0 ] ) +swarmbot( name "r506" pose [ -33.750 -14.750 0 ] ) +swarmbot( name "r507" pose [ -33.750 -14.500 0 ] ) +swarmbot( name "r508" pose [ -33.750 -14.250 0 ] ) +swarmbot( name "r509" pose [ -33.750 -14.000 0 ] ) +swarmbot( name "r510" pose [ -33.500 -15.000 0 ] ) +swarmbot( name "r511" pose [ -33.500 -14.750 0 ] ) +swarmbot( name "r512" pose [ -33.500 -14.500 0 ] ) +swarmbot( name "r513" pose [ -33.500 -14.250 0 ] ) +swarmbot( name "r514" pose [ -33.500 -14.000 0 ] ) +swarmbot( name "r515" pose [ -33.250 -15.000 0 ] ) +swarmbot( name "r516" pose [ -33.250 -14.750 0 ] ) +swarmbot( name "r517" pose [ -33.250 -14.500 0 ] ) +swarmbot( name "r518" pose [ -33.250 -14.250 0 ] ) +swarmbot( name "r519" pose [ -33.250 -14.000 0 ] ) +swarmbot( name "r520" pose [ -33.000 -15.000 0 ] ) +swarmbot( name "r521" pose [ -33.000 -14.750 0 ] ) +swarmbot( name "r522" pose [ -33.000 -14.500 0 ] ) +swarmbot( name "r523" pose [ -33.000 -14.250 0 ] ) +swarmbot( name "r524" pose [ -33.000 -14.000 0 ] ) +swarmbot( name "r525" pose [ -32.750 -15.000 0 ] ) +swarmbot( name "r526" pose [ -32.750 -14.750 0 ] ) +swarmbot( name "r527" pose [ -32.750 -14.500 0 ] ) +swarmbot( name "r528" pose [ -32.750 -14.250 0 ] ) +swarmbot( name "r529" pose [ -32.750 -14.000 0 ] ) +swarmbot( name "r530" pose [ -32.500 -15.000 0 ] ) +swarmbot( name "r531" pose [ -32.500 -14.750 0 ] ) +swarmbot( name "r532" pose [ -32.500 -14.500 0 ] ) +swarmbot( name "r533" pose [ -32.500 -14.250 0 ] ) +swarmbot( name "r534" pose [ -32.500 -14.000 0 ] ) +swarmbot( name "r535" pose [ -32.250 -15.000 0 ] ) +swarmbot( name "r536" pose [ -32.250 -14.750 0 ] ) +swarmbot( name "r537" pose [ -32.250 -14.500 0 ] ) +swarmbot( name "r538" pose [ -32.250 -14.250 0 ] ) +swarmbot( name "r539" pose [ -32.250 -14.000 0 ] ) +swarmbot( name "r540" pose [ -32.000 -15.000 0 ] ) +swarmbot( name "r541" pose [ -32.000 -14.750 0 ] ) +swarmbot( name "r542" pose [ -32.000 -14.500 0 ] ) +swarmbot( name "r543" pose [ -32.000 -14.250 0 ] ) +swarmbot( name "r544" pose [ -32.000 -14.000 0 ] ) +swarmbot( name "r545" pose [ -31.750 -15.000 0 ] ) +swarmbot( name "r546" pose [ -31.750 -14.750 0 ] ) +swarmbot( name "r547" pose [ -31.750 -14.500 0 ] ) +swarmbot( name "r548" pose [ -31.750 -14.250 0 ] ) +swarmbot( name "r549" pose [ -31.750 -14.000 0 ] ) +swarmbot( name "r550" pose [ -31.500 -15.000 0 ] ) +swarmbot( name "r551" pose [ -31.500 -14.750 0 ] ) +swarmbot( name "r552" pose [ -31.500 -14.500 0 ] ) +swarmbot( name "r553" pose [ -31.500 -14.250 0 ] ) +swarmbot( name "r554" pose [ -31.500 -14.000 0 ] ) +swarmbot( name "r555" pose [ -31.250 -15.000 0 ] ) +swarmbot( name "r556" pose [ -31.250 -14.750 0 ] ) +swarmbot( name "r557" pose [ -31.250 -14.500 0 ] ) +swarmbot( name "r558" pose [ -31.250 -14.250 0 ] ) +swarmbot( name "r559" pose [ -31.250 -14.000 0 ] ) +swarmbot( name "r560" pose [ -31.000 -15.000 0 ] ) +swarmbot( name "r561" pose [ -31.000 -14.750 0 ] ) +swarmbot( name "r562" pose [ -31.000 -14.500 0 ] ) +swarmbot( name "r563" pose [ -31.000 -14.250 0 ] ) +swarmbot( name "r564" pose [ -31.000 -14.000 0 ] ) +swarmbot( name "r565" pose [ -30.750 -15.000 0 ] ) +swarmbot( name "r566" pose [ -30.750 -14.750 0 ] ) +swarmbot( name "r567" pose [ -30.750 -14.500 0 ] ) +swarmbot( name "r568" pose [ -30.750 -14.250 0 ] ) +swarmbot( name "r569" pose [ -30.750 -14.000 0 ] ) +swarmbot( name "r570" pose [ -30.500 -15.000 0 ] ) +swarmbot( name "r571" pose [ -30.500 -14.750 0 ] ) +swarmbot( name "r572" pose [ -30.500 -14.500 0 ] ) +swarmbot( name "r573" pose [ -30.500 -14.250 0 ] ) +swarmbot( name "r574" pose [ -30.500 -14.000 0 ] ) +swarmbot( name "r575" pose [ -30.250 -15.000 0 ] ) +swarmbot( name "r576" pose [ -30.250 -14.750 0 ] ) +swarmbot( name "r577" pose [ -30.250 -14.500 0 ] ) +swarmbot( name "r578" pose [ -30.250 -14.250 0 ] ) +swarmbot( name "r579" pose [ -30.250 -14.000 0 ] ) +swarmbot( name "r580" pose [ -30.000 -15.000 0 ] ) +swarmbot( name "r581" pose [ -30.000 -14.750 0 ] ) +swarmbot( name "r582" pose [ -30.000 -14.500 0 ] ) +swarmbot( name "r583" pose [ -30.000 -14.250 0 ] ) +swarmbot( name "r584" pose [ -30.000 -14.000 0 ] ) +swarmbot( name "r585" pose [ -29.750 -15.000 0 ] ) +swarmbot( name "r586" pose [ -29.750 -14.750 0 ] ) +swarmbot( name "r587" pose [ -29.750 -14.500 0 ] ) +swarmbot( name "r588" pose [ -29.750 -14.250 0 ] ) +swarmbot( name "r589" pose [ -29.750 -14.000 0 ] ) +swarmbot( name "r590" pose [ -29.500 -15.000 0 ] ) +swarmbot( name "r591" pose [ -29.500 -14.750 0 ] ) +swarmbot( name "r592" pose [ -29.500 -14.500 0 ] ) +swarmbot( name "r593" pose [ -29.500 -14.250 0 ] ) +swarmbot( name "r594" pose [ -29.500 -14.000 0 ] ) +swarmbot( name "r595" pose [ -29.250 -15.000 0 ] ) +swarmbot( name "r596" pose [ -29.250 -14.750 0 ] ) +swarmbot( name "r597" pose [ -29.250 -14.500 0 ] ) +swarmbot( name "r598" pose [ -29.250 -14.250 0 ] ) +swarmbot( name "r599" pose [ -29.250 -14.000 0 ] ) +swarmbot( name "r600" pose [ -29.000 -15.000 0 ] ) +swarmbot( name "r601" pose [ -29.000 -14.750 0 ] ) +swarmbot( name "r602" pose [ -29.000 -14.500 0 ] ) +swarmbot( name "r603" pose [ -29.000 -14.250 0 ] ) +swarmbot( name "r604" pose [ -29.000 -14.000 0 ] ) +swarmbot( name "r605" pose [ -28.750 -15.000 0 ] ) +swarmbot( name "r606" pose [ -28.750 -14.750 0 ] ) +swarmbot( name "r607" pose [ -28.750 -14.500 0 ] ) +swarmbot( name "r608" pose [ -28.750 -14.250 0 ] ) +swarmbot( name "r609" pose [ -28.750 -14.000 0 ] ) +swarmbot( name "r610" pose [ -28.500 -15.000 0 ] ) +swarmbot( name "r611" pose [ -28.500 -14.750 0 ] ) +swarmbot( name "r612" pose [ -28.500 -14.500 0 ] ) +swarmbot( name "r613" pose [ -28.500 -14.250 0 ] ) +swarmbot( name "r614" pose [ -28.500 -14.000 0 ] ) +swarmbot( name "r615" pose [ -28.250 -15.000 0 ] ) +swarmbot( name "r616" pose [ -28.250 -14.750 0 ] ) +swarmbot( name "r617" pose [ -28.250 -14.500 0 ] ) +swarmbot( name "r618" pose [ -28.250 -14.250 0 ] ) +swarmbot( name "r619" pose [ -28.250 -14.000 0 ] ) +swarmbot( name "r620" pose [ -28.000 -15.000 0 ] ) +swarmbot( name "r621" pose [ -28.000 -14.750 0 ] ) +swarmbot( name "r622" pose [ -28.000 -14.500 0 ] ) +swarmbot( name "r623" pose [ -28.000 -14.250 0 ] ) +swarmbot( name "r624" pose [ -28.000 -14.000 0 ] ) +swarmbot( name "r625" pose [ -27.750 -15.000 0 ] ) +swarmbot( name "r626" pose [ -27.750 -14.750 0 ] ) +swarmbot( name "r627" pose [ -27.750 -14.500 0 ] ) +swarmbot( name "r628" pose [ -27.750 -14.250 0 ] ) +swarmbot( name "r629" pose [ -27.750 -14.000 0 ] ) +swarmbot( name "r630" pose [ -27.500 -15.000 0 ] ) +swarmbot( name "r631" pose [ -27.500 -14.750 0 ] ) +swarmbot( name "r632" pose [ -27.500 -14.500 0 ] ) +swarmbot( name "r633" pose [ -27.500 -14.250 0 ] ) +swarmbot( name "r634" pose [ -27.500 -14.000 0 ] ) +swarmbot( name "r635" pose [ -27.250 -15.000 0 ] ) +swarmbot( name "r636" pose [ -27.250 -14.750 0 ] ) +swarmbot( name "r637" pose [ -27.250 -14.500 0 ] ) +swarmbot( name "r638" pose [ -27.250 -14.250 0 ] ) +swarmbot( name "r639" pose [ -27.250 -14.000 0 ] ) +swarmbot( name "r640" pose [ -27.000 -15.000 0 ] ) +swarmbot( name "r641" pose [ -27.000 -14.750 0 ] ) +swarmbot( name "r642" pose [ -27.000 -14.500 0 ] ) +swarmbot( name "r643" pose [ -27.000 -14.250 0 ] ) +swarmbot( name "r644" pose [ -27.000 -14.000 0 ] ) +swarmbot( name "r645" pose [ -26.750 -15.000 0 ] ) +swarmbot( name "r646" pose [ -26.750 -14.750 0 ] ) +swarmbot( name "r647" pose [ -26.750 -14.500 0 ] ) +swarmbot( name "r648" pose [ -26.750 -14.250 0 ] ) +swarmbot( name "r649" pose [ -26.750 -14.000 0 ] ) +swarmbot( name "r650" pose [ -26.500 -15.000 0 ] ) +swarmbot( name "r651" pose [ -26.500 -14.750 0 ] ) +swarmbot( name "r652" pose [ -26.500 -14.500 0 ] ) +swarmbot( name "r653" pose [ -26.500 -14.250 0 ] ) +swarmbot( name "r654" pose [ -26.500 -14.000 0 ] ) +swarmbot( name "r655" pose [ -26.250 -15.000 0 ] ) +swarmbot( name "r656" pose [ -26.250 -14.750 0 ] ) +swarmbot( name "r657" pose [ -26.250 -14.500 0 ] ) +swarmbot( name "r658" pose [ -26.250 -14.250 0 ] ) +swarmbot( name "r659" pose [ -26.250 -14.000 0 ] ) +swarmbot( name "r660" pose [ -26.000 -15.000 0 ] ) +swarmbot( name "r661" pose [ -26.000 -14.750 0 ] ) +swarmbot( name "r662" pose [ -26.000 -14.500 0 ] ) +swarmbot( name "r663" pose [ -26.000 -14.250 0 ] ) +swarmbot( name "r664" pose [ -26.000 -14.000 0 ] ) +swarmbot( name "r665" pose [ -25.750 -15.000 0 ] ) +swarmbot( name "r666" pose [ -25.750 -14.750 0 ] ) +swarmbot( name "r667" pose [ -25.750 -14.500 0 ] ) +swarmbot( name "r668" pose [ -25.750 -14.250 0 ] ) +swarmbot( name "r669" pose [ -25.750 -14.000 0 ] ) +swarmbot( name "r670" pose [ -25.500 -15.000 0 ] ) +swarmbot( name "r671" pose [ -25.500 -14.750 0 ] ) +swarmbot( name "r672" pose [ -25.500 -14.500 0 ] ) +swarmbot( name "r673" pose [ -25.500 -14.250 0 ] ) +swarmbot( name "r674" pose [ -25.500 -14.000 0 ] ) +swarmbot( name "r675" pose [ -25.250 -15.000 0 ] ) +swarmbot( name "r676" pose [ -25.250 -14.750 0 ] ) +swarmbot( name "r677" pose [ -25.250 -14.500 0 ] ) +swarmbot( name "r678" pose [ -25.250 -14.250 0 ] ) +swarmbot( name "r679" pose [ -25.250 -14.000 0 ] ) +swarmbot( name "r680" pose [ -25.000 -15.000 0 ] ) +swarmbot( name "r681" pose [ -25.000 -14.750 0 ] ) +swarmbot( name "r682" pose [ -25.000 -14.500 0 ] ) +swarmbot( name "r683" pose [ -25.000 -14.250 0 ] ) +swarmbot( name "r684" pose [ -25.000 -14.000 0 ] ) +swarmbot( name "r685" pose [ -24.750 -15.000 0 ] ) +swarmbot( name "r686" pose [ -24.750 -14.750 0 ] ) +swarmbot( name "r687" pose [ -24.750 -14.500 0 ] ) +swarmbot( name "r688" pose [ -24.750 -14.250 0 ] ) +swarmbot( name "r689" pose [ -24.750 -14.000 0 ] ) +swarmbot( name "r690" pose [ -24.500 -15.000 0 ] ) +swarmbot( name "r691" pose [ -24.500 -14.750 0 ] ) +swarmbot( name "r692" pose [ -24.500 -14.500 0 ] ) +swarmbot( name "r693" pose [ -24.500 -14.250 0 ] ) +swarmbot( name "r694" pose [ -24.500 -14.000 0 ] ) +swarmbot( name "r695" pose [ -24.250 -15.000 0 ] ) +swarmbot( name "r696" pose [ -24.250 -14.750 0 ] ) +swarmbot( name "r697" pose [ -24.250 -14.500 0 ] ) +swarmbot( name "r698" pose [ -24.250 -14.250 0 ] ) +swarmbot( name "r699" pose [ -24.250 -14.000 0 ] ) +swarmbot( name "r700" pose [ -24.000 -15.000 0 ] ) +swarmbot( name "r701" pose [ -24.000 -14.750 0 ] ) +swarmbot( name "r702" pose [ -24.000 -14.500 0 ] ) +swarmbot( name "r703" pose [ -24.000 -14.250 0 ] ) +swarmbot( name "r704" pose [ -24.000 -14.000 0 ] ) +swarmbot( name "r705" pose [ -23.750 -15.000 0 ] ) +swarmbot( name "r706" pose [ -23.750 -14.750 0 ] ) +swarmbot( name "r707" pose [ -23.750 -14.500 0 ] ) +swarmbot( name "r708" pose [ -23.750 -14.250 0 ] ) +swarmbot( name "r709" pose [ -23.750 -14.000 0 ] ) +swarmbot( name "r710" pose [ -23.500 -15.000 0 ] ) +swarmbot( name "r711" pose [ -23.500 -14.750 0 ] ) +swarmbot( name "r712" pose [ -23.500 -14.500 0 ] ) +swarmbot( name "r713" pose [ -23.500 -14.250 0 ] ) +swarmbot( name "r714" pose [ -23.500 -14.000 0 ] ) +swarmbot( name "r715" pose [ -23.250 -15.000 0 ] ) +swarmbot( name "r716" pose [ -23.250 -14.750 0 ] ) +swarmbot( name "r717" pose [ -23.250 -14.500 0 ] ) +swarmbot( name "r718" pose [ -23.250 -14.250 0 ] ) +swarmbot( name "r719" pose [ -23.250 -14.000 0 ] ) +swarmbot( name "r720" pose [ -23.000 -15.000 0 ] ) +swarmbot( name "r721" pose [ -23.000 -14.750 0 ] ) +swarmbot( name "r722" pose [ -23.000 -14.500 0 ] ) +swarmbot( name "r723" pose [ -23.000 -14.250 0 ] ) +swarmbot( name "r724" pose [ -23.000 -14.000 0 ] ) +swarmbot( name "r725" pose [ -22.750 -15.000 0 ] ) +swarmbot( name "r726" pose [ -22.750 -14.750 0 ] ) +swarmbot( name "r727" pose [ -22.750 -14.500 0 ] ) +swarmbot( name "r728" pose [ -22.750 -14.250 0 ] ) +swarmbot( name "r729" pose [ -22.750 -14.000 0 ] ) +swarmbot( name "r730" pose [ -22.500 -15.000 0 ] ) +swarmbot( name "r731" pose [ -22.500 -14.750 0 ] ) +swarmbot( name "r732" pose [ -22.500 -14.500 0 ] ) +swarmbot( name "r733" pose [ -22.500 -14.250 0 ] ) +swarmbot( name "r734" pose [ -22.500 -14.000 0 ] ) +swarmbot( name "r735" pose [ -22.250 -15.000 0 ] ) +swarmbot( name "r736" pose [ -22.250 -14.750 0 ] ) +swarmbot( name "r737" pose [ -22.250 -14.500 0 ] ) +swarmbot( name "r738" pose [ -22.250 -14.250 0 ] ) +swarmbot( name "r739" pose [ -22.250 -14.000 0 ] ) +swarmbot( name "r740" pose [ -22.000 -15.000 0 ] ) +swarmbot( name "r741" pose [ -22.000 -14.750 0 ] ) +swarmbot( name "r742" pose [ -22.000 -14.500 0 ] ) +swarmbot( name "r743" pose [ -22.000 -14.250 0 ] ) +swarmbot( name "r744" pose [ -22.000 -14.000 0 ] ) +swarmbot( name "r745" pose [ -21.750 -15.000 0 ] ) +swarmbot( name "r746" pose [ -21.750 -14.750 0 ] ) +swarmbot( name "r747" pose [ -21.750 -14.500 0 ] ) +swarmbot( name "r748" pose [ -21.750 -14.250 0 ] ) +swarmbot( name "r749" pose [ -21.750 -14.000 0 ] ) +swarmbot( name "r750" pose [ -21.500 -15.000 0 ] ) +swarmbot( name "r751" pose [ -21.500 -14.750 0 ] ) +swarmbot( name "r752" pose [ -21.500 -14.500 0 ] ) +swarmbot( name "r753" pose [ -21.500 -14.250 0 ] ) +swarmbot( name "r754" pose [ -21.500 -14.000 0 ] ) +swarmbot( name "r755" pose [ -21.250 -15.000 0 ] ) +swarmbot( name "r756" pose [ -21.250 -14.750 0 ] ) +swarmbot( name "r757" pose [ -21.250 -14.500 0 ] ) +swarmbot( name "r758" pose [ -21.250 -14.250 0 ] ) +swarmbot( name "r759" pose [ -21.250 -14.000 0 ] ) +swarmbot( name "r760" pose [ -21.000 -15.000 0 ] ) +swarmbot( name "r761" pose [ -21.000 -14.750 0 ] ) +swarmbot( name "r762" pose [ -21.000 -14.500 0 ] ) +swarmbot( name "r763" pose [ -21.000 -14.250 0 ] ) +swarmbot( name "r764" pose [ -21.000 -14.000 0 ] ) +swarmbot( name "r765" pose [ -20.750 -15.000 0 ] ) +swarmbot( name "r766" pose [ -20.750 -14.750 0 ] ) +swarmbot( name "r767" pose [ -20.750 -14.500 0 ] ) +swarmbot( name "r768" pose [ -20.750 -14.250 0 ] ) +swarmbot( name "r769" pose [ -20.750 -14.000 0 ] ) +swarmbot( name "r770" pose [ -20.500 -15.000 0 ] ) +swarmbot( name "r771" pose [ -20.500 -14.750 0 ] ) +swarmbot( name "r772" pose [ -20.500 -14.500 0 ] ) +swarmbot( name "r773" pose [ -20.500 -14.250 0 ] ) +swarmbot( name "r774" pose [ -20.500 -14.000 0 ] ) +swarmbot( name "r775" pose [ -20.250 -15.000 0 ] ) +swarmbot( name "r776" pose [ -20.250 -14.750 0 ] ) +swarmbot( name "r777" pose [ -20.250 -14.500 0 ] ) +swarmbot( name "r778" pose [ -20.250 -14.250 0 ] ) +swarmbot( name "r779" pose [ -20.250 -14.000 0 ] ) +swarmbot( name "r780" pose [ -20.000 -15.000 0 ] ) +swarmbot( name "r781" pose [ -20.000 -14.750 0 ] ) +swarmbot( name "r782" pose [ -20.000 -14.500 0 ] ) +swarmbot( name "r783" pose [ -20.000 -14.250 0 ] ) +swarmbot( name "r784" pose [ -20.000 -14.000 0 ] ) +swarmbot( name "r785" pose [ -19.750 -15.000 0 ] ) +swarmbot( name "r786" pose [ -19.750 -14.750 0 ] ) +swarmbot( name "r787" pose [ -19.750 -14.500 0 ] ) +swarmbot( name "r788" pose [ -19.750 -14.250 0 ] ) +swarmbot( name "r789" pose [ -19.750 -14.000 0 ] ) +swarmbot( name "r790" pose [ -19.500 -15.000 0 ] ) +swarmbot( name "r791" pose [ -19.500 -14.750 0 ] ) +swarmbot( name "r792" pose [ -19.500 -14.500 0 ] ) +swarmbot( name "r793" pose [ -19.500 -14.250 0 ] ) +swarmbot( name "r794" pose [ -19.500 -14.000 0 ] ) +swarmbot( name "r795" pose [ -19.250 -15.000 0 ] ) +swarmbot( name "r796" pose [ -19.250 -14.750 0 ] ) +swarmbot( name "r797" pose [ -19.250 -14.500 0 ] ) +swarmbot( name "r798" pose [ -19.250 -14.250 0 ] ) +swarmbot( name "r799" pose [ -19.250 -14.000 0 ] ) +swarmbot( name "r800" pose [ -19.000 -15.000 0 ] ) +swarmbot( name "r801" pose [ -19.000 -14.750 0 ] ) +swarmbot( name "r802" pose [ -19.000 -14.500 0 ] ) +swarmbot( name "r803" pose [ -19.000 -14.250 0 ] ) +swarmbot( name "r804" pose [ -19.000 -14.000 0 ] ) +swarmbot( name "r805" pose [ -18.750 -15.000 0 ] ) +swarmbot( name "r806" pose [ -18.750 -14.750 0 ] ) +swarmbot( name "r807" pose [ -18.750 -14.500 0 ] ) +swarmbot( name "r808" pose [ -18.750 -14.250 0 ] ) +swarmbot( name "r809" pose [ -18.750 -14.000 0 ] ) +swarmbot( name "r810" pose [ -18.500 -15.000 0 ] ) +swarmbot( name "r811" pose [ -18.500 -14.750 0 ] ) +swarmbot( name "r812" pose [ -18.500 -14.500 0 ] ) +swarmbot( name "r813" pose [ -18.500 -14.250 0 ] ) +swarmbot( name "r814" pose [ -18.500 -14.000 0 ] ) +swarmbot( name "r815" pose [ -18.250 -15.000 0 ] ) +swarmbot( name "r816" pose [ -18.250 -14.750 0 ] ) +swarmbot( name "r817" pose [ -18.250 -14.500 0 ] ) +swarmbot( name "r818" pose [ -18.250 -14.250 0 ] ) +swarmbot( name "r819" pose [ -18.250 -14.000 0 ] ) +swarmbot( name "r820" pose [ -18.000 -15.000 0 ] ) +swarmbot( name "r821" pose [ -18.000 -14.750 0 ] ) +swarmbot( name "r822" pose [ -18.000 -14.500 0 ] ) +swarmbot( name "r823" pose [ -18.000 -14.250 0 ] ) +swarmbot( name "r824" pose [ -18.000 -14.000 0 ] ) +swarmbot( name "r825" pose [ -17.750 -15.000 0 ] ) +swarmbot( name "r826" pose [ -17.750 -14.750 0 ] ) +swarmbot( name "r827" pose [ -17.750 -14.500 0 ] ) +swarmbot( name "r828" pose [ -17.750 -14.250 0 ] ) +swarmbot( name "r829" pose [ -17.750 -14.000 0 ] ) +swarmbot( name "r830" pose [ -17.500 -15.000 0 ] ) +swarmbot( name "r831" pose [ -17.500 -14.750 0 ] ) +swarmbot( name "r832" pose [ -17.500 -14.500 0 ] ) +swarmbot( name "r833" pose [ -17.500 -14.250 0 ] ) +swarmbot( name "r834" pose [ -17.500 -14.000 0 ] ) +swarmbot( name "r835" pose [ -17.250 -15.000 0 ] ) +swarmbot( name "r836" pose [ -17.250 -14.750 0 ] ) +swarmbot( name "r837" pose [ -17.250 -14.500 0 ] ) +swarmbot( name "r838" pose [ -17.250 -14.250 0 ] ) +swarmbot( name "r839" pose [ -17.250 -14.000 0 ] ) +swarmbot( name "r840" pose [ -17.000 -15.000 0 ] ) +swarmbot( name "r841" pose [ -17.000 -14.750 0 ] ) +swarmbot( name "r842" pose [ -17.000 -14.500 0 ] ) +swarmbot( name "r843" pose [ -17.000 -14.250 0 ] ) +swarmbot( name "r844" pose [ -17.000 -14.000 0 ] ) +swarmbot( name "r845" pose [ -16.750 -15.000 0 ] ) +swarmbot( name "r846" pose [ -16.750 -14.750 0 ] ) +swarmbot( name "r847" pose [ -16.750 -14.500 0 ] ) +swarmbot( name "r848" pose [ -16.750 -14.250 0 ] ) +swarmbot( name "r849" pose [ -16.750 -14.000 0 ] ) +swarmbot( name "r850" pose [ -16.500 -15.000 0 ] ) +swarmbot( name "r851" pose [ -16.500 -14.750 0 ] ) +swarmbot( name "r852" pose [ -16.500 -14.500 0 ] ) +swarmbot( name "r853" pose [ -16.500 -14.250 0 ] ) +swarmbot( name "r854" pose [ -16.500 -14.000 0 ] ) +swarmbot( name "r855" pose [ -16.250 -15.000 0 ] ) +swarmbot( name "r856" pose [ -16.250 -14.750 0 ] ) +swarmbot( name "r857" pose [ -16.250 -14.500 0 ] ) +swarmbot( name "r858" pose [ -16.250 -14.250 0 ] ) +swarmbot( name "r859" pose [ -16.250 -14.000 0 ] ) +swarmbot( name "r860" pose [ -16.000 -15.000 0 ] ) +swarmbot( name "r861" pose [ -16.000 -14.750 0 ] ) +swarmbot( name "r862" pose [ -16.000 -14.500 0 ] ) +swarmbot( name "r863" pose [ -16.000 -14.250 0 ] ) +swarmbot( name "r864" pose [ -16.000 -14.000 0 ] ) +swarmbot( name "r865" pose [ -15.750 -15.000 0 ] ) +swarmbot( name "r866" pose [ -15.750 -14.750 0 ] ) +swarmbot( name "r867" pose [ -15.750 -14.500 0 ] ) +swarmbot( name "r868" pose [ -15.750 -14.250 0 ] ) +swarmbot( name "r869" pose [ -15.750 -14.000 0 ] ) +swarmbot( name "r870" pose [ -15.500 -15.000 0 ] ) +swarmbot( name "r871" pose [ -15.500 -14.750 0 ] ) +swarmbot( name "r872" pose [ -15.500 -14.500 0 ] ) +swarmbot( name "r873" pose [ -15.500 -14.250 0 ] ) +swarmbot( name "r874" pose [ -15.500 -14.000 0 ] ) +swarmbot( name "r875" pose [ -15.250 -15.000 0 ] ) +swarmbot( name "r876" pose [ -15.250 -14.750 0 ] ) +swarmbot( name "r877" pose [ -15.250 -14.500 0 ] ) +swarmbot( name "r878" pose [ -15.250 -14.250 0 ] ) +swarmbot( name "r879" pose [ -15.250 -14.000 0 ] ) +swarmbot( name "r880" pose [ -15.000 -15.000 0 ] ) +swarmbot( name "r881" pose [ -15.000 -14.750 0 ] ) +swarmbot( name "r882" pose [ -15.000 -14.500 0 ] ) +swarmbot( name "r883" pose [ -15.000 -14.250 0 ] ) +swarmbot( name "r884" pose [ -15.000 -14.000 0 ] ) +swarmbot( name "r885" pose [ -14.750 -15.000 0 ] ) +swarmbot( name "r886" pose [ -14.750 -14.750 0 ] ) +swarmbot( name "r887" pose [ -14.750 -14.500 0 ] ) +swarmbot( name "r888" pose [ -14.750 -14.250 0 ] ) +swarmbot( name "r889" pose [ -14.750 -14.000 0 ] ) +swarmbot( name "r890" pose [ -14.500 -15.000 0 ] ) +swarmbot( name "r891" pose [ -14.500 -14.750 0 ] ) +swarmbot( name "r892" pose [ -14.500 -14.500 0 ] ) +swarmbot( name "r893" pose [ -14.500 -14.250 0 ] ) +swarmbot( name "r894" pose [ -14.500 -14.000 0 ] ) +swarmbot( name "r895" pose [ -14.250 -15.000 0 ] ) +swarmbot( name "r896" pose [ -14.250 -14.750 0 ] ) +swarmbot( name "r897" pose [ -14.250 -14.500 0 ] ) +swarmbot( name "r898" pose [ -14.250 -14.250 0 ] ) +swarmbot( name "r899" pose [ -14.250 -14.000 0 ] ) +swarmbot( name "r900" pose [ -14.000 -15.000 0 ] ) +swarmbot( name "r901" pose [ -14.000 -14.750 0 ] ) +swarmbot( name "r902" pose [ -14.000 -14.500 0 ] ) +swarmbot( name "r903" pose [ -14.000 -14.250 0 ] ) +swarmbot( name "r904" pose [ -14.000 -14.000 0 ] ) +swarmbot( name "r905" pose [ -13.750 -15.000 0 ] ) +swarmbot( name "r906" pose [ -13.750 -14.750 0 ] ) +swarmbot( name "r907" pose [ -13.750 -14.500 0 ] ) +swarmbot( name "r908" pose [ -13.750 -14.250 0 ] ) +swarmbot( name "r909" pose [ -13.750 -14.000 0 ] ) +swarmbot( name "r910" pose [ -13.500 -15.000 0 ] ) +swarmbot( name "r911" pose [ -13.500 -14.750 0 ] ) +swarmbot( name "r912" pose [ -13.500 -14.500 0 ] ) +swarmbot( name "r913" pose [ -13.500 -14.250 0 ] ) +swarmbot( name "r914" pose [ -13.500 -14.000 0 ] ) +swarmbot( name "r915" pose [ -13.250 -15.000 0 ] ) +swarmbot( name "r916" pose [ -13.250 -14.750 0 ] ) +swarmbot( name "r917" pose [ -13.250 -14.500 0 ] ) +swarmbot( name "r918" pose [ -13.250 -14.250 0 ] ) +swarmbot( name "r919" pose [ -13.250 -14.000 0 ] ) +swarmbot( name "r920" pose [ -13.000 -15.000 0 ] ) +swarmbot( name "r921" pose [ -13.000 -14.750 0 ] ) +swarmbot( name "r922" pose [ -13.000 -14.500 0 ] ) +swarmbot( name "r923" pose [ -13.000 -14.250 0 ] ) +swarmbot( name "r924" pose [ -13.000 -14.000 0 ] ) +swarmbot( name "r925" pose [ -12.750 -15.000 0 ] ) +swarmbot( name "r926" pose [ -12.750 -14.750 0 ] ) +swarmbot( name "r927" pose [ -12.750 -14.500 0 ] ) +swarmbot( name "r928" pose [ -12.750 -14.250 0 ] ) +swarmbot( name "r929" pose [ -12.750 -14.000 0 ] ) +swarmbot( name "r930" pose [ -12.500 -15.000 0 ] ) +swarmbot( name "r931" pose [ -12.500 -14.750 0 ] ) +swarmbot( name "r932" pose [ -12.500 -14.500 0 ] ) +swarmbot( name "r933" pose [ -12.500 -14.250 0 ] ) +swarmbot( name "r934" pose [ -12.500 -14.000 0 ] ) +swarmbot( name "r935" pose [ -12.250 -15.000 0 ] ) +swarmbot( name "r936" pose [ -12.250 -14.750 0 ] ) +swarmbot( name "r937" pose [ -12.250 -14.500 0 ] ) +swarmbot( name "r938" pose [ -12.250 -14.250 0 ] ) +swarmbot( name "r939" pose [ -12.250 -14.000 0 ] ) +swarmbot( name "r940" pose [ -12.000 -15.000 0 ] ) +swarmbot( name "r941" pose [ -12.000 -14.750 0 ] ) +swarmbot( name "r942" pose [ -12.000 -14.500 0 ] ) +swarmbot( name "r943" pose [ -12.000 -14.250 0 ] ) +swarmbot( name "r944" pose [ -12.000 -14.000 0 ] ) +swarmbot( name "r945" pose [ -11.750 -15.000 0 ] ) +swarmbot( name "r946" pose [ -11.750 -14.750 0 ] ) +swarmbot( name "r947" pose [ -11.750 -14.500 0 ] ) +swarmbot( name "r948" pose [ -11.750 -14.250 0 ] ) +swarmbot( name "r949" pose [ -11.750 -14.000 0 ] ) +swarmbot( name "r950" pose [ -11.500 -15.000 0 ] ) +swarmbot( name "r951" pose [ -11.500 -14.750 0 ] ) +swarmbot( name "r952" pose [ -11.500 -14.500 0 ] ) +swarmbot( name "r953" pose [ -11.500 -14.250 0 ] ) +swarmbot( name "r954" pose [ -11.500 -14.000 0 ] ) +swarmbot( name "r955" pose [ -11.250 -15.000 0 ] ) +swarmbot( name "r956" pose [ -11.250 -14.750 0 ] ) +swarmbot( name "r957" pose [ -11.250 -14.500 0 ] ) +swarmbot( name "r958" pose [ -11.250 -14.250 0 ] ) +swarmbot( name "r959" pose [ -11.250 -14.000 0 ] ) +swarmbot( name "r960" pose [ -11.000 -15.000 0 ] ) +swarmbot( name "r961" pose [ -11.000 -14.750 0 ] ) +swarmbot( name "r962" pose [ -11.000 -14.500 0 ] ) +swarmbot( name "r963" pose [ -11.000 -14.250 0 ] ) +swarmbot( name "r964" pose [ -11.000 -14.000 0 ] ) +swarmbot( name "r965" pose [ -10.750 -15.000 0 ] ) +swarmbot( name "r966" pose [ -10.750 -14.750 0 ] ) +swarmbot( name "r967" pose [ -10.750 -14.500 0 ] ) +swarmbot( name "r968" pose [ -10.750 -14.250 0 ] ) +swarmbot( name "r969" pose [ -10.750 -14.000 0 ] ) +swarmbot( name "r970" pose [ -10.500 -15.000 0 ] ) +swarmbot( name "r971" pose [ -10.500 -14.750 0 ] ) +swarmbot( name "r972" pose [ -10.500 -14.500 0 ] ) +swarmbot( name "r973" pose [ -10.500 -14.250 0 ] ) +swarmbot( name "r974" pose [ -10.500 -14.000 0 ] ) +swarmbot( name "r975" pose [ -10.250 -15.000 0 ] ) +swarmbot( name "r976" pose [ -10.250 -14.750 0 ] ) +swarmbot( name "r977" pose [ -10.250 -14.500 0 ] ) +swarmbot( name "r978" pose [ -10.250 -14.250 0 ] ) +swarmbot( name "r979" pose [ -10.250 -14.000 0 ] ) +swarmbot( name "r980" pose [ -10.000 -15.000 0 ] ) +swarmbot( name "r981" pose [ -10.000 -14.750 0 ] ) +swarmbot( name "r982" pose [ -10.000 -14.500 0 ] ) +swarmbot( name "r983" pose [ -10.000 -14.250 0 ] ) +swarmbot( name "r984" pose [ -10.000 -14.000 0 ] ) +swarmbot( name "r985" pose [ -9.750 -15.000 0 ] ) +swarmbot( name "r986" pose [ -9.750 -14.750 0 ] ) +swarmbot( name "r987" pose [ -9.750 -14.500 0 ] ) +swarmbot( name "r988" pose [ -9.750 -14.250 0 ] ) +swarmbot( name "r989" pose [ -9.750 -14.000 0 ] ) +swarmbot( name "r990" pose [ -9.500 -15.000 0 ] ) +swarmbot( name "r991" pose [ -9.500 -14.750 0 ] ) +swarmbot( name "r992" pose [ -9.500 -14.500 0 ] ) +swarmbot( name "r993" pose [ -9.500 -14.250 0 ] ) +swarmbot( name "r994" pose [ -9.500 -14.000 0 ] ) +swarmbot( name "r995" pose [ -9.250 -15.000 0 ] ) +swarmbot( name "r996" pose [ -9.250 -14.750 0 ] ) +swarmbot( name "r997" pose [ -9.250 -14.500 0 ] ) +swarmbot( name "r998" pose [ -9.250 -14.250 0 ] ) +swarmbot( name "r999" pose [ -9.250 -14.000 0 ] ) + +swarmbot( name "r1000" pose [ 0 -15.000 0 ] ) +swarmbot( name "r1001" pose [ 0 -14.750 0 ] ) +swarmbot( name "r1002" pose [ 0 -14.500 0 ] ) +swarmbot( name "r1003" pose [ 0 -14.250 0 ] ) +swarmbot( name "r1004" pose [ 0 -14.000 0 ] ) +swarmbot( name "r1005" pose [ .250 -15.000 0 ] ) +swarmbot( name "r1006" pose [ .250 -14.750 0 ] ) +swarmbot( name "r1007" pose [ .250 -14.500 0 ] ) +swarmbot( name "r1008" pose [ .250 -14.250 0 ] ) +swarmbot( name "r1009" pose [ .250 -14.000 0 ] ) +swarmbot( name "r1010" pose [ .500 -15.000 0 ] ) +swarmbot( name "r1011" pose [ .500 -14.750 0 ] ) +swarmbot( name "r1012" pose [ .500 -14.500 0 ] ) +swarmbot( name "r1013" pose [ .500 -14.250 0 ] ) +swarmbot( name "r1014" pose [ .500 -14.000 0 ] ) +swarmbot( name "r1015" pose [ .750 -15.000 0 ] ) +swarmbot( name "r1016" pose [ .750 -14.750 0 ] ) +swarmbot( name "r1017" pose [ .750 -14.500 0 ] ) +swarmbot( name "r1018" pose [ .750 -14.250 0 ] ) +swarmbot( name "r1019" pose [ .750 -14.000 0 ] ) +swarmbot( name "r1020" pose [ 1.000 -15.000 0 ] ) +swarmbot( name "r1021" pose [ 1.000 -14.750 0 ] ) +swarmbot( name "r1022" pose [ 1.000 -14.500 0 ] ) +swarmbot( name "r1023" pose [ 1.000 -14.250 0 ] ) +swarmbot( name "r1024" pose [ 1.000 -14.000 0 ] ) +swarmbot( name "r1025" pose [ 1.250 -15.000 0 ] ) +swarmbot( name "r1026" pose [ 1.250 -14.750 0 ] ) +swarmbot( name "r1027" pose [ 1.250 -14.500 0 ] ) +swarmbot( name "r1028" pose [ 1.250 -14.250 0 ] ) +swarmbot( name "r1029" pose [ 1.250 -14.000 0 ] ) +swarmbot( name "r1030" pose [ 1.500 -15.000 0 ] ) +swarmbot( name "r1031" pose [ 1.500 -14.750 0 ] ) +swarmbot( name "r1032" pose [ 1.500 -14.500 0 ] ) +swarmbot( name "r1033" pose [ 1.500 -14.250 0 ] ) +swarmbot( name "r1034" pose [ 1.500 -14.000 0 ] ) +swarmbot( name "r1035" pose [ 1.750 -15.000 0 ] ) +swarmbot( name "r1036" pose [ 1.750 -14.750 0 ] ) +swarmbot( name "r1037" pose [ 1.750 -14.500 0 ] ) +swarmbot( name "r1038" pose [ 1.750 -14.250 0 ] ) +swarmbot( name "r1039" pose [ 1.750 -14.000 0 ] ) +swarmbot( name "r1040" pose [ 2.000 -15.000 0 ] ) +swarmbot( name "r1041" pose [ 2.000 -14.750 0 ] ) +swarmbot( name "r1042" pose [ 2.000 -14.500 0 ] ) +swarmbot( name "r1043" pose [ 2.000 -14.250 0 ] ) +swarmbot( name "r1044" pose [ 2.000 -14.000 0 ] ) +swarmbot( name "r1045" pose [ 2.250 -15.000 0 ] ) +swarmbot( name "r1046" pose [ 2.250 -14.750 0 ] ) +swarmbot( name "r1047" pose [ 2.250 -14.500 0 ] ) +swarmbot( name "r1048" pose [ 2.250 -14.250 0 ] ) +swarmbot( name "r1049" pose [ 2.250 -14.000 0 ] ) +swarmbot( name "r1050" pose [ 2.500 -15.000 0 ] ) +swarmbot( name "r1051" pose [ 2.500 -14.750 0 ] ) +swarmbot( name "r1052" pose [ 2.500 -14.500 0 ] ) +swarmbot( name "r1053" pose [ 2.500 -14.250 0 ] ) +swarmbot( name "r1054" pose [ 2.500 -14.000 0 ] ) +swarmbot( name "r1055" pose [ 2.750 -15.000 0 ] ) +swarmbot( name "r1056" pose [ 2.750 -14.750 0 ] ) +swarmbot( name "r1057" pose [ 2.750 -14.500 0 ] ) +swarmbot( name "r1058" pose [ 2.750 -14.250 0 ] ) +swarmbot( name "r1059" pose [ 2.750 -14.000 0 ] ) +swarmbot( name "r1060" pose [ 3.000 -15.000 0 ] ) +swarmbot( name "r1061" pose [ 3.000 -14.750 0 ] ) +swarmbot( name "r1062" pose [ 3.000 -14.500 0 ] ) +swarmbot( name "r1063" pose [ 3.000 -14.250 0 ] ) +swarmbot( name "r1064" pose [ 3.000 -14.000 0 ] ) +swarmbot( name "r1065" pose [ 3.250 -15.000 0 ] ) +swarmbot( name "r1066" pose [ 3.250 -14.750 0 ] ) +swarmbot( name "r1067" pose [ 3.250 -14.500 0 ] ) +swarmbot( name "r1068" pose [ 3.250 -14.250 0 ] ) +swarmbot( name "r1069" pose [ 3.250 -14.000 0 ] ) +swarmbot( name "r1070" pose [ 3.500 -15.000 0 ] ) +swarmbot( name "r1071" pose [ 3.500 -14.750 0 ] ) +swarmbot( name "r1072" pose [ 3.500 -14.500 0 ] ) +swarmbot( name "r1073" pose [ 3.500 -14.250 0 ] ) +swarmbot( name "r1074" pose [ 3.500 -14.000 0 ] ) +swarmbot( name "r1075" pose [ 3.750 -15.000 0 ] ) +swarmbot( name "r1076" pose [ 3.750 -14.750 0 ] ) +swarmbot( name "r1077" pose [ 3.750 -14.500 0 ] ) +swarmbot( name "r1078" pose [ 3.750 -14.250 0 ] ) +swarmbot( name "r1079" pose [ 3.750 -14.000 0 ] ) +swarmbot( name "r1080" pose [ 4.000 -15.000 0 ] ) +swarmbot( name "r1081" pose [ 4.000 -14.750 0 ] ) +swarmbot( name "r1082" pose [ 4.000 -14.500 0 ] ) +swarmbot( name "r1083" pose [ 4.000 -14.250 0 ] ) +swarmbot( name "r1084" pose [ 4.000 -14.000 0 ] ) +swarmbot( name "r1085" pose [ 4.250 -15.000 0 ] ) +swarmbot( name "r1086" pose [ 4.250 -14.750 0 ] ) +swarmbot( name "r1087" pose [ 4.250 -14.500 0 ] ) +swarmbot( name "r1088" pose [ 4.250 -14.250 0 ] ) +swarmbot( name "r1089" pose [ 4.250 -14.000 0 ] ) +swarmbot( name "r1090" pose [ 4.500 -15.000 0 ] ) +swarmbot( name "r1091" pose [ 4.500 -14.750 0 ] ) +swarmbot( name "r1092" pose [ 4.500 -14.500 0 ] ) +swarmbot( name "r1093" pose [ 4.500 -14.250 0 ] ) +swarmbot( name "r1094" pose [ 4.500 -14.000 0 ] ) +swarmbot( name "r1095" pose [ 4.750 -15.000 0 ] ) +swarmbot( name "r1096" pose [ 4.750 -14.750 0 ] ) +swarmbot( name "r1097" pose [ 4.750 -14.500 0 ] ) +swarmbot( name "r1098" pose [ 4.750 -14.250 0 ] ) +swarmbot( name "r1099" pose [ 4.750 -14.000 0 ] ) +swarmbot( name "r1100" pose [ 5.000 -15.000 0 ] ) +swarmbot( name "r1101" pose [ 5.000 -14.750 0 ] ) +swarmbot( name "r1102" pose [ 5.000 -14.500 0 ] ) +swarmbot( name "r1103" pose [ 5.000 -14.250 0 ] ) +swarmbot( name "r1104" pose [ 5.000 -14.000 0 ] ) +swarmbot( name "r1105" pose [ 5.250 -15.000 0 ] ) +swarmbot( name "r1106" pose [ 5.250 -14.750 0 ] ) +swarmbot( name "r1107" pose [ 5.250 -14.500 0 ] ) +swarmbot( name "r1108" pose [ 5.250 -14.250 0 ] ) +swarmbot( name "r1109" pose [ 5.250 -14.000 0 ] ) +swarmbot( name "r1110" pose [ 5.500 -15.000 0 ] ) +swarmbot( name "r1111" pose [ 5.500 -14.750 0 ] ) +swarmbot( name "r1112" pose [ 5.500 -14.500 0 ] ) +swarmbot( name "r1113" pose [ 5.500 -14.250 0 ] ) +swarmbot( name "r1114" pose [ 5.500 -14.000 0 ] ) +swarmbot( name "r1115" pose [ 5.750 -15.000 0 ] ) +swarmbot( name "r1116" pose [ 5.750 -14.750 0 ] ) +swarmbot( name "r1117" pose [ 5.750 -14.500 0 ] ) +swarmbot( name "r1118" pose [ 5.750 -14.250 0 ] ) +swarmbot( name "r1119" pose [ 5.750 -14.000 0 ] ) +swarmbot( name "r1120" pose [ 6.000 -15.000 0 ] ) +swarmbot( name "r1121" pose [ 6.000 -14.750 0 ] ) +swarmbot( name "r1122" pose [ 6.000 -14.500 0 ] ) +swarmbot( name "r1123" pose [ 6.000 -14.250 0 ] ) +swarmbot( name "r1124" pose [ 6.000 -14.000 0 ] ) +swarmbot( name "r1125" pose [ 6.250 -15.000 0 ] ) +swarmbot( name "r1126" pose [ 6.250 -14.750 0 ] ) +swarmbot( name "r1127" pose [ 6.250 -14.500 0 ] ) +swarmbot( name "r1128" pose [ 6.250 -14.250 0 ] ) +swarmbot( name "r1129" pose [ 6.250 -14.000 0 ] ) +swarmbot( name "r1130" pose [ 6.500 -15.000 0 ] ) +swarmbot( name "r1131" pose [ 6.500 -14.750 0 ] ) +swarmbot( name "r1132" pose [ 6.500 -14.500 0 ] ) +swarmbot( name "r1133" pose [ 6.500 -14.250 0 ] ) +swarmbot( name "r1134" pose [ 6.500 -14.000 0 ] ) +swarmbot( name "r1135" pose [ 6.750 -15.000 0 ] ) +swarmbot( name "r1136" pose [ 6.750 -14.750 0 ] ) +swarmbot( name "r1137" pose [ 6.750 -14.500 0 ] ) +swarmbot( name "r1138" pose [ 6.750 -14.250 0 ] ) +swarmbot( name "r1139" pose [ 6.750 -14.000 0 ] ) +swarmbot( name "r1140" pose [ 7.000 -15.000 0 ] ) +swarmbot( name "r1141" pose [ 7.000 -14.750 0 ] ) +swarmbot( name "r1142" pose [ 7.000 -14.500 0 ] ) +swarmbot( name "r1143" pose [ 7.000 -14.250 0 ] ) +swarmbot( name "r1144" pose [ 7.000 -14.000 0 ] ) +swarmbot( name "r1145" pose [ 7.250 -15.000 0 ] ) +swarmbot( name "r1146" pose [ 7.250 -14.750 0 ] ) +swarmbot( name "r1147" pose [ 7.250 -14.500 0 ] ) +swarmbot( name "r1148" pose [ 7.250 -14.250 0 ] ) +swarmbot( name "r1149" pose [ 7.250 -14.000 0 ] ) +swarmbot( name "r1150" pose [ 7.500 -15.000 0 ] ) +swarmbot( name "r1151" pose [ 7.500 -14.750 0 ] ) +swarmbot( name "r1152" pose [ 7.500 -14.500 0 ] ) +swarmbot( name "r1153" pose [ 7.500 -14.250 0 ] ) +swarmbot( name "r1154" pose [ 7.500 -14.000 0 ] ) +swarmbot( name "r1155" pose [ 7.750 -15.000 0 ] ) +swarmbot( name "r1156" pose [ 7.750 -14.750 0 ] ) +swarmbot( name "r1157" pose [ 7.750 -14.500 0 ] ) +swarmbot( name "r1158" pose [ 7.750 -14.250 0 ] ) +swarmbot( name "r1159" pose [ 7.750 -14.000 0 ] ) +swarmbot( name "r1160" pose [ 8.000 -15.000 0 ] ) +swarmbot( name "r1161" pose [ 8.000 -14.750 0 ] ) +swarmbot( name "r1162" pose [ 8.000 -14.500 0 ] ) +swarmbot( name "r1163" pose [ 8.000 -14.250 0 ] ) +swarmbot( name "r1164" pose [ 8.000 -14.000 0 ] ) +swarmbot( name "r1165" pose [ 8.250 -15.000 0 ] ) +swarmbot( name "r1166" pose [ 8.250 -14.750 0 ] ) +swarmbot( name "r1167" pose [ 8.250 -14.500 0 ] ) +swarmbot( name "r1168" pose [ 8.250 -14.250 0 ] ) +swarmbot( name "r1169" pose [ 8.250 -14.000 0 ] ) +swarmbot( name "r1170" pose [ 8.500 -15.000 0 ] ) +swarmbot( name "r1171" pose [ 8.500 -14.750 0 ] ) +swarmbot( name "r1172" pose [ 8.500 -14.500 0 ] ) +swarmbot( name "r1173" pose [ 8.500 -14.250 0 ] ) +swarmbot( name "r1174" pose [ 8.500 -14.000 0 ] ) +swarmbot( name "r1175" pose [ 8.750 -15.000 0 ] ) +swarmbot( name "r1176" pose [ 8.750 -14.750 0 ] ) +swarmbot( name "r1177" pose [ 8.750 -14.500 0 ] ) +swarmbot( name "r1178" pose [ 8.750 -14.250 0 ] ) +swarmbot( name "r1179" pose [ 8.750 -14.000 0 ] ) +swarmbot( name "r1180" pose [ 9.000 -15.000 0 ] ) +swarmbot( name "r1181" pose [ 9.000 -14.750 0 ] ) +swarmbot( name "r1182" pose [ 9.000 -14.500 0 ] ) +swarmbot( name "r1183" pose [ 9.000 -14.250 0 ] ) +swarmbot( name "r1184" pose [ 9.000 -14.000 0 ] ) +swarmbot( name "r1185" pose [ 9.250 -15.000 0 ] ) +swarmbot( name "r1186" pose [ 9.250 -14.750 0 ] ) +swarmbot( name "r1187" pose [ 9.250 -14.500 0 ] ) +swarmbot( name "r1188" pose [ 9.250 -14.250 0 ] ) +swarmbot( name "r1189" pose [ 9.250 -14.000 0 ] ) +swarmbot( name "r1190" pose [ 9.500 -15.000 0 ] ) +swarmbot( name "r1191" pose [ 9.500 -14.750 0 ] ) +swarmbot( name "r1192" pose [ 9.500 -14.500 0 ] ) +swarmbot( name "r1193" pose [ 9.500 -14.250 0 ] ) +swarmbot( name "r1194" pose [ 9.500 -14.000 0 ] ) +swarmbot( name "r1195" pose [ 9.750 -15.000 0 ] ) +swarmbot( name "r1196" pose [ 9.750 -14.750 0 ] ) +swarmbot( name "r1197" pose [ 9.750 -14.500 0 ] ) +swarmbot( name "r1198" pose [ 9.750 -14.250 0 ] ) +swarmbot( name "r1199" pose [ 9.750 -14.000 0 ] ) +swarmbot( name "r1200" pose [ 10.000 -15.000 0 ] ) +swarmbot( name "r1201" pose [ 10.000 -14.750 0 ] ) +swarmbot( name "r1202" pose [ 10.000 -14.500 0 ] ) +swarmbot( name "r1203" pose [ 10.000 -14.250 0 ] ) +swarmbot( name "r1204" pose [ 10.000 -14.000 0 ] ) +swarmbot( name "r1205" pose [ 10.250 -15.000 0 ] ) +swarmbot( name "r1206" pose [ 10.250 -14.750 0 ] ) +swarmbot( name "r1207" pose [ 10.250 -14.500 0 ] ) +swarmbot( name "r1208" pose [ 10.250 -14.250 0 ] ) +swarmbot( name "r1209" pose [ 10.250 -14.000 0 ] ) +swarmbot( name "r1210" pose [ 10.500 -15.000 0 ] ) +swarmbot( name "r1211" pose [ 10.500 -14.750 0 ] ) +swarmbot( name "r1212" pose [ 10.500 -14.500 0 ] ) +swarmbot( name "r1213" pose [ 10.500 -14.250 0 ] ) +swarmbot( name "r1214" pose [ 10.500 -14.000 0 ] ) +swarmbot( name "r1215" pose [ 10.750 -15.000 0 ] ) +swarmbot( name "r1216" pose [ 10.750 -14.750 0 ] ) +swarmbot( name "r1217" pose [ 10.750 -14.500 0 ] ) +swarmbot( name "r1218" pose [ 10.750 -14.250 0 ] ) +swarmbot( name "r1219" pose [ 10.750 -14.000 0 ] ) +swarmbot( name "r1220" pose [ 11.000 -15.000 0 ] ) +swarmbot( name "r1221" pose [ 11.000 -14.750 0 ] ) +swarmbot( name "r1222" pose [ 11.000 -14.500 0 ] ) +swarmbot( name "r1223" pose [ 11.000 -14.250 0 ] ) +swarmbot( name "r1224" pose [ 11.000 -14.000 0 ] ) +swarmbot( name "r1225" pose [ 11.250 -15.000 0 ] ) +swarmbot( name "r1226" pose [ 11.250 -14.750 0 ] ) +swarmbot( name "r1227" pose [ 11.250 -14.500 0 ] ) +swarmbot( name "r1228" pose [ 11.250 -14.250 0 ] ) +swarmbot( name "r1229" pose [ 11.250 -14.000 0 ] ) +swarmbot( name "r1230" pose [ 11.500 -15.000 0 ] ) +swarmbot( name "r1231" pose [ 11.500 -14.750 0 ] ) +swarmbot( name "r1232" pose [ 11.500 -14.500 0 ] ) +swarmbot( name "r1233" pose [ 11.500 -14.250 0 ] ) +swarmbot( name "r1234" pose [ 11.500 -14.000 0 ] ) +swarmbot( name "r1235" pose [ 11.750 -15.000 0 ] ) +swarmbot( name "r1236" pose [ 11.750 -14.750 0 ] ) +swarmbot( name "r1237" pose [ 11.750 -14.500 0 ] ) +swarmbot( name "r1238" pose [ 11.750 -14.250 0 ] ) +swarmbot( name "r1239" pose [ 11.750 -14.000 0 ] ) +swarmbot( name "r1240" pose [ 12.000 -15.000 0 ] ) +swarmbot( name "r1241" pose [ 12.000 -14.750 0 ] ) +swarmbot( name "r1242" pose [ 12.000 -14.500 0 ] ) +swarmbot( name "r1243" pose [ 12.000 -14.250 0 ] ) +swarmbot( name "r1244" pose [ 12.000 -14.000 0 ] ) +swarmbot( name "r1245" pose [ 12.250 -15.000 0 ] ) +swarmbot( name "r1246" pose [ 12.250 -14.750 0 ] ) +swarmbot( name "r1247" pose [ 12.250 -14.500 0 ] ) +swarmbot( name "r1248" pose [ 12.250 -14.250 0 ] ) +swarmbot( name "r1249" pose [ 12.250 -14.000 0 ] ) +swarmbot( name "r1250" pose [ 12.500 -15.000 0 ] ) +swarmbot( name "r1251" pose [ 12.500 -14.750 0 ] ) +swarmbot( name "r1252" pose [ 12.500 -14.500 0 ] ) +swarmbot( name "r1253" pose [ 12.500 -14.250 0 ] ) +swarmbot( name "r1254" pose [ 12.500 -14.000 0 ] ) +swarmbot( name "r1255" pose [ 12.750 -15.000 0 ] ) +swarmbot( name "r1256" pose [ 12.750 -14.750 0 ] ) +swarmbot( name "r1257" pose [ 12.750 -14.500 0 ] ) +swarmbot( name "r1258" pose [ 12.750 -14.250 0 ] ) +swarmbot( name "r1259" pose [ 12.750 -14.000 0 ] ) +swarmbot( name "r1260" pose [ 13.000 -15.000 0 ] ) +swarmbot( name "r1261" pose [ 13.000 -14.750 0 ] ) +swarmbot( name "r1262" pose [ 13.000 -14.500 0 ] ) +swarmbot( name "r1263" pose [ 13.000 -14.250 0 ] ) +swarmbot( name "r1264" pose [ 13.000 -14.000 0 ] ) +swarmbot( name "r1265" pose [ 13.250 -15.000 0 ] ) +swarmbot( name "r1266" pose [ 13.250 -14.750 0 ] ) +swarmbot( name "r1267" pose [ 13.250 -14.500 0 ] ) +swarmbot( name "r1268" pose [ 13.250 -14.250 0 ] ) +swarmbot( name "r1269" pose [ 13.250 -14.000 0 ] ) +swarmbot( name "r1270" pose [ 13.500 -15.000 0 ] ) +swarmbot( name "r1271" pose [ 13.500 -14.750 0 ] ) +swarmbot( name "r1272" pose [ 13.500 -14.500 0 ] ) +swarmbot( name "r1273" pose [ 13.500 -14.250 0 ] ) +swarmbot( name "r1274" pose [ 13.500 -14.000 0 ] ) +swarmbot( name "r1275" pose [ 13.750 -15.000 0 ] ) +swarmbot( name "r1276" pose [ 13.750 -14.750 0 ] ) +swarmbot( name "r1277" pose [ 13.750 -14.500 0 ] ) +swarmbot( name "r1278" pose [ 13.750 -14.250 0 ] ) +swarmbot( name "r1279" pose [ 13.750 -14.000 0 ] ) +swarmbot( name "r1280" pose [ 14.000 -15.000 0 ] ) +swarmbot( name "r1281" pose [ 14.000 -14.750 0 ] ) +swarmbot( name "r1282" pose [ 14.000 -14.500 0 ] ) +swarmbot( name "r1283" pose [ 14.000 -14.250 0 ] ) +swarmbot( name "r1284" pose [ 14.000 -14.000 0 ] ) +swarmbot( name "r1285" pose [ 14.250 -15.000 0 ] ) +swarmbot( name "r1286" pose [ 14.250 -14.750 0 ] ) +swarmbot( name "r1287" pose [ 14.250 -14.500 0 ] ) +swarmbot( name "r1288" pose [ 14.250 -14.250 0 ] ) +swarmbot( name "r1289" pose [ 14.250 -14.000 0 ] ) +swarmbot( name "r1290" pose [ 14.500 -15.000 0 ] ) +swarmbot( name "r1291" pose [ 14.500 -14.750 0 ] ) +swarmbot( name "r1292" pose [ 14.500 -14.500 0 ] ) +swarmbot( name "r1293" pose [ 14.500 -14.250 0 ] ) +swarmbot( name "r1294" pose [ 14.500 -14.000 0 ] ) +swarmbot( name "r1295" pose [ 14.750 -15.000 0 ] ) +swarmbot( name "r1296" pose [ 14.750 -14.750 0 ] ) +swarmbot( name "r1297" pose [ 14.750 -14.500 0 ] ) +swarmbot( name "r1298" pose [ 14.750 -14.250 0 ] ) +swarmbot( name "r1299" pose [ 14.750 -14.000 0 ] ) +swarmbot( name "r1300" pose [ 15.000 -15.000 0 ] ) +swarmbot( name "r1301" pose [ 15.000 -14.750 0 ] ) +swarmbot( name "r1302" pose [ 15.000 -14.500 0 ] ) +swarmbot( name "r1303" pose [ 15.000 -14.250 0 ] ) +swarmbot( name "r1304" pose [ 15.000 -14.000 0 ] ) +swarmbot( name "r1305" pose [ 15.250 -15.000 0 ] ) +swarmbot( name "r1306" pose [ 15.250 -14.750 0 ] ) +swarmbot( name "r1307" pose [ 15.250 -14.500 0 ] ) +swarmbot( name "r1308" pose [ 15.250 -14.250 0 ] ) +swarmbot( name "r1309" pose [ 15.250 -14.000 0 ] ) +swarmbot( name "r1310" pose [ 15.500 -15.000 0 ] ) +swarmbot( name "r1311" pose [ 15.500 -14.750 0 ] ) +swarmbot( name "r1312" pose [ 15.500 -14.500 0 ] ) +swarmbot( name "r1313" pose [ 15.500 -14.250 0 ] ) +swarmbot( name "r1314" pose [ 15.500 -14.000 0 ] ) +swarmbot( name "r1315" pose [ 15.750 -15.000 0 ] ) +swarmbot( name "r1316" pose [ 15.750 -14.750 0 ] ) +swarmbot( name "r1317" pose [ 15.750 -14.500 0 ] ) +swarmbot( name "r1318" pose [ 15.750 -14.250 0 ] ) +swarmbot( name "r1319" pose [ 15.750 -14.000 0 ] ) +swarmbot( name "r1320" pose [ 16.000 -15.000 0 ] ) +swarmbot( name "r1321" pose [ 16.000 -14.750 0 ] ) +swarmbot( name "r1322" pose [ 16.000 -14.500 0 ] ) +swarmbot( name "r1323" pose [ 16.000 -14.250 0 ] ) +swarmbot( name "r1324" pose [ 16.000 -14.000 0 ] ) +swarmbot( name "r1325" pose [ 16.250 -15.000 0 ] ) +swarmbot( name "r1326" pose [ 16.250 -14.750 0 ] ) +swarmbot( name "r1327" pose [ 16.250 -14.500 0 ] ) +swarmbot( name "r1328" pose [ 16.250 -14.250 0 ] ) +swarmbot( name "r1329" pose [ 16.250 -14.000 0 ] ) +swarmbot( name "r1330" pose [ 16.500 -15.000 0 ] ) +swarmbot( name "r1331" pose [ 16.500 -14.750 0 ] ) +swarmbot( name "r1332" pose [ 16.500 -14.500 0 ] ) +swarmbot( name "r1333" pose [ 16.500 -14.250 0 ] ) +swarmbot( name "r1334" pose [ 16.500 -14.000 0 ] ) +swarmbot( name "r1335" pose [ 16.750 -15.000 0 ] ) +swarmbot( name "r1336" pose [ 16.750 -14.750 0 ] ) +swarmbot( name "r1337" pose [ 16.750 -14.500 0 ] ) +swarmbot( name "r1338" pose [ 16.750 -14.250 0 ] ) +swarmbot( name "r1339" pose [ 16.750 -14.000 0 ] ) +swarmbot( name "r1340" pose [ 17.000 -15.000 0 ] ) +swarmbot( name "r1341" pose [ 17.000 -14.750 0 ] ) +swarmbot( name "r1342" pose [ 17.000 -14.500 0 ] ) +swarmbot( name "r1343" pose [ 17.000 -14.250 0 ] ) +swarmbot( name "r1344" pose [ 17.000 -14.000 0 ] ) +swarmbot( name "r1345" pose [ 17.250 -15.000 0 ] ) +swarmbot( name "r1346" pose [ 17.250 -14.750 0 ] ) +swarmbot( name "r1347" pose [ 17.250 -14.500 0 ] ) +swarmbot( name "r1348" pose [ 17.250 -14.250 0 ] ) +swarmbot( name "r1349" pose [ 17.250 -14.000 0 ] ) +swarmbot( name "r1350" pose [ 17.500 -15.000 0 ] ) +swarmbot( name "r1351" pose [ 17.500 -14.750 0 ] ) +swarmbot( name "r1352" pose [ 17.500 -14.500 0 ] ) +swarmbot( name "r1353" pose [ 17.500 -14.250 0 ] ) +swarmbot( name "r1354" pose [ 17.500 -14.000 0 ] ) +swarmbot( name "r1355" pose [ 17.750 -15.000 0 ] ) +swarmbot( name "r1356" pose [ 17.750 -14.750 0 ] ) +swarmbot( name "r1357" pose [ 17.750 -14.500 0 ] ) +swarmbot( name "r1358" pose [ 17.750 -14.250 0 ] ) +swarmbot( name "r1359" pose [ 17.750 -14.000 0 ] ) +swarmbot( name "r1360" pose [ 18.000 -15.000 0 ] ) +swarmbot( name "r1361" pose [ 18.000 -14.750 0 ] ) +swarmbot( name "r1362" pose [ 18.000 -14.500 0 ] ) +swarmbot( name "r1363" pose [ 18.000 -14.250 0 ] ) +swarmbot( name "r1364" pose [ 18.000 -14.000 0 ] ) +swarmbot( name "r1365" pose [ 18.250 -15.000 0 ] ) +swarmbot( name "r1366" pose [ 18.250 -14.750 0 ] ) +swarmbot( name "r1367" pose [ 18.250 -14.500 0 ] ) +swarmbot( name "r1368" pose [ 18.250 -14.250 0 ] ) +swarmbot( name "r1369" pose [ 18.250 -14.000 0 ] ) +swarmbot( name "r1370" pose [ 18.500 -15.000 0 ] ) +swarmbot( name "r1371" pose [ 18.500 -14.750 0 ] ) +swarmbot( name "r1372" pose [ 18.500 -14.500 0 ] ) +swarmbot( name "r1373" pose [ 18.500 -14.250 0 ] ) +swarmbot( name "r1374" pose [ 18.500 -14.000 0 ] ) +swarmbot( name "r1375" pose [ 18.750 -15.000 0 ] ) +swarmbot( name "r1376" pose [ 18.750 -14.750 0 ] ) +swarmbot( name "r1377" pose [ 18.750 -14.500 0 ] ) +swarmbot( name "r1378" pose [ 18.750 -14.250 0 ] ) +swarmbot( name "r1379" pose [ 18.750 -14.000 0 ] ) +swarmbot( name "r1380" pose [ 19.000 -15.000 0 ] ) +swarmbot( name "r1381" pose [ 19.000 -14.750 0 ] ) +swarmbot( name "r1382" pose [ 19.000 -14.500 0 ] ) +swarmbot( name "r1383" pose [ 19.000 -14.250 0 ] ) +swarmbot( name "r1384" pose [ 19.000 -14.000 0 ] ) +swarmbot( name "r1385" pose [ 19.250 -15.000 0 ] ) +swarmbot( name "r1386" pose [ 19.250 -14.750 0 ] ) +swarmbot( name "r1387" pose [ 19.250 -14.500 0 ] ) +swarmbot( name "r1388" pose [ 19.250 -14.250 0 ] ) +swarmbot( name "r1389" pose [ 19.250 -14.000 0 ] ) +swarmbot( name "r1390" pose [ 19.500 -15.000 0 ] ) +swarmbot( name "r1391" pose [ 19.500 -14.750 0 ] ) +swarmbot( name "r1392" pose [ 19.500 -14.500 0 ] ) +swarmbot( name "r1393" pose [ 19.500 -14.250 0 ] ) +swarmbot( name "r1394" pose [ 19.500 -14.000 0 ] ) +swarmbot( name "r1395" pose [ 19.750 -15.000 0 ] ) +swarmbot( name "r1396" pose [ 19.750 -14.750 0 ] ) +swarmbot( name "r1397" pose [ 19.750 -14.500 0 ] ) +swarmbot( name "r1398" pose [ 19.750 -14.250 0 ] ) +swarmbot( name "r1399" pose [ 19.750 -14.000 0 ] ) +swarmbot( name "r1400" pose [ 20.000 -15.000 0 ] ) +swarmbot( name "r1401" pose [ 20.000 -14.750 0 ] ) +swarmbot( name "r1402" pose [ 20.000 -14.500 0 ] ) +swarmbot( name "r1403" pose [ 20.000 -14.250 0 ] ) +swarmbot( name "r1404" pose [ 20.000 -14.000 0 ] ) +swarmbot( name "r1405" pose [ 20.250 -15.000 0 ] ) +swarmbot( name "r1406" pose [ 20.250 -14.750 0 ] ) +swarmbot( name "r1407" pose [ 20.250 -14.500 0 ] ) +swarmbot( name "r1408" pose [ 20.250 -14.250 0 ] ) +swarmbot( name "r1409" pose [ 20.250 -14.000 0 ] ) +swarmbot( name "r1410" pose [ 20.500 -15.000 0 ] ) +swarmbot( name "r1411" pose [ 20.500 -14.750 0 ] ) +swarmbot( name "r1412" pose [ 20.500 -14.500 0 ] ) +swarmbot( name "r1413" pose [ 20.500 -14.250 0 ] ) +swarmbot( name "r1414" pose [ 20.500 -14.000 0 ] ) +swarmbot( name "r1415" pose [ 20.750 -15.000 0 ] ) +swarmbot( name "r1416" pose [ 20.750 -14.750 0 ] ) +swarmbot( name "r1417" pose [ 20.750 -14.500 0 ] ) +swarmbot( name "r1418" pose [ 20.750 -14.250 0 ] ) +swarmbot( name "r1419" pose [ 20.750 -14.000 0 ] ) +swarmbot( name "r1420" pose [ 21.000 -15.000 0 ] ) +swarmbot( name "r1421" pose [ 21.000 -14.750 0 ] ) +swarmbot( name "r1422" pose [ 21.000 -14.500 0 ] ) +swarmbot( name "r1423" pose [ 21.000 -14.250 0 ] ) +swarmbot( name "r1424" pose [ 21.000 -14.000 0 ] ) +swarmbot( name "r1425" pose [ 21.250 -15.000 0 ] ) +swarmbot( name "r1426" pose [ 21.250 -14.750 0 ] ) +swarmbot( name "r1427" pose [ 21.250 -14.500 0 ] ) +swarmbot( name "r1428" pose [ 21.250 -14.250 0 ] ) +swarmbot( name "r1429" pose [ 21.250 -14.000 0 ] ) +swarmbot( name "r1430" pose [ 21.500 -15.000 0 ] ) +swarmbot( name "r1431" pose [ 21.500 -14.750 0 ] ) +swarmbot( name "r1432" pose [ 21.500 -14.500 0 ] ) +swarmbot( name "r1433" pose [ 21.500 -14.250 0 ] ) +swarmbot( name "r1434" pose [ 21.500 -14.000 0 ] ) +swarmbot( name "r1435" pose [ 21.750 -15.000 0 ] ) +swarmbot( name "r1436" pose [ 21.750 -14.750 0 ] ) +swarmbot( name "r1437" pose [ 21.750 -14.500 0 ] ) +swarmbot( name "r1438" pose [ 21.750 -14.250 0 ] ) +swarmbot( name "r1439" pose [ 21.750 -14.000 0 ] ) +swarmbot( name "r1440" pose [ 22.000 -15.000 0 ] ) +swarmbot( name "r1441" pose [ 22.000 -14.750 0 ] ) +swarmbot( name "r1442" pose [ 22.000 -14.500 0 ] ) +swarmbot( name "r1443" pose [ 22.000 -14.250 0 ] ) +swarmbot( name "r1444" pose [ 22.000 -14.000 0 ] ) +swarmbot( name "r1445" pose [ 22.250 -15.000 0 ] ) +swarmbot( name "r1446" pose [ 22.250 -14.750 0 ] ) +swarmbot( name "r1447" pose [ 22.250 -14.500 0 ] ) +swarmbot( name "r1448" pose [ 22.250 -14.250 0 ] ) +swarmbot( name "r1449" pose [ 22.250 -14.000 0 ] ) +swarmbot( name "r1450" pose [ 22.500 -15.000 0 ] ) +swarmbot( name "r1451" pose [ 22.500 -14.750 0 ] ) +swarmbot( name "r1452" pose [ 22.500 -14.500 0 ] ) +swarmbot( name "r1453" pose [ 22.500 -14.250 0 ] ) +swarmbot( name "r1454" pose [ 22.500 -14.000 0 ] ) +swarmbot( name "r1455" pose [ 22.750 -15.000 0 ] ) +swarmbot( name "r1456" pose [ 22.750 -14.750 0 ] ) +swarmbot( name "r1457" pose [ 22.750 -14.500 0 ] ) +swarmbot( name "r1458" pose [ 22.750 -14.250 0 ] ) +swarmbot( name "r1459" pose [ 22.750 -14.000 0 ] ) +swarmbot( name "r1460" pose [ 23.000 -15.000 0 ] ) +swarmbot( name "r1461" pose [ 23.000 -14.750 0 ] ) +swarmbot( name "r1462" pose [ 23.000 -14.500 0 ] ) +swarmbot( name "r1463" pose [ 23.000 -14.250 0 ] ) +swarmbot( name "r1464" pose [ 23.000 -14.000 0 ] ) +swarmbot( name "r1465" pose [ 23.250 -15.000 0 ] ) +swarmbot( name "r1466" pose [ 23.250 -14.750 0 ] ) +swarmbot( name "r1467" pose [ 23.250 -14.500 0 ] ) +swarmbot( name "r1468" pose [ 23.250 -14.250 0 ] ) +swarmbot( name "r1469" pose [ 23.250 -14.000 0 ] ) +swarmbot( name "r1470" pose [ 23.500 -15.000 0 ] ) +swarmbot( name "r1471" pose [ 23.500 -14.750 0 ] ) +swarmbot( name "r1472" pose [ 23.500 -14.500 0 ] ) +swarmbot( name "r1473" pose [ 23.500 -14.250 0 ] ) +swarmbot( name "r1474" pose [ 23.500 -14.000 0 ] ) +swarmbot( name "r1475" pose [ 23.750 -15.000 0 ] ) +swarmbot( name "r1476" pose [ 23.750 -14.750 0 ] ) +swarmbot( name "r1477" pose [ 23.750 -14.500 0 ] ) +swarmbot( name "r1478" pose [ 23.750 -14.250 0 ] ) +swarmbot( name "r1479" pose [ 23.750 -14.000 0 ] ) +swarmbot( name "r1480" pose [ 24.000 -15.000 0 ] ) +swarmbot( name "r1481" pose [ 24.000 -14.750 0 ] ) +swarmbot( name "r1482" pose [ 24.000 -14.500 0 ] ) +swarmbot( name "r1483" pose [ 24.000 -14.250 0 ] ) +swarmbot( name "r1484" pose [ 24.000 -14.000 0 ] ) +swarmbot( name "r1485" pose [ 24.250 -15.000 0 ] ) +swarmbot( name "r1486" pose [ 24.250 -14.750 0 ] ) +swarmbot( name "r1487" pose [ 24.250 -14.500 0 ] ) +swarmbot( name "r1488" pose [ 24.250 -14.250 0 ] ) +swarmbot( name "r1489" pose [ 24.250 -14.000 0 ] ) +swarmbot( name "r1490" pose [ 24.500 -15.000 0 ] ) +swarmbot( name "r1491" pose [ 24.500 -14.750 0 ] ) +swarmbot( name "r1492" pose [ 24.500 -14.500 0 ] ) +swarmbot( name "r1493" pose [ 24.500 -14.250 0 ] ) +swarmbot( name "r1494" pose [ 24.500 -14.000 0 ] ) +swarmbot( name "r1495" pose [ 24.750 -15.000 0 ] ) +swarmbot( name "r1496" pose [ 24.750 -14.750 0 ] ) +swarmbot( name "r1497" pose [ 24.750 -14.500 0 ] ) +swarmbot( name "r1498" pose [ 24.750 -14.250 0 ] ) +swarmbot( name "r1499" pose [ 24.750 -14.000 0 ] ) +swarmbot( name "r1500" pose [ 25.000 -15.000 0 ] ) +swarmbot( name "r1501" pose [ 25.000 -14.750 0 ] ) +swarmbot( name "r1502" pose [ 25.000 -14.500 0 ] ) +swarmbot( name "r1503" pose [ 25.000 -14.250 0 ] ) +swarmbot( name "r1504" pose [ 25.000 -14.000 0 ] ) +swarmbot( name "r1505" pose [ 25.250 -15.000 0 ] ) +swarmbot( name "r1506" pose [ 25.250 -14.750 0 ] ) +swarmbot( name "r1507" pose [ 25.250 -14.500 0 ] ) +swarmbot( name "r1508" pose [ 25.250 -14.250 0 ] ) +swarmbot( name "r1509" pose [ 25.250 -14.000 0 ] ) +swarmbot( name "r1510" pose [ 25.500 -15.000 0 ] ) +swarmbot( name "r1511" pose [ 25.500 -14.750 0 ] ) +swarmbot( name "r1512" pose [ 25.500 -14.500 0 ] ) +swarmbot( name "r1513" pose [ 25.500 -14.250 0 ] ) +swarmbot( name "r1514" pose [ 25.500 -14.000 0 ] ) +swarmbot( name "r1515" pose [ 25.750 -15.000 0 ] ) +swarmbot( name "r1516" pose [ 25.750 -14.750 0 ] ) +swarmbot( name "r1517" pose [ 25.750 -14.500 0 ] ) +swarmbot( name "r1518" pose [ 25.750 -14.250 0 ] ) +swarmbot( name "r1519" pose [ 25.750 -14.000 0 ] ) +swarmbot( name "r1520" pose [ 26.000 -15.000 0 ] ) +swarmbot( name "r1521" pose [ 26.000 -14.750 0 ] ) +swarmbot( name "r1522" pose [ 26.000 -14.500 0 ] ) +swarmbot( name "r1523" pose [ 26.000 -14.250 0 ] ) +swarmbot( name "r1524" pose [ 26.000 -14.000 0 ] ) +swarmbot( name "r1525" pose [ 26.250 -15.000 0 ] ) +swarmbot( name "r1526" pose [ 26.250 -14.750 0 ] ) +swarmbot( name "r1527" pose [ 26.250 -14.500 0 ] ) +swarmbot( name "r1528" pose [ 26.250 -14.250 0 ] ) +swarmbot( name "r1529" pose [ 26.250 -14.000 0 ] ) +swarmbot( name "r1530" pose [ 26.500 -15.000 0 ] ) +swarmbot( name "r1531" pose [ 26.500 -14.750 0 ] ) +swarmbot( name "r1532" pose [ 26.500 -14.500 0 ] ) +swarmbot( name "r1533" pose [ 26.500 -14.250 0 ] ) +swarmbot( name "r1534" pose [ 26.500 -14.000 0 ] ) +swarmbot( name "r1535" pose [ 26.750 -15.000 0 ] ) +swarmbot( name "r1536" pose [ 26.750 -14.750 0 ] ) +swarmbot( name "r1537" pose [ 26.750 -14.500 0 ] ) +swarmbot( name "r1538" pose [ 26.750 -14.250 0 ] ) +swarmbot( name "r1539" pose [ 26.750 -14.000 0 ] ) +swarmbot( name "r1540" pose [ 27.000 -15.000 0 ] ) +swarmbot( name "r1541" pose [ 27.000 -14.750 0 ] ) +swarmbot( name "r1542" pose [ 27.000 -14.500 0 ] ) +swarmbot( name "r1543" pose [ 27.000 -14.250 0 ] ) +swarmbot( name "r1544" pose [ 27.000 -14.000 0 ] ) +swarmbot( name "r1545" pose [ 27.250 -15.000 0 ] ) +swarmbot( name "r1546" pose [ 27.250 -14.750 0 ] ) +swarmbot( name "r1547" pose [ 27.250 -14.500 0 ] ) +swarmbot( name "r1548" pose [ 27.250 -14.250 0 ] ) +swarmbot( name "r1549" pose [ 27.250 -14.000 0 ] ) +swarmbot( name "r1550" pose [ 27.500 -15.000 0 ] ) +swarmbot( name "r1551" pose [ 27.500 -14.750 0 ] ) +swarmbot( name "r1552" pose [ 27.500 -14.500 0 ] ) +swarmbot( name "r1553" pose [ 27.500 -14.250 0 ] ) +swarmbot( name "r1554" pose [ 27.500 -14.000 0 ] ) +swarmbot( name "r1555" pose [ 27.750 -15.000 0 ] ) +swarmbot( name "r1556" pose [ 27.750 -14.750 0 ] ) +swarmbot( name "r1557" pose [ 27.750 -14.500 0 ] ) +swarmbot( name "r1558" pose [ 27.750 -14.250 0 ] ) +swarmbot( name "r1559" pose [ 27.750 -14.000 0 ] ) +swarmbot( name "r1560" pose [ 28.000 -15.000 0 ] ) +swarmbot( name "r1561" pose [ 28.000 -14.750 0 ] ) +swarmbot( name "r1562" pose [ 28.000 -14.500 0 ] ) +swarmbot( name "r1563" pose [ 28.000 -14.250 0 ] ) +swarmbot( name "r1564" pose [ 28.000 -14.000 0 ] ) +swarmbot( name "r1565" pose [ 28.250 -15.000 0 ] ) +swarmbot( name "r1566" pose [ 28.250 -14.750 0 ] ) +swarmbot( name "r1567" pose [ 28.250 -14.500 0 ] ) +swarmbot( name "r1568" pose [ 28.250 -14.250 0 ] ) +swarmbot( name "r1569" pose [ 28.250 -14.000 0 ] ) +swarmbot( name "r1570" pose [ 28.500 -15.000 0 ] ) +swarmbot( name "r1571" pose [ 28.500 -14.750 0 ] ) +swarmbot( name "r1572" pose [ 28.500 -14.500 0 ] ) +swarmbot( name "r1573" pose [ 28.500 -14.250 0 ] ) +swarmbot( name "r1574" pose [ 28.500 -14.000 0 ] ) +swarmbot( name "r1575" pose [ 28.750 -15.000 0 ] ) +swarmbot( name "r1576" pose [ 28.750 -14.750 0 ] ) +swarmbot( name "r1577" pose [ 28.750 -14.500 0 ] ) +swarmbot( name "r1578" pose [ 28.750 -14.250 0 ] ) +swarmbot( name "r1579" pose [ 28.750 -14.000 0 ] ) +swarmbot( name "r1580" pose [ 29.000 -15.000 0 ] ) +swarmbot( name "r1581" pose [ 29.000 -14.750 0 ] ) +swarmbot( name "r1582" pose [ 29.000 -14.500 0 ] ) +swarmbot( name "r1583" pose [ 29.000 -14.250 0 ] ) +swarmbot( name "r1584" pose [ 29.000 -14.000 0 ] ) @@ Diff output truncated at 100000 characters. @@ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <alexcb@us...> - 2008-07-04 17:31:07
|
Revision: 6769 http://playerstage.svn.sourceforge.net/playerstage/?rev=6769&view=rev Author: alexcb Date: 2008-07-04 17:31:17 -0700 (Fri, 04 Jul 2008) Log Message: ----------- white floor when grid is disabled Modified Paths: -------------- code/stage/trunk/libstage/canvas.cc Modified: code/stage/trunk/libstage/canvas.cc =================================================================== --- code/stage/trunk/libstage/canvas.cc 2008-07-05 00:10:12 UTC (rev 6768) +++ code/stage/trunk/libstage/canvas.cc 2008-07-05 00:31:17 UTC (rev 6769) @@ -484,7 +484,11 @@ { stg_bounds3d_t bounds = world->GetExtent(); float z = 0; - glColor3f( 0.6, 0.6, 1.0 ); + + glEnable(GL_POLYGON_OFFSET_FILL); + glPolygonOffset(2.0, 2.0); + + glColor4f( 1.0, 1.0, 1.0, 1.0 ); glBegin(GL_QUADS); glVertex3f( bounds.x.min, bounds.y.min, z ); glVertex3f( bounds.x.max, bounds.y.min, z ); @@ -561,6 +565,8 @@ if( showGrid ) DrawGlobalGrid(); + else + DrawFloor(); if( showTree || showOccupancy ) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <alexcb@us...> - 2008-07-04 17:10:04
|
Revision: 6768 http://playerstage.svn.sourceforge.net/playerstage/?rev=6768&view=rev Author: alexcb Date: 2008-07-04 17:10:12 -0700 (Fri, 04 Jul 2008) Log Message: ----------- modified deselection to allow moving the world while keeping a selected group selected Modified Paths: -------------- code/stage/trunk/libstage/canvas.cc code/stage/trunk/libstage/stage.hh Modified: code/stage/trunk/libstage/canvas.cc =================================================================== --- code/stage/trunk/libstage/canvas.cc 2008-07-04 23:45:09 UTC (rev 6767) +++ code/stage/trunk/libstage/canvas.cc 2008-07-05 00:10:12 UTC (rev 6768) @@ -225,27 +225,14 @@ switch(event) { case FL_MOUSEWHEEL: - if( selected_models ) - { - // rotate all selected models - for( GList* it = selected_models; it; it=it->next ) - { - StgModel* mod = (StgModel*)it->data; - mod->AddToPose( 0,0,0, 0.1*(double)Fl::event_dy() ); - } - redraw(); + if( perspectiveCam == true ) { + perspective_camera.scroll( Fl::event_dy() / 10.0 ); } - else - { - if( perspectiveCam == true ) { - perspective_camera.scroll( Fl::event_dy() / 10.0 ); - } - else { - camera.scale( Fl::event_dy(), Fl::event_x(), w(), Fl::event_y(), h() ); - } - invalidate(); - redraw(); + else { + camera.scale( Fl::event_dy(), Fl::event_x(), w(), Fl::event_y(), h() ); } + invalidate(); + redraw(); return 1; case FL_MOVE: // moused moved while no button was pressed @@ -291,7 +278,11 @@ selectedModel = false; switch( Fl::event_button() ) { - case 1: + case 1: + clicked_empty_space = ( mod == NULL ); + empty_space_startx = startx; + empty_space_starty = starty; + std::cout << "clicked: " << startx << " " << Fl::event_x() << std::endl; if( mod ) { // clicked a model if ( Fl::event_state( FL_SHIFT ) ) { @@ -314,10 +305,7 @@ selectedModel = true; // selected a model } } - else { - // clicked on empty space, unselect all - unSelectAll(); - } + return 1; case 3: { @@ -377,7 +365,10 @@ } // end case FL_DRAG case FL_RELEASE: // mouse button released - + if( empty_space_startx == Fl::event_x() && empty_space_starty == Fl::event_y() && clicked_empty_space == true ) { + // clicked on empty space, unselect all + unSelectAll(); + } return 1; case FL_FOCUS: Modified: code/stage/trunk/libstage/stage.hh =================================================================== --- code/stage/trunk/libstage/stage.hh 2008-07-04 23:45:09 UTC (rev 6767) +++ code/stage/trunk/libstage/stage.hh 2008-07-05 00:10:12 UTC (rev 6768) @@ -1929,6 +1929,8 @@ int startx, starty; bool selectedModel; + bool clicked_empty_space; + int empty_space_startx, empty_space_starty; GList* selected_models; ///< a list of models that are currently ///selected by the user StgModel* last_selection; ///< the most recently selected model This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <alexcb@us...> - 2008-07-04 16:45:03
|
Revision: 6767 http://playerstage.svn.sourceforge.net/playerstage/?rev=6767&view=rev Author: alexcb Date: 2008-07-04 16:45:09 -0700 (Fri, 04 Jul 2008) Log Message: ----------- fixed robot dissapearing off screen while draging near edges bug Modified Paths: -------------- code/stage/trunk/libstage/canvas.cc Modified: code/stage/trunk/libstage/canvas.cc =================================================================== --- code/stage/trunk/libstage/canvas.cc 2008-07-04 23:33:05 UTC (rev 6766) +++ code/stage/trunk/libstage/canvas.cc 2008-07-04 23:45:09 UTC (rev 6767) @@ -197,6 +197,15 @@ void StgCanvas::CanvasToWorld( int px, int py, double *wx, double *wy, double* wz ) { + if( px <= 0 ) + px = 1; + else if( px >= w() ) + px = w() - 1; + if( py <= 0 ) + py = 1; + else if( py >= h() ) + py = h() - 1; + int viewport[4]; glGetIntegerv(GL_VIEWPORT, viewport); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <alexcb@us...> - 2008-07-04 16:32:57
|
Revision: 6766 http://playerstage.svn.sourceforge.net/playerstage/?rev=6766&view=rev Author: alexcb Date: 2008-07-04 16:33:05 -0700 (Fri, 04 Jul 2008) Log Message: ----------- modified clock string to indicate follow mode Modified Paths: -------------- code/stage/trunk/libstage/canvas.cc code/stage/trunk/libstage/stage.hh code/stage/trunk/libstage/worldgui.cc Modified: code/stage/trunk/libstage/canvas.cc =================================================================== --- code/stage/trunk/libstage/canvas.cc 2008-07-04 22:58:26 UTC (rev 6765) +++ code/stage/trunk/libstage/canvas.cc 2008-07-04 23:33:05 UTC (rev 6766) @@ -696,15 +696,18 @@ glPolygonMode( GL_FRONT_AND_BACK, GL_FILL ); - colorstack.Push( 0.8,0.8,1.0 ); // pale blue - glRectf( -w()/2, -h()/2, -w()/2 +120, -h()/2+20 ); - colorstack.Pop(); + std::string clockstr = world->ClockString(); + if( showFollow == true && last_selection ) + clockstr.append( " --FOLLOW MODE--" ); - char clockstr[50]; - world->ClockString( clockstr, 50 ); - + int width = clockstr.length() * 7; + + colorstack.Push( 0.8,0.8,1.0 ); // pale blue + glRectf( -w()/2, -h()/2, -w()/2 + width, -h()/2+20 ); + colorstack.Pop(); + colorstack.Push( 0,0,0 ); // black - gl_draw_string( -w()/2+4, -h()/2+4, 5, clockstr ); + gl_draw_string( -w()/2+4, -h()/2+4, 5, clockstr.c_str() ); colorstack.Pop(); glEnable( GL_DEPTH_TEST ); Modified: code/stage/trunk/libstage/stage.hh =================================================================== --- code/stage/trunk/libstage/stage.hh 2008-07-04 22:58:26 UTC (rev 6765) +++ code/stage/trunk/libstage/stage.hh 2008-07-04 23:33:05 UTC (rev 6766) @@ -2048,7 +2048,7 @@ /** Get human readable string that describes the current simulation time. */ - void ClockString( char* str, size_t maxlen ); + std::string ClockString( void ); /** Set the minimum real time interval between world updates, in microeconds. */ Modified: code/stage/trunk/libstage/worldgui.cc =================================================================== --- code/stage/trunk/libstage/worldgui.cc 2008-07-04 22:58:26 UTC (rev 6765) +++ code/stage/trunk/libstage/worldgui.cc 2008-07-04 23:33:05 UTC (rev 6766) @@ -108,6 +108,8 @@ #include <FL/Fl_File_Chooser.H> #include <set> +#include <sstream> +#include <iomanip> // this should be set by CMake #ifndef PACKAGE_STRING @@ -271,7 +273,7 @@ } -void StgWorldGui::ClockString( char* str, size_t maxlen ) +std::string StgWorldGui::ClockString() { const uint32_t usec_per_hour = 360000000; const uint32_t usec_per_minute = 60000000; @@ -290,32 +292,27 @@ average_real_interval /= INTERVAL_LOG_LEN; double localratio = (double)interval_sim / (double)average_real_interval; + + std::ostringstream status_stream; + status_stream.fill( '0' ); + if( hours > 0 ) + status_stream << hours << "h"; -#ifdef DEBUG - if( hours > 0 ) - snprintf( str, maxlen, "Time: %uh%02um%02u.%03us\t[%.6f]\tsubs: %d %s", - hours, minutes, seconds, msec, - localratio, - total_subs, - paused ? "--PAUSED--" : "" ); - else - snprintf( str, maxlen, "Time: %02um%02u.%03us\t[%.6f]\tsubs: %d %s", - minutes, seconds, msec, - localratio, - total_subs, - paused ? "--PAUSED--" : "" ); -#else - if( hours > 0 ) - snprintf( str, maxlen, "%uh%02um%02u.%03us\t[%.2f] %s", - hours, minutes, seconds, msec, - localratio, - paused ? "--PAUSED--" : "" ); - else - snprintf( str, maxlen, "%02um%02u.%03us\t[%.2f] %s", - minutes, seconds, msec, - localratio, - paused ? "--PAUSED--" : "" ); -#endif + localratio = 1; + + status_stream << std::setw( 2 ) << minutes << "m" + << std::setw( 2 ) << seconds << "." << std::setprecision( 3 ) << std::setw( 3 ) << msec << "s "; + + char str[ 80 ]; + snprintf( str, 80, "[%.2f]", localratio ); + status_stream << str; + + + if( paused == true ) + status_stream << " --PAUSED--"; + + + return status_stream.str(); } void StgWorldGui::DrawTree( bool drawall ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rtv@us...> - 2008-07-04 15:58:16
|
Revision: 6765 http://playerstage.svn.sourceforge.net/playerstage/?rev=6765&view=rev Author: rtv Date: 2008-07-04 15:58:26 -0700 (Fri, 04 Jul 2008) Log Message: ----------- fixed model name prefix and window title bar Modified Paths: -------------- code/stage/trunk/libstage/CMakeLists.txt code/stage/trunk/libstage/ancestor.cc code/stage/trunk/libstage/canvas.cc code/stage/trunk/libstage/model_laser.cc code/stage/trunk/libstage/model_load.cc code/stage/trunk/libstage/model_position.cc code/stage/trunk/libstage/stage.cc code/stage/trunk/libstage/stest.cc code/stage/trunk/libstage/test.cc code/stage/trunk/libstage/world.cc code/stage/trunk/libstage/worldfile.cc code/stage/trunk/libstage/worldfile.hh code/stage/trunk/libstage/worldgui.cc Modified: code/stage/trunk/libstage/CMakeLists.txt =================================================================== --- code/stage/trunk/libstage/CMakeLists.txt 2008-07-04 22:10:13 UTC (rev 6764) +++ code/stage/trunk/libstage/CMakeLists.txt 2008-07-04 22:58:26 UTC (rev 6765) @@ -65,6 +65,9 @@ add_executable( test test.cc ) target_link_libraries( test stage ) +add_executable( stest stest.cc ) +target_link_libraries( stest stage ) + INSTALL(TARGETS stagebinary stage RUNTIME DESTINATION bin LIBRARY DESTINATION lib Modified: code/stage/trunk/libstage/ancestor.cc =================================================================== --- code/stage/trunk/libstage/ancestor.cc 2008-07-04 22:10:13 UTC (rev 6764) +++ code/stage/trunk/libstage/ancestor.cc 2008-07-04 22:58:26 UTC (rev 6765) @@ -28,9 +28,17 @@ // poke a name into the child char* buf = new char[TOKEN_MAX]; - snprintf( buf, TOKEN_MAX, "%s.%s:%d", - token, typetable[mod->type].token, child_type_counts[mod->type] ); - + + if( token ) // if this object has a name, use it + snprintf( buf, TOKEN_MAX, "%s.%s:%d", + token, + typetable[mod->type].token, + child_type_counts[mod->type] ); + else + snprintf( buf, TOKEN_MAX, "%s:%d", + typetable[mod->type].token, + child_type_counts[mod->type] ); + //printf( "%s generated a name for my child %s\n", token, buf ); mod->SetToken( buf ); Modified: code/stage/trunk/libstage/canvas.cc =================================================================== --- code/stage/trunk/libstage/canvas.cc 2008-07-04 22:10:13 UTC (rev 6764) +++ code/stage/trunk/libstage/canvas.cc 2008-07-04 22:58:26 UTC (rev 6765) @@ -275,50 +275,52 @@ return 1; case FL_PUSH: // button pressed - StgModel* mod = getModel( startx, starty ); - startx = Fl::event_x(); - starty = Fl::event_y(); - selectedModel = false; - switch( Fl::event_button() ) + { + StgModel* mod = getModel( startx, starty ); + startx = Fl::event_x(); + starty = Fl::event_y(); + selectedModel = false; + switch( Fl::event_button() ) + { + case 1: + if( mod ) { + // clicked a model + if ( Fl::event_state( FL_SHIFT ) ) { + // holding shift, toggle selection + if ( selected( mod ) ) + unSelect( mod ); + else { + select( mod ); + selectedModel = true; // selected a model + } + } + else { + if ( !selected( mod ) ) { + // clicked on an unselected model while + // not holding shift, this is the new + // selection + unSelectAll(); + select( mod ); + } + selectedModel = true; // selected a model + } + } + else { + // clicked on empty space, unselect all + unSelectAll(); + } + return 1; + case 3: { - case 1: - if( mod ) { - // clicked a model - if ( Fl::event_state( FL_SHIFT ) ) { - // holding shift, toggle selection - if ( selected( mod ) ) - unSelect( mod ); - else { - select( mod ); - selectedModel = true; // selected a model - } - } - else { - if ( !selected( mod ) ) { - // clicked on an unselected model while - // not holding shift, this is the new - // selection - unSelectAll(); - select( mod ); - } - selectedModel = true; // selected a model - } - } - else { - // clicked on empty space, unselect all - unSelectAll(); - } - return 1; - case 3: - { - // leave selections alone - // rotating handled within FL_DRAG - return 1; + // leave selections alone + // rotating handled within FL_DRAG + return 1; } - default: - return 0; - } - + default: + return 0; + } + } + case FL_DRAG: // mouse moved while button was pressed { int dx = Fl::event_x() - startx; @@ -964,7 +966,6 @@ glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); } - if( perspectiveCam == true ) { if( showFollow && last_selection ) { Modified: code/stage/trunk/libstage/model_laser.cc =================================================================== --- code/stage/trunk/libstage/model_laser.cc 2008-07-04 22:10:13 UTC (rev 6764) +++ code/stage/trunk/libstage/model_laser.cc 2008-07-04 22:58:26 UTC (rev 6765) @@ -77,11 +77,11 @@ */ StgModelLaser::StgModelLaser( StgWorld* world, - StgModel* parent ) + StgModel* parent ) : StgModel( world, parent, MODEL_TYPE_LASER ) { PRINT_DEBUG2( "Constructing StgModelLaser %d (%s)\n", - id, typestr ); + id, typestr ); // sensible laser defaults interval = DEFAULT_INTERVAL_MS * (int)thousand; @@ -157,8 +157,8 @@ } static bool laser_raytrace_match( StgBlock* testblock, - StgModel* finder, - const void* dummy ) + StgModel* finder, + const void* dummy ) { // Ignore the model that's looking and things that are invisible to // lasers @@ -188,20 +188,20 @@ rayorg.a = bearing; Raytrace( rayorg, - range_max, - laser_raytrace_match, - NULL, - &sample, - true ); // z testing enabled + range_max, + laser_raytrace_match, + NULL, + &sample, + true ); // z testing enabled samples[t].range = sample.range; // if we hit a model and it reflects brightly, we set // reflectance high, else low if( sample.block && ( sample.block->Model()->GetLaserReturn() >= LaserBright ) ) - samples[t].reflectance = 1; + samples[t].reflectance = 1; else - samples[t].reflectance = 0; + samples[t].reflectance = 0; // todo - lower bound on range bearing += sample_incr; @@ -211,22 +211,22 @@ if( resolution > 1 ) { for( unsigned int t=resolution; t<sample_count; t+=resolution ) - for( unsigned int g=1; g<resolution; g++ ) - { - if( t >= sample_count ) - break; + for( unsigned int g=1; g<resolution; g++ ) + { + if( t >= sample_count ) + break; - // copy the rightmost sample data into this point - memcpy( &samples[t-g], - &samples[t-resolution], - sizeof(stg_laser_sample_t)); + // copy the rightmost sample data into this point + memcpy( &samples[t-g], + &samples[t-resolution], + sizeof(stg_laser_sample_t)); - double left = samples[t].range; - double right = samples[t-resolution].range; + double left = samples[t].range; + double right = samples[t-resolution].range; - // linear range interpolation between the left and right samples - samples[t-g].range = (left-g*(left-right)/resolution); - } + // linear range interpolation between the left and right samples + samples[t-g].range = (left-g*(left-right)/resolution); + } } data_dirty = true; @@ -310,7 +310,7 @@ if ( ! (showLaserData || showLaserStrikes) ) return; - glPushMatrix(); + glPushMatrix(); // we only regenerate the list if there's new data if( 1 /* (temp hack) data_dirty*/ ) @@ -318,17 +318,14 @@ data_dirty = false; glNewList( data_dl, GL_COMPILE ); - //glEnableClientState( GL_VERTEX_ARRAY ); + //glEnableClientState( GL_VERTEX_ARRAY ); glTranslatef( 0,0, geom.size.z/2.0 ); // shoot the laser beam out at the right height - - PushColor( 0, 0, 1, 0.5 ); - - glPointSize( 4.0 ); - - // DEBUG - draw the origin of the laser beams - glBegin( GL_POINTS ); - glVertex2f( 0,0 ); - glEnd(); + + // DEBUG - draw the origin of the laser beams + //glPointSize( 4.0 ); + //glBegin( GL_POINTS ); + //glVertex2f( 0,0 ); + //glEnd(); // pack the laser hit points into a vertex array for fast rendering static float* pts = NULL; @@ -337,59 +334,48 @@ pts[0] = 0.0; pts[1] = 0.0; - - glVertexPointer( 2, GL_FLOAT, 0, pts ); - + PushColor( 0, 0, 1, 0.5 ); + 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)(samples[s].range * cos(ray_angle) ); - pts[2*s+3] = (float)(samples[s].range * sin(ray_angle) ); + { + double ray_angle = (s * (fov / (sample_count-1))) - fov/2.0; + pts[2*s+2] = (float)(samples[s].range * cos(ray_angle) ); + pts[2*s+3] = (float)(samples[s].range * sin(ray_angle) ); - // if the sample is unusually bright, draw a little blob - if( samples[s].reflectance > 0 ) - { - glBegin( GL_POINTS ); - glVertex2f( pts[2*s+2], pts[2*s+3] ); - glEnd(); - - // why doesn't this work? - //glDrawArrays( GL_POINTS, 2*s+2, 1 ); - } + // if the sample is unusually bright, draw a little blob + if( samples[s].reflectance > 0 ) + { + glBegin( GL_POINTS ); + glVertex2f( pts[2*s+2], pts[2*s+3] ); + glEnd(); + } - } + } PopColor(); - glDepthMask( GL_FALSE ); glPolygonMode( GL_FRONT_AND_BACK, GL_FILL ); // draw the filled polygon in transparent blue - PushColor( 0, 0, 1, 0.1 ); - - + PushColor( 0, 0, 1, 0.1 ); + glVertexPointer( 2, GL_FLOAT, 0, pts ); glDrawArrays( GL_POLYGON, 0, sample_count+1 ); - - // reset PopColor(); - if( showLaserStrikes ) - { - // draw the beam strike points in black - PushColor( 0, 0, 0, 1.0 ); - glPointSize( 1.0 ); - glDrawArrays( GL_POINTS, 0, sample_count+1 ); - PopColor(); - } + if( showLaserStrikes ) + { + // draw the beam strike points in black + PushColor( 0, 0, 0, 1.0 ); + glPointSize( 1.0 ); + glDrawArrays( GL_POINTS, 0, sample_count+1 ); + PopColor(); + } glDepthMask( GL_TRUE ); - - - //glDisableClientState( GL_VERTEX_ARRAY ); glEndList(); } // end if ( data_dirty ) glCallList( data_dl ); - glPopMatrix(); + glPopMatrix(); } Modified: code/stage/trunk/libstage/model_load.cc =================================================================== --- code/stage/trunk/libstage/model_load.cc 2008-07-04 22:10:13 UTC (rev 6764) +++ code/stage/trunk/libstage/model_load.cc 2008-07-04 22:58:26 UTC (rev 6765) @@ -1,19 +1,14 @@ #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif + #include <limits.h> #include <libgen.h> // for dirname() #include <string.h> -#include "stage_internal.hh" - -//#define DEBUG 1 - #include <ltdl.h> -void FooInit( StgModel* ); -void FooUpdate( StgModel* ); +#include "stage_internal.hh" - void StgModel::Load() { assert( wf ); @@ -21,349 +16,349 @@ PRINT_DEBUG1( "Model \"%s\" loading...", token ); - if( wf->PropertyExists( wf_entity, "debug" ) ) + if( wf->PropertyExists( wf_entity, "debug" ) ) + { + PRINT_WARN2( "debug property specified for model %d %s\n", + wf_entity, this->token ); + this->debug = wf->ReadInt( wf_entity, "debug", this->debug ); + } + + if( wf->PropertyExists( wf_entity, "name" ) ) + { + char *name = (char*)wf->ReadString(wf_entity, "name", NULL ); + if( name ) { - PRINT_WARN2( "debug property specified for model %d %s\n", - wf_entity, this->token ); - this->debug = wf->ReadInt( wf_entity, "debug", this->debug ); + //printf( "changed %s to %s\n", this->token, token ); + this->token = strdup( name ); + world->AddModel( this ); // add this name to the world's table } + else + PRINT_ERR1( "Name blank for model %s. Check your worldfile\n", this->token ); - if( wf->PropertyExists( wf_entity, "name" ) ) - { - char *name = (char*)wf->ReadString(wf_entity, "name", NULL ); - if( name ) - { - //printf( "changed %s to %s\n", this->token, token ); - this->token = strdup( name ); - world->AddModel( this ); // add this name to the world's table - } - else - PRINT_ERR1( "Name blank for model %s. Check your worldfile\n", this->token ); + // add this name to the table - // add this name to the table + } - } + //PRINT_WARN1( "%s::Load", token ); - //PRINT_WARN1( "%s::Load", token ); + if( wf->PropertyExists( wf_entity, "origin" ) ) + { + stg_geom_t 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.a = wf->ReadTupleAngle(wf_entity, "origin", 2, geom.pose.a ); + this->SetGeom( geom ); + } - if( wf->PropertyExists( wf_entity, "origin" ) ) - { - stg_geom_t 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.a = wf->ReadTupleAngle(wf_entity, "origin", 2, geom.pose.a ); - this->SetGeom( geom ); - } + if( wf->PropertyExists( wf_entity, "origin4" ) ) + { + stg_geom_t geom = GetGeom(); + geom.pose.x = wf->ReadTupleLength(wf_entity, "origin4", 0, geom.pose.x ); + geom.pose.y = wf->ReadTupleLength(wf_entity, "origin4", 1, geom.pose.y ); + geom.pose.z = wf->ReadTupleLength(wf_entity, "origin4", 2, geom.pose.z ); + geom.pose.a = wf->ReadTupleAngle(wf_entity, "origin4", 3, geom.pose.a ); + this->SetGeom( geom ); + } - if( wf->PropertyExists( wf_entity, "origin4" ) ) - { - stg_geom_t geom = GetGeom(); - geom.pose.x = wf->ReadTupleLength(wf_entity, "origin4", 0, geom.pose.x ); - geom.pose.y = wf->ReadTupleLength(wf_entity, "origin4", 1, geom.pose.y ); - geom.pose.z = wf->ReadTupleLength(wf_entity, "origin4", 2, geom.pose.z ); - geom.pose.a = wf->ReadTupleAngle(wf_entity, "origin4", 3, geom.pose.a ); - this->SetGeom( geom ); - } + if( wf->PropertyExists( wf_entity, "size" ) ) + { + stg_geom_t 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 ); + this->SetGeom( geom ); + } - if( wf->PropertyExists( wf_entity, "size" ) ) - { - stg_geom_t 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 ); - this->SetGeom( geom ); - } + if( wf->PropertyExists( wf_entity, "size3" ) ) + { + stg_geom_t geom = GetGeom(); + geom.size.x = wf->ReadTupleLength(wf_entity, "size3", 0, geom.size.x ); + geom.size.y = wf->ReadTupleLength(wf_entity, "size3", 1, geom.size.y ); + geom.size.z = wf->ReadTupleLength(wf_entity, "size3", 2, geom.size.z ); + this->SetGeom( geom ); + } - if( wf->PropertyExists( wf_entity, "size3" ) ) - { - stg_geom_t geom = GetGeom(); - geom.size.x = wf->ReadTupleLength(wf_entity, "size3", 0, geom.size.x ); - geom.size.y = wf->ReadTupleLength(wf_entity, "size3", 1, geom.size.y ); - geom.size.z = wf->ReadTupleLength(wf_entity, "size3", 2, geom.size.z ); - this->SetGeom( geom ); - } + if( wf->PropertyExists( wf_entity, "pose" )) + { + stg_pose_t pose = GetPose(); + pose.x = wf->ReadTupleLength(wf_entity, "pose", 0, pose.x ); + pose.y = wf->ReadTupleLength(wf_entity, "pose", 1, pose.y ); + pose.a = wf->ReadTupleAngle(wf_entity, "pose", 2, pose.a ); + this->SetPose( pose ); + } - if( wf->PropertyExists( wf_entity, "pose" )) - { - stg_pose_t pose = GetPose(); - pose.x = wf->ReadTupleLength(wf_entity, "pose", 0, pose.x ); - pose.y = wf->ReadTupleLength(wf_entity, "pose", 1, pose.y ); - pose.a = wf->ReadTupleAngle(wf_entity, "pose", 2, pose.a ); - this->SetPose( pose ); - } + if( wf->PropertyExists( wf_entity, "pose4" )) + { + stg_pose_t pose = GetPose(); + pose.x = wf->ReadTupleLength(wf_entity, "pose4", 0, pose.x ); + pose.y = wf->ReadTupleLength(wf_entity, "pose4", 1, pose.y ); + pose.z = wf->ReadTupleLength(wf_entity, "pose4", 2, pose.z ); + pose.a = wf->ReadTupleAngle( wf_entity, "pose4", 3, pose.a ); - if( wf->PropertyExists( wf_entity, "pose4" )) - { - stg_pose_t pose = GetPose(); - pose.x = wf->ReadTupleLength(wf_entity, "pose4", 0, pose.x ); - pose.y = wf->ReadTupleLength(wf_entity, "pose4", 1, pose.y ); - pose.z = wf->ReadTupleLength(wf_entity, "pose4", 2, pose.z ); - pose.a = wf->ReadTupleAngle( wf_entity, "pose4", 3, pose.a ); + this->SetPose( pose ); + } - this->SetPose( pose ); - } + if( wf->PropertyExists( wf_entity, "velocity" )) + { + stg_velocity_t vel = GetVelocity(); + vel.x = wf->ReadTupleLength(wf_entity, "velocity", 0, vel.x ); + vel.y = wf->ReadTupleLength(wf_entity, "velocity", 1, vel.y ); + vel.a = wf->ReadTupleAngle(wf_entity, "velocity", 3, vel.a ); + this->SetVelocity( vel ); - if( wf->PropertyExists( wf_entity, "velocity" )) - { - stg_velocity_t vel = GetVelocity(); - vel.x = wf->ReadTupleLength(wf_entity, "velocity", 0, vel.x ); - vel.y = wf->ReadTupleLength(wf_entity, "velocity", 1, vel.y ); - vel.a = wf->ReadTupleAngle(wf_entity, "velocity", 3, vel.a ); - this->SetVelocity( vel ); + if( vel.x || vel.y || vel.z || vel.a ) + world->StartUpdatingModel( this ); + } - if( vel.x || vel.y || vel.z || vel.a ) - world->StartUpdatingModel( this ); - } + if( wf->PropertyExists( wf_entity, "velocity4" )) + { + stg_velocity_t vel = GetVelocity(); + vel.x = wf->ReadTupleLength(wf_entity, "velocity4", 0, vel.x ); + vel.y = wf->ReadTupleLength(wf_entity, "velocity4", 1, vel.y ); + vel.z = wf->ReadTupleLength(wf_entity, "velocity4", 2, vel.z ); + vel.a = wf->ReadTupleAngle(wf_entity, "velocity4", 3, vel.a ); + this->SetVelocity( vel ); + } - if( wf->PropertyExists( wf_entity, "velocity4" )) - { - stg_velocity_t vel = GetVelocity(); - vel.x = wf->ReadTupleLength(wf_entity, "velocity4", 0, vel.x ); - vel.y = wf->ReadTupleLength(wf_entity, "velocity4", 1, vel.y ); - vel.z = wf->ReadTupleLength(wf_entity, "velocity4", 2, vel.z ); - vel.a = wf->ReadTupleAngle(wf_entity, "velocity4", 3, vel.a ); - this->SetVelocity( vel ); - } + if( wf->PropertyExists( wf_entity, "boundary" )) + { + this->SetBoundary( wf->ReadInt(wf_entity, "boundary", this->boundary )); + } - if( wf->PropertyExists( wf_entity, "boundary" )) + if( wf->PropertyExists( wf_entity, "color" )) + { + stg_color_t col = 0xFFFF0000; // red; + const char* colorstr = wf->ReadString( wf_entity, "color", NULL ); + if( colorstr ) { - this->SetBoundary( wf->ReadInt(wf_entity, "boundary", this->boundary )); - } + if( strcmp( colorstr, "random" ) == 0 ) + { + col = (uint32_t)random(); + col |= 0xFF000000; // set the alpha channel to max + } + else + col = stg_lookup_color( colorstr ); - 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 ) - { - col = (uint32_t)random(); - col |= 0xFF000000; // set the alpha channel to max - } - else - col = stg_lookup_color( colorstr ); + this->SetColor( col ); + } + } - this->SetColor( col ); - } - } + if( wf->PropertyExists( wf_entity, "color_rgba" )) + { + double red = wf->ReadTupleFloat( wf_entity, "color_rgba", 0, 0); + double green = wf->ReadTupleFloat( wf_entity, "color_rgba", 1, 0); + double blue = wf->ReadTupleFloat( wf_entity, "color_rgba", 2, 0); + double alpha = wf->ReadTupleFloat( wf_entity, "color_rgba", 3, 0); - if( wf->PropertyExists( wf_entity, "color_rgba" )) - { - double red = wf->ReadTupleFloat( wf_entity, "color_rgba", 0, 0); - double green = wf->ReadTupleFloat( wf_entity, "color_rgba", 1, 0); - double blue = wf->ReadTupleFloat( wf_entity, "color_rgba", 2, 0); - double alpha = wf->ReadTupleFloat( wf_entity, "color_rgba", 3, 0); + this->SetColor( stg_color_pack( red, green, blue, alpha )); + } - this->SetColor( stg_color_pack( red, green, blue, alpha )); - } + if( wf->PropertyExists( wf_entity, "bitmap" ) ) + { + const char* bitmapfile = wf->ReadString( wf_entity, "bitmap", NULL ); + assert( bitmapfile ); - if( wf->PropertyExists( wf_entity, "bitmap" ) ) + char full[_POSIX_PATH_MAX]; + + if( bitmapfile[0] == '/' ) + strcpy( full, bitmapfile ); + else { - const char* bitmapfile = wf->ReadString( wf_entity, "bitmap", NULL ); - assert( bitmapfile ); + char *tmp = strdup(wf->filename); + snprintf( full, _POSIX_PATH_MAX, + "%s/%s", dirname(tmp), bitmapfile ); + free(tmp); + } - char full[_POSIX_PATH_MAX]; + PRINT_DEBUG1( "attempting to load image %s", full ); - if( bitmapfile[0] == '/' ) - strcpy( full, bitmapfile ); - else - { - char *tmp = strdup(wf->filename); - snprintf( full, _POSIX_PATH_MAX, - "%s/%s", dirname(tmp), bitmapfile ); - free(tmp); - } - - PRINT_DEBUG1( "attempting to load image %s", full ); - - stg_rotrect_t* rects = NULL; - unsigned int rect_count = 0; - unsigned int width, height; - if( stg_rotrects_from_image_file( full, + stg_rotrect_t* rects = NULL; + unsigned int rect_count = 0; + unsigned int width, height; + if( stg_rotrects_from_image_file( full, &rects, &rect_count, &width, &height ) ) - { - PRINT_ERR1( "failed to load rects from image file \"%s\"", - full ); - return; - } + { + PRINT_ERR1( "failed to load rects from image file \"%s\"", + full ); + return; + } - this->UnMap(); - this->ClearBlocks(); + this->UnMap(); + this->ClearBlocks(); - //printf( "found %d rects\n", rect_count ); + //printf( "found %d rects\n", rect_count ); - if( rects && (rect_count > 0) ) - { - //puts( "loading rects" ); - for( unsigned int r=0; r<rect_count; r++ ) - this->AddBlockRect( rects[r].pose.x, rects[r].pose.y, - rects[r].size.x, rects[r].size.y ); + if( rects && (rect_count > 0) ) + { + //puts( "loading rects" ); + for( unsigned int r=0; r<rect_count; r++ ) + this->AddBlockRect( rects[r].pose.x, rects[r].pose.y, + rects[r].size.x, rects[r].size.y ); - if( this->boundary ) - { - // add thin bounding blocks - double epsilon = 0.01; - this->AddBlockRect(0,0, epsilon, height ); - this->AddBlockRect(0,0, width, epsilon ); - this->AddBlockRect(0, height-epsilon, width, epsilon ); - this->AddBlockRect(width-epsilon,0, epsilon, height ); - } + if( this->boundary ) + { + // add thin bounding blocks + double epsilon = 0.01; + this->AddBlockRect(0,0, epsilon, height ); + this->AddBlockRect(0,0, width, epsilon ); + this->AddBlockRect(0, height-epsilon, width, epsilon ); + this->AddBlockRect(width-epsilon,0, epsilon, height ); + } - StgBlock::ScaleList( this->blocks, &this->geom.size ); - this->Map(); - this->NeedRedraw(); + StgBlock::ScaleList( this->blocks, &this->geom.size ); + this->Map(); + this->NeedRedraw(); - g_free( rects ); - } + g_free( rects ); + } - //printf( "model %s block count %d\n", - // token, g_list_length( blocks )); - } + //printf( "model %s block count %d\n", + // token, g_list_length( blocks )); + } - if( wf->PropertyExists( wf_entity, "blocks" ) ) - { - int blockcount = wf->ReadInt( wf_entity, "blocks", -1 ); + if( wf->PropertyExists( wf_entity, "blocks" ) ) + { + int blockcount = wf->ReadInt( wf_entity, "blocks", -1 ); - this->UnMap(); - this->ClearBlocks(); + this->UnMap(); + this->ClearBlocks(); - //printf( "expecting %d blocks\n", blockcount ); + //printf( "expecting %d blocks\n", blockcount ); - char key[256]; - for( int l=0; l<blockcount; l++ ) - { - snprintf(key, sizeof(key), "block[%d].points", l); - int pointcount = wf->ReadInt(wf_entity,key,0); + char key[256]; + for( int l=0; l<blockcount; l++ ) + { + snprintf(key, sizeof(key), "block[%d].points", l); + int pointcount = wf->ReadInt(wf_entity,key,0); - //printf( "expecting %d points in block %d\n", - //pointcount, l ); + //printf( "expecting %d points in block %d\n", + //pointcount, l ); - stg_point_t* pts = stg_points_create( pointcount ); + stg_point_t* pts = stg_points_create( pointcount ); - int p; - for( p=0; p<pointcount; p++ ) { - snprintf(key, sizeof(key), "block[%d].point[%d]", l, p ); + int p; + for( p=0; p<pointcount; p++ ) { + snprintf(key, sizeof(key), "block[%d].point[%d]", l, p ); - pts[p].x = wf->ReadTupleLength(wf_entity, key, 0, 0); - pts[p].y = wf->ReadTupleLength(wf_entity, key, 1, 0); + pts[p].x = wf->ReadTupleLength(wf_entity, key, 0, 0); + pts[p].y = wf->ReadTupleLength(wf_entity, key, 1, 0); - //printf( "key %s x: %.2f y: %.2f\n", - // key, pt.x, pt.y ); - } + //printf( "key %s x: %.2f y: %.2f\n", + // key, pt.x, pt.y ); + } - // block Z axis - snprintf(key, sizeof(key), "block[%d].z", l); + // block Z axis + snprintf(key, sizeof(key), "block[%d].z", l); - stg_meters_t zmin = - wf->ReadTupleLength(wf_entity, key, 0, 0.0 ); + stg_meters_t zmin = + wf->ReadTupleLength(wf_entity, key, 0, 0.0 ); - stg_meters_t zmax = - wf->ReadTupleLength(wf_entity, key, 1, 1.0 ); + stg_meters_t zmax = + wf->ReadTupleLength(wf_entity, key, 1, 1.0 ); - // block color - stg_color_t blockcol = this->color; - bool inherit_color = true; + // block color + stg_color_t blockcol = this->color; + bool inherit_color = true; - snprintf(key, sizeof(key), "block[%d].color", l); + snprintf(key, sizeof(key), "block[%d].color", l); - const char* colorstr = wf->ReadString( wf_entity, key, NULL ); - if( colorstr ) - { - blockcol = stg_lookup_color( colorstr ); - inherit_color = false; - } + const char* colorstr = wf->ReadString( wf_entity, key, NULL ); + if( colorstr ) + { + blockcol = stg_lookup_color( colorstr ); + inherit_color = false; + } - this->AddBlock( pts, pointcount, zmin, zmax, blockcol, inherit_color ); + this->AddBlock( pts, pointcount, zmin, zmax, blockcol, inherit_color ); - stg_points_destroy( pts ); - } + stg_points_destroy( pts ); + } - StgBlock::ScaleList( this->blocks, &this->geom.size ); + StgBlock::ScaleList( this->blocks, &this->geom.size ); - if( this->boundary ) - { - // add thin bounding blocks - double epsilon = 0.001; - double width = geom.size.x; - double height = geom.size.y; - this->AddBlockRect(-width/2.0, -height/2.0, epsilon, height ); - this->AddBlockRect(-width/2.0, -height/2.0, width, epsilon ); - this->AddBlockRect(-width/2.0, height/2.0-epsilon, width, epsilon ); - this->AddBlockRect(width/2.0-epsilon, -height/2.0, epsilon, height ); - } + if( this->boundary ) + { + // add thin bounding blocks + double epsilon = 0.001; + double width = geom.size.x; + double height = geom.size.y; + this->AddBlockRect(-width/2.0, -height/2.0, epsilon, height ); + this->AddBlockRect(-width/2.0, -height/2.0, width, epsilon ); + this->AddBlockRect(-width/2.0, height/2.0-epsilon, width, epsilon ); + this->AddBlockRect(width/2.0-epsilon, -height/2.0, epsilon, height ); + } - this->Map(); - } + this->Map(); + } - if( wf->PropertyExists( wf_entity, "mass" )) - this->SetMass( wf->ReadFloat(wf_entity, "mass", this->mass )); + if( wf->PropertyExists( wf_entity, "mass" )) + this->SetMass( wf->ReadFloat(wf_entity, "mass", this->mass )); - if( wf->PropertyExists( wf_entity, "fiducial_return" )) - this->SetFiducialReturn( wf->ReadInt( wf_entity, "fiducial_return", this->fiducial_return )); + if( wf->PropertyExists( wf_entity, "fiducial_return" )) + this->SetFiducialReturn( wf->ReadInt( wf_entity, "fiducial_return", this->fiducial_return )); - if( wf->PropertyExists( wf_entity, "fiducial_key" )) - this->SetFiducialKey( wf->ReadInt( wf_entity, "fiducial_key", this->fiducial_key )); + if( wf->PropertyExists( wf_entity, "fiducial_key" )) + this->SetFiducialKey( wf->ReadInt( wf_entity, "fiducial_key", this->fiducial_key )); - if( wf->PropertyExists( wf_entity, "obstacle_return" )) - this->SetObstacleReturn( wf->ReadInt( wf_entity, "obstacle_return", this->obstacle_return )); + if( wf->PropertyExists( wf_entity, "obstacle_return" )) + this->SetObstacleReturn( wf->ReadInt( wf_entity, "obstacle_return", this->obstacle_return )); - if( wf->PropertyExists( wf_entity, "ranger_return" )) - this->SetRangerReturn( wf->ReadInt( wf_entity, "ranger_return", this->ranger_return )); + if( wf->PropertyExists( wf_entity, "ranger_return" )) + this->SetRangerReturn( wf->ReadInt( wf_entity, "ranger_return", this->ranger_return )); - if( wf->PropertyExists( wf_entity, "blob_return" )) - this->SetBlobReturn( wf->ReadInt( wf_entity, "blob_return", this->blob_return )); + if( wf->PropertyExists( wf_entity, "blob_return" )) + this->SetBlobReturn( wf->ReadInt( wf_entity, "blob_return", this->blob_return )); - if( wf->PropertyExists( wf_entity, "laser_return" )) - this->SetLaserReturn( (stg_laser_return_t)wf->ReadInt(wf_entity, "laser_return", this->laser_return )); + if( wf->PropertyExists( wf_entity, "laser_return" )) + this->SetLaserReturn( (stg_laser_return_t)wf->ReadInt(wf_entity, "laser_return", this->laser_return )); - if( wf->PropertyExists( wf_entity, "gripper_return" )) - this->SetGripperReturn( wf->ReadInt( wf_entity, "gripper_return", this->gripper_return )); + if( wf->PropertyExists( wf_entity, "gripper_return" )) + this->SetGripperReturn( wf->ReadInt( wf_entity, "gripper_return", this->gripper_return )); - if( wf->PropertyExists( wf_entity, "gui_nose" )) - this->SetGuiNose( wf->ReadInt(wf_entity, "gui_nose", this->gui_nose )); + if( wf->PropertyExists( wf_entity, "gui_nose" )) + this->SetGuiNose( wf->ReadInt(wf_entity, "gui_nose", this->gui_nose )); - if( wf->PropertyExists( wf_entity, "gui_grid" )) - this->SetGuiGrid( wf->ReadInt(wf_entity, "gui_grid", this->gui_grid )); + if( wf->PropertyExists( wf_entity, "gui_grid" )) + this->SetGuiGrid( wf->ReadInt(wf_entity, "gui_grid", this->gui_grid )); - if( wf->PropertyExists( wf_entity, "gui_outline" )) - this->SetGuiOutline( wf->ReadInt(wf_entity, "gui_outline", this->gui_outline )); + if( wf->PropertyExists( wf_entity, "gui_outline" )) + this->SetGuiOutline( wf->ReadInt(wf_entity, "gui_outline", this->gui_outline )); - if( wf->PropertyExists( wf_entity, "gui_movemask" )) - this->SetGuiMask( wf->ReadInt(wf_entity, "gui_movemask", this->gui_mask )); + if( wf->PropertyExists( wf_entity, "gui_movemask" )) + this->SetGuiMask( wf->ReadInt(wf_entity, "gui_movemask", this->gui_mask )); - if( wf->PropertyExists( wf_entity, "map_resolution" )) - this->SetMapResolution( wf->ReadFloat(wf_entity, "map_resolution", this->map_resolution )); + if( wf->PropertyExists( wf_entity, "map_resolution" )) + this->SetMapResolution( wf->ReadFloat(wf_entity, "map_resolution", this->map_resolution )); - if( wf->PropertyExists( wf_entity, "ctrl" )) - { - char* lib = (char*)wf->ReadString(wf_entity, "ctrl", NULL ); + if( wf->PropertyExists( wf_entity, "ctrl" )) + { + char* lib = (char*)wf->ReadString(wf_entity, "ctrl", NULL ); - if( !lib ) - puts( "Error - NULL library name" ); - else - LoadControllerModule( lib ); - } + if( !lib ) + puts( "Error - NULL library name" ); + else + LoadControllerModule( lib ); + } - if( wf->PropertyExists( wf_entity, "say" )) - this->Say( wf->ReadString(wf_entity, "say", NULL )); + if( wf->PropertyExists( wf_entity, "say" )) + this->Say( wf->ReadString(wf_entity, "say", NULL )); - // call any type-specific load callbacks - this->CallCallbacks( &this->load_hook ); + // call any type-specific load callbacks + this->CallCallbacks( &this->load_hook ); - // MUST BE THE LAST THING LOADED - if( wf->PropertyExists( wf_entity, "alwayson" )) - { - if( wf->ReadInt( wf_entity, "alwayson", 0) > 0 ) - Startup(); - } + // MUST BE THE LAST THING LOADED + if( wf->PropertyExists( wf_entity, "alwayson" )) + { + if( wf->ReadInt( wf_entity, "alwayson", 0) > 0 ) + Startup(); + } - if( this->debug ) - printf( "Model \"%s\" is in debug mode\n", token ); + if( this->debug ) + printf( "Model \"%s\" is in debug mode\n", token ); - PRINT_DEBUG1( "Model \"%s\" loading complete", token ); + PRINT_DEBUG1( "Model \"%s\" loading complete", token ); } @@ -372,70 +367,70 @@ assert( wf ); assert( wf_entity ); - PRINT_DEBUG1( "Model \"%s\" saving...", token ); + PRINT_DEBUG1( "Model \"%s\" saving...", token ); - PRINT_DEBUG4( "saving model %s pose %.2f %.2f %.2f", - this->token, - this->pose.x, - this->pose.y, - this->pose.a ); + PRINT_DEBUG4( "saving model %s pose %.2f %.2f %.2f", + this->token, + this->pose.x, + this->pose.y, + this->pose.a ); - // right now we only save poses - wf->WriteTupleLength( wf_entity, "pose", 0, this->pose.x); - wf->WriteTupleLength( wf_entity, "pose", 1, this->pose.y); - wf->WriteTupleAngle( wf_entity, "pose", 2, this->pose.a); + // right now we only save poses + wf->WriteTupleLength( wf_entity, "pose", 0, this->pose.x); + wf->WriteTupleLength( wf_entity, "pose", 1, this->pose.y); + wf->WriteTupleAngle( wf_entity, "pose", 2, this->pose.a); - wf->WriteTupleLength( wf_entity, "pose3", 0, this->pose.x); - wf->WriteTupleLength( wf_entity, "pose3", 1, this->pose.y); - wf->WriteTupleLength( wf_entity, "pose3", 2, this->pose.z); - wf->WriteTupleAngle( wf_entity, "pose3", 3, this->pose.a); + wf->WriteTupleLength( wf_entity, "pose3", 0, this->pose.x); + wf->WriteTupleLength( wf_entity, "pose3", 1, this->pose.y); + wf->WriteTupleLength( wf_entity, "pose3", 2, this->pose.z); + wf->WriteTupleAngle( wf_entity, "pose3", 3, this->pose.a); - // call any type-specific save callbacks - this->CallCallbacks( &this->save_hook ); + // call any type-specific save callbacks + this->CallCallbacks( &this->save_hook ); - PRINT_DEBUG1( "Model \"%s\" saving complete.", token ); + PRINT_DEBUG1( "Model \"%s\" saving complete.", token ); } void StgModel::LoadControllerModule( char* lib ) { - printf( "[Ctrl \"%s\"", lib ); - fflush(stdout); + printf( "[Ctrl \"%s\"", lib ); + fflush(stdout); - /* Initialise libltdl. */ - int errors = lt_dlinit(); - assert(errors==0); + /* Initialise libltdl. */ + int errors = lt_dlinit(); + assert(errors==0); - char* stagepath = getenv("STAGEPATH"); - if( stagepath == NULL ) - stagepath = "."; + char* stagepath = getenv("STAGEPATH"); + if( stagepath == NULL ) + stagepath = (char*)"."; - lt_dlsetsearchpath( stagepath ); + lt_dlsetsearchpath( stagepath ); - lt_dlhandle handle = NULL; + lt_dlhandle handle = NULL; - if(( handle = lt_dlopenext( lib ) )) - { - printf( "]" ); + if(( handle = lt_dlopenext( lib ) )) + { + printf( "]" ); - this->initfunc = (ctrlinit_t*)lt_dlsym( handle, "Init" ); - if( this->initfunc == NULL ) - { - printf( "Libtool error: %s. Something is wrong with your plugin. Quitting\n", - lt_dlerror() ); // report the error from libtool - exit(-1); - } - } - else + this->initfunc = (ctrlinit_t*)lt_dlsym( handle, "Init" ); + if( this->initfunc == NULL ) { - printf( "Libtool error: %s. Can't open your plugin controller. Quitting\n", - lt_dlerror() ); // report the error from libtool - - PRINT_ERR1( "Failed to open \"%s\". Check that it can be found by searching the directories in your STAGEPATH environment variable, or the current directory if STAGEPATH is not set.]\n", lib ); - exit(-1); + printf( "Libtool error: %s. Something is wrong with your plugin. Quitting\n", + lt_dlerror() ); // report the error from libtool + exit(-1); } + } + else + { + printf( "Libtool error: %s. Can't open your plugin controller. Quitting\n", + lt_dlerror() ); // report the error from libtool - fflush(stdout); + PRINT_ERR1( "Failed to open \"%s\". Check that it can be found by searching the directories in your STAGEPATH environment variable, or the current directory if STAGEPATH is not set.]\n", lib ); + exit(-1); + } + + fflush(stdout); } Modified: code/stage/trunk/libstage/model_position.cc =================================================================== --- code/stage/trunk/libstage/model_position.cc 2008-07-04 22:10:13 UTC (rev 6764) +++ code/stage/trunk/libstage/model_position.cc 2008-07-04 22:58:26 UTC (rev 6765) @@ -170,12 +170,11 @@ // specified est_origin = this->GetGlobalPose(); - keyword = "localization_origin"; if( wf->PropertyExists( wf_entity, keyword ) ) { - est_origin.x = wf->ReadTupleLength( wf_entity, keyword, 0, est_origin.x ); - est_origin.y = wf->ReadTupleLength( wf_entity, keyword, 1, est_origin.y ); - est_origin.a = wf->ReadTupleAngle( wf_entity,keyword, 2, est_origin.a ); + est_origin.x = wf->ReadTupleLength( wf_entity, "localization_origin", 0, est_origin.x ); + est_origin.y = wf->ReadTupleLength( wf_entity, "localization_origin", 1, est_origin.y ); + est_origin.a = wf->ReadTupleAngle( wf_entity, "localization_origin", 2, est_origin.a ); // compute our localization pose based on the origin and true pose stg_pose_t gpose = this->GetGlobalPose(); @@ -195,15 +194,14 @@ } // odometry model parameters - keyword = "odom_error"; if( wf->PropertyExists( wf_entity, keyword ) ) { integration_error.x = - wf->ReadTupleLength( wf_entity, keyword, 0, integration_error.x ); + wf->ReadTupleLength( wf_entity, "odom_error", 0, integration_error.x ); integration_error.y = - wf->ReadTupleLength( wf_entity, keyword, 1, integration_error.y ); + wf->ReadTupleLength( wf_entity, "odom_error", 1, integration_error.y ); integration_error.a - = wf->ReadTupleAngle( wf_entity, keyword, 2, integration_error.a ); + = wf->ReadTupleAngle( wf_entity, "odom_error", 2, integration_error.a ); } // choose a localization model Modified: code/stage/trunk/libstage/stage.cc =================================================================== --- code/stage/trunk/libstage/stage.cc 2008-07-04 22:10:13 UTC (rev 6764) +++ code/stage/trunk/libstage/stage.cc 2008-07-04 22:58:26 UTC (rev 6765) @@ -193,7 +193,7 @@ if( file == NULL ) { - char* searchfiles[] = { + const char* searchfiles[] = { "./rgb.txt", #ifdef RGBFILE RGBFILE, @@ -205,7 +205,7 @@ searchfiles[i]; i++ ) { - char* filename = searchfiles[i]; + const char* filename = searchfiles[i]; PRINT_DEBUG1( "Attempting to open \"%s\"", filename ); if( (file = fopen( filename, "r")) ) break; // opened a file ok - jump out of for loop Modified: code/stage/trunk/libstage/stest.cc =================================================================== --- code/stage/trunk/libstage/stest.cc 2008-07-04 22:10:13 UTC (rev 6764) +++ code/stage/trunk/libstage/stest.cc 2008-07-04 22:58:26 UTC (rev 6765) @@ -25,8 +25,8 @@ StgModelLaser* laser; StgModelPosition* position; StgModelRanger* ranger; - StgModelFiducial* fiducial; - StgModelBlobfinder* blobfinder; + //StgModelFiducial* fiducial; + //StgModelBlobfinder* blobfinder; } robot_t; #define VSPEED 0.4 // meters per second @@ -58,16 +58,16 @@ for( int i=0; i<POPSIZE; i++ ) { - char* base = "r"; + const char* base = "r"; sprintf( namebuf, "%s%d", base, i ); robots[i].position = (StgModelPosition*)world.GetModel( namebuf ); assert(robots[i].position); robots[i].position->Subscribe(); - robots[i].laser = (StgModelLaser*) - robots[i].position->GetUnsubscribedModelOfType( "laser" ); - assert(robots[i].laser); - robots[i].laser->Subscribe(); + // robots[i].laser = (StgModelLaser*) +// robots[i].position->GetUnsubscribedModelOfType( MODEL_TYPE_LASER ); +// assert(robots[i].laser); + //robots[i].laser->Subscribe(); // robots[i].fiducial = (StgModelFiducial*) // robots[i].position->GetUnsubscribedModelOfType( "fiducial" ); @@ -75,7 +75,7 @@ // robots[i].fiducial->Subscribe(); robots[i].ranger = (StgModelRanger*) - robots[i].position->GetUnsubscribedModelOfType( "ranger" ); + robots[i].position->GetUnsubscribedModelOfType( MODEL_TYPE_RANGER ); assert(robots[i].ranger); robots[i].ranger->Subscribe(); @@ -86,11 +86,10 @@ } // start the clock - //world.Start(); - //puts( "done" ); + //world.Start();readltime //puts( "done" ); - while( ! world.TestQuit() ) - if( world.RealTimeUpdate() ) + while( 1 ) + if( world.Update() ) // if( world.Update() ) for( int i=0; i<POPSIZE; i++ ) { Modified: code/stage/trunk/libstage/test.cc =================================================================== --- code/stage/trunk/libstage/test.cc 2008-07-04 22:10:13 UTC (rev 6764) +++ code/stage/trunk/libstage/test.cc 2008-07-04 22:58:26 UTC (rev 6765) @@ -14,13 +14,13 @@ wg->Update(); } -void test( char* str, double a, double b ) +void test( const char* str, double a, double b ) { if( fabs(a-b) > epsilon ) printf( "FAIL %s expected %.3f saw %.3f\n", str, a, b ); } -void test( char* str, stg_pose_t a, stg_pose_t b ) +void test( const char* str, stg_pose_t a, stg_pose_t b ) { if( fabs(a.x-b.x) > epsilon ) printf( "POSE FAIL %s expected pose.x %.3f saw pose.x %.3f\n", str, a.x, b.x ); Modified: code/stage/trunk/libstage/world.cc =================================================================== --- code/stage/trunk/libstage/world.cc 2008-07-04 22:10:13 UTC (rev 6764) +++ code/stage/trunk/libstage/world.cc 2008-07-04 22:58:26 UTC (rev 6765) @@ -449,145 +449,152 @@ stg_raytrace_sample_t* sample, bool ztest ) { + // printf( "raytracing at [ %.2f %.2f %.2f %.2f ] for %.2f \n", +// pose.x, +// pose.y, +// pose.z, +// pose.a, +// range ); + // initialize the sample - memcpy( &sample->pose, &pose, sizeof(stg_pose_t)); // pose stays fixed - sample->range = range; // we might change this below - sample->block = NULL; // we might change this below + sample->pose = pose; + sample->range = range; // we might change this below + sample->block = NULL; // we might change this below + + // find the global integer bitmap address of the ray + int32_t x = (int32_t)(pose.x*ppm); + int32_t y = (int32_t)(pose.y*ppm); + int32_t z = 0; + + int32_t xstart = x; + int32_t ystart = y; + + // and the x and y offsets of the ray + int32_t dx = (int32_t)(ppm*range * cos(pose.a)); + int32_t dy = (int32_t)(ppm*range * sin(pose.a)); + int32_t dz = 0; + + // if( finder->debug ) + // RecordRay( pose.x, + // pose.y, + // pose.x + range.max * cos(pose.a), + // pose.y + range.max * sin(pose.a) ); + + // fast integer line 3d algorithm adapted from Cohen's code from + // Graphics Gems IV + int n, sx, sy, sz, exy, exz, ezy, ax, ay, az, bx, by, bz; + sx = sgn(dx); sy = sgn(dy); sz = sgn(dz); + ax = abs(dx); ay = abs(dy); az = abs(dz); + bx = 2*ax; by = 2*ay; bz = 2*az; + exy = ay-ax; exz = az-ax; ezy = ay-az; + n = ax+ay+az; + + // printf( "Raytracing from (%d,%d,%d) steps (%d,%d,%d) %d\n", + // x,y,z, dx,dy,dz, n ); + + // superregion coords + stg_point_int_t lastsup; + lastsup.x = INT_MAX; // an unlikely first raytrace + lastsup.y = INT_MAX; + + stg_point_int_t lastreg = {0,0}; + lastsup.x = INT_MAX; // an unlikely first raytrace + lastsup.y = INT_MAX; + + SuperRegion* sr = NULL; + Region* r = NULL; + + //puts( "RAYTRACE" ); + + while ( n-- ) + { + // superregion coords + stg_point_int_t sup; + sup.x = x >> SRBITS; + sup.y = y >> SRBITS; + + // printf( "pixel [%d %d]\tS[ %d %d ]\t", + // x, y, sup.x, sup.y ); - // find the global integer bitmap address of the ray - int32_t x = (int32_t)(pose.x*ppm); - int32_t y = (int32_t)(pose.y*ppm); - int32_t z = 0; + if( ! (sup.x == lastsup.x && sup.y == lastsup.y )) + { + sr = (SuperRegion*)g_hash_table_lookup( superregions, (void*)&sup ); + lastsup = sup; // remember these coords + } - int32_t xstart = x; - int32_t ystart = y; + if( sr ) + { + // find the region coords inside this superregion + stg_point_int_t reg; + reg.x = (x - ( sup.x << SRBITS)) >> RBITS; + reg.y = (y - ( sup.y << SRBITS)) >> RBITS; - // and the x and y offsets of the ray - int32_t dx = (int32_t)(ppm*range * cos(pose.a)); - int32_t dy = (int32_t)(ppm*range * sin(pose.a)); - int32_t dz = 0; + // printf( "R[ %d %d ]\t", reg.x, reg.y ); - // if( finder->debug ) - // RecordRay( pose.x, - // pose.y, - // pose.x + range.max * cos(pose.a), - // pose.y + range.max * sin(pose.a) ); + if( ! (reg.x == lastreg.x && reg.y == lastreg.y )) + { + r = sr->GetRegion( reg.x, reg.y ); + lastreg = reg; + } - // fast integer line 3d algorithm adapted from Cohen's code from - // Graphics Gems IV - int n, sx, sy, sz, exy, exz, ezy, ax, ay, az, bx, by, bz; - sx = sgn(dx); sy = sgn(dy); sz = sgn(dz); - ax = abs(dx); ay = abs(dy); az = abs(dz); - bx = 2*ax; by = 2*ay; bz = 2*az; - exy = ay-ax; exz = az-ax; ezy = ay-az; - n = ax+ay+az; + if( r && r->count ) + { + // compute the pixel offset inside this region + stg_point_int_t cell; + cell.x = x - ((sup.x << SRBITS) + (reg.x << RBITS)); + cell.y = y - ((sup.y << SRBITS) + (reg.y << RBITS)); - // printf( "Raytracing from (%d,%d,%d) steps (%d,%d,%d) %d\n", - // x,y,z, dx,dy,dz, n ); + // printf( "C[ %d %d ]\t", cell.x, cell.y ); - // superregion coords - stg_point_int_t lastsup; - lastsup.x = INT_MAX; // an unlikely first raytrace - lastsup.y = INT_MAX; + for( GSList* list = r->GetCell( cell.x, cell.y )->list; + list; + list = list->next ) + { + StgBlock* block = (StgBlock*)list->data; + assert( block ); - stg_point_int_t lastreg = {0,0}; - lastsup.x = INT_MAX; // an unlikely first raytrace - lastsup.y = INT_MAX; - - SuperRegion* sr = NULL; - Region* r = NULL; - - //puts( "RAYTRACE" ); - - while ( n-- ) - { - // superregion coords - stg_point_int_t sup; - sup.x = x >> SRBITS; - sup.y = y >> SRBITS; - - // printf( "pixel [%d %d]\tS[ %d %d ]\t", - // x, y, sup.x, sup.y ); - - if( ! (sup.x == lastsup.x && sup.y == lastsup.y )) - { - sr = (SuperRegion*)g_hash_table_lookup( superregions, (void*)&sup ); - lastsup = sup; // remember these coords + // if this block does not belong to the searching model and it + // matches the predicate and it's in the right z range + if( //block && (block->Model() != finder) && + (ztest ? block->IntersectGlobalZ( pose.z ) : true) && + (*func)( block, mod, arg ) ) + { + // a hit! + sample->block = block; + sample->range = hypot( (x-xstart)/ppm, (y-ystart)/ppm ); + return; + } } + } + } - if( sr ) - { - // find the region coords inside this superregion - stg_point_int_t reg; - reg.x = (x - ( sup.x << SRBITS)) >> RBITS; - reg.y = (y - ( sup.y << SRBITS)) >> RBITS; + // printf( "\t step %d n %d pixel [ %d, %d ] block [ %d %d ] index [ %d %d ] \n", + // //coarse [ %d %d ]\n", + // count++, n, x, y, blockx, blocky, b_dx, b_dy ); - // printf( "R[ %d %d ]\t", reg.x, reg.y ); - - if( ! (reg.x == lastreg.x && reg.y == lastreg.y )) - { - r = sr->GetRegion( reg.x, reg.y ); - lastreg = reg; - } - - if( r && r->count ) - { - // compute the pixel offset inside this region - stg_point_int_t cell; - cell.x = x - ((sup.x << SRBITS) + (reg.x << RBITS)); - cell.y = y - ((sup.y << SRBITS) + (reg.y << RBITS)); - - // printf( "C[ %d %d ]\t", cell.x, cell.y ); - - for( GSList* list = r->GetCell( cell.x, cell.y )->list; - list; - list = list->next ) - { - StgBlock* block = (StgBlock*)list->data; - assert( block ); - - // if this block does not belong to the searching model and it - // matches the predicate and it's in the right z range - if( //block && (block->Model() != finder) && - (ztest ? block->IntersectGlobalZ( pose.z ) : true) && - (*func)( block, mod, arg ) ) - { - // a hit! - sample->block = block; - sample->range = hypot( (x-xstart)/ppm, (y-ystart)/ppm ); - return; - } - } - } - } - - // printf( "\t step %d n %d pixel [ %d, %d ] block [ %d %d ] index [ %d %d ] \n", - // //coarse [ %d %d ]\n", - // count++, n, x, y, blockx, blocky, b_dx, b_dy ); - - // increment our pixel in the correct direction - if ( exy < 0 ) { - if ( exz < 0 ) { - x += sx; exy += by; exz += bz; - } - else { - z += sz; exz -= bx; ezy += by; - } - } - else { - if ( ezy < 0 ) { - z += sz; - exz -= bx; ezy += by; - } - else { - y += sy; exy -= bx; ezy -= bz; - } - } - // puts(""); + // increment our pixel in the correct direction + if ( exy < 0 ) { + if ( exz < 0 ) { + x += sx; exy += by; exz += bz; } + else { + z += sz; exz -= bx; ezy += by; + } + } + else { + if ( ezy < 0 ) { + z += sz; + exz -= bx; ezy += by; + } + else { + y += sy; exy -= bx; ezy -= bz; + } + } + // puts(""); + } - // hit nothing - return; + // hit nothing + return; } static void _save_cb( gpointer key, gpointer data, gpointer user ) Modified: code/stage/trunk/libstage/worldfile.cc =================================================================== --- code/stage/trunk/libstage/worldfile.cc 2008-07-04 22:10:13 UTC (rev 6764) +++ code/stage/trunk/libstage/worldfile.cc 2008-07-04 22:58:26 UTC (rev 6765) @@ -1402,7 +1402,7 @@ } -bool Worldfile::PropertyExists( int section, char* token ) +bool Worldfile::PropertyExists( int section, const char* token ) { return( this->GetProperty( section, token ) ? true : false ); } Modified: code/stage/trunk/libstage/worldfile.hh =================================================================== --- code/stage/trunk/libstage/worldfile.hh 2008-07-04 22:10:13 UTC (rev 6764) +++ code/stage/trunk/libstage/worldfile.hh 2008-07-04 22:58:26 UTC (rev 6765) @@ -268,7 +268,7 @@ // returns true iff the property exists in the file, so that you can // be sure that GetProperty() will work - bool PropertyExists( int section, char* token ); + bool PropertyExists( int section, const char* token ); // Set the value of an property. private: void SetPropertyValue( CProperty* property, int index, const char *value); Modified: code/stage/trunk/libstage/worldgui.cc =================================================================== --- code/stage/trunk/libstage/worldgui.cc 2008-07-04 22:10:13 UTC (rev 6764) +++ code/stage/trunk/libstage/worldgui.cc 2008-07-04 22:58:26 UTC (rev 6765) @@ -115,20 +115,25 @@ #endif StgWorldGui::StgWorldGui(int W,int H,const char* L) : - Fl_Window(W,H,L) + Fl_Window(W,H,L ) { //size_range( 100,100 ); // set minimum window size oDlg = NULL; graphics = true; paused = false; + // improve the title bar to say "Stage: <worldfile name>" + std::string title = "Stage: "; + title += L; + label( title.c_str() ); + interval_real = (stg_usec_t)thousand * DEFAULT_INTERVAL_REAL; for( unsigned int i=0; i<INTERVAL_LOG_LEN; i++ ) this->interval_log[i] = this->interval_real; // build the menus - mbar = new Fl_Menu_Bar(0,0, W, 30);// 640, 30); + mbar = new Fl_Menu_Bar(0,0, W, 30); mbar->textsize(12); canvas = new StgCanvas( this,0,30,W,H-30 ); @@ -166,6 +171,7 @@ delete canvas; } + void StgWorldGui::Load( const char* filename ) { PRINT_DEBUG1( "%s.Load()", token ); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jeremy_asher@us...> - 2008-07-04 15:10:11
|
Revision: 6764 http://playerstage.svn.sourceforge.net/playerstage/?rev=6764&view=rev Author: jeremy_asher Date: 2008-07-04 15:10:13 -0700 (Fri, 04 Jul 2008) Log Message: ----------- Temporary change to show laser data while paused Modified Paths: -------------- code/stage/trunk/libstage/model_laser.cc Modified: code/stage/trunk/libstage/model_laser.cc =================================================================== --- code/stage/trunk/libstage/model_laser.cc 2008-07-04 22:05:58 UTC (rev 6763) +++ code/stage/trunk/libstage/model_laser.cc 2008-07-04 22:10:13 UTC (rev 6764) @@ -313,7 +313,7 @@ glPushMatrix(); // we only regenerate the list if there's new data - if( data_dirty ) + if( 1 /* (temp hack) data_dirty*/ ) { data_dirty = false; @@ -387,7 +387,7 @@ //glDisableClientState( GL_VERTEX_ARRAY ); glEndList(); - } + } // end if ( data_dirty ) glCallList( data_dl ); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jeremy_asher@us...> - 2008-07-04 15:05:49
|
Revision: 6763 http://playerstage.svn.sourceforge.net/playerstage/?rev=6763&view=rev Author: jeremy_asher Date: 2008-07-04 15:05:58 -0700 (Fri, 04 Jul 2008) Log Message: ----------- Rewrote model selection code to mirror standard selection functionality and to fix bugs Modified Paths: -------------- code/stage/trunk/libstage/canvas.cc code/stage/trunk/libstage/stage.hh Modified: code/stage/trunk/libstage/canvas.cc =================================================================== --- code/stage/trunk/libstage/canvas.cc 2008-07-04 22:01:25 UTC (rev 6762) +++ code/stage/trunk/libstage/canvas.cc 2008-07-04 22:05:58 UTC (rev 6763) @@ -73,8 +73,6 @@ interval = 50; //msec between redraws graphics = true; - dragging = false; - rotating = false; // // start the timer that causes regular redraws Fl::add_timeout( ((double)interval/1000), @@ -86,12 +84,8 @@ { } -StgModel* StgCanvas::Select( int x, int y ) +StgModel* StgCanvas::getModel( int x, int y ) { - // TODO XX - //return NULL; - - // render all models in a unique color make_current(); // make sure the GL context is current glClearColor ( 1,1,1,1 ); // white @@ -158,30 +152,47 @@ glEnable(GL_DITHER); glEnable(GL_BLEND); glClearColor ( 0.7, 0.7, 0.8, 1.0); + + return mod; +} - if( mod ) // we clicked on a root model +bool StgCanvas::selected( StgModel* mod ) { + if( g_list_find( selected_models, mod ) ) + return true; + else + return false; +} + +void StgCanvas::select( StgModel* mod ) { + if( mod ) { - // if it's already selected - if( GList* link = g_list_find( selected_models, mod ) ) - { - // remove it from the selected list - selected_models = - g_list_remove_link( selected_models, link ); - mod->Disable(); - } - else - { - last_selection = mod; - selected_models = g_list_prepend( selected_models, mod ); - mod->Enable(); - } - - invalidate(); + last_selection = mod; + selected_models = g_list_prepend( selected_models, mod ); +// mod->Disable(); } +} - return mod; +void StgCanvas::unSelect( StgModel* mod ) { + if( mod ) + { + if ( GList* link = g_list_find( selected_models, mod ) ) + { + // remove it from the selected list + selected_models = + g_list_remove_link( selected_models, link ); +// mod->Enable(); + } + } } +void StgCanvas::unSelectAll() { +// for( GList* it=selected_models; it; it=it->next ) +// ((StgModel*)it->data)->Enable(); + + g_list_free( selected_models ); + selected_models = NULL; +} + // convert from 2d window pixel to 3d world coordinates void StgCanvas::CanvasToWorld( int px, int py, double *wx, double *wy, double* wz ) @@ -207,194 +218,205 @@ case FL_MOUSEWHEEL: if( selected_models ) { - // rotate all selected models - for( GList* it = selected_models; it; it=it->next ) - { - StgModel* mod = (StgModel*)it->data; - mod->AddToPose( 0,0,0, 0.1*(double)Fl::event_dy() ); - } - redraw(); + // rotate all selected models + for( GList* it = selected_models; it; it=it->next ) + { + StgModel* mod = (StgModel*)it->data; + mod->AddToPose( 0,0,0, 0.1*(double)Fl::event_dy() ); + } + redraw(); } - else - { - if( perspectiveCam == true ) { - perspective_camera.scroll( Fl::event_dy() / 10.0 ); - } else { - camera.scale( Fl::event_dy(), Fl::event_x(), w(), Fl::event_y(), h() ); - } - invalidate(); - redraw(); - } - return 1; + else + { + if( perspectiveCam == true ) { + perspective_camera.scroll( Fl::event_dy() / 10.0 ); + } + else { + camera.scale( Fl::event_dy(), Fl::event_x(), w(), Fl::event_y(), h() ); + } + invalidate(); + redraw(); + } + return 1; + + case FL_MOVE: // moused moved while no button was pressed + if( Fl::event_state( FL_CTRL ) ) + { + int dx = Fl::event_x() - startx; + int dy = Fl::event_y() - starty; - case FL_MOVE: // moused moved while no button was pressed - if( Fl::event_state( FL_CTRL ) ) - { - int dx = Fl::event_x() - startx; - int dy = Fl::event_y() - starty; + if( perspectiveCam == true ) { + perspective_camera.addYaw( -dx ); + perspective_camera.addPitch( -dy ); + } + else { + camera.pitch( 0.5 * static_cast<double>( dy ) ); + camera.yaw( 0.5 * static_cast<double>( dx ) ); + } + invalidate(); + redraw(); + } + else if( Fl::event_state( FL_ALT ) ) + { + int dx = Fl::event_x() - startx; + int dy = Fl::event_y() - starty; - if( perspectiveCam == true ) { - perspective_camera.addYaw( -dx ); - perspective_camera.addPitch( -dy ); - } else { - camera.pitch( 0.5 * static_cast<double>( dy ) ); - camera.yaw( 0.5 * static_cast<double>( dx ) ); - } + if( perspectiveCam == true ) { + perspective_camera.move( -dx, dy, 0.0 ); + } + else { + camera.move( -dx, dy ); + } + invalidate(); - invalidate(); - redraw(); - } - else if( Fl::event_state( FL_ALT ) ) - { - int dx = Fl::event_x() - startx; - int dy = Fl::event_y() - starty; + } + startx = Fl::event_x(); + starty = Fl::event_y(); + return 1; - if( perspectiveCam == true ) { - perspective_camera.move( -dx, dy, 0.0 ); - } else { - camera.move( -dx, dy ); + case FL_PUSH: // button pressed + StgModel* mod = getModel( startx, starty ); + startx = Fl::event_x(); + starty = Fl::event_y(); + selectedModel = false; + switch( Fl::event_button() ) + { + case 1: + if( mod ) { + // clicked a model + if ( Fl::event_state( FL_SHIFT ) ) { + // holding shift, toggle selection + if ( selected( mod ) ) + unSelect( mod ); + else { + select( mod ); + selectedModel = true; // selected a model + } + } + else { + if ( !selected( mod ) ) { + // clicked on an unselected model while + // not holding shift, this is the new + // selection + unSelectAll(); + select( mod ); + } + selectedModel = true; // selected a model + } + } + else { + // clicked on empty space, unselect all + unSelectAll(); + } + return 1; + case 3: + { + // leave selections alone + // rotating handled within FL_DRAG + return 1; + } + default: + return 0; + } - } - invalidate(); - - } - - startx = Fl::event_x(); - starty = Fl::event_y(); - - return 1; - - case FL_PUSH: // button pressed - switch( Fl::event_button() ) + case FL_DRAG: // mouse moved while button was pressed { - case 1: - startx = Fl::event_x(); - starty = Fl::event_y(); - if( Select( startx, starty ) ) - dragging = true; - return 1; - case 3: - { - startx = Fl::event_x(); - starty = Fl::event_y(); - if( Select( startx, starty ) ) - rotating = true; - return 1; - } - default: - return 0; - } + int dx = Fl::event_x() - startx; + int dy = Fl::event_y() - starty; - case FL_DRAG: // mouse moved while button was pressed - { - int dx = Fl::event_x() - startx; - int dy = Fl::event_y() - starty; + if ( Fl::event_state( FL_BUTTON1 ) ) { + // Left mouse button drag + if ( selectedModel ) { + // started dragging on a selected model + + double sx,sy,sz; + CanvasToWorld( startx, starty, + &sx, &sy, &sz ); + double x,y,z; + CanvasToWorld( Fl::event_x(), Fl::event_y(), + &x, &y, &z ); + // move all selected models to the mouse pointer + for( GList* it = selected_models; it; it=it->next ) + { + StgModel* mod = (StgModel*)it->data; + mod->AddToPose( x-sx, y-sy, 0, 0 ); + } + } + else { + // started dragging on empty space or an + // unselected model, move the canvas + camera.move( -dx, dy ); + invalidate(); // so the projection gets updated + } + } + else if ( Fl::event_state( FL_BUTTON3 ) ) { + // rotate all selected models + for( GList* it = selected_models; it; it=it->next ) + { + StgModel* mod = (StgModel*)it->data; + mod->AddToPose( 0,0,0, 0.05*dx ); + } + } + + startx = Fl::event_x(); + starty = Fl::event_y(); - switch( Fl::event_button() ) - { - case 1: - if( dragging ) - { - assert(selected_models); + redraw(); + return 1; + } // end case FL_DRAG - double sx,sy,sz; - CanvasToWorld( startx, starty, - &sx, &sy, &sz ); - double x,y,z; - CanvasToWorld( Fl::event_x(), Fl::event_y(), - &x, &y, &z ); + case FL_RELEASE: // mouse button released + + return 1; - // move all selected models to the mouse pointer - for( GList* it = selected_models; it; it=it->next ) - { - StgModel* mod = (StgModel*)it->data; - mod->AddToPose( x-sx, y-sy, 0, 0 ); - } - } - else - { - camera.move( -dx, dy ); - invalidate(); // so the projection gets updated - } - break; - case 3: // right button - if( rotating ) - { - // move all selected models to the mouse pointer - for( GList* it = selected_models; it; it=it->next ) - { - StgModel* mod = (StgModel*)it->data; - mod->AddToPose( 0,0,0, 0.05*dx ); - } - } - break; - } - } - startx = Fl::event_x(); - starty = Fl::event_y(); + case FL_FOCUS: + case FL_UNFOCUS: + //.... Return 1 if you want keyboard events, 0 otherwise + return 1; - redraw(); - return 1; // end case FL_DRAG - - case FL_RELEASE: // mouse button released - // unselect everyone unless shift is pressed - if( ! Fl::event_state( FL_SHIFT ) ) - { - for( GList* it=selected_models; it; it=it->next ) - ((StgModel*)it->data)->Enable(); - - g_list_free( selected_models ); - selected_models = NULL; - dragging = false; - rotating = false; - redraw(); - } - return 1; - - case FL_FOCUS : - case FL_UNFOCUS : - //.... Return 1 if you want keyboard events, 0 otherwise - return 1; - case FL_KEYBOARD: - switch( Fl::event_key() ) - { - case 'p': // pause - world->TogglePause(); - break; - case ' ': // space bar - camera.resetAngle(); - //invalidate(); - if( Fl::event_state( FL_CTRL ) ) { - resetCamera(); - } - redraw(); - break; - case FL_Left: - if( perspectiveCam == false ) { camera.move( -10, 0 ); } - else { perspective_camera.strafe( -0.5 ); } break; - case FL_Right: - if( perspectiveCam == false ) {camera.move( 10, 0 ); } - else { perspective_camera.strafe( 0.5 ); } break; - case FL_Down: - if( perspectiveCam == false ) {camera.move( 0, -10 ); } - else { perspective_camera.forward( -0.5 ); } break; - case FL_Up: - if( perspectiveCam == false ) {camera.move( 0, 10 ); } - else { perspective_camera.forward( 0.5 ); } break; + case FL_KEYBOARD: + switch( Fl::event_key() ) + { + case 'p': // pause + world->TogglePause(); + break; + case ' ': // space bar + camera.resetAngle(); + //invalidate(); + if( Fl::event_state( FL_CTRL ) ) { + resetCamera(); + } + redraw(); + break; + case FL_Left: + if( perspectiveCam == false ) { camera.move( -10, 0 ); } + else { perspective_camera.strafe( -0.5 ); } break; + case FL_Right: + if( perspectiveCam == false ) {camera.move( 10, 0 ); } + else { perspective_camera.strafe( 0.5 ); } break; + case FL_Down: + if( perspectiveCam == false ) {camera.move( 0, -10 ); } + else { perspective_camera.forward( -0.5 ); } break; + case FL_Up: + if( perspectiveCam == false ) {camera.move( 0, 10 ); } + else { perspective_camera.forward( 0.5 ); } break; + default: + return 0; // keypress unhandled + } + + invalidate(); // update projection + return 1; + +// case FL_SHORTCUT: +// //... shortcut, key is in Fl::event_key(), ascii in Fl::event_text() +// //... Return 1 if you understand/use the shortcut event, 0 otherwise... +// return 1; default: - return 0; // keypress unhandled - } - invalidate(); // update projection - return 1; - //case FL_SHORTCUT: - ///... shortcut, key is in Fl::event_key(), ascii in Fl::event_text() - // ... Return 1 if you understand/use the shortcut event, 0 otherwise... - //return 1; - default: - // pass other events to the base class... - //printf( "EVENT %d\n", event ); - return Fl_Gl_Window::handle(event); - } + // pass other events to the base class... + //printf( "EVENT %d\n", event ); + return Fl_Gl_Window::handle(event); + + } // end switch( event ) } void StgCanvas::FixViewport(int W,int H) @@ -595,15 +617,17 @@ // draw the model-specific visualizations if( showData ) { - GList* it; - if ( visualizeAll ) - it = world->StgWorld::children; - else - it = selected_models; - for( ; it; it=it->next ) + if ( visualizeAll ) { + for( GList* it = world->StgWorld::children; it; it=it->next ) ((StgModel*)it->data)->DataVisualizeTree(); - - + } + else if ( selected_models ) { + for( GList* it = selected_models; it; it=it->next ) + ((StgModel*)it->data)->DataVisualizeTree(); + } + else if ( last_selection ) { + last_selection->DataVisualizeTree(); + } } if( showGrid ) Modified: code/stage/trunk/libstage/stage.hh =================================================================== --- code/stage/trunk/libstage/stage.hh 2008-07-04 22:01:25 UTC (rev 6762) +++ code/stage/trunk/libstage/stage.hh 2008-07-04 22:05:58 UTC (rev 6763) @@ -1928,8 +1928,7 @@ StgPerspectiveCamera perspective_camera; int startx, starty; - bool dragging; - bool rotating; + bool selectedModel; GList* selected_models; ///< a list of models that are currently ///selected by the user StgModel* last_selection; ///< the most recently selected model @@ -1986,7 +1985,11 @@ void CanvasToWorld( int px, int py, double *wx, double *wy, double* wz ); - StgModel* Select( int x, int y ); + StgModel* getModel( int x, int y ); + bool selected( StgModel* mod ); + void select( StgModel* mod ); + void unSelect( StgModel* mod ); + void unSelectAll(); inline void PushColor( stg_color_t col ) { colorstack.Push( col ); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <alexcb@us...> - 2008-07-04 15:01:17
|
Revision: 6762 http://playerstage.svn.sourceforge.net/playerstage/?rev=6762&view=rev Author: alexcb Date: 2008-07-04 15:01:25 -0700 (Fri, 04 Jul 2008) Log Message: ----------- fixed infinite scrolling bug when camera pitch is 90degrees Modified Paths: -------------- code/stage/trunk/libstage/stage.hh Modified: code/stage/trunk/libstage/stage.hh =================================================================== --- code/stage/trunk/libstage/stage.hh 2008-07-04 21:53:04 UTC (rev 6761) +++ code/stage/trunk/libstage/stage.hh 2008-07-04 22:01:25 UTC (rev 6762) @@ -1870,6 +1870,12 @@ //adjust for pitch angle y = y / cos( dtor( _pitch ) ); + //don't allow huge values + if( y > 100 ) + y = 100; + else if( y < -100 ) + y = -100; + //adjust for yaw angle _x += cos( dtor( _yaw ) ) * x; _y += -sin( dtor( _yaw ) ) * x; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rtv@us...> - 2008-07-04 14:52:56
|
Revision: 6761 http://playerstage.svn.sourceforge.net/playerstage/?rev=6761&view=rev Author: rtv Date: 2008-07-04 14:53:04 -0700 (Fri, 04 Jul 2008) Log Message: ----------- fixed vertexarray bug Modified Paths: -------------- code/stage/trunk/examples/ctrl/swarmbenchmark.cc code/stage/trunk/libstage/canvas.cc code/stage/trunk/libstage/model.cc code/stage/trunk/libstage/model_camera.cc code/stage/trunk/libstage/model_laser.cc code/stage/trunk/libstage/model_ranger.cc code/stage/trunk/worlds/everything.world code/stage/trunk/worlds/pioneer.inc code/stage/trunk/worlds/swarmbenchmark/cave.world Modified: code/stage/trunk/examples/ctrl/swarmbenchmark.cc =================================================================== --- code/stage/trunk/examples/ctrl/swarmbenchmark.cc 2008-07-04 19:55:31 UTC (rev 6760) +++ code/stage/trunk/examples/ctrl/swarmbenchmark.cc 2008-07-04 21:53:04 UTC (rev 6761) @@ -14,10 +14,6 @@ #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; @@ -25,10 +21,10 @@ StgModelRanger* ranger; } robot_t; -#define VSPEED 0.4 // meters per second -#define WGAIN 1.0 // turn speed gain +#define VSPEED 0.5 // meters per second +#define WGAIN 1.5 // turn speed gain #define SAFE_DIST 0.6 // meters -#define SAFE_ANGLE 0.25 // radians +#define SAFE_ANGLE 1 // radians // forward declare int RangerUpdate( StgModel* mod, robot_t* robot ); @@ -48,8 +44,8 @@ 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 = (StgModelLaser*)mod->GetModel( "laser:0" ); + //assert( robot->laser ); //robot->laser->Subscribe(); return 0; //ok @@ -71,6 +67,8 @@ dx += srange * cos( rgr->sensors[s].pose.a ); dy += srange * sin( rgr->sensors[s].pose.a ); + + //printf( "sensor %d angle= %.2f\n", s, rgr->sensors[s].pose.a ); } if( (dx == 0) || (dy == 0) ) @@ -84,15 +82,21 @@ double side_speed = 0.0; double turn_speed = WGAIN * resultant_angle; - int forward = rgr->sensor_count/2 -1 ; + //printf( "resultant %.2f turn_speed %.2f\n", resultant_angle, turn_speed ); + + int forward = 0 ; // 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) && + if( (rgr->samples[0] > SAFE_DIST) && + (rgr->samples[1] > SAFE_DIST/2.0) && + (rgr->samples[2] > SAFE_DIST/5.0) && + (rgr->samples[15] > SAFE_DIST/2.0) && + (rgr->samples[14] > SAFE_DIST/5.0) && (fabs( resultant_angle ) < SAFE_ANGLE) ) { forward_speed = VSPEED; } + + //printf( "forward angle = %.2f\n", rgr->sensors[forward].pose.a ); // // send a command to the robot // stg_velocity_t vel; Modified: code/stage/trunk/libstage/canvas.cc =================================================================== --- code/stage/trunk/libstage/canvas.cc 2008-07-04 19:55:31 UTC (rev 6760) +++ code/stage/trunk/libstage/canvas.cc 2008-07-04 21:53:04 UTC (rev 6761) @@ -874,8 +874,8 @@ glHint( GL_LINE_SMOOTH_HINT, GL_FASTEST ); glDepthMask( GL_TRUE ); glEnable( GL_TEXTURE_2D ); + glEnableClientState( GL_VERTEX_ARRAY ); - //TODO find a better home for loading textures if( loaded_texture == false ) { std::string fullpath = world->fileMan->fullPath( "stall.png" ); Modified: code/stage/trunk/libstage/model.cc =================================================================== --- code/stage/trunk/libstage/model.cc 2008-07-04 19:55:31 UTC (rev 6760) +++ code/stage/trunk/libstage/model.cc 2008-07-04 21:53:04 UTC (rev 6761) @@ -1181,7 +1181,7 @@ PushLocalCoords(); DataVisualize(); // virtual function overridden by most model types - // shift to top of this model + // shift to top of this model - why is this not necessary? glTranslatef( 0,0, geom.size.z ); // and draw the children Modified: code/stage/trunk/libstage/model_camera.cc =================================================================== --- code/stage/trunk/libstage/model_camera.cc 2008-07-04 19:55:31 UTC (rev 6760) +++ code/stage/trunk/libstage/model_camera.cc 2008-07-04 21:53:04 UTC (rev 6761) @@ -329,7 +329,7 @@ } - glEnableClientState( GL_VERTEX_ARRAY ); + //glEnableClientState( GL_VERTEX_ARRAY ); glEnableClientState( GL_COLOR_ARRAY ); glVertexPointer( 3, GL_FLOAT, 0, _camera_quads ); Modified: code/stage/trunk/libstage/model_laser.cc =================================================================== --- code/stage/trunk/libstage/model_laser.cc 2008-07-04 19:55:31 UTC (rev 6760) +++ code/stage/trunk/libstage/model_laser.cc 2008-07-04 21:53:04 UTC (rev 6761) @@ -318,9 +318,18 @@ data_dirty = false; glNewList( data_dl, GL_COMPILE ); - + //glEnableClientState( GL_VERTEX_ARRAY ); glTranslatef( 0,0, geom.size.z/2.0 ); // shoot the laser beam out at the right height + PushColor( 0, 0, 1, 0.5 ); + + glPointSize( 4.0 ); + + // DEBUG - draw the origin of the laser beams + glBegin( GL_POINTS ); + glVertex2f( 0,0 ); + glEnd(); + // pack the laser hit points into a vertex array for fast rendering static float* pts = NULL; pts = (float*)g_realloc( pts, 2 * (sample_count+1) * sizeof(float)); @@ -328,10 +337,7 @@ pts[0] = 0.0; pts[1] = 0.0; - PushColor( 0, 0, 1, 0.5 ); - glPointSize( 4.0 ); - glVertexPointer( 2, GL_FLOAT, 0, pts ); for( unsigned int s=0; s<sample_count; s++ ) @@ -379,7 +385,7 @@ glDepthMask( GL_TRUE ); - + //glDisableClientState( GL_VERTEX_ARRAY ); glEndList(); } Modified: code/stage/trunk/libstage/model_ranger.cc =================================================================== --- code/stage/trunk/libstage/model_ranger.cc 2008-07-04 19:55:31 UTC (rev 6760) +++ code/stage/trunk/libstage/model_ranger.cc 2008-07-04 21:53:04 UTC (rev 6761) @@ -80,9 +80,12 @@ #include <math.h> static const stg_watts_t DEFAULT_RANGER_WATTSPERSENSOR = 0.2; -static const stg_meters_t DEFAULT_RANGER_SIZEX = 0.01; -static const stg_meters_t DEFAULT_RANGER_SIZEY = 0.04; -static const stg_meters_t DEFAULT_RANGER_SIZEZ = 0.04; +static const stg_meters_t DEFAULT_RANGER_SIZEX = 0.4; +static const stg_meters_t DEFAULT_RANGER_SIZEY = 0.4; +static const stg_meters_t DEFAULT_RANGER_SIZEZ = 0.05; +static const stg_meters_t DEFAULT_RANGER_TRANSDUCER_SIZEX = 0.01; +static const stg_meters_t DEFAULT_RANGER_TRANSDUCER_SIZEY = 0.04; +static const stg_meters_t DEFAULT_RANGER_TRANSDUCER_SIZEZ = 0.04; static const stg_meters_t DEFAULT_RANGER_RANGEMAX = 5.0; static const stg_meters_t DEFAULT_RANGER_RANGEMIN = 0.0; static const unsigned int DEFAULT_RANGER_RAYCOUNT = 3; @@ -113,12 +116,16 @@ stg_geom_t geom; memset( &geom, 0, sizeof(geom)); // no size + geom.size.x = DEFAULT_RANGER_SIZEX; + geom.size.y = DEFAULT_RANGER_SIZEY; + geom.size.z = DEFAULT_RANGER_SIZEZ; this->SetGeom( geom ); samples = NULL; sensor_count = DEFAULT_RANGER_SENSORCOUNT; sensors = new stg_ranger_sensor_t[sensor_count]; + // spread the transducers around the ranger's body double offset = MIN(geom.size.x, geom.size.y) / 2.0; // create default ranger config @@ -127,11 +134,11 @@ sensors[c].pose.a = (2.0*M_PI)/sensor_count * c; sensors[c].pose.x = offset * cos( sensors[c].pose.a ); sensors[c].pose.y = offset * sin( sensors[c].pose.a ); - sensors[c].pose.z = 0;//geom.size.z / 2.0; // half way up + sensors[c].pose.z = geom.size.z / 2.0; // half way up - sensors[c].size.x = DEFAULT_RANGER_SIZEX; - sensors[c].size.y = DEFAULT_RANGER_SIZEY; - sensors[c].size.z = DEFAULT_RANGER_SIZEZ; + sensors[c].size.x = DEFAULT_RANGER_TRANSDUCER_SIZEX; + sensors[c].size.y = DEFAULT_RANGER_TRANSDUCER_SIZEY; + sensors[c].size.z = DEFAULT_RANGER_TRANSDUCER_SIZEZ; sensors[c].bounds_range.min = DEFAULT_RANGER_RANGEMIN; sensors[c].bounds_range.max = DEFAULT_RANGER_RANGEMAX;; @@ -356,11 +363,6 @@ { stg_ranger_sensor_t* rngr = &sensors[s]; - //double dx = rngr->size.x/2.0; - //double dy = rngr->size.y/2.0; - //double dz = rngr->size.z/2.0; - - // sensor FOV double sidelen = samples[s]; double da = rngr->fov/2.0; @@ -384,12 +386,13 @@ glDepthMask( GL_FALSE ); glPolygonMode( GL_FRONT_AND_BACK, GL_FILL ); PushColor( 0, 1, 0, 0.1 ); // transparent pale green - glEnableClientState( GL_VERTEX_ARRAY ); + //glEnableClientState( GL_VERTEX_ARRAY ); glVertexPointer( 3, GL_FLOAT, 0, pts ); glDrawArrays( GL_TRIANGLES, 0, 3 * sensor_count ); // restore state glDepthMask( GL_TRUE ); + //glDisableClientState( GL_VERTEX_ARRAY ); PopColor(); } Modified: code/stage/trunk/worlds/everything.world =================================================================== --- code/stage/trunk/worlds/everything.world 2008-07-04 19:55:31 UTC (rev 6760) +++ code/stage/trunk/worlds/everything.world 2008-07-04 21:53:04 UTC (rev 6761) @@ -18,8 +18,8 @@ window( size [ 1059.000 541.000 ] - center [-3.707 -1.447] - scale 25.877 # pixels per meter + center [-6.333 2.011] + scale 80.217 # pixels per meter ) floorplan( @@ -47,44 +47,44 @@ puck( pose [-9.114 2.467 -105.501 ] color "red" ) puck( pose [-9.045 2.624 -37.717 ] color "purple" ) -puck( pose [-8.959 2.752 -461.643 ] color "orange" ) +puck( pose [-8.959 2.752 -101.643 ] color "orange" ) +ranger( alwayson 1 ) + + sicklaser( pose [0.030 0.000 0.000 ] alwayson 1 ) + + # extend the pioneer2dx definition from pioneer.inc # define trickedoutpioneer pioneer2dx ( - sicklaser( alwayson 1 - pose [0.030 0.000 0.000 ] - fiducial( range_max 8 range_max_id 5 ) + ranger( alwayson 1 ) - blobfinder( alwayson 1 + sicklaser( pose [0.030 0.000 0.000 ] alwayson 1 ) + + fiducial( range_max 8 range_max_id 5 ) + + blobfinder( channel_count 6 channels [ "red" "blue" "green" "cyan" "yellow" "magenta" ] + alwayson 1 ) - ) + + #camera( alwayson 1 ) - fiducial_return 17 gripper_return 0 localization "gps" localization_origin [ 0 0 0 ] - -# bumper( bcount 3 -# blength 0.2 -# bpose[0] [0 -0.165 90] -# bpose[1] [0 0.165 -90] -# bpose[2] [-0.26 0 0] -# blength[2] 0.1 # set the length of a single bumper -# ) ) trickedoutpioneer ( name "robot1" - pose [-10.071 3.186 -722.333] + pose [-10.071 3.186 -2.333] #gripper( pose [0.23 0.000 0.000] color "gray" ) #speech() @@ -105,21 +105,21 @@ fiducial_return 18 color "blue" name "p2" - pose [-6.009 2.481 -194.220] + pose [-6.009 2.481 165.780] ) trickedoutpioneer ( color "green" name "p3" - pose [-6.492 2.156 -199.781] + pose [-6.492 2.156 160.219] ) trickedoutpioneer ( color "cyan" name "p4" - pose [-7.641 3.989 -487.216] + pose [-7.641 3.989 -127.216] ) trickedoutpioneer @@ -165,5 +165,5 @@ roomba( name "roomba1" - pose [-9 0.5 0] + pose [-9.000 0.500 0.000] ) Modified: code/stage/trunk/worlds/pioneer.inc =================================================================== --- code/stage/trunk/worlds/pioneer.inc 2008-07-04 19:55:31 UTC (rev 6760) +++ code/stage/trunk/worlds/pioneer.inc 2008-07-04 21:53:04 UTC (rev 6761) @@ -52,7 +52,7 @@ # use the sonar array defined above with a small vertical offset to # drop the sensors into the robot body - p2dx_sonar( pose4 [0.04 0 -0.03 0] ) + #p2dx_sonar( pose4 [0.04 0 -0.03 0] ) # differential steering model drive "diff" Modified: code/stage/trunk/worlds/swarmbenchmark/cave.world =================================================================== --- code/stage/trunk/worlds/swarmbenchmark/cave.world 2008-07-04 19:55:31 UTC (rev 6760) +++ code/stage/trunk/worlds/swarmbenchmark/cave.world 2008-07-04 21:53:04 UTC (rev 6761) @@ -8,17 +8,17 @@ 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 +interval_real 100 # 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 [ -61.500 -50.000 ] scale 51.828 + interval 10 ) floorplan @@ -32,10 +32,11 @@ define rob fancypioneer2dx ( fancysicklaser( pose [ 0.040 0.000 0.000 ] samples 180 ) + ranger( pose4 [ 0 0 -0.05 0 ] ) + ctrl "swarmbenchmark" ) - define redrob rob( color "red" ) define greenrob rob( color "green" ) define magentarob rob( color "magenta" ) @@ -58,7 +59,7 @@ redrob( pose [-4.393 4.938 114.269] ) redrob( pose [-6.277 4.252 -97.494] ) redrob( pose [-5.202 5.566 -89.743] ) - +# bluerob( pose [-7.014 6.409 -103.088] ) bluerob( pose [-6.139 5.649 -29.509] ) bluerob( pose [-6.315 6.277 -35.740] ) @@ -69,7 +70,7 @@ bluerob( pose [-6.810 4.727 -41.884] ) bluerob( pose [-7.415 7.485 -14.803] ) bluerob( pose [-6.722 7.120 -70.950] ) - +# greenrob( pose [-2.686 6.660 -20.602] ) greenrob( pose [-3.274 5.174 63.058] ) greenrob( pose [-2.477 6.075 -93.720] ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <alexcb@us...> - 2008-07-04 12:55:25
|
Revision: 6760 http://playerstage.svn.sourceforge.net/playerstage/?rev=6760&view=rev Author: alexcb Date: 2008-07-04 12:55:31 -0700 (Fri, 04 Jul 2008) Log Message: ----------- fixed drawing issue with laser and camera Modified Paths: -------------- code/stage/trunk/libstage/model_camera.cc code/stage/trunk/libstage/model_laser.cc Modified: code/stage/trunk/libstage/model_camera.cc =================================================================== --- code/stage/trunk/libstage/model_camera.cc 2008-07-04 18:18:25 UTC (rev 6759) +++ code/stage/trunk/libstage/model_camera.cc 2008-07-04 19:55:31 UTC (rev 6760) @@ -237,16 +237,17 @@ //TODO create lines outlining camera frustrum, then iterate over each depth measurement and create a square void StgModelCamera::DataVisualize( void ) -{ +{ + if( _frame_data == NULL || !showCameraData ) return; - + float w_fov = _camera.horizFov(); float h_fov = _camera.vertFov(); - + float start_fov = w_fov / 2.0 + 180.0; //start at right float start_vert_fov = h_fov / 2.0 + 90.0; //start at top - + int w = _width; int h = _height; float a_space = w_fov / w; //degrees between each sample @@ -284,7 +285,6 @@ _valid_vertexbuf_cache = true; } - glTranslatef( 0, 0, CAMERA_HEIGHT / 2.0 ); glDisable( GL_CULL_FACE ); glPolygonMode( GL_FRONT_AND_BACK, GL_FILL ); //glBegin( GL_QUADS ); Modified: code/stage/trunk/libstage/model_laser.cc =================================================================== --- code/stage/trunk/libstage/model_laser.cc 2008-07-04 18:18:25 UTC (rev 6759) +++ code/stage/trunk/libstage/model_laser.cc 2008-07-04 19:55:31 UTC (rev 6760) @@ -310,6 +310,8 @@ if ( ! (showLaserData || showLaserStrikes) ) return; + glPushMatrix(); + // we only regenerate the list if there's new data if( data_dirty ) { @@ -383,4 +385,5 @@ glCallList( data_dl ); + glPopMatrix(); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <alexcb@us...> - 2008-07-04 11:18:16
|
Revision: 6759 http://playerstage.svn.sourceforge.net/playerstage/?rev=6759&view=rev Author: alexcb Date: 2008-07-04 11:18:25 -0700 (Fri, 04 Jul 2008) Log Message: ----------- fixed stall icon positioning for perspective camera mode Modified Paths: -------------- code/stage/trunk/CMakeLists.txt code/stage/trunk/libstage/camera.cc code/stage/trunk/libstage/canvas.cc code/stage/trunk/libstage/model.cc code/stage/trunk/libstage/model_camera.cc code/stage/trunk/libstage/stage.hh code/stage/trunk/worlds/everything.world code/stage/trunk/worlds/fasr.world code/stage/trunk/worlds/pantilt.inc code/stage/trunk/worlds/swarmbenchmark/cave.world Modified: code/stage/trunk/CMakeLists.txt =================================================================== --- code/stage/trunk/CMakeLists.txt 2008-07-04 17:44:35 UTC (rev 6758) +++ code/stage/trunk/CMakeLists.txt 2008-07-04 18:18:25 UTC (rev 6759) @@ -80,6 +80,7 @@ include_directories( . libstage replace + /opt/local/include/ ${GLIB_INCLUDE_DIRS} ${LIBPNG_INCLUDE_DIRS} ${CMAKE_INCLUDE_PATH} Modified: code/stage/trunk/libstage/camera.cc =================================================================== --- code/stage/trunk/libstage/camera.cc 2008-07-04 17:44:35 UTC (rev 6758) +++ code/stage/trunk/libstage/camera.cc 2008-07-04 18:18:25 UTC (rev 6759) @@ -14,8 +14,9 @@ //perspective camera //perspective camera StgPerspectiveCamera::StgPerspectiveCamera( void ) : - _x( 0 ), _y( 0 ), _z( 0 ), _pitch( 90 ), _yaw( 0 ), _z_near( 0.2 ), _z_far( 40.0 ), _vert_fov( 40 ), _horiz_fov( 60 ), _aspect( 1.0 ) + _z_near( 0.2 ), _z_far( 40.0 ), _vert_fov( 40 ), _horiz_fov( 60 ), _aspect( 1.0 ) { + setYaw( 90 ); } void StgPerspectiveCamera::move( float x, float y, float z ) Modified: code/stage/trunk/libstage/canvas.cc =================================================================== --- code/stage/trunk/libstage/canvas.cc 2008-07-04 17:44:35 UTC (rev 6758) +++ code/stage/trunk/libstage/canvas.cc 2008-07-04 18:18:25 UTC (rev 6759) @@ -65,6 +65,7 @@ perspective_camera.setPose( -3.0, 0.0, 1.0 ); perspective_camera.setPitch( 70.0 ); //look down + current_camera = &camera; startx = starty = 0; //panx = pany = stheta = sphi = 0.0; @@ -925,10 +926,12 @@ if( perspectiveCam == true ) { perspective_camera.setAspect( static_cast< float >( w() ) / static_cast< float >( h() ) ); perspective_camera.SetProjection(); + current_camera = &perspective_camera; } else { stg_bounds3d_t extent = world->GetExtent(); camera.SetProjection( w(), h(), extent.y.min, extent.y.max ); camera.Draw(); + current_camera = &camera; } // enable vertex arrays Modified: code/stage/trunk/libstage/model.cc =================================================================== --- code/stage/trunk/libstage/model.cc 2008-07-04 17:44:35 UTC (rev 6758) +++ code/stage/trunk/libstage/model.cc 2008-07-04 18:18:25 UTC (rev 6759) @@ -915,9 +915,17 @@ // draw speech bubble if( say_string ) { - float stheta = -dtor( canvas->camera.getPitch() ); - float sphi = dtor( canvas->camera.getYaw() ); + float stheta = -dtor( canvas->current_camera->pitch() ); + float sphi = dtor( canvas->current_camera->yaw() ); float scale = canvas->camera.getScale(); + if( canvas->perspectiveCam == true ) { + sphi = atan2( + ( pose.x - canvas->current_camera->x() ) + , + ( pose.y - canvas->current_camera->y() ) + ); + stheta = -stheta; + } glPushMatrix(); @@ -969,8 +977,16 @@ void StgModel::DrawImage( uint32_t texture_id, Stg::StgCanvas* canvas, float alpha ) { - float stheta = -dtor( canvas->camera.getPitch() ); - float sphi = dtor( canvas->camera.getYaw() ); + float stheta = -dtor( canvas->current_camera->pitch() ); + float sphi = dtor( canvas->current_camera->yaw() ); + if( canvas->perspectiveCam == true ) { + sphi = atan2( + ( pose.x - canvas->current_camera->x() ) + , + ( pose.y - canvas->current_camera->y() ) + ); + stheta = -stheta; + } glEnable(GL_TEXTURE_2D); glBindTexture( GL_TEXTURE_2D, texture_id ); Modified: code/stage/trunk/libstage/model_camera.cc =================================================================== --- code/stage/trunk/libstage/model_camera.cc 2008-07-04 17:44:35 UTC (rev 6758) +++ code/stage/trunk/libstage/model_camera.cc 2008-07-04 18:18:25 UTC (rev 6759) @@ -19,8 +19,8 @@ Option StgModelCamera::showCameraData( "Show Camera Data", "show_camera", "", true ); -static const stg_size_t DEFAULT_SIZE = {0.15, 0.15, 0.2 }; -static const char DEFAULT_GEOM_COLOR[] = "blue"; +static const stg_size_t DEFAULT_SIZE = {0.1, 0.07, 0.05 }; +static const char DEFAULT_GEOM_COLOR[] = "black"; /** @ingroup model Modified: code/stage/trunk/libstage/stage.hh =================================================================== --- code/stage/trunk/libstage/stage.hh 2008-07-04 17:44:35 UTC (rev 6758) +++ code/stage/trunk/libstage/stage.hh 2008-07-04 18:18:25 UTC (rev 6759) @@ -1781,12 +1781,24 @@ class StgCamera { + protected: + float _pitch; //left-right (about y) + float _yaw; //up-down (about x) + float _x, _y, _z; + public: - StgCamera() { } + StgCamera() : _pitch( 0 ), _yaw( 0 ), _x( 0 ), _y( 0 ), _z( 0 ) { } virtual ~StgCamera() { } virtual void Draw( void ) const = 0; + inline float yaw( void ) const { return _yaw; } + inline float pitch( void ) const { return _pitch; } + + inline float x( void ) const { return _x; } + inline float y( void ) const { return _y; } + inline float z( void ) const { return _z; } + //TODO data should be passed in somehow else. (at least min/max stuff) //virtual void SetProjection( float pixels_width, float pixels_height, float y_min, float y_max ) const = 0; }; @@ -1794,9 +1806,6 @@ class StgPerspectiveCamera : public StgCamera { private: - float _x, _y, _z; - float _pitch; //left-right (about y) - float _yaw; //up-down (about x) float _z_near; float _z_far; @@ -1826,8 +1835,6 @@ _aspect = aspect; } inline void setYaw( float yaw ) { _yaw = yaw; } - inline float yaw( void ) const { return _yaw; } - inline float pitch( void ) const { return _pitch; } inline float horizFov( void ) const { return _horiz_fov; } inline float vertFov( void ) const { return _vert_fov; } inline void addYaw( float yaw ) { _yaw += yaw; } @@ -1848,13 +1855,10 @@ class StgOrthoCamera : public StgCamera { private: - float _x, _y, _z; - float _pitch; //left-right (about y) - float _yaw; //up-down (about x) float _scale; public: - StgOrthoCamera( void ) : _x( 0 ), _y( 0 ), _z( 0 ), _pitch( 0 ), _yaw( 0 ), _scale( 15 ) { } + StgOrthoCamera( void ) : _scale( 15 ) { } virtual void Draw() const; virtual void SetProjection( float pixels_width, float pixels_height, float y_min, float y_max ) const; @@ -1913,6 +1917,7 @@ private: GlColorStack colorstack; + StgCamera* current_camera; StgOrthoCamera camera; StgPerspectiveCamera perspective_camera; Modified: code/stage/trunk/worlds/everything.world =================================================================== --- code/stage/trunk/worlds/everything.world 2008-07-04 17:44:35 UTC (rev 6758) +++ code/stage/trunk/worlds/everything.world 2008-07-04 18:18:25 UTC (rev 6759) @@ -64,7 +64,6 @@ ) ) - camera( alwayson 1 ) fiducial_return 17 gripper_return 0 @@ -94,8 +93,11 @@ trickedoutpioneer ( color "red" - name "redrobot" + name "redrobot_w_camera" pose [-5.645 3.034 -162.098] + camera( alwayson 1 + + ) ) trickedoutpioneer Modified: code/stage/trunk/worlds/fasr.world =================================================================== --- code/stage/trunk/worlds/fasr.world 2008-07-04 17:44:35 UTC (rev 6758) +++ code/stage/trunk/worlds/fasr.world 2008-07-04 18:18:25 UTC (rev 6759) @@ -21,10 +21,10 @@ # configure the GUI window window ( - size [ 1641.000 953.000 ] - center [0.265 0.145] - rotate [ -57.500 -29.500 ] - scale 62.271 + size [ 833.000 605.000 ] + center [0.000 0.000] + rotate [ -47.500 -12.500 ] + scale 32.344 show_data 0 show_flags 1 @@ -59,15 +59,17 @@ ( color "red" - sicklaser( pose [ 0.040 0.000 0.000 ] samples 30 range_max 5 laser_return 2 ) - camera( pose [ 0.000 0.000 0.000 ] width 100 height 100 horizfov 70 vertfov 40 yaw 0 ) + sicklaser( pose [ 0.040 0.000 0.000 ] samples 30 range_max 5 laser_return 2 + + camera( pose [ 0.000 0.000 0.000 ] width 100 height 100 horizfov 70 vertfov 40 yaw 0 ) + ) ctrl "fasr" - # say "Autolab" +# say "Autolab" ) -autorob( pose [4.461 6.406 1.930] ) +autorob( pose [1.633 4.021 1.930] ) #autorob( pose [6.635 6.458 -52.629] ) #autorob( pose [6.385 5.805 -87.082] ) #autorob( pose [7.004 5.327 170.536] ) Modified: code/stage/trunk/worlds/pantilt.inc =================================================================== --- code/stage/trunk/worlds/pantilt.inc 2008-07-04 17:44:35 UTC (rev 6758) +++ code/stage/trunk/worlds/pantilt.inc 2008-07-04 18:18:25 UTC (rev 6759) @@ -17,6 +17,17 @@ ) #TODO make a fancier model -#define fancypantiltcamer pantiltcamera -#( -#) +define fancypantiltcamer pantiltcamera +( + blocks 1 + + # bottom + block[0].points 4 + block[0].point[0] [ -2.1 0.07 ] + block[0].point[1] [ -2.1 -0.07 ] + block[0].point[2] [ 2.1 -0.07 ] + block[0].point[3] [ 2.1 0.07 ] + block[0].z [0 0.2 ] + + +) Modified: code/stage/trunk/worlds/swarmbenchmark/cave.world =================================================================== --- code/stage/trunk/worlds/swarmbenchmark/cave.world 2008-07-04 17:44:35 UTC (rev 6758) +++ code/stage/trunk/worlds/swarmbenchmark/cave.world 2008-07-04 18:18:25 UTC (rev 6759) @@ -17,7 +17,7 @@ ( size [ 1000.000 1000.000 ] center [-0.932 -0.088] - rotate [ 0.000 0.000 ] + rotate [ -61.500 -50.000 ] scale 51.828 ) @@ -48,114 +48,114 @@ 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] ) +redrob( pose [-5.285 4.915 150.459] ) +redrob( pose [-4.432 5.655 -85.494] ) +redrob( pose [-5.518 4.157 -10.236] ) +redrob( pose [-6.007 5.008 144.441] ) +redrob( pose [-5.599 3.365 -172.038] ) +redrob( pose [-6.852 3.655 4.679] ) +redrob( pose [-7.483 4.049 -12.199] ) +redrob( pose [-4.393 4.938 114.269] ) +redrob( pose [-6.277 4.252 -97.494] ) +redrob( pose [-5.202 5.566 -89.743] ) -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] ) +bluerob( pose [-7.014 6.409 -103.088] ) +bluerob( pose [-6.139 5.649 -29.509] ) +bluerob( pose [-6.315 6.277 -35.740] ) +bluerob( pose [-7.527 6.162 -18.380] ) +bluerob( pose [-6.897 5.544 -2.394] ) +bluerob( pose [-7.535 6.860 11.282] ) +bluerob( pose [-7.332 5.061 -0.348] ) +bluerob( pose [-6.810 4.727 -41.884] ) +bluerob( pose [-7.415 7.485 -14.803] ) +bluerob( pose [-6.722 7.120 -70.950] ) -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] ) +greenrob( pose [-2.686 6.660 -20.602] ) +greenrob( pose [-3.274 5.174 63.058] ) +greenrob( pose [-2.477 6.075 -93.720] ) +greenrob( pose [-3.473 5.829 -57.467] ) +greenrob( pose [-2.462 7.492 -65.482] ) +greenrob( pose [-1.836 6.835 -59.739] ) +greenrob( pose [-1.654 6.043 -171.672] ) +greenrob( pose [-0.519 7.392 -67.052] ) +greenrob( pose [-0.563 6.815 -106.072] ) +greenrob( pose [-1.404 7.436 -110.338] ) -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] ) +magentarob( pose [1.731 7.249 -92.107] ) +magentarob( pose [2.586 6.521 -100.329] ) +magentarob( pose [3.001 5.447 -46.977] ) +magentarob( pose [3.611 7.214 -116.841] ) +magentarob( pose [2.625 7.473 -48.982] ) +magentarob( pose [3.660 6.559 -74.307] ) +magentarob( pose [3.434 5.808 -83.857] ) +magentarob( pose [0.624 7.277 -40.753] ) +magentarob( pose [2.017 6.083 -52.575] ) +magentarob( pose [0.561 6.752 4.367] ) -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] ) +yellowrob( pose [-7.548 3.117 12.515] ) +yellowrob( pose [-6.811 2.501 83.166] ) +yellowrob( pose [-7.475 2.119 -0.137] ) +yellowrob( pose [-7.052 1.708 -48.147] ) +yellowrob( pose [-6.352 3.226 -146.472] ) +yellowrob( pose [-6.323 1.862 -155.344] ) +yellowrob( pose [-5.966 2.552 -75.391] ) +yellowrob( pose [-5.358 1.495 -128.137] ) +yellowrob( pose [-5.279 2.419 32.326] ) +yellowrob( pose [-4.698 1.671 -113.009] ) -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] ) +goldrob( pose [5.834 7.276 -74.706] ) +goldrob( pose [7.335 7.494 -146.899] ) +goldrob( pose [6.407 5.942 -91.539] ) +goldrob( pose [7.258 6.175 -116.576] ) +goldrob( pose [5.541 6.778 -92.857] ) +goldrob( pose [6.564 6.902 -120.722] ) +goldrob( pose [4.799 7.285 -75.638] ) +goldrob( pose [5.271 6.005 -74.373] ) +goldrob( pose [4.769 6.595 -86.730] ) +goldrob( pose [4.340 5.941 -65.977] ) -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] ) +darkredrob( pose [-7.630 0.425 -15.747] ) +darkredrob( pose [-7.571 1.112 1.397] ) +darkredrob( pose [-6.158 1.168 32.866] ) +darkredrob( pose [-4.509 0.635 4.689] ) +darkredrob( pose [-7.549 -0.241 1.423] ) +darkredrob( pose [-6.728 0.180 -22.542] ) +darkredrob( pose [-6.824 0.826 -11.285] ) +darkredrob( pose [-6.015 0.257 -2.367] ) +darkredrob( pose [-5.195 0.771 -64.592] ) +darkredrob( pose [-5.483 -0.245 70.044] ) -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] ) +cyanrob( pose [-2.544 4.684 -134.461] ) +cyanrob( pose [-0.366 3.260 -44.509] ) +cyanrob( pose [-1.760 4.277 -118.276] ) +cyanrob( pose [-2.211 5.401 -160.089] ) +cyanrob( pose [-2.281 3.871 17.255] ) +cyanrob( pose [-1.440 3.502 -67.215] ) +cyanrob( pose [-2.532 2.902 -6.938] ) +cyanrob( pose [-1.919 2.877 -13.437] ) +cyanrob( pose [-1.725 1.970 -17.763] ) +cyanrob( pose [-1.483 5.050 8.818] ) -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] ) +orangerob( pose [-7.652 -2.012 -0.754] ) +orangerob( pose [-6.934 -2.155 -40.701] ) +orangerob( pose [-6.798 -1.520 -93.732] ) +orangerob( pose [-7.525 -0.994 -9.450] ) +orangerob( pose [-6.679 -0.670 -70.140] ) +orangerob( pose [-7.611 -3.107 -51.626] ) +orangerob( pose [-6.656 -3.665 -70.493] ) +orangerob( pose [-6.139 -3.326 -90.309] ) +orangerob( pose [-6.163 -1.853 -115.649] ) +orangerob( pose [-6.026 -0.817 -11.811] ) -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] ) +purplerob( pose [-3.863 1.615 -84.575] ) +purplerob( pose [-2.826 1.856 -44.148] ) +purplerob( pose [-3.889 1.094 -50.194] ) +purplerob( pose [-3.124 1.034 -72.759] ) +purplerob( pose [-3.878 0.244 -74.604] ) +purplerob( pose [-2.846 0.345 -36.704] ) +purplerob( pose [-3.651 -0.504 -8.212] ) +purplerob( pose [-2.736 -0.851 -45.703] ) +purplerob( pose [-2.477 1.234 -50.431] ) +purplerob( pose [-4.471 -0.104 26.367] ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jeremy_asher@us...> - 2008-07-04 10:44:31
|
Revision: 6758 http://playerstage.svn.sourceforge.net/playerstage/?rev=6758&view=rev Author: jeremy_asher Date: 2008-07-04 10:44:35 -0700 (Fri, 04 Jul 2008) Log Message: ----------- Extended Option class to allow custom callbacks on menu option selection to permit perspective cam mode to invalidate canvas Modified Paths: -------------- code/stage/trunk/libstage/canvas.cc code/stage/trunk/libstage/option.cc code/stage/trunk/libstage/option.hh Modified: code/stage/trunk/libstage/canvas.cc =================================================================== --- code/stage/trunk/libstage/canvas.cc 2008-07-04 17:07:49 UTC (rev 6757) +++ code/stage/trunk/libstage/canvas.cc 2008-07-04 17:44:35 UTC (rev 6758) @@ -201,12 +201,11 @@ int StgCanvas::handle(int event) { - - switch(event) - { - case FL_MOUSEWHEEL: - if( selected_models ) + switch(event) { + case FL_MOUSEWHEEL: + if( selected_models ) + { // rotate all selected models for( GList* it = selected_models; it; it=it->next ) { @@ -214,7 +213,7 @@ mod->AddToPose( 0,0,0, 0.1*(double)Fl::event_dy() ); } redraw(); - } + } else { if( perspectiveCam == true ) { @@ -759,6 +758,11 @@ printf( "Saved %s\n", filename ); } +void perspectiveCb( Fl_Widget* w, void* p ) +{ + StgCanvas* canvas = static_cast<StgCanvas*>( p ); + canvas->invalidate(); +} void StgCanvas::createMenuItems( Fl_Menu_Bar* menu, std::string path ) { @@ -773,6 +777,7 @@ showGrid.createMenuItem( menu, path ); showStatus.createMenuItem( menu, path ); perspectiveCam.createMenuItem( menu, path ); + perspectiveCam.menuCallback( perspectiveCb, this ); showOccupancy.createMenuItem( menu, path ); showTrailArrows.createMenuItem( menu, path ); showTrails.createMenuItem( menu, path ); Modified: code/stage/trunk/libstage/option.cc =================================================================== --- code/stage/trunk/libstage/option.cc 2008-07-04 17:07:49 UTC (rev 6757) +++ code/stage/trunk/libstage/option.cc 2008-07-04 17:44:35 UTC (rev 6758) @@ -9,17 +9,13 @@ wf_token( tok ), shortcut( key ), menu( NULL ), -menuIndex( -1 ) +menuCb( NULL ) { } -Option::Option( const Option& o ) : -optName( o.optName ), -value( o.value ), -wf_token( o.wf_token ), -shortcut( o.shortcut ), -menu( o.menu ), -menuIndex( o.menuIndex ) -{ } +Fl_Menu_Item* getMenuItem( Fl_Menu_* menu, int i ) { + const Fl_Menu_Item* mArr = menu->menu(); + return const_cast<Fl_Menu_Item*>( &mArr[ i ] ); +} void Option::Load( Worldfile* wf, int section ) @@ -32,13 +28,20 @@ wf->WriteInt(section, wf_token.c_str(), value ); } -void toggleCb( Fl_Widget* w, void* p ) +void Option::toggleCb( Fl_Widget* w, void* p ) { //Fl_Menu_* menu = static_cast<Fl_Menu_*>( w ); Option* opt = static_cast<Option*>( p ); opt->invert(); + if ( opt->menuCb ) + opt->menuCb( NULL, opt->menuCbParam ); } +void Option::menuCallback( Fl_Callback* cb, void* p ) { + menuCb = cb; + menuCbParam = p; +} + void Option::createMenuItem( Fl_Menu_Bar* m, std::string path ) { menu = m; @@ -47,15 +50,14 @@ menuIndex = menu->add( path.c_str(), shortcut.c_str(), toggleCb, this, FL_MENU_TOGGLE | (value ? FL_MENU_VALUE : 0 ) ); -} +} void Option::set( bool val ) { value = val; if( menu ) { - const Fl_Menu_Item* mArr = menu->menu(); - Fl_Menu_Item* item = const_cast<Fl_Menu_Item*>( &mArr[ menuIndex ] ); + Fl_Menu_Item* item = getMenuItem( menu, menuIndex ); value ? item->set() : item->clear(); } } Modified: code/stage/trunk/libstage/option.hh =================================================================== --- code/stage/trunk/libstage/option.hh 2008-07-04 17:07:49 UTC (rev 6757) +++ code/stage/trunk/libstage/option.hh 2008-07-04 17:44:35 UTC (rev 6758) @@ -29,10 +29,11 @@ std::string shortcut; Fl_Menu_* menu; int menuIndex; + Fl_Callback* menuCb; + void* menuCbParam; public: Option( std::string n, std::string tok, std::string key, bool v ); - Option( const Option& o ); const std::string name() const { return optName; } inline bool val() const { return value; } @@ -50,6 +51,8 @@ void createMenuItem( Fl_Menu_Bar* menu, std::string path ); + void menuCallback( Fl_Callback* cb, void* p ); + static void toggleCb( Fl_Widget* w, void* p ); void Load( Worldfile* wf, int section ); void Save( Worldfile* wf, int section ); }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <alexcb@us...> - 2008-07-04 10:07:39
|
Revision: 6757 http://playerstage.svn.sourceforge.net/playerstage/?rev=6757&view=rev Author: alexcb Date: 2008-07-04 10:07:49 -0700 (Fri, 04 Jul 2008) Log Message: ----------- camera model drawing Modified Paths: -------------- code/stage/trunk/libstage/model_camera.cc Modified: code/stage/trunk/libstage/model_camera.cc =================================================================== --- code/stage/trunk/libstage/model_camera.cc 2008-07-04 02:44:27 UTC (rev 6756) +++ code/stage/trunk/libstage/model_camera.cc 2008-07-04 17:07:49 UTC (rev 6757) @@ -19,6 +19,9 @@ Option StgModelCamera::showCameraData( "Show Camera Data", "show_camera", "", true ); +static const stg_size_t DEFAULT_SIZE = {0.15, 0.15, 0.2 }; +static const char DEFAULT_GEOM_COLOR[] = "blue"; + /** @ingroup model @defgroup model_camera Camera model @@ -110,19 +113,18 @@ printf( "Unable to use Camera Model - it must be run with a GUI world\n" ); assert( 0 ); } - _canvas = world_gui->GetCanvas(); - // Set up sensible defaults _camera.setPitch( 90.0 ); - SetColor( stg_lookup_color( "green" ) ); - stg_geom_t geom; - memset( &geom, 0, sizeof(geom)); // no size - //TODO can't draw this as it blocks the laser + memset( &geom, 0, sizeof(geom)); + geom.size = DEFAULT_SIZE; SetGeom( geom ); + // set default color + SetColor( stg_lookup_color(DEFAULT_GEOM_COLOR)); + registerOption( &showCameraData ); Startup(); @@ -198,8 +200,9 @@ glViewport( 0, 0, _width, _height ); _camera.update(); _camera.SetProjection(); + float height = GetGlobalPose().z; //TODO reposition the camera so it isn't inside the model ( or don't draw the parent when calling renderframe ) - _camera.setPose( parent->GetGlobalPose().x, parent->GetGlobalPose().y, CAMERA_HEIGHT ); //TODO use something smarter than a #define - make it configurable + _camera.setPose( parent->GetGlobalPose().x, parent->GetGlobalPose().y, height ); //TODO use something smarter than a #define - make it configurable _camera.setYaw( rtod( parent->GetGlobalPose().a ) - 90.0 - _yaw_offset ); //-90.0 points the camera infront of the robot instead of pointing right _camera.setPitch( 90.0 - _pitch_offset ); _camera.Draw(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |