00001
00002 #ifndef STG_H
00003 #define STG_H
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00034
00035 #include <unistd.h>
00036 #include <stdint.h>
00037 #include <assert.h>
00038 #include <stdlib.h>
00039 #include <stdio.h>
00040 #include <libgen.h>
00041 #include <string.h>
00042 #include <sys/types.h>
00043 #include <sys/time.h>
00044 #include <pthread.h>
00045
00046
00047 #include <cmath>
00048 #include <iostream>
00049 #include <vector>
00050 #include <list>
00051 #include <map>
00052 #include <set>
00053 #include <queue>
00054 #include <algorithm>
00055
00056
00057 #include <FL/Fl.H>
00058 #include <FL/Fl_Box.H>
00059 #include <FL/Fl_Gl_Window.H>
00060 #include <FL/Fl_Menu_Bar.H>
00061 #include <FL/Fl_Window.H>
00062 #include <FL/fl_draw.H>
00063 #include <FL/gl.h>
00064
00065 #ifdef __APPLE__
00066 #include <OpenGL/glu.h>
00067 #else
00068 #include <GL/glu.h>
00069 #endif
00070
00072 namespace Stg
00073 {
00074
00075 class Block;
00076 class Canvas;
00077 class Cell;
00078 class Worldfile;
00079 class World;
00080 class WorldGui;
00081 class Model;
00082 class OptionsDlg;
00083 class Camera;
00084 class FileManager;
00085 class Option;
00086
00087 typedef Model* (*creator_t)( World*, Model*, const std::string& type );
00088
00091 void Init( int* argc, char** argv[] );
00092
00094 bool InitDone();
00095
00098 const char* Version();
00099
00101 const char COPYRIGHT[] =
00102 "Copyright Richard Vaughan and contributors 2000-2009";
00103
00105 const char AUTHORS[] =
00106 "Richard Vaughan, Brian Gerkey, Andrew Howard, Reed Hedges, Pooya Karimian, Toby Collett, Jeremy Asher, Alex Couture-Beil and contributors.";
00107
00109 const char WEBSITE[] = "http://playerstage.org";
00110
00112 const char DESCRIPTION[] =
00113 "Robot simulation library\nPart of the Player Project";
00114
00116 const char LICENSE[] =
00117 "Stage robot simulation library\n" \
00118 "Copyright (C) 2000-2009 Richard Vaughan and contributors\n" \
00119 "Part of the Player Project [http://playerstage.org]\n" \
00120 "\n" \
00121 "This program is free software; you can redistribute it and/or\n" \
00122 "modify it under the terms of the GNU General Public License\n" \
00123 "as published by the Free Software Foundation; either version 2\n" \
00124 "of the License, or (at your option) any later version.\n" \
00125 "\n" \
00126 "This program is distributed in the hope that it will be useful,\n" \
00127 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" \
00128 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" \
00129 "GNU General Public License for more details.\n" \
00130 "\n" \
00131 "You should have received a copy of the GNU General Public License\n" \
00132 "along with this program; if not, write to the Free Software\n" \
00133 "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n" \
00134 "\n" \
00135 "The text of the license may also be available online at\n" \
00136 "http://www.gnu.org/licenses/old-licenses/gpl-2.0.html\n";
00137
00139 const double thousand = 1e3;
00140
00142 const double million = 1e6;
00143
00145 const double billion = 1e9;
00146
00148 inline double rtod( double r ){ return( r*180.0/M_PI ); }
00149
00151 inline double dtor( double d ){ return( d*M_PI/180.0 ); }
00152
00154 inline double normalize( double a )
00155 {
00156 while( a < -M_PI ) a += 2.0*M_PI;
00157 while( a > M_PI ) a -= 2.0*M_PI;
00158 return a;
00159 };
00160
00162 inline int sgn( int a){ return( a<0 ? -1 : 1); }
00163
00165 inline double sgn( double a){ return( a<0 ? -1.0 : 1.0); }
00166
00168 enum { FiducialNone = 0 };
00169
00171 typedef uint32_t id_t;
00172
00174 typedef double meters_t;
00175
00177 typedef double radians_t;
00178
00180 typedef struct timeval time_t;
00181
00183 typedef unsigned long msec_t;
00184
00186 typedef uint64_t usec_t;
00187
00189 typedef double kg_t;
00190
00192 typedef double joules_t;
00193
00195 typedef double watts_t;
00196
00197 class Color
00198 {
00199 public:
00200 double r,g,b,a;
00201
00202 Color( double r, double g, double b, double a=1.0 );
00203
00207 Color( const std::string& name );
00208
00209 Color();
00210
00211 bool operator!=( const Color& other ) const;
00212 bool operator==( const Color& other ) const;
00213 static Color RandomColor();
00214 void Print( const char* prefix ) const;
00215
00217 static const Color blue, red, green, yellow, magenta, cyan;
00218
00219 const Color& Load( Worldfile* wf, int entity );
00220
00221 void GLSet( void ) { glColor4f( r,g,b,a ); }
00222 };
00223
00225 class Size
00226 {
00227 public:
00228 meters_t x, y, z;
00229
00230 Size( meters_t x,
00231 meters_t y,
00232 meters_t z )
00233 : x(x), y(y), z(z)
00234 {}
00235
00237 Size() : x( 0.4 ), y( 0.4 ), z( 1.0 )
00238 {}
00239
00240 Size& Load( Worldfile* wf, int section, const char* keyword );
00241 void Save( Worldfile* wf, int section, const char* keyword ) const;
00242
00243 void Zero()
00244 { x=y=z=0.0; }
00245 };
00246
00248 class Pose
00249 {
00250 public:
00251 meters_t x, y, z;
00252 radians_t a;
00253
00254 Pose( meters_t x,
00255 meters_t y,
00256 meters_t z,
00257 radians_t a )
00258 : x(x), y(y), z(z), a(a)
00259 { }
00260
00261 Pose() : x(0.0), y(0.0), z(0.0), a(0.0)
00262 { }
00263
00264 virtual ~Pose(){};
00265
00268 static Pose Random( meters_t xmin, meters_t xmax,
00269 meters_t ymin, meters_t ymax )
00270 {
00271 return Pose( xmin + drand48() * (xmax-xmin),
00272 ymin + drand48() * (ymax-ymin),
00273 0,
00274 normalize( drand48() * (2.0 * M_PI) ));
00275 }
00276
00280 virtual void Print( const char* prefix ) const
00281 {
00282 printf( "%s pose [x:%.3f y:%.3f z:%.3f a:%.3f]\n",
00283 prefix, x,y,z,a );
00284 }
00285
00286 std::string String() const
00287 {
00288 char buf[256];
00289 snprintf( buf, 256, "[ %.3f %.3f %.3f %.3f ]",
00290 x,y,z,a );
00291 return std::string(buf);
00292 }
00293
00294
00295 bool IsZero() const
00296 { return( !(x || y || z || a )); };
00297
00299 void Zero()
00300 { x=y=z=a=0.0; }
00301
00302 Pose& Load( Worldfile* wf, int section, const char* keyword );
00303 void Save( Worldfile* wf, int section, const char* keyword );
00304
00305 inline Pose operator+( const Pose& p ) const
00306 {
00307 const double cosa = cos(a);
00308 const double sina = sin(a);
00309
00310 return Pose( x + p.x * cosa - p.y * sina,
00311 y + p.x * sina + p.y * cosa,
00312 z + p.z,
00313 normalize(a + p.a) );
00314 }
00315
00316
00317 bool operator<( const Pose& other ) const
00318 {
00319 return( hypot( y, x ) < hypot( other.y, other.x ));
00320 }
00321
00322 bool operator==( const Pose& other ) const
00323 {
00324 return( x==other.x &&
00325 y==other.y &&
00326 z==other.z &&
00327 a==other.a );
00328 }
00329
00330 bool operator!=( const Pose& other ) const
00331 {
00332 return( x!=other.x ||
00333 y!=other.y ||
00334 z!=other.z ||
00335 a!=other.a );
00336 }
00337
00338 meters_t Distance2D( const Pose& other ) const
00339 {
00340 return hypot( x-other.x, y-other.y );
00341 }
00342
00343 };
00344
00345
00348 class Velocity : public Pose
00349 {
00350 public:
00356 Velocity( double x,
00357 double y,
00358 double z,
00359 double a ) :
00360 Pose( x, y, z, a )
00361 { }
00362
00363 Velocity()
00364 { }
00365
00372 Velocity& Load( Worldfile* wf, int section, const char* keyword )
00373 {
00374 Pose::Load( wf, section, keyword );
00375 return *this;
00376 }
00377
00378 virtual void Print( const char* prefix ) const
00379 {
00380 if( prefix )
00381 printf( "%s", prefix );
00382
00383 printf( "velocity [x:%.3f y:%.3f z:%3.f a:%.3f]\n",
00384 x,y,z,a );
00385 }
00386 };
00387
00388
00391 class Geom
00392 {
00393 public:
00394 Pose pose;
00395 Size size;
00396
00402 void Print( const char* prefix ) const
00403 {
00404 if( prefix )
00405 printf( "%s", prefix );
00406
00407 printf( "geom pose: (%.2f,%.2f,%.2f) size: [%.2f,%.2f]\n",
00408 pose.x,
00409 pose.y,
00410 pose.a,
00411 size.x,
00412 size.y );
00413 }
00414
00416 Geom() : pose(), size() {}
00417
00419 Geom( const Pose& p, const Size& s ) : pose(p), size(s) {}
00420
00421 void Zero()
00422 {
00423 pose.Zero();
00424 size.Zero();
00425 }
00426 };
00427
00429 class Bounds
00430 {
00431 public:
00433 double min;
00435 double max;
00436
00437 Bounds() : min(0), max(0) { }
00438 Bounds( double min, double max ) : min(min), max(max) { }
00439
00440 Bounds& Load( Worldfile* wf, int section, const char* keyword );
00441
00442
00443 double Constrain( double value );
00444 };
00445
00447 class bounds3d_t
00448 {
00449 public:
00451 Bounds x;
00453 Bounds y;
00455 Bounds z;
00456
00457 bounds3d_t() : x(), y(), z() {}
00458 bounds3d_t( const Bounds& x, const Bounds& y, const Bounds& z)
00459 : x(x), y(y), z(z) {}
00460 };
00461
00463 typedef struct
00464 {
00465 Bounds range;
00466 radians_t angle;
00467 } fov_t;
00468
00470 class point_t
00471 {
00472 public:
00473 meters_t x, y;
00474 point_t( meters_t x, meters_t y ) : x(x), y(y){}
00475 point_t() : x(0.0), y(0.0){}
00476
00477 bool operator+=( const point_t& other )
00478 { return ((x += other.x) && (y += other.y) ); }
00479 };
00480
00482 class point3_t
00483 {
00484 public:
00485 meters_t x,y,z;
00486 point3_t( meters_t x, meters_t y, meters_t z )
00487 : x(x), y(y), z(z) {}
00488
00489 point3_t() : x(0.0), y(0.0), z(0.0) {}
00490 };
00491
00493 class point_int_t
00494 {
00495 public:
00496 int x,y;
00497 point_int_t( int x, int y ) : x(x), y(y){}
00498 point_int_t() : x(0), y(0){}
00499
00501 bool operator<( const point_int_t& other ) const
00502 {
00503 if( x < other.x ) return true;
00504 if( other.x < x ) return false;
00505 return y < other.y;
00506 }
00507
00508 bool operator==( const point_int_t& other ) const
00509 { return ((x == other.x) && (y == other.y) ); }
00510 };
00511
00514 point_t* unit_square_points_create();
00515
00518 namespace Gl
00519 {
00520 void pose_shift( const Pose &pose );
00521 void pose_inverse_shift( const Pose &pose );
00522 void coord_shift( double x, double y, double z, double a );
00523 void draw_grid( bounds3d_t vol );
00525 void draw_string( float x, float y, float z, const char *string);
00526 void draw_string_multiline( float x, float y, float w, float h,
00527 const char *string, Fl_Align align );
00528 void draw_speech_bubble( float x, float y, float z, const char* str );
00529 void draw_octagon( float w, float h, float m );
00530 void draw_octagon( float x, float y, float w, float h, float m );
00531 void draw_vector( double x, double y, double z );
00532 void draw_origin( double len );
00533 void draw_array( float x, float y, float w, float h,
00534 float* data, size_t len, size_t offset,
00535 float min, float max );
00536 void draw_array( float x, float y, float w, float h,
00537 float* data, size_t len, size_t offset );
00539 void draw_centered_rect( float x, float y, float dx, float dy );
00540 }
00541
00542 void RegisterModels();
00543
00544
00546 class Visualizer {
00547 private:
00548 const std::string menu_name;
00549 const std::string worldfile_name;
00550
00551 public:
00552 Visualizer( const std::string& menu_name,
00553 const std::string& worldfile_name )
00554 : menu_name( menu_name ),
00555 worldfile_name( worldfile_name )
00556 { }
00557
00558 virtual ~Visualizer( void ) { }
00559 virtual void Visualize( Model* mod, Camera* cam ) = 0;
00560
00561 const std::string& GetMenuName() { return menu_name; }
00562 const std::string& GetWorldfileName() { return worldfile_name; }
00563 };
00564
00565
00568 typedef int(*model_callback_t)(Model* mod, void* user );
00569
00570 typedef int(*world_callback_t)(World* world, void* user );
00571
00572
00573 double constrain( double val, double minval, double maxval );
00574
00575 typedef struct
00576 {
00577 int enabled;
00578 Pose pose;
00579 meters_t size;
00580 Color color;
00581 msec_t period;
00582 double duty_cycle;
00583 } blinkenlight_t;
00584
00585
00587 typedef struct
00588 {
00589 Pose pose;
00590 Size size;
00591 } rotrect_t;
00592
00597 int rotrects_from_image_file( const std::string& filename,
00598 std::vector<rotrect_t>& rects );
00599
00603 typedef bool (*ray_test_func_t)(Model* candidate,
00604 Model* finder,
00605 const void* arg );
00606
00607
00608
00609 #define VAR(V,init) __typeof(init) V=(init)
00610
00611
00612
00613
00614
00615
00616 #define FOR_EACH(I,C) for(VAR(I,(C).begin()),ite=(C).end();(I)!=ite;++(I))
00617
00620 template <class T, class C>
00621 void EraseAll( T thing, C& cont )
00622 { cont.erase( std::remove( cont.begin(), cont.end(), thing ), cont.end() ); }
00623
00624
00625 #define PRINT_ERR(m) fprintf( stderr, "\033[41merr\033[0m: "m" (%s %s)\n", __FILE__, __FUNCTION__)
00626 #define PRINT_ERR1(m,a) fprintf( stderr, "\033[41merr\033[0m: "m" (%s %s)\n", a, __FILE__, __FUNCTION__)
00627 #define PRINT_ERR2(m,a,b) fprintf( stderr, "\033[41merr\033[0m: "m" (%s %s)\n", a, b, __FILE__, __FUNCTION__)
00628 #define PRINT_ERR3(m,a,b,c) fprintf( stderr, "\033[41merr\033[0m: "m" (%s %s)\n", a, b, c, __FILE__, __FUNCTION__)
00629 #define PRINT_ERR4(m,a,b,c,d) fprintf( stderr, "\033[41merr\033[0m: "m" (%s %s)\n", a, b, c, d, __FILE__, __FUNCTION__)
00630 #define PRINT_ERR5(m,a,b,c,d,e) fprintf( stderr, "\033[41merr\033[0m: "m" (%s %s)\n", a, b, c, d, e, __FILE__, __FUNCTION__)
00631
00632
00633 #define PRINT_WARN(m) printf( "\033[44mwarn\033[0m: "m" (%s %s)\n", __FILE__, __FUNCTION__)
00634 #define PRINT_WARN1(m,a) printf( "\033[44mwarn\033[0m: "m" (%s %s)\n", a, __FILE__, __FUNCTION__)
00635 #define PRINT_WARN2(m,a,b) printf( "\033[44mwarn\033[0m: "m" (%s %s)\n", a, b, __FILE__, __FUNCTION__)
00636 #define PRINT_WARN3(m,a,b,c) printf( "\033[44mwarn\033[0m: "m" (%s %s)\n", a, b, c, __FILE__, __FUNCTION__)
00637 #define PRINT_WARN4(m,a,b,c,d) printf( "\033[44mwarn\033[0m: "m" (%s %s)\n", a, b, c, d, __FILE__, __FUNCTION__)
00638 #define PRINT_WARN5(m,a,b,c,d,e) printf( "\033[44mwarn\033[0m: "m" (%s %s)\n", a, b, c, d, e, __FILE__, __FUNCTION__)
00639
00640
00641 #ifdef DEBUG
00642 #define PRINT_MSG(m) printf( "Stage: "m" (%s %s)\n", __FILE__, __FUNCTION__)
00643 #define PRINT_MSG1(m,a) printf( "Stage: "m" (%s %s)\n", a, __FILE__, __FUNCTION__)
00644 #define PRINT_MSG2(m,a,b) printf( "Stage: "m" (%s %s)\n", a, b, __FILE__, __FUNCTION__)
00645 #define PRINT_MSG3(m,a,b,c) printf( "Stage: "m" (%s %s)\n", a, b, c, __FILE__, __FUNCTION__)
00646 #define PRINT_MSG4(m,a,b,c,d) printf( "Stage: "m" (%s %s)\n", a, b, c, d, __FILE__, __FUNCTION__)
00647 #define PRINT_MSG5(m,a,b,c,d,e) printf( "Stage: "m" (%s %s)\n", a, b, c, d, e,__FILE__, __FUNCTION__)
00648 #else
00649 #define PRINT_MSG(m) printf( "Stage: "m"\n" )
00650 #define PRINT_MSG1(m,a) printf( "Stage: "m"\n", a)
00651 #define PRINT_MSG2(m,a,b) printf( "Stage: "m"\n,", a, b )
00652 #define PRINT_MSG3(m,a,b,c) printf( "Stage: "m"\n", a, b, c )
00653 #define PRINT_MSG4(m,a,b,c,d) printf( "Stage: "m"\n", a, b, c, d )
00654 #define PRINT_MSG5(m,a,b,c,d,e) printf( "Stage: "m"\n", a, b, c, d, e )
00655 #endif
00656
00657
00658 #ifdef DEBUG
00659 #define PRINT_DEBUG(m) printf( "debug: "m" (%s %s)\n", __FILE__, __FUNCTION__)
00660 #define PRINT_DEBUG1(m,a) printf( "debug: "m" (%s %s)\n", a, __FILE__, __FUNCTION__)
00661 #define PRINT_DEBUG2(m,a,b) printf( "debug: "m" (%s %s)\n", a, b, __FILE__, __FUNCTION__)
00662 #define PRINT_DEBUG3(m,a,b,c) printf( "debug: "m" (%s %s)\n", a, b, c, __FILE__, __FUNCTION__)
00663 #define PRINT_DEBUG4(m,a,b,c,d) printf( "debug: "m" (%s %s)\n", a, b, c ,d, __FILE__, __FUNCTION__)
00664 #define PRINT_DEBUG5(m,a,b,c,d,e) printf( "debug: "m" (%s %s)\n", a, b, c ,d, e, __FILE__, __FUNCTION__)
00665 #else
00666 #define PRINT_DEBUG(m)
00667 #define PRINT_DEBUG1(m,a)
00668 #define PRINT_DEBUG2(m,a,b)
00669 #define PRINT_DEBUG3(m,a,b,c)
00670 #define PRINT_DEBUG4(m,a,b,c,d)
00671 #define PRINT_DEBUG5(m,a,b,c,d,e)
00672 #endif
00673
00674 class Block;
00675 class Model;
00676
00677
00678
00680 class Ancestor
00681 {
00682 friend class Canvas;
00683
00684 protected:
00685
00687 std::map<std::string,unsigned int> child_type_counts;
00688
00689 std::vector<Model*> children;
00690
00691 bool debug;
00692
00694 std::map<std::string,void*> props;
00695
00696 std::string token;
00697
00698 Ancestor& Load( Worldfile* wf, int section );
00699 void Save( Worldfile* wf, int section );
00700
00701 public:
00702 Ancestor();
00703 virtual ~Ancestor();
00704
00706 std::vector<Model*>& GetChildren(){ return children;}
00707
00709 void ForEachDescendant( model_callback_t func, void* arg );
00710
00711 virtual void AddChild( Model* mod );
00712 virtual void RemoveChild( Model* mod );
00713 virtual Pose GetGlobalPose() const;
00714
00715 const char* Token() const { return token.c_str(); }
00716 const std::string& TokenStr() const { return token; }
00717
00718 virtual void SetToken( const std::string& str )
00719 {
00720
00721
00722 if( str.size() > 0 )
00723 token = str;
00724 else
00725 PRINT_ERR( "Ancestor::SetToken() called with zero length string. Ignored." );
00726 }
00727
00729 void SetProperty( std::string& key, void* value ){ props[ key ] = value; }
00730
00732 void* GetProperty( std::string& key )
00733 {
00734 std::map<std::string,void*>::iterator it = props.find( key );
00735 return( it == props.end() ? NULL : it->second );
00736 }
00737 };
00738
00741 class RaytraceResult
00742 {
00743 public:
00744 Pose pose;
00745 meters_t range;
00746 Model* mod;
00747 Color color;
00748
00749 RaytraceResult() : pose(), range(0), mod(NULL), color() {}
00750 RaytraceResult( const Pose& pose,
00751 meters_t range )
00752 : pose(pose), range(range), mod(NULL), color() {}
00753 };
00754
00755 class Ray
00756 {
00757 public:
00758 Ray( const Model* mod, const Pose& origin, const meters_t range, const ray_test_func_t func, const void* arg, const bool ztest ) :
00759 mod(mod), origin(origin), range(range), func(func), arg(arg), ztest(ztest)
00760 {}
00761
00762 Ray() : mod(NULL), origin(0,0,0,0), range(0), func(NULL), arg(NULL), ztest(true)
00763 {}
00764
00765 const Model* mod;
00766 Pose origin;
00767 meters_t range;
00768 ray_test_func_t func;
00769 const void* arg;
00770 bool ztest;
00771 };
00772
00773
00774
00775 class Region;
00776 class SuperRegion;
00777 class BlockGroup;
00778 class PowerPack;
00779
00780 class LogEntry
00781 {
00782 usec_t timestamp;
00783 Model* mod;
00784 Pose pose;
00785
00786 public:
00787 LogEntry( usec_t timestamp, Model* mod );
00788
00790 static std::vector<LogEntry> log;
00791
00793 static size_t Count(){ return log.size(); }
00794
00796 static void Clear(){ log.clear(); }
00797
00799 static void Print();
00800 };
00801
00802 class CtrlArgs
00803 {
00804 public:
00805 std::string worldfile;
00806 std::string cmdline;
00807
00808 CtrlArgs( std::string w, std::string c ) : worldfile(w), cmdline(c) {}
00809 };
00810
00811 class ModelPosition;
00812
00814 class World : public Ancestor
00815 {
00816 public:
00817 friend class Block;
00818 friend class Model;
00819 friend class ModelFiducial;
00820 friend class Canvas;
00821 friend class WorkerThread;
00822
00823 public:
00826 static std::vector<std::string> args;
00827 static std::string ctrlargs;
00828
00829 private:
00830
00831 static std::set<World*> world_set;
00832 static bool quit_all;
00833 static void UpdateCb( World* world);
00834 static unsigned int next_id;
00835
00836 bool destroy;
00837 bool dirty;
00838
00840 std::set<Model*> models;
00841
00843 std::map<std::string, Model*> models_by_name;
00844
00846 std::map<int,Model*> models_by_wfentity;
00847
00850 std::vector<Model*> models_with_fiducials;
00851
00852 struct ltx
00853 {
00854 bool operator()(const Model* a, const Model* b) const;
00855 };
00856
00857 struct lty
00858 {
00859 bool operator()(const Model* a, const Model* b) const;
00860 };
00861
00864 std::set<Model*,ltx> models_with_fiducials_byx;
00865
00868 std::set<Model*,lty> models_with_fiducials_byy;
00869
00871 void FiducialInsert( Model* mod )
00872 {
00873 FiducialErase( mod );
00874 models_with_fiducials.push_back( mod );
00875 }
00876
00878 void FiducialErase( Model* mod )
00879 {
00880 EraseAll( mod, models_with_fiducials );
00881 }
00882
00883 double ppm;
00884 bool quit;
00885
00886 bool show_clock;
00887 unsigned int show_clock_interval;
00888
00889 pthread_mutex_t sync_mutex;
00890 unsigned int threads_working;
00891 pthread_cond_t threads_start_cond;
00892 pthread_cond_t threads_done_cond;
00893 int total_subs;
00894 unsigned int worker_threads;
00895
00896 protected:
00897
00898 std::list<std::pair<world_callback_t,void*> > cb_list;
00899 bounds3d_t extent;
00900 bool graphics;
00901
00902 std::set<Option*> option_table;
00903 std::list<PowerPack*> powerpack_list;
00904
00905 usec_t quit_time;
00906 std::list<float*> ray_list;
00907 usec_t sim_time;
00908 std::map<point_int_t,SuperRegion*> superregions;
00909
00910 std::vector< std::vector<Model*> > update_lists;
00911
00912 uint64_t updates;
00913 Worldfile* wf;
00914
00915 void CallUpdateCallbacks();
00916
00917 public:
00918
00919 uint64_t UpdateCount(){ return updates; }
00920
00921 bool paused;
00922
00923 virtual void Start(){ paused = false; };
00924 virtual void Stop(){ paused = true; };
00925 virtual void TogglePause(){ paused ? Start() : Stop(); };
00926
00927 bool Paused() const { return( paused ); };
00928
00932 virtual void Redraw( void ){ };
00933
00934 std::vector<point_int_t> rt_cells;
00935 std::vector<point_int_t> rt_candidate_cells;
00936
00937 static const int DEFAULT_PPM = 50;
00938
00941 void AddUpdateCallback( world_callback_t cb, void* user );
00942
00945 int RemoveUpdateCallback( world_callback_t cb, void* user );
00946
00948 void Log( Model* mod );
00949
00951 void NeedRedraw(){ dirty = true; };
00952
00954 Model* ground;
00955
00958 virtual std::string ClockString( void ) const;
00959
00960 Model* CreateModel( Model* parent, const std::string& typestr );
00961 void LoadModel( Worldfile* wf, int entity );
00962 void LoadBlock( Worldfile* wf, int entity );
00963 void LoadBlockGroup( Worldfile* wf, int entity );
00964
00965 void LoadSensor( Worldfile* wf, int entity );
00966
00967 virtual Model* RecentlySelectedModel() const { return NULL; }
00968
00970 void MapPoly( const std::vector<point_int_t>& poly,
00971 Block* block,
00972 unsigned int layer );
00973
00974 SuperRegion* AddSuperRegion( const point_int_t& coord );
00975 SuperRegion* GetSuperRegion( const point_int_t& org );
00976 SuperRegion* GetSuperRegionCreate( const point_int_t& org );
00977
00978
00981 int32_t MetersToPixels( meters_t x ) const
00982 { return (int32_t)floor(x * ppm); };
00983
00984 point_int_t MetersToPixels( const point_t& pt ) const
00985 { return point_int_t( MetersToPixels(pt.x), MetersToPixels(pt.y)); };
00986
00987
00988 virtual void PushColor( Color col )
00989 { (void)col; };
00990 virtual void PushColor( double r, double g, double b, double a )
00991 { (void)r; (void)g; (void)b; (void)a; };
00992
00993 virtual void PopColor(){ };
00994
00995 SuperRegion* CreateSuperRegion( point_int_t origin );
00996 void DestroySuperRegion( SuperRegion* sr );
00997
00999 RaytraceResult Raytrace( const Ray& ray );
01000
01001 RaytraceResult Raytrace( const Pose& pose,
01002 const meters_t range,
01003 const ray_test_func_t func,
01004 const Model* finder,
01005 const void* arg,
01006 const bool ztest );
01007
01008 void Raytrace( const Pose &pose,
01009 const meters_t range,
01010 const radians_t fov,
01011 const ray_test_func_t func,
01012 const Model* finder,
01013 const void* arg,
01014 RaytraceResult* samples,
01015 const uint32_t sample_count,
01016 const bool ztest );
01017
01018
01020 inline void Extend( point3_t pt );
01021
01022 virtual void AddModel( Model* mod );
01023 virtual void RemoveModel( Model* mod );
01024
01025 void AddModelName( Model* mod, const std::string& name );
01026
01027 void AddPowerPack( PowerPack* pp );
01028 void RemovePowerPack( PowerPack* pp );
01029
01030 void ClearRays();
01031
01033 void RecordRay( double x1, double y1, double x2, double y2 );
01034
01037 bool PastQuitTime();
01038
01039 static void* update_thread_entry( std::pair<World*,int>* info );
01040
01041 class Event
01042 {
01043 public:
01044
01045 Event( usec_t time, Model* mod, model_callback_t cb, void* arg )
01046 : time(time), mod(mod), cb(cb), arg(arg) {}
01047
01048 usec_t time;
01049 Model* mod;
01050 model_callback_t cb;
01051 void* arg;
01052
01055 bool operator<( const Event& other ) const;
01056 };
01057
01059 std::vector<std::priority_queue<Event> > event_queues;
01060
01062 std::vector<std::queue<Model*> > pending_update_callbacks;
01063
01075 void Enqueue( unsigned int queue_num, usec_t delay, Model* mod, model_callback_t cb, void* arg )
01076 { event_queues[queue_num].push( Event( sim_time + delay, mod, cb, arg ) ); }
01077
01079 std::set<Model*> active_energy;
01080 void EnableEnergy( Model* m ) { active_energy.insert( m ); };
01081 void DisableEnergy( Model* m ) { active_energy.erase( m ); };
01082
01084 std::set<ModelPosition*> active_velocity;
01085
01087 usec_t sim_interval;
01088
01089
01090
01091
01092 int update_cb_count;
01093
01095 void ConsumeQueue( unsigned int queue_num );
01096
01099 unsigned int GetEventQueue( Model* mod ) const;
01100
01101 public:
01103 static bool UpdateAll();
01104
01111 static void Run();
01112
01113 World( const std::string& name = "MyWorld",
01114 double ppm = DEFAULT_PPM );
01115
01116 virtual ~World();
01117
01119 usec_t SimTimeNow(void) const { return sim_time; }
01120
01123 Worldfile* GetWorldFile() { return wf; };
01124
01128 virtual bool IsGUI() const { return false; }
01129
01135 virtual void Load( const std::string& worldfile_path );
01136
01137 virtual void UnLoad();
01138
01139 virtual void Reload();
01140
01143 virtual bool Save( const char* filename );
01144
01148 virtual bool Update(void);
01149
01153 bool TestQuit() const { return( quit || quit_all ); }
01154
01156 void Quit(){ quit = true; }
01157
01159 void QuitAll(){ quit_all = true; }
01160
01162 void CancelQuit(){ quit = false; }
01163
01165 void CancelQuitAll(){ quit_all = false; }
01166
01167 void TryCharge( PowerPack* pp, const Pose& pose );
01168
01171 double Resolution() const { return ppm; };
01172
01175 Model* GetModel( const std::string& name ) const;
01176
01178 const std::set<Model*> GetAllModels() const { return models; };
01179
01181 const bounds3d_t& GetExtent() const { return extent; };
01182
01184 uint64_t GetUpdateCount() const { return updates; }
01185
01187 void RegisterOption( Option* opt );
01188
01190 void ShowClock( bool enable ){ show_clock = enable; };
01191
01193 Model* GetGround() {return ground;};
01194
01195 };
01196
01197 class Block
01198 {
01199 friend class BlockGroup;
01200 friend class Model;
01201 friend class SuperRegion;
01202 friend class World;
01203 friend class Canvas;
01204 friend class Cell;
01205 public:
01206
01210 Block( Model* mod,
01211 const std::vector<point_t>& pts,
01212 meters_t zmin,
01213 meters_t zmax,
01214 Color color,
01215 bool inherit_color,
01216 bool wheel );
01217
01219 Block( Model* mod, Worldfile* wf, int entity);
01220
01221 ~Block();
01222
01224 void Map( unsigned int layer );
01225
01227 void UnMap( unsigned int layer );
01228
01230 void DrawSolid(bool topview);
01231
01233 void DrawFootPrint();
01234
01236 void Translate( double x, double y );
01237
01239 double CenterX();
01240
01242 double CenterY();
01243
01245 void SetCenterX( double y );
01246
01248 void SetCenterY( double y );
01249
01251 void SetCenter( double x, double y);
01252
01254 void SetZ( double min, double max );
01255
01256 void AppendTouchingModels( std::set<Model*>& touchers );
01257
01259 Model* TestCollision();
01260
01261 void Load( Worldfile* wf, int entity );
01262 Model* GetModel(){ return mod; };
01263 const Color& GetColor();
01264 void Rasterize( uint8_t* data,
01265 unsigned int width, unsigned int height,
01266 meters_t cellwidth, meters_t cellheight );
01267
01268 private:
01269 Model* mod;
01270 std::vector<point_t> mpts;
01271 size_t pt_count;
01272 std::vector<point_t> pts;
01273 Size size;
01274 Bounds local_z;
01275 Color color;
01276 bool inherit_color;
01277 bool wheel;
01278
01279 void DrawTop();
01280 void DrawSides();
01281
01283 Bounds global_z;
01284 bool mapped;
01285
01287 std::vector< std::list<Block*>::iterator > list_entries;
01288
01291 std::vector<Cell*> rendered_cells[2];
01292
01295 point_t BlockPointToModelMeters( const point_t& bpt );
01296
01298 void InvalidateModelPointCache();
01299
01300 };
01301
01302
01303 class BlockGroup
01304 {
01305 friend class Model;
01306 friend class Block;
01307
01308 private:
01309 int displaylist;
01310
01311 void BuildDisplayList( Model* mod );
01312
01313 std::vector<Block*> blocks;
01314 Size size;
01315 point3_t offset;
01316 meters_t minx, maxx, miny, maxy;
01317
01318 public:
01319 BlockGroup();
01320 ~BlockGroup();
01321
01322 uint32_t GetCount(){ return blocks.size(); };
01323 const Size& GetSize(){ return size; };
01324 const point3_t& GetOffset(){ return offset; };
01325
01328 void CalcSize();
01329
01330 void AppendBlock( Block* block );
01331 void CallDisplayList( Model* mod );
01332 void Clear() ;
01334 void AppendTouchingModels( std::set<Model*>& touchers );
01335
01338 Model* TestCollision();
01339
01340 void Map( unsigned int layer );
01341 void UnMap( unsigned int layer );
01342
01344 void DrawSolid( const Geom &geom);
01345
01347 void DrawFootPrint( const Geom &geom);
01348
01349 void LoadBitmap( Model* mod, const std::string& bitmapfile, Worldfile *wf );
01350 void LoadBlock( Model* mod, Worldfile* wf, int entity );
01351
01352 void Rasterize( uint8_t* data,
01353 unsigned int width, unsigned int height,
01354 meters_t cellwidth, meters_t cellheight );
01355
01356 void InvalidateModelPointCache()
01357 {
01358 FOR_EACH( it, blocks )
01359 (*it)->InvalidateModelPointCache();
01360 }
01361
01362 };
01363
01364 class Camera
01365 {
01366 protected:
01367 double _pitch;
01368 double _yaw;
01369 double _x, _y, _z;
01370
01371 public:
01372 Camera() : _pitch( 0 ), _yaw( 0 ), _x( 0 ), _y( 0 ), _z( 0 ) { }
01373 virtual ~Camera() { }
01374
01375 virtual void Draw( void ) const = 0;
01376 virtual void SetProjection( void ) const = 0;
01377
01378 double yaw( void ) const { return _yaw; }
01379 double pitch( void ) const { return _pitch; }
01380
01381 double x( void ) const { return _x; }
01382 double y( void ) const { return _y; }
01383 double z( void ) const { return _z; }
01384
01385 virtual void reset() = 0;
01386 virtual void Load( Worldfile* wf, int sec ) = 0;
01387
01388
01389
01390 };
01391
01392 class PerspectiveCamera : public Camera
01393 {
01394 private:
01395 double _z_near;
01396 double _z_far;
01397 double _vert_fov;
01398 double _horiz_fov;
01399 double _aspect;
01400
01401 public:
01402 PerspectiveCamera( void );
01403
01404 virtual void Draw( void ) const;
01405 virtual void SetProjection( void ) const;
01406
01407 void update( void );
01408
01409 void strafe( double amount );
01410 void forward( double amount );
01411
01412 void setPose( double x, double y, double z ) { _x = x; _y = y; _z = z; }
01413 void addPose( double x, double y, double z ) { _x += x; _y += y; _z += z; if( _z < 0.1 ) _z = 0.1; }
01414 void move( double x, double y, double z );
01415 void setFov( double horiz_fov, double vert_fov ) { _horiz_fov = horiz_fov; _vert_fov = vert_fov; }
01417 void setAspect( double aspect ) { _aspect = aspect; }
01418 void setYaw( double yaw ) { _yaw = yaw; }
01419 double horizFov( void ) const { return _horiz_fov; }
01420 double vertFov( void ) const { return _vert_fov; }
01421 void addYaw( double yaw ) { _yaw += yaw; }
01422 void setPitch( double pitch ) { _pitch = pitch; }
01423 void addPitch( double pitch ) { _pitch += pitch; if( _pitch < 0 ) _pitch = 0; else if( _pitch > 180 ) _pitch = 180; }
01424
01425 double realDistance( double z_buf_val ) const {
01426 return _z_near * _z_far / ( _z_far - z_buf_val * ( _z_far - _z_near ) );
01427 }
01428 void scroll( double dy ) { _z += dy; }
01429 double nearClip( void ) const { return _z_near; }
01430 double farClip( void ) const { return _z_far; }
01431 void setClip( double near, double far ) { _z_far = far; _z_near = near; }
01432
01433 void reset() { setPitch( 70 ); setYaw( 0 ); }
01434
01435 void Load( Worldfile* wf, int sec );
01436 void Save( Worldfile* wf, int sec );
01437 };
01438
01439 class OrthoCamera : public Camera
01440 {
01441 private:
01442 double _scale;
01443 double _pixels_width;
01444 double _pixels_height;
01445 double _y_min;
01446 double _y_max;
01447
01448 public:
01449 OrthoCamera( void ) :
01450 _scale( 15 ),
01451 _pixels_width(0),
01452 _pixels_height(0),
01453 _y_min(0),
01454 _y_max(0)
01455 { }
01456
01457 virtual void Draw() const;
01458
01459 virtual void SetProjection( double pixels_width,
01460 double pixels_height,
01461 double y_min,
01462 double y_max );
01463
01464 virtual void SetProjection( void ) const;
01465
01466 void move( double x, double y );
01467
01468 void setYaw( double yaw ) { _yaw = yaw; }
01469
01470 void setPitch( double pitch ) { _pitch = pitch; }
01471
01472 void addYaw( double yaw ) { _yaw += yaw; }
01473
01474 void addPitch( double pitch ) {
01475 _pitch += pitch;
01476 if( _pitch > 90 )
01477 _pitch = 90;
01478 else if( _pitch < 0 )
01479 _pitch = 0;
01480 }
01481
01482 void setScale( double scale ) { _scale = scale; }
01483 void setPose( double x, double y) { _x = x; _y = y; }
01484
01485 void scale( double scale, double shift_x = 0, double h = 0, double shift_y = 0, double w = 0 );
01486 void reset( void ) { _pitch = _yaw = 0; }
01487
01488 double scale() const { return _scale; }
01489
01490 void Load( Worldfile* wf, int sec );
01491 void Save( Worldfile* wf, int sec );
01492 };
01493
01494
01498 class WorldGui : public World, public Fl_Window
01499 {
01500 friend class Canvas;
01501 friend class ModelCamera;
01502 friend class Model;
01503 friend class Option;
01504
01505 private:
01506
01507 Canvas* canvas;
01508 std::vector<Option*> drawOptions;
01509 FileManager* fileMan;
01510 std::vector<usec_t> interval_log;
01511
01514 double speedup;
01515
01516 Fl_Menu_Bar* mbar;
01517 OptionsDlg* oDlg;
01518 bool pause_time;
01519
01522 usec_t real_time_interval;
01523
01525 usec_t real_time_now;
01526
01529 usec_t real_time_recorded;
01530
01532 uint64_t timing_interval;
01533
01534
01535 static void windowCb( Fl_Widget* w, WorldGui* wg );
01536 static void fileLoadCb( Fl_Widget* w, WorldGui* wg );
01537 static void fileSaveCb( Fl_Widget* w, WorldGui* wg );
01538 static void fileSaveAsCb( Fl_Widget* w, WorldGui* wg );
01539 static void fileExitCb( Fl_Widget* w, WorldGui* wg );
01540 static void viewOptionsCb( OptionsDlg* oDlg, WorldGui* wg );
01541 static void optionsDlgCb( OptionsDlg* oDlg, WorldGui* wg );
01542 static void helpAboutCb( Fl_Widget* w, WorldGui* wg );
01543 static void pauseCb( Fl_Widget* w, WorldGui* wg );
01544 static void onceCb( Fl_Widget* w, WorldGui* wg );
01545 static void fasterCb( Fl_Widget* w, WorldGui* wg );
01546 static void slowerCb( Fl_Widget* w, WorldGui* wg );
01547 static void realtimeCb( Fl_Widget* w, WorldGui* wg );
01548 static void fasttimeCb( Fl_Widget* w, WorldGui* wg );
01549 static void resetViewCb( Fl_Widget* w, WorldGui* wg );
01550 static void moreHelptCb( Fl_Widget* w, WorldGui* wg );
01551
01552
01553 bool saveAsDialog();
01554 bool closeWindowQuery();
01555
01556 virtual void AddModel( Model* mod );
01557
01558 void SetTimeouts();
01559
01560 protected:
01561
01562 virtual void PushColor( Color col );
01563 virtual void PushColor( double r, double g, double b, double a );
01564 virtual void PopColor();
01565
01566 void DrawOccupancy() const;
01567 void DrawVoxels() const;
01568
01569 public:
01570
01571 WorldGui(int W,int H,const char*L=0);
01572 ~WorldGui();
01573
01575 virtual void Redraw( void );
01576
01577 virtual std::string ClockString() const;
01578 virtual bool Update();
01579 virtual void Load( const std::string& filename );
01580 virtual void UnLoad();
01581 virtual bool Save( const char* filename );
01582 virtual bool IsGUI() const { return true; };
01583 virtual Model* RecentlySelectedModel() const;
01584
01585 virtual void Start();
01586 virtual void Stop();
01587
01588 usec_t RealTimeNow(void) const;
01589
01590 void DrawBoundingBoxTree();
01591
01592 Canvas* GetCanvas( void ) const { return canvas; }
01593
01595 void Show();
01596
01598 std::string EnergyString( void ) const;
01599 virtual void RemoveChild( Model* mod );
01600
01601 bool IsTopView();
01602 };
01603
01604
01605 class StripPlotVis : public Visualizer
01606 {
01607 private:
01608
01609 Model* mod;
01610 float* data;
01611 size_t len;
01612 size_t count;
01613 unsigned int index;
01614 float x,y,w,h,min,max;
01615 Color fgcolor, bgcolor;
01616
01617 public:
01618 StripPlotVis( float x, float y, float w, float h,
01619 size_t len,
01620 Color fgcolor, Color bgcolor,
01621 const char* name, const char* wfname );
01622 virtual ~StripPlotVis();
01623 virtual void Visualize( Model* mod, Camera* cam );
01624 void AppendValue( float value );
01625 };
01626
01627
01628 class PowerPack
01629 {
01630 friend class WorldGui;
01631 friend class Canvas;
01632
01633 protected:
01634
01635 class DissipationVis : public Visualizer
01636 {
01637 private:
01638 unsigned int columns, rows;
01639 meters_t width, height;
01640
01641 std::vector<joules_t> cells;
01642
01643 joules_t peak_value;
01644 double cellsize;
01645
01646 static joules_t global_peak_value;
01647
01648 public:
01649 DissipationVis( meters_t width,
01650 meters_t height,
01651 meters_t cellsize );
01652
01653 virtual ~DissipationVis();
01654 virtual void Visualize( Model* mod, Camera* cam );
01655
01656 void Accumulate( meters_t x, meters_t y, joules_t amount );
01657 } event_vis;
01658
01659
01660 StripPlotVis output_vis;
01661 StripPlotVis stored_vis;
01662
01664 Model* mod;
01665
01667 joules_t stored;
01668
01670 joules_t capacity;
01671
01673 bool charging;
01674
01676 joules_t dissipated;
01677
01678
01679 usec_t last_time;
01680 joules_t last_joules;
01681 watts_t last_watts;
01682
01683 public:
01684 static joules_t global_stored;
01685 static joules_t global_capacity;
01686 static joules_t global_dissipated;
01687 static joules_t global_input;
01688
01689 public:
01690 PowerPack( Model* mod );
01691 ~PowerPack();
01692
01694 void Visualize( Camera* cam );
01695
01697 joules_t RemainingCapacity() const;
01698
01700 void Add( joules_t j );
01701
01703 void Subtract( joules_t j );
01704
01706 void TransferTo( PowerPack* dest, joules_t amount );
01707
01708 double ProportionRemaining() const
01709 { return( stored / capacity ); }
01710
01713 void Print( const char* prefix ) const
01714 {
01715 if( prefix )
01716 printf( "%s", prefix );
01717
01718 printf( "PowerPack %.2f/%.2f J\n", stored, capacity );
01719 }
01720
01721 joules_t GetStored() const;
01722 joules_t GetCapacity() const;
01723 joules_t GetDissipated() const;
01724 void SetCapacity( joules_t j );
01725 void SetStored( joules_t j );
01726
01728 bool GetCharging() const { return charging; }
01729
01730 void ChargeStart(){ charging = true; }
01731 void ChargeStop(){ charging = false; }
01732
01734 void Dissipate( joules_t j );
01735
01737 void Dissipate( joules_t j, const Pose& p );
01738 };
01739
01740
01742 class Model : public Ancestor
01743 {
01744 friend class Ancestor;
01745 friend class World;
01746 friend class World::Event;
01747 friend class WorldGui;
01748 friend class Canvas;
01749 friend class Block;
01750 friend class Region;
01751 friend class BlockGroup;
01752 friend class PowerPack;
01753 friend class Ray;
01754 friend class ModelFiducial;
01755
01756 private:
01758 static uint32_t count;
01759 static std::map<id_t,Model*> modelsbyid;
01760
01762 bool mapped;
01763
01764 std::vector<Option*> drawOptions;
01765 const std::vector<Option*>& getOptions() const { return drawOptions; }
01766
01767 protected:
01768
01771 bool alwayson;
01772
01773 BlockGroup blockgroup;
01775 int blocks_dl;
01776
01780 int boundary;
01781
01784 public:
01785 class cb_t
01786 {
01787 public:
01788 model_callback_t callback;
01789 void* arg;
01790
01791 cb_t( model_callback_t cb, void* arg )
01792 : callback(cb), arg(arg) {}
01793
01794 cb_t( world_callback_t cb, void* arg )
01795 : callback(NULL), arg(arg) { (void)cb; }
01796
01797 cb_t() : callback(NULL), arg(NULL) {}
01798
01800 bool operator<( const cb_t& other ) const
01801 {
01802 if( callback == other.callback )
01803 return( arg < other.arg );
01804
01805 return ((void*)(callback)) < ((void*)(other.callback));
01806 }
01807
01809 bool operator==( const cb_t& other ) const
01810 { return( callback == other.callback); }
01811 };
01812
01813 class Flag
01814 {
01815 private:
01816 Color color;
01817 double size;
01818 int displaylist;
01819
01820 public:
01821 void SetColor( const Color& col );
01822 void SetSize( double sz );
01823
01824 Color GetColor(){ return color; }
01825 double GetSize(){ return size; }
01826
01827 Flag( const Color& color, double size );
01828 Flag* Nibble( double portion );
01829
01832 void Draw( GLUquadric* quadric );
01833 };
01834
01835 typedef enum {
01836 CB_FLAGDECR,
01837 CB_FLAGINCR,
01838 CB_GEOM,
01839 CB_INIT,
01840 CB_LOAD,
01841 CB_PARENT,
01842 CB_POSE,
01843 CB_SAVE,
01844 CB_SHUTDOWN,
01845 CB_STARTUP,
01846 CB_UPDATE,
01847 CB_VELOCITY,
01848
01849 __CB_TYPE_COUNT
01850 } callback_type_t;
01851
01852 protected:
01856 std::vector<std::set<cb_t> > callbacks;
01857
01859 Color color;
01860
01864 bool data_fresh;
01865
01869 bool disabled;
01870
01872 std::list<Visualizer*> cv_list;
01873
01875 std::list<Flag*> flag_list;
01876
01879 double friction;
01880
01883 Geom geom;
01884
01886 class GuiState
01887 {
01888 public:
01889 bool grid;
01890 bool move;
01891 bool nose;
01892 bool outline;
01893
01894 GuiState();
01895 GuiState& Load( Worldfile* wf, int wf_entity );
01896 } gui;
01897
01898 bool has_default_block;
01899
01901 uint32_t id;
01902 usec_t interval;
01903 usec_t interval_energy;
01904
01905
01906 usec_t last_update;
01907 bool log_state;
01908 meters_t map_resolution;
01909 kg_t mass;
01910
01912 Model* parent;
01913
01916 Pose pose;
01917
01919 PowerPack* power_pack;
01920
01923 std::list<PowerPack*> pps_charging;
01924
01926 class RasterVis : public Visualizer
01927 {
01928 private:
01929 uint8_t* data;
01930 unsigned int width, height;
01931 meters_t cellwidth, cellheight;
01932 std::vector<point_t> pts;
01933
01934 public:
01935 RasterVis();
01936 virtual ~RasterVis( void ){}
01937 virtual void Visualize( Model* mod, Camera* cam );
01938
01939 void SetData( uint8_t* data,
01940 unsigned int width,
01941 unsigned int height,
01942 meters_t cellwidth,
01943 meters_t cellheight );
01944
01945 int subs;
01946 int used;
01947
01948 void AddPoint( meters_t x, meters_t y );
01949 void ClearPts();
01950
01951 } rastervis;
01952
01953 bool rebuild_displaylist;
01954 std::string say_string;
01955
01956 bool stack_children;
01957
01958 bool stall;
01959 int subs;
01960
01964 bool thread_safe;
01965
01967 class TrailItem
01968 {
01969 public:
01970 usec_t time;
01971 Pose pose;
01972 Color color;
01973
01974 TrailItem()
01975 : time(0), pose(), color(){}
01976
01977
01978
01979 };
01980
01982 std::vector<TrailItem> trail;
01983
01985 unsigned int trail_index;
01986
01990 static unsigned int trail_length;
01991
01993 static uint64_t trail_interval;
01994
01996 void UpdateTrail();
01997
01998
01999 const std::string type;
02002 unsigned int event_queue_num;
02003 bool used;
02004
02005 watts_t watts;
02006
02009 watts_t watts_give;
02010
02013 watts_t watts_take;
02014
02015 Worldfile* wf;
02016 int wf_entity;
02017 World* world;
02018 WorldGui* world_gui;
02019
02020 public:
02021
02022 virtual void SetToken( const std::string& str )
02023 {
02024
02025
02026 if( str.size() > 0 )
02027 {
02028 world->AddModelName( this, str );
02029 Ancestor::SetToken( str );
02030 }
02031 else
02032 PRINT_ERR( "Model::SetToken() called with zero length string. Ignored." );
02033 }
02034
02035
02036 const std::string& GetModelType() const {return type;}
02037 std::string GetSayString(){return std::string(say_string);}
02038
02041 Model* GetChild( const std::string& name ) const;
02042
02044 usec_t GetInterval(){ return interval; }
02045
02046 class Visibility
02047 {
02048 public:
02049 bool blob_return;
02050 int fiducial_key;
02051 int fiducial_return;
02052 bool gripper_return;
02053 bool obstacle_return;
02054 double ranger_return;
02055
02056 Visibility();
02057
02058 Visibility& Load( Worldfile* wf, int wf_entity );
02059 void Save( Worldfile* wf, int wf_entity );
02060 } vis;
02061
02062 usec_t GetUpdateInterval() const { return interval; }
02063 usec_t GetEnergyInterval() const { return interval_energy; }
02064
02065
02068 void Rasterize( uint8_t* data,
02069 unsigned int width, unsigned int height,
02070 meters_t cellwidth, meters_t cellheight );
02071
02072 private:
02075 explicit Model(const Model& original);
02076
02079 Model& operator=(const Model& original);
02080
02081 protected:
02082
02084 void RegisterOption( Option* opt );
02085
02086 void AppendTouchingModels( std::set<Model*>& touchers );
02087
02092 Model* TestCollision();
02093
02094 void CommitTestedPose();
02095
02096 void Map( unsigned int layer );
02097
02099 inline void Map(){ Map(0); Map(1); }
02100
02101 void UnMap( unsigned int layer );
02102
02104 inline void UnMap(){ UnMap(0); UnMap(1); }
02105
02106 void MapWithChildren( unsigned int layer );
02107 void UnMapWithChildren( unsigned int layer );
02108
02109
02110 void MapFromRoot( unsigned int layer );
02111 void UnMapFromRoot( unsigned int layer );
02112
02115 RaytraceResult Raytrace( const Pose &pose,
02116 const meters_t range,
02117 const ray_test_func_t func,
02118 const void* arg,
02119 const bool ztest = true );
02120
02123 void Raytrace( const Pose &pose,
02124 const meters_t range,
02125 const radians_t fov,
02126 const ray_test_func_t func,
02127 const void* arg,
02128 RaytraceResult* samples,
02129 const uint32_t sample_count,
02130 const bool ztest = true );
02131
02132 RaytraceResult Raytrace( const radians_t bearing,
02133 const meters_t range,
02134 const ray_test_func_t func,
02135 const void* arg,
02136 const bool ztest = true );
02137
02138 void Raytrace( const radians_t bearing,
02139 const meters_t range,
02140 const radians_t fov,
02141 const ray_test_func_t func,
02142 const void* arg,
02143 RaytraceResult* samples,
02144 const uint32_t sample_count,
02145 const bool ztest = true );
02146
02147 virtual void Startup();
02148 virtual void Shutdown();
02149 virtual void Update();
02150 virtual void UpdateCharge();
02151
02152 static int UpdateWrapper( Model* mod, void* arg ){ mod->Update(); return 0; }
02153
02155 void CallUpdateCallbacks( void );
02156
02157 meters_t ModelHeight() const;
02158
02159 void DrawBlocksTree();
02160 virtual void DrawBlocks();
02161 void DrawBoundingBox();
02162 void DrawBoundingBoxTree();
02163 virtual void DrawStatus( Camera* cam );
02164 void DrawStatusTree( Camera* cam );
02165
02166 void DrawOriginTree();
02167 void DrawOrigin();
02168
02169 void PushLocalCoords();
02170 void PopCoords();
02171
02173 void DrawImage( uint32_t texture_id, Camera* cam, float alpha, double width=1.0, double height=1.0 );
02174
02175 virtual void DrawPicker();
02176 virtual void DataVisualize( Camera* cam );
02177 virtual void DrawSelected(void);
02178
02179 void DrawTrailFootprint();
02180 void DrawTrailBlocks();
02181 void DrawTrailArrows();
02182 void DrawGrid();
02183
02184 void DataVisualizeTree( Camera* cam );
02185 void DrawFlagList();
02186 void DrawPose( Pose pose );
02187
02188 public:
02189 virtual void PushColor( Color col ){ world->PushColor( col ); }
02190 virtual void PushColor( double r, double g, double b, double a ){ world->PushColor( r,g,b,a ); }
02191 virtual void PopColor() { world->PopColor(); }
02192
02193 PowerPack* FindPowerPack() const;
02194
02195
02196
02197
02198 void PlaceInFreeSpace( meters_t xmin, meters_t xmax,
02199 meters_t ymin, meters_t ymax );
02200
02202 std::string PoseString()
02203 { return pose.String(); }
02204
02206 static Model* LookupId( uint32_t id )
02207 { return modelsbyid[id]; }
02208
02210 Model( World* world,
02211 Model* parent = NULL,
02212 const std::string& type = "model",
02213 const std::string& name = "" );
02214
02216 virtual ~Model();
02217
02219 Model()
02220 : mapped(false), alwayson(false), blocks_dl(0),
02221 boundary(false), data_fresh(false), disabled(true), friction(0), has_default_block(false), log_state(false), map_resolution(0), mass(0), parent(NULL), rebuild_displaylist(false), stack_children(true), stall(false), subs(0), thread_safe(false),trail_index(0), event_queue_num(0), used(false), watts(0), watts_give(0),watts_take(0),wf(NULL), wf_entity(0), world(NULL)
02222 {}
02223
02224 void Say( const std::string& str );
02225
02227 void AddVisualizer( Visualizer* custom_visual, bool on_by_default );
02228
02230 void RemoveVisualizer( Visualizer* custom_visual );
02231
02232 void BecomeParentOf( Model* child );
02233
02234 void Load( Worldfile* wf, int wf_entity )
02235 {
02238 SetWorldfile( wf, wf_entity );
02239 Load();
02240 }
02241
02243 void SetWorldfile( Worldfile* wf, int wf_entity )
02244 { this->wf = wf; this->wf_entity = wf_entity; }
02245
02247 virtual void Load();
02248
02250 virtual void Save();
02251
02253 void InitControllers();
02254
02255 void AddFlag( Flag* flag );
02256 void RemoveFlag( Flag* flag );
02257
02258 void PushFlag( Flag* flag );
02259 Flag* PopFlag();
02260
02261 unsigned int GetFlagCount() const { return flag_list.size(); }
02262
02267 void Disable(){ disabled = true; };
02268
02271 void Enable(){ disabled = false; };
02272
02275 void LoadControllerModule( const char* lib );
02276
02279 void NeedRedraw();
02280
02282 void Redraw();
02283
02286 void LoadBlock( Worldfile* wf, int entity );
02287
02290 Block* AddBlockRect( meters_t x, meters_t y,
02291 meters_t dx, meters_t dy,
02292 meters_t dz );
02293
02295 void ClearBlocks();
02296
02299 Model* Parent() const { return this->parent; }
02300
02302 World* GetWorld() const { return this->world; }
02303
02305 Model* Root(){ return( parent ? parent->Root() : this ); }
02306
02307 bool IsAntecedent( const Model* testmod ) const;
02308
02310 bool IsDescendent( const Model* testmod ) const;
02311
02313 bool IsRelated( const Model* testmod ) const;
02314
02316 Pose GetGlobalPose() const;
02317
02319 Velocity GetGlobalVelocity() const;
02320
02321
02322 void SetGlobalVelocity( const Velocity& gvel );
02323
02325 void Subscribe();
02326
02328 void Unsubscribe();
02329
02331 void SetGlobalPose( const Pose& gpose );
02332
02334
02335
02337
02338
02340 void SetPose( const Pose& pose );
02341
02343 void AddToPose( const Pose& pose );
02344
02346 void AddToPose( double dx, double dy, double dz, double da );
02347
02349 void SetGeom( const Geom& src );
02350
02353 void SetFiducialReturn( int fid );
02354
02356 int GetFiducialReturn() const { return vis.fiducial_return; }
02357
02360 void SetFiducialKey( int key );
02361
02362 Color GetColor() const { return color; }
02363
02365 uint32_t GetId() const { return id; }
02366
02368 kg_t GetTotalMass() const;
02369
02371 kg_t GetMassOfChildren() const;
02372
02374 int SetParent( Model* newparent);
02375
02378 Geom GetGeom() const { return geom; }
02379
02382 Pose GetPose() const { return pose; }
02383
02384
02385
02386 void SetColor( Color col );
02387 void SetMass( kg_t mass );
02388 void SetStall( bool stall );
02389 void SetGravityReturn( bool val );
02390 void SetGripperReturn( bool val );
02391 void SetStickyReturn( bool val );
02392 void SetRangerReturn( double val );
02393 void SetObstacleReturn( bool val );
02394 void SetBlobReturn( bool val );
02395 void SetRangerReturn( bool val );
02396 void SetBoundary( bool val );
02397 void SetGuiNose( bool val );
02398 void SetGuiMove( bool val );
02399 void SetGuiGrid( bool val );
02400 void SetGuiOutline( bool val );
02401 void SetWatts( watts_t watts );
02402 void SetMapResolution( meters_t res );
02403 void SetFriction( double friction );
02404
02405 bool DataIsFresh() const { return this->data_fresh; }
02406
02407
02408
02409
02416 void AddCallback( callback_type_t type,
02417 model_callback_t cb,
02418 void* user );
02419
02420 int RemoveCallback( callback_type_t type,
02421 model_callback_t callback );
02422
02423 int CallCallbacks( callback_type_t type );
02424
02425
02426 virtual void Print( char* prefix ) const;
02427 virtual const char* PrintWithPose() const;
02428
02431 Pose GlobalToLocal( const Pose& pose ) const;
02432
02435 Pose LocalToGlobal( const Pose& pose ) const
02436 {
02437 return( ( GetGlobalPose() + geom.pose ) + pose );
02438 }
02439
02441 std::vector<point_int_t> LocalToPixels( const std::vector<point_t>& local ) const;
02442
02445 point_t LocalToGlobal( const point_t& pt) const;
02446
02449 Model* GetUnsubscribedModelOfType( const std::string& type ) const;
02450
02453 Model* GetUnusedModelOfType( const std::string& type );
02454
02457 bool Stalled() const { return this->stall; }
02458
02461 unsigned int GetSubscriptionCount() const { return subs; }
02462
02464 bool HasSubscribers() const { return( subs > 0 ); }
02465
02466 static std::map< std::string, creator_t> name_map;
02467
02468
02469
02470
02471
02472
02473
02474
02475
02476 };
02477
02478
02479
02480
02481
02483 class ModelBlobfinder : public Model
02484 {
02485 public:
02487 class Blob
02488 {
02489 public:
02490 Color color;
02491 uint32_t left, top, right, bottom;
02492 meters_t range;
02493 };
02494
02495 class Vis : public Visualizer
02496 {
02497 private:
02498
02499 public:
02500 Vis( World* world );
02501 virtual ~Vis( void ){}
02502 virtual void Visualize( Model* mod, Camera* cam );
02503 } vis;
02504
02505 private:
02506 std::vector<Blob> blobs;
02507 std::vector<Color> colors;
02508
02509
02510 static bool BlockMatcher( Block* testblock, Model* finder );
02511
02512 public:
02513 radians_t fov;
02514 radians_t pan;
02515 meters_t range;
02516 unsigned int scan_height;
02517 unsigned int scan_width;
02518
02519
02520 ModelBlobfinder( World* world,
02521 Model* parent,
02522 const std::string& type );
02523
02524 ~ModelBlobfinder();
02525
02526 virtual void Startup();
02527 virtual void Shutdown();
02528 virtual void Update();
02529 virtual void Load();
02530
02531 Blob* GetBlobs( unsigned int* count )
02532 {
02533 if( count ) *count = blobs.size();
02534 return &blobs[0];
02535 }
02536
02537 std::vector<Blob> GetBlobs() const { return blobs; }
02538
02540 void AddColor( Color col );
02541
02543 void RemoveColor( Color col );
02544
02547 void RemoveAllColors();
02548 };
02549
02550
02551
02552
02553
02554
02555 class ModelLightIndicator : public Model
02556 {
02557 public:
02558 ModelLightIndicator( World* world,
02559 Model* parent,
02560 const std::string& type );
02561 ~ModelLightIndicator();
02562
02563 void SetState(bool isOn);
02564
02565 protected:
02566 virtual void DrawBlocks();
02567
02568 private:
02569 bool m_IsOn;
02570 };
02571
02572
02573
02574
02575 class ModelGripper : public Model
02576 {
02577 public:
02578
02579 enum paddle_state_t {
02580 PADDLE_OPEN = 0,
02581 PADDLE_CLOSED,
02582 PADDLE_OPENING,
02583 PADDLE_CLOSING,
02584 };
02585
02586 enum lift_state_t {
02587 LIFT_DOWN = 0,
02588 LIFT_UP,
02589 LIFT_UPPING,
02590 LIFT_DOWNING,
02591 };
02592
02593 enum cmd_t {
02594 CMD_NOOP = 0,
02595 CMD_OPEN,
02596 CMD_CLOSE,
02597 CMD_UP,
02598 CMD_DOWN
02599 };
02600
02601
02604 struct config_t
02605 {
02606 Size paddle_size;
02607 paddle_state_t paddles;
02608 lift_state_t lift;
02609 double paddle_position;
02610 double lift_position;
02611 Model* gripped;
02612 bool paddles_stalled;
02613 double close_limit;
02614 bool autosnatch;
02615 double break_beam_inset[2];
02616 Model* beam[2];
02617 Model* contact[2];
02618 };
02619
02620 private:
02621 virtual void Update();
02622 virtual void DataVisualize( Camera* cam );
02623
02624 void FixBlocks();
02625 void PositionPaddles();
02626 void UpdateBreakBeams();
02627 void UpdateContacts();
02628
02629 config_t cfg;
02630 cmd_t cmd;
02631
02632 Block* paddle_left;
02633 Block* paddle_right;
02634
02635 static Option showData;
02636
02637 public:
02638 static const Size size;
02639
02640
02641 ModelGripper( World* world,
02642 Model* parent,
02643 const std::string& type );
02644
02645 virtual ~ModelGripper();
02646
02647 virtual void Load();
02648 virtual void Save();
02649
02651 void SetConfig( config_t & newcfg ){ this->cfg = newcfg; FixBlocks(); }
02652
02654 config_t GetConfig(){ return cfg; };
02655
02657 void SetCommand( cmd_t cmd ) { this->cmd = cmd; }
02659 void CommandClose() { SetCommand( CMD_CLOSE ); }
02661 void CommandOpen() { SetCommand( CMD_OPEN ); }
02663 void CommandUp() { SetCommand( CMD_UP ); }
02665 void CommandDown() { SetCommand( CMD_DOWN ); }
02666 };
02667
02668
02669
02670
02671
02672
02673
02674
02675
02676
02677
02678
02679
02680
02681
02682
02683
02684
02685
02687 class ModelFiducial : public Model
02688 {
02689 public:
02691 class Fiducial
02692 {
02693 public:
02694 meters_t range;
02695 radians_t bearing;
02696 Pose geom;
02697
02698 Pose pose;
02699 Model* mod;
02700 int id;
02701 };
02702
02703 private:
02704
02705 void AddModelIfVisible( Model* him );
02706
02707 virtual void Update();
02708 virtual void DataVisualize( Camera* cam );
02709
02710 static Option showData;
02711 static Option showFov;
02712
02713 std::vector<Fiducial> fiducials;
02714
02715 public:
02716 ModelFiducial( World* world,
02717 Model* parent,
02718 const std::string& type );
02719 virtual ~ModelFiducial();
02720
02721 virtual void Load();
02722 void Shutdown( void );
02723
02724 meters_t max_range_anon;
02725 meters_t max_range_id;
02726 meters_t min_range;
02727 radians_t fov;
02728 radians_t heading;
02729 int key;
02730 bool ignore_zloc;
02731
02733 std::vector<Fiducial>& GetFiducials() { return fiducials; }
02734
02736 Fiducial* GetFiducials( unsigned int* count )
02737 {
02738 if( count ) *count = fiducials.size();
02739 return &fiducials[0];
02740 }
02741 };
02742
02743
02744
02745
02747 class ModelRanger : public Model
02748 {
02749 public:
02750 public:
02751 ModelRanger( World* world, Model* parent,
02752 const std::string& type );
02753 virtual ~ModelRanger();
02754
02755 virtual void Load();
02756 virtual void Print( char* prefix ) const;
02757
02758 class Vis : public Visualizer
02759 {
02760 public:
02761 static Option showArea;
02762 static Option showStrikes;
02763 static Option showFov;
02764 static Option showBeams;
02765 static Option showTransducers;
02766
02767 Vis( World* world );
02768 virtual ~Vis( void ){}
02769 virtual void Visualize( Model* mod, Camera* cam );
02770 } vis;
02771
02772 class Sensor
02773 {
02774 public:
02775 Pose pose;
02776 Size size;
02777 Bounds range;
02778 radians_t fov;
02779 unsigned int sample_count;
02780 Color col;
02781
02782 std::vector<meters_t> ranges;
02783 std::vector<double> intensities;
02784 std::vector<double> bearings;
02785
02786 Sensor() : pose( 0,0,0,0 ),
02787 size( 0.02, 0.02, 0.02 ),
02788 range( 0.0, 5.0 ),
02789 fov( 0.1 ),
02790 sample_count(1),
02791 col( 0,1,0,0.3 ),
02792 ranges(),
02793 intensities(),
02794 bearings()
02795 {}
02796
02797 void Update( ModelRanger* rgr );
02798 void Visualize( Vis* vis, ModelRanger* rgr ) const;
02799 std::string String() const;
02800 void Load( Worldfile* wf, int entity );
02801 };
02802
02804 const std::vector<Sensor>& GetSensors() const
02805 { return sensors; }
02806
02808 std::vector<Sensor>& GetSensorsMutable()
02809 { return sensors; }
02810
02811 void LoadSensor( Worldfile* wf, int entity );
02812
02813 private:
02814 std::vector<Sensor> sensors;
02815
02816 protected:
02817
02818 virtual void Startup();
02819 virtual void Shutdown();
02820 virtual void Update();
02821 };
02822
02823
02824 class ModelBlinkenlight : public Model
02825 {
02826 private:
02827 double dutycycle;
02828 bool enabled;
02829 msec_t period;
02830 bool on;
02831
02832 static Option showBlinkenData;
02833 public:
02834 ModelBlinkenlight( World* world,
02835 Model* parent,
02836 const std::string& type );
02837
02838 ~ModelBlinkenlight();
02839
02840 virtual void Load();
02841 virtual void Update();
02842 virtual void DataVisualize( Camera* cam );
02843 };
02844
02845
02846
02847
02849 class ModelCamera : public Model
02850 {
02851 public:
02852 typedef struct
02853 {
02854
02855 GLfloat x, y, z;
02856 } ColoredVertex;
02857
02858 private:
02859 Canvas* _canvas;
02860
02861 GLfloat* _frame_data;
02862 GLubyte* _frame_color_data;
02863
02864 bool _valid_vertexbuf_cache;
02865 ColoredVertex* _vertexbuf_cache;
02866
02867 int _width;
02868 int _height;
02869 static const int _depth = 4;
02870
02871 int _camera_quads_size;
02872 GLfloat* _camera_quads;
02873 GLubyte* _camera_colors;
02874
02875 static Option showCameraData;
02876
02877 PerspectiveCamera _camera;
02878 double _yaw_offset;
02879 double _pitch_offset;
02880
02882 bool GetFrame();
02883
02884 public:
02885 ModelCamera( World* world,
02886 Model* parent,
02887 const std::string& type );
02888
02889 ~ModelCamera();
02890
02891 virtual void Load();
02892
02894 virtual void Update();
02895
02897
02898
02900 virtual void DataVisualize( Camera* cam );
02901
02903 int getWidth( void ) const { return _width; }
02904
02906 int getHeight( void ) const { return _height; }
02907
02909 const PerspectiveCamera& getCamera( void ) const { return _camera; }
02910
02912 const GLfloat* FrameDepth() const { return _frame_data; }
02913
02915 const GLubyte* FrameColor() const { return _frame_color_data; }
02916
02918 void setPitch( double pitch ) { _pitch_offset = pitch; _valid_vertexbuf_cache = false; }
02919
02921 void setYaw( double yaw ) { _yaw_offset = yaw; _valid_vertexbuf_cache = false; }
02922 };
02923
02924
02925
02927 class ModelPosition : public Model
02928 {
02929 friend class Canvas;
02930
02931 public:
02933 typedef enum
02934 { CONTROL_ACCELERATION,
02935 CONTROL_VELOCITY,
02936 CONTROL_POSITION
02937 } ControlMode;
02938
02940 typedef enum
02941 { LOCALIZATION_GPS,
02942 LOCALIZATION_ODOM
02943 } LocalizationMode;
02944
02946 typedef enum
02947 { DRIVE_DIFFERENTIAL,
02948 DRIVE_OMNI,
02949 DRIVE_CAR
02950 } DriveMode;
02951
02952 private:
02953 Velocity velocity;
02954 Pose goal;
02955 ControlMode control_mode;
02956 DriveMode drive_mode;
02957 LocalizationMode localization_mode;
02958 Velocity integration_error;
02959 double wheelbase;
02960
02961 public:
02963 Bounds acceleration_bounds[4];
02964
02966 Bounds velocity_bounds[4];
02967
02968 public:
02969
02970 ModelPosition( World* world,
02971 Model* parent,
02972 const std::string& type );
02973
02974 ~ModelPosition();
02975
02976 virtual void Move();
02977 virtual void Startup();
02978 virtual void Shutdown();
02979 virtual void Update();
02980 virtual void Load();
02981
02984 Velocity GetVelocity() const { return velocity; }
02985 void SetVelocity( const Velocity& val );
02986
02989 class Waypoint
02990 {
02991 public:
02992 Waypoint( meters_t x, meters_t y, meters_t z, radians_t a, Color color ) ;
02993 Waypoint( const Pose& pose, Color color ) ;
02994 Waypoint();
02995 void Draw() const;
02996
02997 Pose pose;
02998 Color color;
02999 };
03000
03001 std::vector<Waypoint> waypoints;
03002
03003 class WaypointVis : public Visualizer
03004 {
03005 public:
03006 WaypointVis();
03007 virtual ~WaypointVis( void ){}
03008 virtual void Visualize( Model* mod, Camera* cam );
03009 } wpvis;
03010
03011 class PoseVis : public Visualizer
03012 {
03013 public:
03014 PoseVis();
03015 virtual ~PoseVis( void ){}
03016 virtual void Visualize( Model* mod, Camera* cam );
03017 } posevis;
03018
03020 void SetOdom( Pose odom );
03021
03024 void SetSpeed( double x, double y, double a );
03025 void SetXSpeed( double x );
03026 void SetYSpeed( double y );
03027 void SetZSpeed( double z );
03028 void SetTurnSpeed( double a );
03029 void SetSpeed( Velocity vel );
03031 void Stop();
03032
03035 void GoTo( double x, double y, double a );
03036 void GoTo( Pose pose );
03037
03041 void SetAcceleration( double x, double y, double a );
03042
03043
03044 Pose est_pose;
03045 Pose est_pose_error;
03046 Pose est_origin;
03047 };
03048
03049
03050
03051
03053 class ModelActuator : public Model
03054 {
03055 public:
03057 typedef enum
03058 { CONTROL_VELOCITY,
03059 CONTROL_POSITION
03060 } ControlMode;
03061
03063 typedef enum
03064 { TYPE_LINEAR,
03065 TYPE_ROTATIONAL
03066 } ActuatorType;
03067
03068 private:
03069 double goal;
03070 double pos;
03071 double max_speed;
03072 double min_position;
03073 double max_position;
03074 double start_position;
03075 double cosa;
03076 double sina;
03077 ControlMode control_mode;
03078 ActuatorType actuator_type;
03079 point3_t axis;
03080
03081 Pose InitialPose;
03082 public:
03083
03084 ModelActuator( World* world,
03085 Model* parent,
03086 const std::string& type );
03087
03088 ~ModelActuator();
03089
03090 virtual void Startup();
03091 virtual void Shutdown();
03092 virtual void Update();
03093 virtual void Load();
03094
03097 void SetSpeed( double speed );
03098
03099 double GetSpeed() const {return goal;}
03100
03103 void GoTo( double pose );
03104
03105 double GetPosition() const {return pos;};
03106 double GetMaxPosition() const {return max_position;};
03107 double GetMinPosition() const {return min_position;};
03108
03109 ActuatorType GetType() const { return actuator_type; }
03110 point3_t GetAxis() const { return axis; }
03111 };
03112
03113
03114 };
03115
03116 #endif