wbr914.h
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #ifndef _WBR914_H
00033 #define _WBR914_H
00034
00035 #include <termios.h>
00036 #include <pthread.h>
00037 #include <sys/time.h>
00038
00039 #include <libplayercore/playercore.h>
00040 #include <replace/replace.h>
00041
00042
00043 #define MOTOR_DEF_MAX_SPEED 0.3
00044 #define MOTOR_DEF_MAX_TURNSPEED DTOR(100)
00045 #define ACCELERATION_DEFAULT 100
00046 #define DECELERATION_DEFAULT 250
00047
00048
00049 #define NOOP 0x00
00050 #define SETPOS 0x10
00051 #define SETVEL 0x11
00052 #define UPDATE 0x1A
00053 #define GETCMDPOS 0x1D
00054 #define GETCMDVEL 0x1E
00055 #define GETEVENTSTATUS 0x31
00056 #define RESETEVENTSTATUS 0x34
00057 #define GETACTUALPOS 0x37
00058 #define RESET 0x39
00059 #define SETACTUALPOS 0x4D
00060 #define GETSAMPLETIME 0x61
00061 #define SETPHASECOUNTS 0x75
00062 #define SETMOTORCMD 0x77
00063 #define SETLIMITSWITCHMODE 0x80
00064 #define WRITEDIGITAL 0x82
00065 #define READDIGITAL 0x83
00066 #define GETVERSION 0x8F
00067 #define SETACCEL 0x90
00068 #define SETDECEL 0x91
00069 #define SETPROFILEMODE 0xA0
00070 #define GETACTUALVEL 0xAD
00071 #define SETSTOPMODE 0xD0
00072 #define SETMOTORMODE 0xDC
00073 #define SETOUTPUTMODE 0xE0
00074 #define READANALOG 0xEF
00075
00076 #define MOTOR_0 ((unsigned char)0x00)
00077 #define MOTOR_1 ((unsigned char)0x01)
00078
00079
00080 #define LEFT_MOTOR MOTOR_1
00081 #define RIGHT_MOTOR MOTOR_0
00082
00083
00084 #define DEFAULT_M3_PORT "/dev/ttyUSB0"
00085
00086 #define DELAY_US 10000
00087
00088 typedef enum {
00089 TrapezoidalProfile = 0,
00090 VelocityContouringProfile,
00091 SCurveProfile,
00092 } ProfileMode_t;
00093
00094 typedef enum {
00095 NoStopMode = 0,
00096 AbruptStopMode,
00097 SmoothStopMode
00098 } StopMode;
00099
00100
00101 #define DEFAULT_MOTOR_0_DIR -1
00102 #define DEFAULT_MOTOR_1_DIR 1
00103 #define DEFAULT_AXLE_LENGTH (0.301)
00104
00105 #define MAX_TICKS 48000
00106 #define WHEEL_DIAMETER (0.125)
00107 #define WHEEL_RADIUS (WHEEL_DIAMETER/2.0)
00108 #define WHEEL_CIRC (M_PI*WHEEL_DIAMETER)
00109 #define MOTOR_STEP (1.8/MOTOR_TICKS_PER_STEP)
00110 #define GEAR_RATIO (4.8)
00111 #define WHEEL_STEP (MOTOR_STEP/GEAR_RATIO)
00112 #define M_PER_TICK (WHEEL_RADIUS/WHEEL_STEP)
00113 #define MOTOR_TICKS_PER_STEP (64.0)
00114 #define MOTOR_TICKS_PER_REV (200.0*MOTOR_TICKS_PER_STEP)
00115 #define NUM_IR_SENSORS 8
00116
00117
00118 #define MAX_WHEELSPEED 8000
00119 #define MPS_PER_TICK 1 // TODO: what is this?
00120
00121 #define FULL_STOP 0
00122 #define STOP 1
00123
00124 #define DEFAULT_PERCENT_TORQUE 75
00125
00126
00127
00128 typedef struct
00129 {
00130 player_position2d_data_t position;
00131 player_ir_data_t ir;
00132 player_aio_data_t aio;
00133 player_dio_data_t dio;
00134 } __attribute__ ((packed)) player_data_t;
00135
00136
00137 class wbr914 : public Driver
00138 {
00139 public:
00140
00141 wbr914(ConfigFile* cf, int section);
00142 virtual ~wbr914();
00143
00144 virtual int Subscribe(player_devaddr_t id);
00145 virtual int Unsubscribe(player_devaddr_t id);
00146
00147
00148 virtual void Main();
00149
00150 virtual int Setup();
00151 virtual int Shutdown();
00152
00153
00154 virtual int ProcessMessage(QueuePointer &resp_queue,
00155 player_msghdr * hdr,
00156 void * data);
00157
00158
00159 private:
00160 bool RecvBytes( unsigned char*s, int len );
00161 int ReadBuf(unsigned char* s, size_t len);
00162 int WriteBuf(unsigned char* s, size_t len);
00163 int sendCmdCom( unsigned char address, unsigned char c,
00164 int cmd_num, unsigned char* arg,
00165 int ret_num, unsigned char * ret );
00166 int sendCmd0( unsigned char address, unsigned char c,
00167 int ret_num, unsigned char * ret );
00168 int sendCmd16( unsigned char address, unsigned char c,
00169 int16_t arg, int ret_num, unsigned char * ret );
00170 int sendCmd32( unsigned char address, unsigned char c,
00171 int32_t arg, int ret_num, unsigned char * ret );
00172
00173 int32_t BytesToInt32( unsigned char *ptr );
00174 int16_t BytesToInt16( unsigned char *ptr );
00175
00176 int ResetRawPositions();
00177 int HandleConfig(QueuePointer &resp_queue,
00178 player_msghdr * hdr,
00179 void* data);
00180
00181
00182 int HandleCommand(player_msghdr * hdr, void * data);
00183 void HandleVelocityCommand(player_position2d_cmd_vel_t* cmd );
00184 void HandleDigitalOutCommand( player_dio_data_t* doutCmd );
00185 void SetDigitalData( player_dio_data_t * d );
00186
00187
00188 void GetAllData( void );
00189 void GetPositionData( player_position2d_data_t* d );
00190 void GetIRData( player_ir_data_t * d );
00191 void GetAnalogData( player_aio_data_t * d );
00192 void GetDigitalData( player_dio_data_t * d );
00193
00194 void PublishData(void);
00195
00196
00197 const char* GetPMDErrorString( int rc );
00198 int InitRobot();
00199 void UpdateM3();
00200 void Stop( int StopMode );
00201
00202 bool EnableMotors( bool enable );
00203
00204 void SetVelocity( uint8_t chan, float mps );
00205 void SetVelocity( float mpsL, float mpsR );
00206 void SetVelocityInTicks( int32_t left, int32_t right );
00207 void GetVelocityInTicks( int32_t* left, int32_t* right );
00208
00209 void Move( uint8_t chan, float meters );
00210 void Move( float metersL, float metersR );
00211
00212 void SetPosition( uint8_t chan, float meters );
00213 void SetPosition( float metersL, float metersR );
00214 void SetActualPositionInTicks( int32_t left, int32_t right );
00215 void SetActualPosition( float left, float right );
00216 void GetPositionInTicks( int32_t* left, int32_t* right );
00217
00218 void SetAccelerationProfile();
00219 void StopRobot();
00220 int GetAnalogSensor(int s, short * val );
00221 void GetDigitalIn( unsigned short* digIn );
00222 void SetDigitalOut( unsigned short digOut );
00223 void SetOdometry( player_position2d_set_odom_req_t* od );
00224 void SetContourMode( ProfileMode_t prof );
00225 void SetMicrosteps();
00226
00227
00228
00229 int32_t Meters2Ticks( float meters );
00230 float Ticks2Meters( int32_t ticks );
00231 int32_t MPS2Vel( float mps );
00232 float Vel2MPS( int32_t vel );
00233
00234
00235 private:
00236
00237 struct termios _old_tio;
00238 bool _tioChanged;
00239
00240 int _fd;
00241 bool _fd_blocking;
00242 const char* _serial_port;
00243 int _baud;
00244
00245 player_data_t _data;
00246
00247 player_devaddr_t position_id;
00248 player_devaddr_t ir_id;
00249 player_devaddr_t aio_id;
00250 player_devaddr_t dio_id;
00251
00252
00253 int position_subscriptions;
00254 int ir_subscriptions;
00255 int aio_subscriptions;
00256 int dio_subscriptions;
00257
00258 int param_idx;
00259 int direct_wheel_vel_control;
00260
00261 player_position2d_cmd_vel_t last_position_cmd;
00262
00263
00264 int motor_max_speed;
00265 int motor_max_turnspeed;
00266
00267
00268 short motor_max_trans_accel, motor_max_trans_decel;
00269 short motor_max_rot_accel, motor_max_rot_decel;
00270
00271
00272
00273 player_position2d_geom_t _robot2d_geom;
00274 player_position3d_geom_t _robot3d_geom;
00275 player_ir_pose_t _ir_geom;
00276
00277
00278 int32_t last_lpos;
00279 int32_t last_rpos;
00280 double _x;
00281 double _y;
00282 double _yaw;
00283
00284
00285 bool _stopped;
00286 bool _motorsEnabled;
00287 int _debug;
00288 int _usCycleTime;
00289 double _velocityK;
00290 double _positionK;
00291 int _percentTorque;
00292
00293 uint16_t _lastDigOut;
00294 };
00295
00296
00297 #endif
Last updated 12 September 2005 21:38:45
|