Revision: 6841 http://playerstage.svn.sourceforge.net/playerstage/?rev=6841&view=rev Author: rtv Date: 2008-07-10 23:31:47 -0700 (Thu, 10 Jul 2008)
Log Message: ----------- fixed long-standing model geometry bug Modified Paths: -------------- code/stage/trunk/docsrc/stage.txt code/stage/trunk/libstage/block.cc code/stage/trunk/libstage/canvas.cc code/stage/trunk/libstage/model.cc code/stage/trunk/libstage/model_laser.cc code/stage/trunk/libstage/stage.hh code/stage/trunk/libstage/world.cc code/stage/trunk/libstage/worldgui.cc code/stage/trunk/worlds/fasr.world Added Paths: ----------- code/stage/trunk/worlds/CMakeLists.txt code/stage/trunk/worlds/benchmark/CMakeLists.txt Modified: code/stage/trunk/docsrc/stage.txt =================================================================== --- code/stage/trunk/docsrc/stage.txt 2008-07-10 22:45:42 UTC (rev 6840) +++ code/stage/trunk/docsrc/stage.txt 2008-07-11 06:31:47 UTC (rev 6841) @@ -81,9 +81,10 @@ <ul> <li>Richard Vaughan <tt>([EMAIL PROTECTED])</tt> -<li>Brian Gerkey <tt>([EMAIL PROTECTED])</tt> +<li>Brian Gerkey <tt>([EMAIL PROTECTED])</tt> <li>Reed Hedges <tt>([EMAIL PROTECTED])</tt> -<li>Andrew Howard <tt>([EMAIL PROTECTED])</tt> +<li>Andrew Howard <tt>([EMAIL PROTECTED])</tt> +<li>Toby Collett <<tt>([EMAIL PROTECTED])</tt> <li>Pooya Karimian <tt>([EMAIL PROTECTED])</tt> <li>Jeremy Asher <tt>([EMAIL PROTECTED])</tt> <li>Alex Couture-Beil <tt>([EMAIL PROTECTED])</tt> Modified: code/stage/trunk/libstage/block.cc =================================================================== --- code/stage/trunk/libstage/block.cc 2008-07-10 22:45:42 UTC (rev 6840) +++ code/stage/trunk/libstage/block.cc 2008-07-11 06:31:47 UTC (rev 6841) @@ -145,6 +145,7 @@ local.z = zmin; global = mod->LocalToGlobal( local ); + //global = local; pts_global_pixels[p].x = mod->GetWorld()->MetersToPixels( global.x ); pts_global_pixels[p].y = mod->GetWorld()->MetersToPixels( global.y ); Modified: code/stage/trunk/libstage/canvas.cc =================================================================== --- code/stage/trunk/libstage/canvas.cc 2008-07-10 22:45:42 UTC (rev 6840) +++ code/stage/trunk/libstage/canvas.cc 2008-07-11 06:31:47 UTC (rev 6841) @@ -410,7 +410,8 @@ world->TogglePause(); break; case ' ': // space bar - //current_camera->reset(); + + //current_camera->reset(); if ( wf ) current_camera->Load( wf, wf->LookupEntity( "window" ) ); else @@ -659,6 +660,10 @@ if( showBlocks ) DrawBlocks(); + // useful debug - puts a point at the origin of each model + //for( GList* it = world->StgWorld::children; it; it=it->next ) + // ((StgModel*)it->data)->DrawOriginTree(); + // draw the model-specific visualizations if( showData ) { if ( visualizeAll ) { Modified: code/stage/trunk/libstage/model.cc =================================================================== --- code/stage/trunk/libstage/model.cc 2008-07-10 22:45:42 UTC (rev 6840) +++ code/stage/trunk/libstage/model.cc 2008-07-11 06:31:47 UTC (rev 6841) @@ -571,7 +571,7 @@ // should one day do all this with affine transforms for neatness? stg_pose_t StgModel::LocalToGlobal( stg_pose_t pose ) { - return pose_sum( pose_sum( geom.pose, GetGlobalPose()), pose ); + return pose_sum( pose_sum( GetGlobalPose(), geom.pose ), pose ); } stg_point3_t StgModel::LocalToGlobal( stg_point3_t point ) @@ -868,12 +868,67 @@ } } +void StgModel::PushMyPose() +{ + world->PushPose(); + world->ShiftPose( &pose ); +} + +void StgModel::PopPose() +{ + world->PopPose(); +} + +void StgModel::ShiftPose( stg_pose_t* pose ) +{ + world->ShiftPose( pose ); +} + +void StgModel::ShiftToTop() +{ + stg_pose_t top; + bzero( &top, sizeof(top)); + top.z = geom.size.z; + ShiftPose( &top ); +} + +void StgModel::DrawOriginTree() +{ + PushMyPose(); + + world->DrawPose(); + + ShiftToTop(); + + for( GList* it=children; it; it=it->next ) + ((StgModel*)it->data)->DrawOriginTree(); + + PopPose(); +} + +void StgWorld::DrawPose() +{ + PushColor( 0,0,0,1 ); + glPointSize( 4 ); + + stg_pose_t* gpose = PeekPose(); + + glBegin( GL_POINTS ); + glVertex3f( gpose->x, gpose->y, gpose->z ); + glEnd(); + + PopColor(); +} + + void StgModel::DrawBlocksTree( ) { PushLocalCoords(); + LISTMETHOD( children, StgModel*, DrawBlocksTree ); + + gl_pose_shift( &geom.pose ); DrawBlocks(); - LISTMETHOD( children, StgModel*, DrawBlocksTree ); PopCoords(); } @@ -904,13 +959,13 @@ // TODO - fix this! //if( rebuild_displaylist ) - { + //{ //rebuild_displaylist = false; //glNewList( blocks_dl, GL_COMPILE ); LISTMETHOD( this->blocks, StgBlock*, Draw ); //glEndList(); - } + //} //glCallList( blocks_dl ); } @@ -924,7 +979,7 @@ glTranslatef( 0,0, parent->geom.size.z ); gl_pose_shift( &pose ); - gl_pose_shift( &geom.pose ); + //gl_pose_shift( &geom.pose ); // useful debug - draw a point at the local origin // PushColor( color ); Modified: code/stage/trunk/libstage/model_laser.cc =================================================================== --- code/stage/trunk/libstage/model_laser.cc 2008-07-10 22:45:42 UTC (rev 6840) +++ code/stage/trunk/libstage/model_laser.cc 2008-07-11 06:31:47 UTC (rev 6841) @@ -26,13 +26,8 @@ static const unsigned int DEFAULT_SAMPLES = 180; static const stg_msec_t DEFAULT_INTERVAL_MS = 100; static const unsigned int DEFAULT_RESOLUTION = 1; +static const char* DEFAULT_COLOR = "blue"; -static const char DEFAULT_GEOM_COLOR[] = "blue"; -//static const char BRIGHT_COLOR[] = "blue"; -//static const char CFG_COLOR[] = "light steel blue"; -//static const char COLOR[] = "steel blue"; -//static const char FILL_COLOR[] = "powder blue"; - Option StgModelLaser::showLaserData( "Show Laser Data", "show_laser", "", true ); Option StgModelLaser::showLaserStrikes( "Show Laser Data", "show_laser_strikes", "", false ); @@ -55,12 +50,11 @@ range_min 0.0 range_max 8.0 fov 3.14159 - laser_sample_skip 1 + resolution 1 # model properties size [ 0.15 0.15 0.2 ] color "blue" - watts 17.5 # approximately correct for SICK LMS200 ) @endverbatim @@ -74,7 +68,7 @@ the maximum range reported by the scanner, in meters. The scanner will not detect objects beyond this range. - fov <float>\n the angular field of view of the scanner, in radians. -- laser_sample_skip <int>\n +- resolution <int>\n Only calculate the true range of every nth laser sample. The missing samples are filled in with a linear interpolation. Generally it would be better to use fewer samples, but some (poorly implemented!) programs expect a fixed number of samples. Setting this number > 1 allows you to reduce the amount of computation required for your fixed-size laser vector. */ @@ -95,7 +89,7 @@ SetGeom( geom ); // set default color - SetColor( stg_lookup_color(DEFAULT_GEOM_COLOR)); + SetColor( stg_lookup_color(DEFAULT_COLOR)); range_min = DEFAULT_MINRANGE; range_max = DEFAULT_MAXRANGE; @@ -130,7 +124,7 @@ range_min = wf->ReadLength( wf_entity, "range_min", range_min); range_max = wf->ReadLength( wf_entity, "range_max", range_max ); fov = wf->ReadAngle( wf_entity, "fov", fov ); - resolution = wf->ReadInt( wf_entity, "laser_sample_skip", resolution ); + resolution = wf->ReadInt( wf_entity, "resolution", resolution ); if( resolution < 1 ) { Modified: code/stage/trunk/libstage/stage.hh =================================================================== --- code/stage/trunk/libstage/stage.hh 2008-07-10 22:45:42 UTC (rev 6840) +++ code/stage/trunk/libstage/stage.hh 2008-07-11 06:31:47 UTC (rev 6841) @@ -112,7 +112,7 @@ /// Author string const char AUTHORS[] = - "Richard Vaughan, Brian Gerkey, Andrew Howard, Reed Hedges, Pooya Karimian and contributors."; + "Richard Vaughan, Brian Gerkey, Andrew Howard, Reed Hedges, Pooya Karimian, Toby Collett, Jeremy Asher, Alex Couture-Beil and contributors."; /// Project website string const char WEBSITE[] = "http://playerstage.org"; @@ -960,46 +960,50 @@ private: static GList* world_list; - /** Update all existing worlds */ + + /** Coordinate system stack - experimental*/ + GQueue* csstack; + + void PushPose(); + void PopPose(); + stg_pose_t* PeekPose(); + void ShiftPose( stg_pose_t* pose ); + void DrawPose(); - static bool quit_all; // quit all worlds ASAP - static unsigned int next_id; //< initialized to zero, used tob - //allocate unique sequential world ids - static int AddBlockPixel( int x, int y, int z, - stg_render_info_t* rinfo ) ; //< used as a callback by StgModel - - //stg_usec_t real_time_next_update; - stg_usec_t real_time_start; - - bool quit; // quit this world ASAP - - // convert a distance in meters to a distance in world occupancy grid pixels - int32_t MetersToPixels( stg_meters_t x ){ return (int32_t)floor(x * ppm) ; }; - - void Initialize( const char* token, + static bool quit_all; ///< quit all worlds ASAP + static unsigned int next_id; ///<initially zero, used to allocate unique sequential world ids + static int AddBlockPixel( int x, int y, int z, + stg_render_info_t* rinfo ) ; //< used as a callback by StgModel + + stg_usec_t real_time_start; ///< the real time at which this world was created + + bool quit; ///< quit this world ASAP + + ///< convert a distance in meters to a distance in world occupancy grid pixels + int32_t MetersToPixels( stg_meters_t x ){ return (int32_t)floor(x * ppm) ; }; + + /** Called by all constructors to set up the object */ + void Initialize( const char* token, stg_msec_t interval_sim, double ppm ); - virtual void PushColor( stg_color_t col ) { /* do nothing */ }; - virtual void PushColor( double r, double g, double b, double a ) { /* do nothing */ }; - virtual void PopColor(){ /* do nothing */ }; - - stg_usec_t real_time_now; - + // dummy implementations to be overloaded by GUI subclasses + virtual void PushColor( stg_color_t col ) { /* do nothing */ }; + virtual void PushColor( double r, double g, double b, double a ) { /* do nothing */ }; + virtual void PopColor(){ /* do nothing */ }; + + /** The current real time in microseconds */ + stg_usec_t real_time_now; + /** StgWorld::quit is set true when this simulation time is reached */ stg_usec_t quit_time; bool destroy; - //stg_id_t id; - - //GHashTable* models_by_id; ///< the models that make up the world, indexed by id GHashTable* models_by_name; ///< the models that make up the world, indexed by name GList* velocity_list; ///< a list of models that have non-zero velocity, for efficient updating - //stg_usec_t wall_last_update; ///< the real time of the last update in ms - bool dirty; ///< iff true, a gui redraw would be required int total_subs; ///< the total number of subscriptions to all models @@ -1298,6 +1302,9 @@ virtual void DrawStatus( StgCanvas* canvas ); void DrawStatusTree( StgCanvas* canvas ); + void DrawOriginTree(); + void DrawOrigin(); + void PushLocalCoords(); void PopCoords(); @@ -1355,6 +1362,12 @@ virtual void PopColor(){ world->PopColor(); } void DrawFlagList(); + + void PushMyPose(); + void PopPose(); + void ShiftPose( stg_pose_t* pose ); + void ShiftToTop(); + public: void PlaceInFreeSpace( stg_meters_t xmin, stg_meters_t xmax, stg_meters_t ymin, stg_meters_t ymax ); Modified: code/stage/trunk/libstage/world.cc =================================================================== --- code/stage/trunk/libstage/world.cc 2008-07-10 22:45:42 UTC (rev 6840) +++ code/stage/trunk/libstage/world.cc 2008-07-11 06:31:47 UTC (rev 6841) @@ -94,6 +94,7 @@ Initialize( token, interval_sim, ppm ); } + void StgWorld::Initialize( const char* token, stg_msec_t interval_sim, double ppm ) @@ -105,6 +106,12 @@ } StgWorld::world_list = g_list_append( StgWorld::world_list, this ); + // initialize the global stack with the origin + this->csstack = g_queue_new(); + stg_pose_t* pose_zero = new stg_pose_t; + bzero( pose_zero, sizeof(stg_pose_t)); + g_queue_push_head( csstack, pose_zero ); + this->ray_list = NULL; this->quit_time = 0; @@ -285,7 +292,7 @@ g_hash_table_insert( entitytable, (gpointer)entity, mod ); } - // warn about unused WF linesa + // warn about unused WF lines wf->WarnUnused(); // run through the loaded models and initialise them @@ -686,3 +693,51 @@ extent.z.min = MIN( extent.z.min, pt.z ); extent.z.max = MAX( extent.z.max, pt.z ); } + + +// coordinate system stack - like OpenGL's matrix stack model + +/** Pop a copy of the current stack head onto the stack */ +void StgWorld::PushPose() +{ + stg_pose_t* newhead = new stg_pose_t; + + // copy the current head into the new head + memcpy( newhead, PeekPose(), sizeof(stg_pose_t)); + + // and push the new head + g_queue_push_head( csstack, newhead ); +} + +/** Pop and free the pose at the head of the stack. */ +void StgWorld::PopPose() +{ + stg_pose_t* popped = (stg_pose_t*)g_queue_pop_head( csstack ); + if( popped ) + delete popped; + else + PRINT_WARN( "Empty CS stack popped" ); +} + +/** return a pointer to the pose at the head of the queue */ +stg_pose_t* StgWorld::PeekPose() +{ + return (stg_pose_t*)g_queue_peek_head( csstack ); +} + +void StgWorld::ShiftPose( stg_pose_t* p2 ) +{ + stg_pose_t* p1 = PeekPose(); + double cosa = cos(p1->a); + double sina = sin(p1->a); + + stg_pose_t result; + result.x = p1->x + p2->x * cosa - p2->y * sina; + result.y = p1->y + p2->x * sina + p2->y * cosa; + result.z = p1->z + p2->z; + result.a = normalize(p1->a + p2->a); + + // copy the new pose onto the existing pose at head of stack + memcpy( p1, &result, sizeof(stg_pose_t)); +} + Modified: code/stage/trunk/libstage/worldgui.cc =================================================================== --- code/stage/trunk/libstage/worldgui.cc 2008-07-10 22:45:42 UTC (rev 6840) +++ code/stage/trunk/libstage/worldgui.cc 2008-07-11 06:31:47 UTC (rev 6841) @@ -148,9 +148,12 @@ "http://playerstage.org\n" "\n" "Copyright 2000-2008 Richard Vaughan,\n" - " Brian Gerkey, Andrew Howard, Reed Hedges, \n" - " Toby Collett, Alex Couture-Beil, Jeremy Asher \n" - " and contributors"; + "Brian Gerkey, Andrew Howard, Reed Hedges, \n" + "Toby Collett, Alex Couture-Beil, Jeremy Asher \n" + "and contributors\n" + "\n" + "Distributed under the terms of the \n" + "GNU General Public License v2"; StgWorldGui::StgWorldGui(int W,int H,const char* L) : Fl_Window(W,H,L ) @@ -537,7 +540,7 @@ fl_register_images(); const int Width = 420; - const int Height = 300; + const int Height = 330; const int Spc = 10; const int ButtonH = 25; const int ButtonW = 60; Added: code/stage/trunk/worlds/CMakeLists.txt =================================================================== --- code/stage/trunk/worlds/CMakeLists.txt (rev 0) +++ code/stage/trunk/worlds/CMakeLists.txt 2008-07-11 06:31:47 UTC (rev 6841) @@ -0,0 +1 @@ +ADD_SUBDIRECTORY(benchmark) Added: code/stage/trunk/worlds/benchmark/CMakeLists.txt =================================================================== --- code/stage/trunk/worlds/benchmark/CMakeLists.txt (rev 0) +++ code/stage/trunk/worlds/benchmark/CMakeLists.txt 2008-07-11 06:31:47 UTC (rev 6841) @@ -0,0 +1,4 @@ +ADD_LIBRARY( expand MODULE expand.cc ) +TARGET_LINK_LIBRARIES( expand stage ) +SET_TARGET_PROPERTIES( expand PROPERTIES PREFIX "" ) +INSTALL( TARGETS expand DESTINATION lib) Modified: code/stage/trunk/worlds/fasr.world =================================================================== --- code/stage/trunk/worlds/fasr.world 2008-07-10 22:45:42 UTC (rev 6840) +++ code/stage/trunk/worlds/fasr.world 2008-07-11 06:31:47 UTC (rev 6841) @@ -54,7 +54,7 @@ define autorob pioneer2dx ( - sicklaser( pose [ 1.040 0 0 0 ] origin [ 0 0 0 0 ] samples 32 range_max 5 laser_return 2 ) + sicklaser( samples 32 range_max 5 laser_return 2 ) ctrl "fasr" #camera( pose [ 0 0 0 0 ] width 100 height 100 horizfov 70 vertfov 40 yaw 0 ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------- Sponsored by: SourceForge.net Community Choice Awards: VOTE NOW! Studies have shown that voting for your favorite open source project, along with a healthy diet, reduces your potential for chronic lameness and boredom. Vote Now at http://www.sourceforge.net/community/cca08 _______________________________________________ Playerstage-commit mailing list Playerstage-commit@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/playerstage-commit