Revision: 7181
http://playerstage.svn.sourceforge.net/playerstage/?rev=7181&view=rev
Author: rtv
Date: 2008-11-28 01:21:44 +0000 (Fri, 28 Nov 2008)
Log Message:
-----------
moved waypoints to position model only, and added coord system viz
Modified Paths:
--------------
code/stage/trunk/examples/ctrl/fasr.cc
code/stage/trunk/libstage/canvas.cc
code/stage/trunk/libstage/gl.cc
code/stage/trunk/libstage/model.cc
code/stage/trunk/libstage/model_blinkenlight.cc
code/stage/trunk/libstage/model_laser.cc
code/stage/trunk/libstage/model_position.cc
code/stage/trunk/libstage/model_ranger.cc
code/stage/trunk/libstage/stage.hh
code/stage/trunk/worlds/fasr.world
Modified: code/stage/trunk/examples/ctrl/fasr.cc
===================================================================
--- code/stage/trunk/examples/ctrl/fasr.cc 2008-11-27 16:37:06 UTC (rev
7180)
+++ code/stage/trunk/examples/ctrl/fasr.cc 2008-11-28 01:21:44 UTC (rev
7181)
@@ -27,7 +27,6 @@
};
-
typedef struct
{
StgModelPosition* pos;
@@ -77,6 +76,21 @@
robot->sink = mod->GetWorld()->GetModel( "sink" );
assert(robot->sink);
+
+ const int waypoint_count = 100;
+ Waypoint* waypoints = new Waypoint[waypoint_count];
+
+ for( int i=0; i<waypoint_count; i++ )
+ {
+ waypoints[i].pose.x = i* 0.1;
+ waypoints[i].pose.y = drand48() * 4.0;
+ waypoints[i].pose.z = 0;
+ waypoints[i].pose.a = normalize( i/10.0 );
+ waypoints[i].color = stg_color_pack( 0,0,1,0 );
+ }
+
+ robot->pos->SetWaypoints( waypoints, waypoint_count );
+
return 0; //ok
}
Modified: code/stage/trunk/libstage/canvas.cc
===================================================================
--- code/stage/trunk/libstage/canvas.cc 2008-11-27 16:37:06 UTC (rev 7180)
+++ code/stage/trunk/libstage/canvas.cc 2008-11-28 01:21:44 UTC (rev 7181)
@@ -762,7 +762,7 @@
DrawBoundingBoxes();
// TODO - finish this properly
- LISTMETHOD( models_sorted, StgModel*, DrawWaypoints );
+ //LISTMETHOD( models_sorted, StgModel*, DrawWaypoints );
// MOTION BLUR
if( showBlur )
Modified: code/stage/trunk/libstage/gl.cc
===================================================================
--- code/stage/trunk/libstage/gl.cc 2008-11-27 16:37:06 UTC (rev 7180)
+++ code/stage/trunk/libstage/gl.cc 2008-11-28 01:21:44 UTC (rev 7181)
@@ -9,11 +9,18 @@
}
// transform the current coordinate frame by the given pose
-void Stg::gl_pose_shift( stg_pose_t* pose )
+void Stg::gl_pose_shift( const stg_pose_t &pose )
{
- gl_coord_shift( pose->x, pose->y, pose->z, pose->a );
+ gl_coord_shift( pose.x, pose.y, pose.z, pose.a );
}
+void Stg::gl_pose_inverse_shift( const stg_pose_t &pose )
+{
+ gl_coord_shift( 0,0,0, -pose.a );
+ gl_coord_shift( -pose.x, -pose.y, -pose.z, 0 );
+}
+
+
// TODO - this could be faster, but we don't draw a lot of text
void Stg::gl_draw_string( float x, float y, float z, const char *str )
{
@@ -45,7 +52,21 @@
glEnd();
}
+void Stg::gl_draw_vector( double x, double y, double z )
+{
+ glBegin( GL_LINES );
+ glVertex3f( 0,0,0 );
+ glVertex3f( x,y,z );
+ glEnd();
+}
+void Stg::gl_draw_origin( double len )
+{
+ gl_draw_vector( len,0,0 );
+ gl_draw_vector( 0,len,0 );
+ gl_draw_vector( 0,0,len );
+}
+
void Stg::gl_draw_grid( stg_bounds3d_t vol )
{
glBegin(GL_LINES);
Modified: code/stage/trunk/libstage/model.cc
===================================================================
--- code/stage/trunk/libstage/model.cc 2008-11-27 16:37:06 UTC (rev 7180)
+++ code/stage/trunk/libstage/model.cc 2008-11-28 01:21:44 UTC (rev 7181)
@@ -194,9 +194,7 @@
wf_entity(0),
has_default_block( true ),
map_caches_are_invalid( true ),
- thread_safe( false ),
- waypoints( NULL ),
- waypoint_count( 0 )
+ thread_safe( false )
{
assert( modelsbyid );
assert( world );
@@ -581,23 +579,6 @@
return pose_sum( pose_sum( GetGlobalPose(), geom.pose ), pose );
}
-// stg_point3_t StgModel::LocalToGlobal( stg_point3_t point )
-// {
-// stg_pose_t pose;
-// pose.x = point.x;
-// pose.y = point.y;
-// pose.z = point.z;
-// pose.a = 0;
-
-// pose = LocalToGlobal( pose );
-
-// point.x = pose.x;
-// point.y = pose.y;
-// point.z = pose.z;
-
-// return point;
-// }
-
void StgModel::MapWithChildren()
{
UnMap();
@@ -617,33 +598,6 @@
((StgModel*)it->data)->UnMapWithChildren();
}
-// given an input point array in model local coordinates, return
-// an array with the same points in global coordinates. caller must
-// delete[] the points.
-// stg_point_t* StgModel::LocalToGlobal( double scalex,
-//
double scaley,
-//
stg_point_t pts[],
-//
uint32_t pt_count )
-// {
-// stg_point_t* glob = new stg_point_t[pt_count];
-
-// stg_pose_t global_pose = GetGlobalPose();
-
-// for( int p=0; p<pt_count; p++ )
-// {
-// stg_pose_t local( pts[p].x * scalex,
-// pts[p].y *
scaley,
-// 0, 0 );
-// stg_pose_t global = pose_sum( global_pose, local );
-
-// glob[p].x = global.x;
-// glob[p].y = global.y;
-// }
-
-// return glob;
-// }
-
-
void StgModel::Map()
{
//PRINT_DEBUG1( "%s.Map()", token );
@@ -773,7 +727,7 @@
glRotatef( rtod(pose.a), 0,0,1 );
- gl_pose_shift( &geom.pose );
+ gl_pose_shift( geom.pose );
double dx = geom.size.x / 2.0 * 1.6;
double dy = geom.size.y / 2.0 * 1.6;
@@ -804,8 +758,8 @@
stg_trail_item_t* checkpoint = & g_array_index( trail, stg_trail_item_t,
i );
glPushMatrix();
- gl_pose_shift( &checkpoint->pose );
- gl_pose_shift( &geom.pose );
+ gl_pose_shift( checkpoint->pose );
+ gl_pose_shift( geom.pose );
stg_color_unpack( checkpoint->color, &r, &g, &b, &a );
PushColor( r, g, b, 0.1 );
@@ -926,7 +880,7 @@
void StgModel::DrawBlocks( )
{
- gl_pose_shift( &geom.pose );
+ gl_pose_shift( geom.pose );
blockgroup.CallDisplayList( this );
}
@@ -940,7 +894,7 @@
void StgModel::DrawBoundingBox()
{
- gl_pose_shift( &geom.pose );
+ gl_pose_shift( geom.pose );
PushColor( color );
@@ -985,7 +939,7 @@
if( parent )
glTranslatef( 0,0, parent->geom.size.z );
- gl_pose_shift( &pose );
+ gl_pose_shift( pose );
}
void StgModel::PopCoords()
@@ -1677,36 +1631,3 @@
{
blockgroup.UnMap();
}
-
-
-/** Set the waypoint array pointer. Returns the old pointer, in case you need
to free/delete[] it */
-Waypoint* StgModel::SetWaypoints( Waypoint* wps, uint32_t count )
-{
- Waypoint* replaced = waypoints;
-
- waypoints = wps;
- waypoint_count = count;
-
- return replaced;
-}
-
-
-void StgModel::DrawWaypoints()
-{
- if( waypoints && waypoint_count )
- {
- //PushLocalCoords();
-
- PushColor( color );
- glPointSize( 3 );
-
- // puts( "drawing wps" );
-
- for( unsigned int i=0; i < waypoint_count; i++ )
- waypoints[i].Draw();
-
- //PopCoords();
- // restore a sensible drawing color
- PopColor();
- }
-}
Modified: code/stage/trunk/libstage/model_blinkenlight.cc
===================================================================
--- code/stage/trunk/libstage/model_blinkenlight.cc 2008-11-27 16:37:06 UTC
(rev 7180)
+++ code/stage/trunk/libstage/model_blinkenlight.cc 2008-11-28 01:21:44 UTC
(rev 7181)
@@ -56,7 +56,11 @@
StgModelBlinkenlight::StgModelBlinkenlight( StgWorld* world,
StgModel* parent )
- : StgModel( world, parent, MODEL_TYPE_BLINKENLIGHT )
+ : StgModel( world, parent, MODEL_TYPE_BLINKENLIGHT ),
+ dutycycle( 1.0 ),
+ enabled( true ),
+ period( 1000 ),
+ on( true )
{
PRINT_DEBUG2( "Constructing StgModelBlinkenlight %d (%s)\n",
id, typestr );
@@ -73,10 +77,6 @@
geom.size.z = 0.02;
this->SetGeom( geom );
- this->dutycycle = 1.0;
- this->enabled = true;
- this->period = 1000;
- this->on = true;
this->Startup();
@@ -108,17 +108,10 @@
void StgModelBlinkenlight::DataVisualize( Camera* cam )
{
+ // TODO XX
if( on && showBlinkenData )
{
- glPushMatrix();
- // move into this model's local coordinate frame
- gl_pose_shift( &this->pose );
- gl_pose_shift( &this->geom.pose );
- glLineWidth( 3 );
- // TODO
//LISTMETHOD( this->blocks, StgBlock*, Draw );
- glLineWidth( 1 );
- glPopMatrix(); // drop out of local coords
}
}
Modified: code/stage/trunk/libstage/model_laser.cc
===================================================================
--- code/stage/trunk/libstage/model_laser.cc 2008-11-27 16:37:06 UTC (rev
7180)
+++ code/stage/trunk/libstage/model_laser.cc 2008-11-28 01:21:44 UTC (rev
7181)
@@ -309,6 +309,8 @@
glPushMatrix();
+ glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
+
// we only regenerate the list if there's new data
if( 1 ) // data_dirty ) // TODO - hmm, why doesn't this work?
{
Modified: code/stage/trunk/libstage/model_position.cc
===================================================================
--- code/stage/trunk/libstage/model_position.cc 2008-11-27 16:37:06 UTC (rev
7180)
+++ code/stage/trunk/libstage/model_position.cc 2008-11-28 01:21:44 UTC (rev
7181)
@@ -40,13 +40,13 @@
position
(
# position properties
- drive ""
- localization ""
+ drive "diff"
+ localization "gps"
localization_origin [ <defaults to model's start pose> ]
# odometry error model parameters,
# only used if localization is set to "odom"
- odom_error [0.03 0.03 0.05]
+ odom_error [0.03 0.03 0.00 0.05]
# model properties
)
@@ -84,7 +84,9 @@
StgModelPosition::StgModelPosition( StgWorld* world,
StgModel* parent )
- : StgModel( world, parent, MODEL_TYPE_POSITION )
+ : StgModel( world, parent, MODEL_TYPE_POSITION ),
+ waypoints( NULL ),
+ waypoint_count( 0 )
{
PRINT_DEBUG2( "Constructing StgModelPosition %d (%s)\n",
id, typestr );
@@ -178,14 +180,13 @@
{
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 );
+ est_origin.z = wf->ReadTupleLength( wf_entity,
"localization_origin", 2, est_origin.z );
+ est_origin.a = wf->ReadTupleAngle( wf_entity,
"localization_origin", 3, est_origin.a );
// compute our localization pose based on the origin and true
pose
stg_pose_t gpose = this->GetGlobalPose();
est_pose.a = normalize( gpose.a - est_origin.a );
- //double cosa = cos(est_pose.a);
- //double sina = sin(est_pose.a);
double cosa = cos(est_origin.a);
double sina = sin(est_origin.a);
double dx = gpose.x - est_origin.x;
@@ -204,8 +205,10 @@
wf->ReadTupleLength( wf_entity, "odom_error", 0,
integration_error.x );
integration_error.y =
wf->ReadTupleLength( wf_entity, "odom_error", 1,
integration_error.y );
+ integration_error.z =
+ wf->ReadTupleLength( wf_entity, "odom_error", 2,
integration_error.z );
integration_error.a
- = wf->ReadTupleAngle( wf_entity, "odom_error", 2,
integration_error.a );
+ = wf->ReadTupleAngle( wf_entity, "odom_error", 3,
integration_error.a );
}
// choose a localization model
@@ -400,7 +403,6 @@
stg_pose_t gpose = this->GetGlobalPose();
est_pose.a = normalize( gpose.a - est_origin.a
);
- //est_pose.a =0;// normalize( gpose.a -
est_origin.a );
double cosa = cos(est_origin.a);
double sina = sin(est_origin.a);
double dx = gpose.x - est_origin.x;
@@ -425,7 +427,6 @@
est_pose.x += dx * cosa + dy * sina;
est_pose.y -= dy * cosa - dx * sina;
-
}
break;
@@ -448,8 +449,6 @@
PRINT_DEBUG( "position startup" );
this->SetWatts( STG_POSITION_WATTS );
-
- //stg_model_position_odom_reset( mod );
}
void StgModelPosition::Shutdown( void )
@@ -544,3 +543,74 @@
est_origin.a = da;
}
+/** Set the waypoint array pointer. Returns the old pointer, in case you need
to free/delete[] it */
+Waypoint* StgModelPosition::SetWaypoints( Waypoint* wps, uint32_t count )
+{
+ Waypoint* replaced = waypoints;
+
+ waypoints = wps;
+ waypoint_count = count;
+
+ return replaced;
+}
+
+void StgModelPosition::DataVisualize( Camera* cam )
+{
+ if( waypoints && waypoint_count )
+ DrawWaypoints();
+
+ // vizualize my estimated pose
+ glPushMatrix();
+
+ // back into global coords
+ gl_pose_inverse_shift( GetGlobalPose() );
+
+ gl_pose_shift( est_origin );
+ PushColor( 1,0,0,1 ); // origin in red
+ gl_draw_origin( 0.5 );
+ PopColor();
+
+ gl_pose_shift( est_pose );
+ PushColor( 0,1,0,1 ); // pose in green
+ gl_draw_origin( 0.5 );
+ PopColor();
+
+ gl_pose_shift( geom.pose );
+ PushColor( 0,0,1,1 ); // offset in blue
+ gl_draw_origin( 0.5 );
+ PopColor();
+
+ double r,g,b,a;
+ stg_color_unpack( color, &r, &g, &b, &a );
+ PushColor( r, g, b, 0.5 );
+
+ glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
+ blockgroup.DrawFootPrint();
+ PopColor();
+
+ glPopMatrix();
+}
+
+void StgModelPosition::DrawWaypoints()
+{
+ glPointSize( 3 );
+
+ // TRUE
+ glPushMatrix();
+ PushColor( color );
+
+ gl_pose_inverse_shift( pose );
+ gl_pose_shift( est_origin );
+
+ for( unsigned int i=0; i < waypoint_count; i++ )
+ waypoints[i].Draw();
+
+ PopColor();
+ glPopMatrix();
+
+ /* printf( "pose [%.2f %.2f %.2f %.2f] est_pose [%.2f %.2f %.2f %.2f]
est_origin [%.2f %.2f %.2f %.2f]\n",
+ pose.x, pose.y, pose.z, pose.a,
+ est_pose.x, est_pose.y, est_pose.z, est_pose.a,
+ est_origin.x, est_origin.y, est_origin.z, est_origin.a
);
+ */
+}
Modified: code/stage/trunk/libstage/model_ranger.cc
===================================================================
--- code/stage/trunk/libstage/model_ranger.cc 2008-11-27 16:37:06 UTC (rev
7180)
+++ code/stage/trunk/libstage/model_ranger.cc 2008-11-28 01:21:44 UTC (rev
7181)
@@ -330,6 +330,7 @@
if( showRangerTransducers )
{
+ glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
PushColor( 0,0,0,1 );
for( unsigned int s=0; s<sensor_count; s++ )
@@ -384,6 +385,7 @@
}
// draw the filled triangles in transparent pale green
+ glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
glDepthMask( GL_FALSE );
PushColor( 0, 1, 0, 0.1 );
glVertexPointer( 3, GL_FLOAT, 0, pts );
Modified: code/stage/trunk/libstage/stage.hh
===================================================================
--- code/stage/trunk/libstage/stage.hh 2008-11-27 16:37:06 UTC (rev 7180)
+++ code/stage/trunk/libstage/stage.hh 2008-11-28 01:21:44 UTC (rev 7181)
@@ -615,7 +615,8 @@
void RegisterModels();
void gl_draw_grid( stg_bounds3d_t vol );
- void gl_pose_shift( stg_pose_t* pose );
+ void gl_pose_shift( const stg_pose_t &pose );
+ void gl_pose_inverse_shift( const stg_pose_t &pose );
void gl_coord_shift( double x, double y, double z, double a );
class StgFlag
@@ -632,6 +633,8 @@
void gl_draw_string( float x, float y, float z, const char *string);
void gl_speech_bubble( float x, float y, float z, const char* str );
void gl_draw_octagon( float w, float h, float m );
+ void gl_draw_vector( double x, double y, double z );
+ void gl_draw_origin( double len );
typedef int(*stg_model_callback_t)(StgModel* mod, void* user );
typedef int(*stg_cell_callback_t)(Cell* cell, void* user );
@@ -1303,10 +1306,6 @@
GMutex* access_mutex;
- Waypoint* waypoints;
- uint32_t waypoint_count;
- void DrawWaypoints();
-
public:
void Lock()
{
@@ -1562,9 +1561,6 @@
bool IsRelated( StgModel* mod2 );
- /** Set the waypoint array pointer. Returns the old pointer, in case
you need to free/delete[] it */
- Waypoint* SetWaypoints( Waypoint* wps, uint32_t count );
-
/** get the pose of a model in the global CS */
stg_pose_t GetGlobalPose();
@@ -2464,12 +2460,19 @@
/// %StgModelPosition class
class StgModelPosition : public StgModel
{
+ friend class StgCanvas;
+
private:
stg_pose_t goal; //< the current velocity or pose to reach, depending
on the value of control_mode
stg_position_control_mode_t control_mode;
stg_position_drive_mode_t drive_mode;
stg_position_localization_mode_t localization_mode; ///< global or
local mode
stg_velocity_t integration_error; ///< errors to apply in simple
odometry model
+
+ Waypoint* waypoints;
+ uint32_t waypoint_count;
+ void DrawWaypoints();
+
public:
static const char* typestr;
// constructor
@@ -2482,7 +2485,12 @@
virtual void Shutdown();
virtual void Update();
virtual void Load();
+
+ virtual void DataVisualize( Camera* cam );
+ /** Set the waypoint array pointer. Returns the old pointer, in case
you need to free/delete[] it */
+ Waypoint* SetWaypoints( Waypoint* wps, uint32_t count );
+
/** Set the current pose estimate.*/
void SetOdom( stg_pose_t odom );
Modified: code/stage/trunk/worlds/fasr.world
===================================================================
--- code/stage/trunk/worlds/fasr.world 2008-11-27 16:37:06 UTC (rev 7180)
+++ code/stage/trunk/worlds/fasr.world 2008-11-28 01:21:44 UTC (rev 7181)
@@ -7,8 +7,8 @@
include "sick.inc"
interval_sim 100 # simulation timestep in milliseconds
-interval_real 0 # real-time interval between simulation updates in
milliseconds
-paused 0
+interval_real 50 # real-time interval between simulation updates in
milliseconds
+paused 1
resolution 0.02
@@ -29,7 +29,7 @@
pcam_angle [ 70.000 0 ]
pcam_on 0
- show_data 0
+ show_data 1
show_flags 1
interval 50
@@ -64,29 +64,32 @@
(
sicklaser( samples 32 range_max 5 laser_return 2 )
ctrl "fasr"
+
+ localization "odom"
)
autorob( pose [5.099 4.804 0 -73.937] )
-autorob( pose [6.471 5.304 0 14.941] )
-autorob( pose [5.937 4.858 0 -147.503] )
-autorob( pose [7.574 6.269 0 -111.715] )
-autorob( pose [5.664 5.938 0 -51.799] )
-autorob( pose [7.016 6.428 0 -128.279] )
-autorob( pose [5.911 4.040 0 -97.047] )
-autorob( pose [4.909 6.097 0 -44.366] )
-autorob( pose [6.898 4.775 0 -117.576] )
-autorob( pose [7.012 5.706 0 129.497] )
+#autorob( pose [5.099 4.804 0 -73.937] localization_origin [5.099 4.804 0
-73.937] )
+#autorob( pose [6.471 5.304 0 14.941] )
+#autorob( pose [5.937 4.858 0 -147.503] )
+#autorob( pose [7.574 6.269 0 -111.715] )
+#autorob( pose [5.664 5.938 0 -51.799] )
+#autorob( pose [7.016 6.428 0 -128.279] )
+#autorob( pose [5.911 4.040 0 -97.047] )
+#autorob( pose [4.909 6.097 0 -44.366] )
+#autorob( pose [6.898 4.775 0 -117.576] )
+#autorob( pose [7.012 5.706 0 129.497] )
-autorob( pose [6.616 6.893 0 170.743] )
-autorob( pose [6.451 4.189 0 -61.453] )
-autorob( pose [5.098 6.788 0 -61.295] )
-autorob( pose [4.374 5.163 0 -90.417] )
-autorob( pose [4.999 4.230 0 -42.157] )
-autorob( pose [4.331 4.217 0 -95.000] )
-autorob( pose [5.440 5.317 0 -26.545] )
-autorob( pose [7.518 6.973 0 163.239] )
-autorob( pose [7.559 4.764 0 -139.066] )
-autorob( pose [4.839 3.595 0 -179.567] )
+#autorob( pose [6.616 6.893 0 170.743] )
+#autorob( pose [6.451 4.189 0 -61.453] )
+#autorob( pose [5.098 6.788 0 -61.295] )
+#autorob( pose [4.374 5.163 0 -90.417] )
+#autorob( pose [4.999 4.230 0 -42.157] )
+#autorob( pose [4.331 4.217 0 -95.000] )
+#autorob( pose [5.440 5.317 0 -26.545] )
+#autorob( pose [7.518 6.973 0 163.239] )
+#autorob( pose [7.559 4.764 0 -139.066] )
+#autorob( pose [4.839 3.595 0 -179.567] )
#autorob( pose [7.122 4.175 0 -31.440] )
#autorob( pose [6.203 6.963 0 2.937] )
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
Playerstage-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/playerstage-commit