Tekkotsu Homepage
Demos
Overview
Downloads
Dev. Resources
Reference
Credits

ERS210Info.h

Go to the documentation of this file.
00001 //-*-c++-*-
00002 #ifndef INCLUDED_ERS210Info_h
00003 #define INCLUDED_ERS210Info_h
00004 
00005 #include <math.h>
00006 #ifndef PLATFORM_APERIOS
00007 typedef unsigned short word; //!< otherwise defined in Types.h
00008 #else
00009 #include <Types.h>
00010 #endif
00011 
00012 #include "CommonInfo.h"
00013 using namespace RobotInfo;
00014 
00015 #if TGT_ERS2xx
00016 #include "ERS2xxInfo.h"
00017 #endif
00018 
00019 //! Contains information about the ERS-210 Robot, such as number of joints, PID defaults, timing information, etc.
00020 namespace ERS210Info {
00021 
00022 #if TGT_ERS2xx
00023   using namespace ERS2xxInfo;
00024 #else
00025   // *******************************
00026   //       ROBOT CONFIGURATION
00027   // *******************************
00028 
00029   const char* const RobotName="ERS-210"; //!< the name of the model, to be used for logging and remote GUIs
00030 
00031   const unsigned int FrameTime=8;        //!< time between frames in the motion system (milliseconds)
00032   const unsigned int NumFrames=4;        //!< the number of frames per buffer (don't forget also double buffered)
00033   const unsigned int SlowFrameTime=128;  //!< time between frames for the ears (which move slower for some reason, don't want to mix with other outputs) (milliseconds)
00034   const unsigned int NumSlowFrames=1;    //!< the number of frames per buffer being sent to ears (double buffered as well)
00035   const unsigned int SoundBufferTime=32; //!< the number of milliseconds per sound buffer... I'm not sure if this can be changed
00036   
00037   //!Corresponds to entries in ERS210Info::PrimitiveName, defined at the end of this file, these are the primary grouping
00038   /*!Right now all binary joints are slow, but perhaps this won't always be the case... hence the IsFast/Slow bitmasks to select which type, in order to be more general */
00039   //!@name Output Types Information
00040   const unsigned JointsPerLeg   =  3; //!< The number of joints per leg
00041   const unsigned NumLegs        =  4; //!< The number of legs
00042   const unsigned NumLegJoints   =  JointsPerLeg*NumLegs; //!< the TOTAL number of joints on ALL legs
00043   const unsigned NumHeadJoints  =  3; //!< The number of joints in the neck
00044   const unsigned NumTailJoints  =  2; //!< The number of joints assigned to the tail
00045   const unsigned NumMouthJoints =  1; //!< the number of joints that control the mouth
00046   const unsigned NumEarJoints   =  2; //!< The number of joints which control the ears (NOT per ear, is total)
00047   const unsigned NumButtons     =  8; //!< the number of buttons that are available, see ERS210Info::ButtonOffset_t
00048   const unsigned NumSensors     =  1+3+1+5;  //!< 1 dist, 3 accel, 1 thermo, 5 from power, see ERS210Info::SensorOffset_t
00049   const unsigned NumLEDs        =  9; //!< The number of LEDs which can be controlled
00050   
00051   const unsigned NumPIDJoints   = NumLegJoints+NumHeadJoints+NumTailJoints+NumMouthJoints; //!< The number of joints which use PID motion - everything except ears
00052   const unsigned NumBinJoints   = NumEarJoints; //!< The number of binary joints - just the ears
00053   const unsigned NumOutputs     = NumPIDJoints + NumBinJoints + NumLEDs; //!< the total number of outputs
00054   const unsigned NumReferenceFrames = NumOutputs + 1 + NumLegs + 1 + 1; //!< for the base, paw, camera, and IR sensor reference frames
00055 
00056   const float CameraHorizFOV=57.6/180*M_PI; //!< horizontal field of view (radians)
00057   const float CameraVertFOV=47.8/180*M_PI; //!< vertical field of view (radians)
00058   const float CameraFOV=CameraHorizFOV; //!< should be set to maximum of #CameraHorizFOV or #CameraVertFOV
00059   const unsigned int CameraResolutionX=176; //!< the number of pixels available in the 'full' layer
00060   const unsigned int CameraResolutionY=144; //!< the number of pixels available in the 'full' layer
00061   const float BallOfFootRadius=27.922/2; //!< radius of the ball of the foot
00062   const float CylinderOfFootRadius=24.606/2; //!< radius of the cylinder of the foot
00063 
00064   //! true for joints which can be updated every 32 ms (all but the ears)
00065   /*! @hideinitializer */
00066   const bool IsFastOutput[NumOutputs] = { true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false };
00067   //! we need this so you can tell programmatically which joints are "real" and which are "fake" in ERS-2xx target mode
00068   /*! @hideinitializer */
00069   const bool IsRealERS210[NumOutputs] = { true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true };
00070   //@}
00071 
00072 
00073   // *******************************
00074   //         OUTPUT OFFSETS
00075   // *******************************
00076 
00077 
00078   //!Corresponds to entries in ERS210Info::PrimitiveName, defined at the end of this file
00079   //!@name Output Offsets
00080 
00081   const unsigned PIDJointOffset = 0; //!< The beginning of the PID Joints
00082   const unsigned LegOffset   = PIDJointOffset;           //!< the offset of the beginning of the leg joints
00083   const unsigned HeadOffset  = LegOffset+NumLegJoints;   //!< the offset of the beginning of the head joints
00084   const unsigned TailOffset  = HeadOffset+NumHeadJoints; //!< the offset of the beginning of the tail joints
00085   const unsigned MouthOffset = TailOffset+NumTailJoints; //!< the offset of the beginning of the mouth joint
00086 
00087   const unsigned LEDOffset   = PIDJointOffset + NumPIDJoints; //!< the offset of LEDs in WorldState::outputs and MotionCommand functions
00088 
00089   const unsigned BinJointOffset = LEDOffset + NumLEDs; //!< The beginning of the binary joints
00090   const unsigned EarOffset   = BinJointOffset;           //!< the offset of the beginning of the ear joints - note that ears aren't sensed.  They can be flicked by the environment and you won't know.  Nor will they be flicked back
00091 
00092   const unsigned BaseFrameOffset   = NumOutputs; //!< Use with kinematics to refer to base reference frame
00093   const unsigned PawFrameOffset    = BaseFrameOffset+1; //!< Use with kinematics to refer to paw reference frames (add appropriate LegOrder_t to specify which paw)
00094   const unsigned CameraFrameOffset = PawFrameOffset+NumLegs; //!< Use with kinematics to refer to camera reference frame
00095   const unsigned IRFrameOffset = CameraFrameOffset+1; //!< Use with kinematics to refer to infrared (distance) sensor reference frame
00096   
00097   //! The offsets of the individual legs
00098   enum LegOffset_t {
00099     LFrLegOffset = LegOffset+LFrLegOrder*JointsPerLeg, //!< beginning of left front leg
00100     RFrLegOffset = LegOffset+RFrLegOrder*JointsPerLeg, //!< beginning of right front leg
00101     LBkLegOffset = LegOffset+LBkLegOrder*JointsPerLeg, //!< beginning of left back leg
00102     RBkLegOffset = LegOffset+RBkLegOrder*JointsPerLeg  //!< beginning of right back leg
00103   };
00104   
00105   //@}
00106   
00107   //! The offsets of the individual LEDs on the head and tail.  Note that left/right are robot's point of view.  See also LEDBitMask_t
00108   enum LEDOffset_t {
00109     BotLLEDOffset = LEDOffset,//!< bottom left (red - sad)
00110     BotRLEDOffset, //!< bottom right (red - sad)
00111     MidLLEDOffset, //!< middle left (green - happy)
00112     MidRLEDOffset, //!< middle right (green - happy)
00113     TopLLEDOffset, //!< top left (red - angry)
00114     TopRLEDOffset, //!< top right (red - angry)
00115     TopBrLEDOffset,//!< top bar (green)
00116     TlRedLEDOffset,//!< red tail light
00117     TlBluLEDOffset, //!< blue tail light
00118  
00119     // alias for 220 cross-compatibility
00120     FaceFrontLeftLEDOffset = BotLLEDOffset,   //!< alias for 220 cross-compatibility
00121     FaceFrontRightLEDOffset = BotRLEDOffset,  //!< alias for 220 cross-compatibility
00122     FaceCenterLeftLEDOffset = MidLLEDOffset,  //!< alias for 220 cross-compatibility
00123     FaceCenterRightLEDOffset = MidRLEDOffset, //!< alias for 220 cross-compatibility
00124     FaceBackLeftLEDOffset = TopLLEDOffset,    //!< alias for 220 cross-compatibility
00125     FaceBackRightLEDOffset = TopRLEDOffset,   //!< alias for 220 cross-compatibility
00126     ModeLEDOffset = TopBrLEDOffset,           //!< alias for 220 cross-compatibility
00127     TailRightLEDOffset = TlRedLEDOffset,      //!< alias for 220 cross-compatibility
00128     TailLeftLEDOffset = TlBluLEDOffset        //!< alias for 220 cross-compatibility
00129   };
00130   
00131   //! Bitmasks for use when specifying combinations of LEDs (see LedEngine ) Note that left/right are robot's point of view
00132   //!@name LED Bitmasks
00133   typedef unsigned int LEDBitMask_t; //!< So you can be clear when you're refering to a LED bitmask
00134   const LEDBitMask_t BotLLEDMask = 1<<(BotLLEDOffset-LEDOffset); //!< bottom left (red - sad)
00135   const LEDBitMask_t BotRLEDMask = 1<<(BotRLEDOffset-LEDOffset); //!< bottom right (red - sad)
00136   const LEDBitMask_t MidLLEDMask = 1<<(MidLLEDOffset-LEDOffset); //!< middle left (green - happy)
00137   const LEDBitMask_t MidRLEDMask = 1<<(MidRLEDOffset-LEDOffset); //!< middle right (green - happy)
00138   const LEDBitMask_t TopLLEDMask = 1<<(TopLLEDOffset-LEDOffset); //!< top left (red - angry)
00139   const LEDBitMask_t TopRLEDMask = 1<<(TopRLEDOffset-LEDOffset); //!< top right (red - angry)
00140   const LEDBitMask_t TopBrLEDMask= 1<<(TopBrLEDOffset-LEDOffset); //!< top bar (green)
00141   const LEDBitMask_t TlRedLEDMask= 1<<(TlRedLEDOffset-LEDOffset); //!< red tail light
00142   const LEDBitMask_t TlBluLEDMask= 1<<(TlBluLEDOffset-LEDOffset); //!< blue tail light
00143 
00144   //! LEDs for face (all but tail)
00145   const LEDBitMask_t FaceLEDMask
00146   = BotLLEDMask | BotRLEDMask
00147   | MidLLEDMask | MidRLEDMask
00148   | TopLLEDMask | TopRLEDMask
00149   | TopBrLEDMask;
00150 
00151   //! LEDs for face (all but tail)
00152   const LEDBitMask_t HeadLEDMask
00153   = BotLLEDMask | BotRLEDMask
00154   | MidLLEDMask | MidRLEDMask
00155   | TopLLEDMask | TopRLEDMask
00156   | TopBrLEDMask;
00157 
00158   const LEDBitMask_t BackLEDMask = 0; //!< 210 has no back LEDs
00159   const LEDBitMask_t TailLEDMask = TlRedLEDMask|TlBluLEDMask; //!< LEDs on tail
00160   const LEDBitMask_t AllLEDMask  = (LEDBitMask_t)~0; //!< selects all of the leds
00161   //@}
00162 
00163 
00164   // *******************************
00165   //          INPUT OFFSETS
00166   // *******************************
00167 
00168 
00169   //! The order in which inputs should be stored
00170   //!@name Input Offsets
00171 
00172   //! holds offsets to different buttons in WorldState::buttons[]
00173   /*! Should be a straight mapping to the ButtonSourceIDs
00174    *
00175    *  Note that the chest (power) button is not a normal button.  It kills
00176    *  power to the motors at a hardware level, and isn't sensed in the
00177    *  normal way.  If you want to know when it is pressed (and you are
00178    *  about to shut down) see PowerSourceID::PauseSID.
00179    *
00180    *  @see WorldState::buttons @see ButtonSourceID_t */
00181   enum ButtonOffset_t {
00182     LFrPawOffset = LFrLegOrder,
00183     RFrPawOffset = RFrLegOrder,
00184     LBkPawOffset = LBkLegOrder,
00185     RBkPawOffset = RBkLegOrder,
00186     ChinButOffset= 4,
00187     BackButOffset,
00188     HeadFrButOffset, //!< not in reliable pressure units, but 1.0 is fairly stiff pressure, 0 is none
00189     HeadButOffset=HeadFrButOffset,  //!< for ERS-7 compatibility
00190     HeadBkButOffset //!< not in reliable pressure units, but 1.0 is fairly stiff pressure, 0 is none
00191   };
00192   
00193   //! Provides a string name for each button
00194   const char* const buttonNames[NumButtons] = {
00195     "LFrPaw","RFrPaw","LBkPaw","RBkPaw",
00196     "ChinBut","BackBut",
00197     "HeadFrBut","HeadBkBut"
00198   };
00199 
00200   //! holds offset to different sensor values in WorldState::sensors[]
00201   /*! @see WorldState::sensors[] */
00202   enum SensorOffset_t {
00203     IRDistOffset = 0,  //!< in millimeters
00204     BAccelOffset, //!< backward acceleration, in @f$m/s^2@f$, negative if sitting on butt (positive for faceplant)
00205     LAccelOffset, //!< acceleration to the robot's left, in @f$m/s^2@f$, negative if lying on robot's left side
00206     DAccelOffset, //!< downward acceleration, in @f$m/s^2@f$, negative if standing up... be careful about the signs on all of these...
00207     ThermoOffset, //!< in degrees Celcius
00208     PowerRemainOffset, //!< percentage, 0-1
00209     PowerThermoOffset, //!<  degrees Celcius
00210     PowerCapacityOffset, //!< milli-amp hours
00211     PowerVoltageOffset, //!< volts
00212     PowerCurrentOffset //!< milli-amp negative values (maybe positive while charging?)
00213   };
00214 
00215   //! Provides a string name for each sensor
00216   const char* const sensorNames[NumSensors] = {
00217     "IRDist",
00218     "BAccel","LAccel","DAccel",
00219     "Thermo",
00220     "PowerRemain","PowerThermo","PowerCapacity","PowerVoltage","PowerCurrent"
00221   };
00222 
00223   //@}
00224 
00225 
00226   //! The length of the strings used for each of the outputs in outputNames (doesn't include null term)
00227   const unsigned outputNameLen = 9;
00228   //! A name of uniform length for referring to joints - handy for posture files, etc.
00229   const char* const outputNames[NumOutputs] = {
00230     "LFr:rotor",
00231     "LFr:elvtr",
00232     "LFr:knee~",
00233     "RFr:rotor",
00234     "RFr:elvtr",
00235     "RFr:knee~",
00236     "LBk:rotor",
00237     "LBk:elvtr",
00238     "LBk:knee~",
00239     "RBk:rotor",
00240     "RBk:elvtr",
00241     "RBk:knee~",
00242     
00243     "NECK:tilt",
00244     "NECK:pan~",
00245     "NECK:roll",
00246     
00247     "TAIL:tilt",
00248     "TAIL:pan~",
00249     
00250     "MOUTH~~~~",
00251     
00252     "LED:botL~",
00253     "LED:botR~",
00254     "LED:midL~",
00255     "LED:midR~",
00256     "LED:topL~",
00257     "LED:topR~",
00258     "LED:topBr",
00259     
00260     "LED:tlRed",
00261     "LED:tlBlu",
00262     
00263     "EAR:left~",
00264     "EAR:right"
00265   };
00266   
00267 
00268   //! the joint identifier strings used to refer to specific joints in OPEN-R (but not needed for others)
00269   /*!@showinitializer 
00270    * @warning IMPORTANT!!!!  DO NOT CHANGE THE ORDER OF ITEMS IN THIS TABLE!!!\n
00271    *
00272    * The offset consts defined in this file correspond to this table and will make life easier
00273    * if you feel the need to reorder things, but they aren't used perfect @e everywhere \n
00274    * In particular, assumptions are made that the pid joints will be in slots 0-numPIDJoints
00275    * and that the fast outputs (ie NOT ears) will be in slots 0-NumFastOutputs\n
00276    * There may be other assumptions not noted here!!!
00277    * @note These entries DON'T correspond to the CPC index numbers defined in WorldState (this only lists joints, and in a different order defined by OPEN-R, that one has sensors as well*/
00278   const char* const PrimitiveName [NumOutputs] = {
00279     "PRM:/r2/c1-Joint2:j1",       //!< the left front leg   the rotator
00280     "PRM:/r2/c1/c2-Joint2:j2",    //!< the left front leg   the elevator 
00281     "PRM:/r2/c1/c2/c3-Joint2:j3", //!< the left front leg   the knee 
00282     "PRM:/r4/c1-Joint2:j1",       //!< the right front leg   the rotator
00283     "PRM:/r4/c1/c2-Joint2:j2",    //!< the right front leg    the elevator 
00284     "PRM:/r4/c1/c2/c3-Joint2:j3", //!< the right front leg   the knee 
00285     
00286     "PRM:/r3/c1-Joint2:j1",       //!< the left hind leg   the rotator
00287     "PRM:/r3/c1/c2-Joint2:j2",    //!< the left hind leg   the elevator 
00288     "PRM:/r3/c1/c2/c3-Joint2:j3", //!< the left hind leg   the knee
00289     "PRM:/r5/c1-Joint2:j1",       //!< the right hind leg   the rotator
00290     "PRM:/r5/c1/c2-Joint2:j2",    //!< the right hind leg   the elevator 
00291     "PRM:/r5/c1/c2/c3-Joint2:j3", //!< the right hind leg   the knee 
00292 
00293     "PRM:/r1/c1-Joint2:j1",       //!< the neck  tilt (12)
00294     "PRM:/r1/c1/c2-Joint2:j2",    //!< the neck   pan 
00295     "PRM:/r1/c1/c2/c3-Joint2:j3", //!< the neck   roll 
00296     
00297     "PRM:/r6/c2-Joint2:j2",       //!< the tail tilt (15)       // *** NOTE ***
00298     "PRM:/r6/c1-Joint2:j1",       //!< the tail pan             // CHANGE_ET 12/16/01 matches neck order
00299     
00300     "PRM:/r1/c1/c2/c3/c4-Joint2:j4", //!< the mouth (17)
00301     
00302     "PRM:/r1/c1/c2/c3/l1-LED2:l1", //!< lower  left  LED (18)
00303     "PRM:/r1/c1/c2/c3/l4-LED2:l4", //!< lower  right LED
00304     "PRM:/r1/c1/c2/c3/l2-LED2:l2", //!< middle left  LED
00305     "PRM:/r1/c1/c2/c3/l5-LED2:l5", //!< middle right LED
00306     "PRM:/r1/c1/c2/c3/l3-LED2:l3", //!< upper  left  LED
00307     "PRM:/r1/c1/c2/c3/l6-LED2:l6", //!< upper  right LED
00308     "PRM:/r1/c1/c2/c3/l7-LED2:l7", //!< top          LED
00309     
00310     "PRM:/r6/l2-LED2:l2", //!< tail red  LED
00311     "PRM:/r6/l1-LED2:l1", //!< tail blue LED
00312     
00313     "PRM:/r1/c1/c2/c3/e1-Joint3:j5", //!< left ear (27)
00314     "PRM:/r1/c1/c2/c3/e2-Joint3:j6" //!< right ear
00315   };
00316 
00317   //! use to open speaker connectio with the system
00318   const char* const SpeakerLocator="PRM:/r1/c1/c2/c3/s1-Speaker:S1";
00319 
00320   //! use to open camera connection with the system
00321   const char* const CameraLocator="PRM:/r1/c1/c2/c3/i1-FbkImageSensor:F1";
00322 
00323   //Old PID table:
00324   /*const word Pid[NumPIDJoints][6] = {
00325     { 0x16, 0x04, 0x08, 0x0E, 0x02, 0x0F },
00326     { 0x14, 0x04, 0x06, 0x0E, 0x02, 0x0F },
00327     { 0x23, 0x04, 0x05, 0x0E, 0x02, 0x0F },
00328     { 0x16, 0x04, 0x08, 0x0E, 0x02, 0x0F },
00329     { 0x14, 0x04, 0x06, 0x0E, 0x02, 0x0F },
00330     { 0x23, 0x04, 0x05, 0x0E, 0x02, 0x0F },
00331     { 0x16, 0x04, 0x08, 0x0E, 0x02, 0x0F },
00332     { 0x14, 0x04, 0x06, 0x0E, 0x02, 0x0F },
00333     { 0x23, 0x04, 0x05, 0x0E, 0x02, 0x0F },
00334     { 0x16, 0x04, 0x08, 0x0E, 0x02, 0x0F },
00335     { 0x14, 0x04, 0x06, 0x0E, 0x02, 0x0F },
00336     { 0x23, 0x04, 0x05, 0x0E, 0x02, 0x0F },
00337     
00338     { 0x0A, 0x08, 0x0C, 0x0E, 0x02, 0x0F },
00339     { 0x0D, 0x08, 0x0B, 0x0E, 0x02, 0x0F },
00340     { 0x10, 0x08, 0x0C, 0x0E, 0x02, 0x0F }, // P was 0x0C, updated as seen on https://www.openr.org/page1_2001/gain.html 8/13/2002
00341     
00342     { 0x0A, 0x00, 0x18, 0x0E, 0x02, 0x0F },
00343     { 0x07, 0x00, 0x11, 0x0E, 0x02, 0x0F },
00344     
00345     { 0x0E, 0x08, 0x10, 0x0E, 0x02, 0x0F }, //  { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
00346   };*/
00347 
00348   //! This table holds the default PID values for each joint.  see PIDMC
00349   const float DefaultPIDs[NumPIDJoints][3] =
00350     {
00351       { 0x16/(double)(1<<(16-0xE)), 0x04/(double)(1<<(16-0x2)), 0x08/(double)(1<<(16-0xF)) },
00352       { 0x14/(double)(1<<(16-0xE)), 0x04/(double)(1<<(16-0x2)), 0x06/(double)(1<<(16-0xF)) },
00353       { 0x23/(double)(1<<(16-0xE)), 0x04/(double)(1<<(16-0x2)), 0x05/(double)(1<<(16-0xF)) },
00354       { 0x16/(double)(1<<(16-0xE)), 0x04/(double)(1<<(16-0x2)), 0x08/(double)(1<<(16-0xF)) },
00355       { 0x14/(double)(1<<(16-0xE)), 0x04/(double)(1<<(16-0x2)), 0x06/(double)(1<<(16-0xF)) },
00356       { 0x23/(double)(1<<(16-0xE)), 0x04/(double)(1<<(16-0x2)), 0x05/(double)(1<<(16-0xF)) },
00357       { 0x16/(double)(1<<(16-0xE)), 0x04/(double)(1<<(16-0x2)), 0x08/(double)(1<<(16-0xF)) },
00358       { 0x14/(double)(1<<(16-0xE)), 0x04/(double)(1<<(16-0x2)), 0x06/(double)(1<<(16-0xF)) },
00359       { 0x23/(double)(1<<(16-0xE)), 0x04/(double)(1<<(16-0x2)), 0x05/(double)(1<<(16-0xF)) },
00360       { 0x16/(double)(1<<(16-0xE)), 0x04/(double)(1<<(16-0x2)), 0x08/(double)(1<<(16-0xF)) },
00361       { 0x14/(double)(1<<(16-0xE)), 0x04/(double)(1<<(16-0x2)), 0x06/(double)(1<<(16-0xF)) },
00362       { 0x23/(double)(1<<(16-0xE)), 0x04/(double)(1<<(16-0x2)), 0x05/(double)(1<<(16-0xF)) },
00363 
00364       { 0x0A/(double)(1<<(16-0xE)), 0x08/(double)(1<<(16-0x2)), 0x0C/(double)(1<<(16-0xF)) },
00365       { 0x0D/(double)(1<<(16-0xE)), 0x08/(double)(1<<(16-0x2)), 0x0B/(double)(1<<(16-0xF)) },
00366       { 0x0A/(double)(1<<(16-0xE)), 0x08/(double)(1<<(16-0x2)), 0x0C/(double)(1<<(16-0xF)) },
00367 
00368       { 0x0A/(double)(1<<(16-0xE)), 0x00/(double)(1<<(16-0x2)), 0x18/(double)(1<<(16-0xF)) },
00369       { 0x07/(double)(1<<(16-0xE)), 0x00/(double)(1<<(16-0x2)), 0x11/(double)(1<<(16-0xF)) },
00370 
00371       { 0x0E/(double)(1<<(16-0xE)), 0x08/(double)(1<<(16-0x2)), 0x10/(double)(1<<(16-0xF)) }
00372     };
00373 
00374   //! These will control the shift values given to the system.  see PIDMC
00375   const unsigned char DefaultPIDShifts[3] = {0x0E, 0x02, 0x0F};
00376     
00377   //!These values are Sony's recommended maximum joint velocities, in rad/ms
00378   /*! a value <= 0 means infinite speed (e.g. LEDs) 
00379    *  
00380    *  These limits are <b>not</b> enforced by the framework.  They are simply available for you to use as you see fit.
00381    *  HeadPointerMC is (as of v1.6) the only included MotionCommand to actually use these values. */
00382   const float MaxOutputSpeed[NumOutputs] = {
00383     2.8143434e-03,     //Legs LR,FB,REK
00384     2.4980025e-03,
00385     2.8361600e-03,
00386     2.8143434e-03,
00387     2.4980025e-03,
00388     2.8361600e-03,
00389     2.8143434e-03,
00390     2.4980025e-03,
00391     2.8361600e-03,
00392     2.8143434e-03,
00393     2.4980025e-03,
00394     2.8361600e-03,
00395   
00396     2.1053034e-03,     //Head TPR
00397     3.0106930e-03,
00398     3.0106930e-03,
00399   
00400     4.4724062e-03,     //Tail
00401     4.4724062e-03,
00402   
00403     4.3742314e-03,     //Mouth
00404     
00405     0,0,0,0,0,0,0,0,0, //LEDs
00406     
00407     0,0                //Ears
00408   };
00409 
00410   #ifndef RAD
00411     //!Just a little macro for converting degrees to radians
00412   #define RAD(deg) (((deg) * M_PI ) / 180.0)
00413     //!a flag so we undef these after we're done - do you have a cleaner solution?
00414   #define __RI_RAD_FLAG
00415   #endif
00416   
00417   //! This table holds the software limits of each of the outputs
00418   const double outputRanges[NumOutputs][2] =
00419     {
00420       { RAD(-117),RAD(117) },{ RAD(-11),RAD(89) },{ RAD(-27),RAD(147) }, //left front REK
00421       { RAD(-117),RAD(117) },{ RAD(-11),RAD(89) },{ RAD(-27),RAD(147) }, //right front REK
00422       { RAD(-117),RAD(117) },{ RAD(-11),RAD(89) },{ RAD(-27),RAD(147) }, //left back REK
00423       { RAD(-117),RAD(117) },{ RAD(-11),RAD(89) },{ RAD(-27),RAD(147) }, //right back REK
00424 
00425       { RAD(-82),RAD(43) },{ RAD(-89.6),RAD(89.6) },{ RAD(-29),RAD(29) }, //neck TPR
00426         
00427       { RAD(-22),RAD(22) },{ RAD(-22),RAD(22) }, // tail tp
00428 
00429       { RAD(-47),RAD(-3) }, //mouth
00430 
00431       {0,1},{0,1},{0,1},{0,1},{0,1},{0,1},{0,1},{0,1},{0,1}, //LEDs
00432     
00433       {0,1},{0,1} //ears
00434     };
00435 
00436   //! This table holds the mechanical limits of each of the outputs
00437   const double mechanicalLimits[NumOutputs][2] =
00438     {
00439       { RAD(-120),RAD(120) },{ RAD(-14),RAD(92) },{ RAD(-30),RAD(150) }, //left front jsk
00440       { RAD(-120),RAD(120) },{ RAD(-14),RAD(92) },{ RAD(-30),RAD(150) }, //right front jsk
00441       { RAD(-120),RAD(120) },{ RAD(-14),RAD(92) },{ RAD(-30),RAD(150) }, //left back jsk
00442       { RAD(-120),RAD(120) },{ RAD(-14),RAD(92) },{ RAD(-30),RAD(150) }, //right back jsk
00443 
00444       { RAD(-85),RAD(46) },{ RAD(-92.6),RAD(92.6) },{ RAD(-32),RAD(32) }, //neck tpr
00445         
00446       { RAD(-25),RAD(25) },{ RAD(-25),RAD(25) }, // tail tp
00447 
00448       { RAD(-50),RAD(0) }, //mouth
00449 
00450       {0,1},{0,1},{0,1},{0,1},{0,1},{0,1},{0,1},{0,1},{0,1}, //LEDs
00451     
00452       {0,1},{0,1} //ears
00453     };
00454 
00455 #ifdef __RI_RAD_FLAG
00456 #undef RAD
00457 #undef __RI_RAD_FLAG
00458 #endif
00459 
00460 #endif //TGT_ERS2xx check
00461 
00462   /*! @name CPC IDs
00463    * values defined by OPEN-R, used to interface with lower level OPEN-R code to read sensors - DOESN'T correspond to ERS210Info::PrimitiveName */
00464   static const int CPCJointNeckTilt           =  0; // Head
00465   static const int CPCJointNeckPan            =  1;
00466   static const int CPCJointNeckRoll           =  2;
00467   static const int CPCSensorHeadBackPressure  =  3;
00468   static const int CPCSensorHeadFrontPressure =  4;
00469   static const int CPCSensorPSD               =  5;
00470   static const int CPCJointMouth              =  6;
00471   static const int CPCSensorChinSwitch        =  7;
00472   static const int CPCJointLFRotator          =  8; // Left front leg
00473   static const int CPCJointLFElevator         =  9;
00474   static const int CPCJointLFKnee             = 10;
00475   static const int CPCSensorLFPaw             = 11;
00476   static const int CPCJointLHRotator          = 12; // Left hind leg
00477   static const int CPCJointLHElevator         = 13;
00478   static const int CPCJointLHKnee             = 14;
00479   static const int CPCSensorLHPaw             = 15;
00480   static const int CPCJointRFRotator          = 16; // Right front leg
00481   static const int CPCJointRFElevator         = 17;
00482   static const int CPCJointRFKnee             = 18;
00483   static const int CPCSensorRFPaw             = 19;
00484   static const int CPCJointRHRotator          = 20; // Right hind leg
00485   static const int CPCJointRHElevator         = 21;
00486   static const int CPCJointRHKnee             = 22;
00487   static const int CPCSensorRHPaw             = 23;
00488   static const int CPCJointTailPan            = 24; // Tail
00489   static const int CPCJointTailTilt           = 25;
00490   static const int CPCSensorThermoSensor      = 26;
00491   static const int CPCSensorBackSwitch        = 27;
00492   static const int CPCSensorAccelFB           = 28; //!< Front-back; see RobotInfo::BAccelOffset 
00493   static const int CPCSensorAccelLR           = 29; //!< Left-right; see RobotInfo::LAccelOffset 
00494   static const int CPCSensorAccelUD           = 30; //!< Up-down; see RobotInfo::DAccelOffset 
00495   //@}
00496 
00497 }
00498   
00499 /*! @file
00500  * @brief Defines RobotInfo namespace for ERS-210 models, gives some information about the robot's capabilities, such as joint counts, offsets, names and PID values
00501  * @author ejt (Creator)
00502  *
00503  * $Author: ejt $
00504  * $Name: tekkotsu-3_0 $
00505  * $Revision: 1.26 $
00506  * $State: Exp $
00507  * $Date: 2006/10/04 02:41:51 $
00508  */
00509 
00510 #endif

Tekkotsu v3.0
Generated Wed Oct 4 00:03:43 2006 by Doxygen 1.4.7