Tekkotsu Homepage
Demos
Overview
Downloads
Dev. Resources
Reference
Credits

Chiara2Info.h

Go to the documentation of this file.
00001 //-*-c++-*-
00002 #ifndef INCLUDED_Chiara2Info_h
00003 #define INCLUDED_Chiara2Info_h
00004 
00005 #include <cmath>
00006 #include <stdlib.h>
00007 #include "CommonInfo.h"
00008 using namespace RobotInfo;
00009 
00010 // see http://tekkotsu.org/porting.html#configuration for more information on TGT_HAS_* flags
00011 #if defined(TGT_CHIARA2)
00012 #  define TGT_IS_BIOLOID
00013 #  define TGT_IS_CHIARA
00014 #  define TGT_IS_CHIARA2
00015 #  define TGT_HAS_CAMERA 1
00016 #  define TGT_HAS_LEDS 7
00017 #  define TGT_HAS_BUTTONS 3
00018 #  define TGT_HAS_LEGS 6
00019 #  define TGT_HAS_SEK_LEGS 6
00020 #  define TGT_HAS_ARMS 1
00021 #  define TGT_HAS_HEAD 1
00022 #  define TGT_HAS_POWER_STATUS
00023 #  define TGT_HAS_IR_DISTANCE 3
00024 #endif
00025 
00026 //! Contains information about an Chiara hexapod robot, such as number of joints, LEDs, etc.
00027 namespace Chiara2Info {
00028 
00029   // *******************************
00030   //       ROBOT CONFIGURATION
00031   // *******************************
00032 
00033   extern const char* const TargetName; //!< the name of the model, to be used for logging and remote GUIs
00034 
00035   const unsigned int FrameTime=32;        //!< time between frames in the motion system (milliseconds)
00036   const unsigned int NumFrames=1;        //!< the number of frames per buffer (don't forget also double buffered)
00037   const unsigned int SoundBufferTime=32; //!< the number of milliseconds per sound buffer... I'm not sure if this can be changed
00038   
00039   //!@name Output Types Information
00040   const unsigned NumWheels      =  0;
00041   
00042   const unsigned JointsPerArm   =  6;
00043   const unsigned NumArms        =  1;
00044   const unsigned NumArmJoints   =  JointsPerArm*NumArms;
00045   
00046   const unsigned JointsPerLeg   =  3; //!< The number of joints per leg
00047   const unsigned NumLegs        =  6; //!< The number of legs
00048   const unsigned NumLegJoints   =  JointsPerLeg*NumLegs; //!< the TOTAL number of joints on ALL legs
00049   const unsigned NumHeadJoints  =  2; //!< The number of joints in the pantilt
00050   const unsigned NumTailJoints  =  0; //!< The number of joints assigned to the tail
00051   const unsigned NumMouthJoints =  0; //!< the number of joints that control the mouth
00052   const unsigned NumEarJoints   =  0; //!< The number of joints which control the ears (NOT per ear, is total)
00053   const unsigned NumButtons     =  3; //!< the number of buttons that are available
00054   const unsigned NumSensors     =  11;  //!< the number of sensors available
00055   const unsigned NumFacePanelLEDs = 0; //!< The number of face panel LEDs
00056 
00057   const unsigned NumLEDs        =  NumLegs + 1; //!< There's an LED on every dynamixel, but can't see most of them, so save some computational resources and only expose the visible ones: knees and pan
00058   const unsigned NumPIDJoints   = NumArmJoints + 1 + NumLegJoints + NumHeadJoints+NumTailJoints+NumMouthJoints;; //!< servo pins
00059   
00060   const unsigned NumOutputs     = NumWheels + NumPIDJoints + NumLEDs; //!< the total number of outputs
00061   const unsigned NumReferenceFrames = NumOutputs + 1 + NumLegs + NumArms + 1 + 3; //!< for the base, feet, gripper, camera, and IR distance rangefinder
00062 
00063   using namespace Camera75DOF;
00064   
00065   const float BallOfFootRadius=0; //!< radius of the ball of the foot
00066   //@}
00067 
00068 
00069   // *******************************
00070   //         OUTPUT OFFSETS
00071   // *******************************
00072 
00073   //!Corresponds to entries in ERS7Info::PrimitiveName, defined at the end of this file
00074   //!@name Output Offsets
00075 
00076   
00077   const unsigned PIDJointOffset = 0; //!< The beginning of the PID Joints
00078   const unsigned RFrRotatorOffset = PIDJointOffset; //!< The right front leg's rotator joint
00079   const unsigned LegOffset   = RFrRotatorOffset+1;           //!< the offset of the beginning of the regular leg joints (after the 1 rotator joint for the right front leg):  #NumLegs of #JointsPerLeg each, in #LegOrder_t order; see #LegOffset_t
00080   const unsigned ArmOffset  = LegOffset+NumLegJoints;   //!< the offset of the beginning of the arm joints, add #TPROffset_t to get specific joint
00081   const unsigned HeadOffset  = ArmOffset+NumArmJoints;   //!< the offset of the beginning of the head joints, add #TPROffset_t to get specific joint
00082 
00083   const unsigned LEDOffset   = PIDJointOffset + NumPIDJoints; //!< the offset of LEDs in WorldState::outputs and MotionCommand functions, see LedOffset_t for specific offsets
00084 
00085   const unsigned BaseFrameOffset   = NumOutputs; //!< Use with kinematics to refer to base reference frame
00086   const unsigned FootFrameOffset    = BaseFrameOffset+1; //!< Use with kinematics to refer to feet reference frames (add appropriate LegOrder_t to specify which paw)
00087   const unsigned GripperFrameOffset = FootFrameOffset+NumLegs; //!< Use with kinematics to refer to gripper reference frame
00088   const unsigned CameraFrameOffset = GripperFrameOffset+NumArms; //!< Use with kinematics to refer to camera reference frame
00089   
00090   const unsigned LeftIRFrameOffset = CameraFrameOffset+1; //!< Use with kinematics to refer to left IR distance rangefinder reference frame
00091   const unsigned CenterIRFrameOffset = LeftIRFrameOffset+1; //!< Use with kinematics to refer to center IR distance rangefinder reference frame
00092   const unsigned IRFrameOffset = CenterIRFrameOffset; //!< alias for CenterIRFrameOffset
00093   const unsigned RightIRFrameOffset = CenterIRFrameOffset+1; //!< Use with kinematics to refer to right IR distance rangefinder reference frame
00094 
00095   //! the ordering of legs
00096   enum LegOrder_t {
00097     RFrLegOrder = 0, //!< right front leg
00098     LFrLegOrder,       //!< left front leg
00099     RMdLegOrder,     //!< right middle leg
00100     LMdLegOrder,     //!< left middle leg
00101     RBkLegOrder,      //!< right back leg
00102     LBkLegOrder     //!< left back leg
00103   };
00104   
00105   //! The offsets within appendages (the legs)  Note that the ordering matches the actual physical ordering of joints on the appendage
00106   enum SEKOffset_t {
00107     SweepOffset=0, //!< moves leg forward or backward along body
00108     ElevatorOffset,  //!< moves leg toward or away from body
00109     KneeOffset       //!< moves knee
00110   };
00111   
00112   //! The offsets of appendages with tilt (elevation), pan (heading), and roll or nod joints (i.e. head/wrist)
00113   enum TPROffset_t {
00114     PanOffset=0, //!< pan/yaw/heading (horizontal)
00115     TiltOffset,      //!< tilt/pitch/elevation (vertical)
00116     NodOffset = TiltOffset, //!< replicated tilt (could be left undefined instead...)
00117     RollOffset //!< spin/twist final axis (can be applied to WristOffset, but Chiara neck only has pan/tilt)
00118   };
00119   
00120   //! The offsets of the individual legs, add #REKOffset_t value to access specific joint
00121   /*! @hideinitializer */
00122   enum LegOffset_t {
00123     RFrLegOffset = LegOffset+RFrLegOrder*JointsPerLeg, //!< beginning of right front leg's joints
00124     LFrLegOffset = LegOffset+LFrLegOrder*JointsPerLeg, //!< beginning of left front leg's joints
00125     RMdLegOffset = LegOffset+RMdLegOrder*JointsPerLeg, //!< beginning of right front leg's joints
00126     LMdLegOffset = LegOffset+LMdLegOrder*JointsPerLeg, //!< beginning of left front leg's joints
00127     RBkLegOffset = LegOffset+RBkLegOrder*JointsPerLeg,  //!< beginning of right back leg's joints
00128     LBkLegOffset = LegOffset+LBkLegOrder*JointsPerLeg, //!< beginning of left back leg's joints
00129   };
00130   
00131   //! These are 'absolute' offsets for the arm joints, don't need to add to ArmOffset like TPROffset_t values do
00132   enum ArmOffset_t {
00133     ArmShoulderOffset=ArmOffset,
00134     ArmElbowOffset,
00135     WristOffset,
00136     WristYawOffset = WristOffset,
00137     WristPitchOffset,
00138     GripperLeftOffset,
00139     GripperRightOffset,
00140     GripperOffset
00141   };
00142   
00143   //! These are 'absolute' offsets for the neck joints, don't need to add to HeadOffset like TPROffset_t values do
00144   enum HeadOffset_t {
00145     HeadPanOffset = HeadOffset,      //!< pan/heading (horizontal)
00146     HeadTiltOffset, //!< tilt/elevation (vertical)
00147   };
00148   
00149   //! The offsets of the individual LEDs, one LED on each dynamixel servo, these match the servo order, so this is empty
00150   /*! @hideinitializer */
00151   enum LEDOffset_t {
00152     RFrKneeLEDOffset = LEDOffset, //!< Small LED on the knee servo
00153     LFrKneeLEDOffset, //!< Small LED on the knee servo
00154     RMdKneeLEDOffset, //!< Small LED on the knee servo
00155     LMdKneeLEDOffset, //!< Small LED on the knee servo
00156     RBkKneeLEDOffset, //!< Small LED on the knee servo
00157     LBkKneeLEDOffset, //!< Small LED on the knee servo
00158     HeadLEDOffset  //!< Small LED on the camera's pan servo
00159   };
00160   
00161   typedef unsigned int LEDBitMask_t; //!< So you can be clear when you're refering to a LED bitmask
00162   
00163   const LEDBitMask_t RFrKneeLEDMask = 1<<(RFrKneeLEDOffset-LEDOffset); //!< mask corresponding to RFrKneeLEDOffset
00164   const LEDBitMask_t LFrKneeLEDMask = 1<<(LFrKneeLEDOffset-LEDOffset); //!< mask corresponding to LFrKneeLEDOffset
00165   const LEDBitMask_t RMdKneeLEDMask = 1<<(RMdKneeLEDOffset-LEDOffset); //!< mask corresponding to RMdKneeLEDOffset
00166   const LEDBitMask_t LMdKneeLEDMask = 1<<(LMdKneeLEDOffset-LEDOffset); //!< mask corresponding to LMdKneeLEDOffset
00167   const LEDBitMask_t RBkKneeLEDMask = 1<<(RBkKneeLEDOffset-LEDOffset); //!< mask corresponding to RBkKneeLEDOffset
00168   const LEDBitMask_t LBkKneeLEDMask = 1<<(LBkKneeLEDOffset-LEDOffset); //!< mask corresponding to LBkKneeLEDOffset
00169   const LEDBitMask_t HeadLEDMask = 1<<(HeadLEDOffset-LEDOffset); //!< mask corresponding to HeadLEDOffset
00170   
00171   //! LEDs for the "face panel" -- on the Chiara this is just HeadLEDMask
00172   const LEDBitMask_t FaceLEDMask = HeadLEDMask;
00173   //! selects all of the leds
00174   const LEDBitMask_t AllLEDMask  = (LEDBitMask_t)~0;
00175   //@}
00176 
00177 
00178   // *******************************
00179   //          INPUT OFFSETS
00180   // *******************************
00181 
00182 
00183   //! The order in which inputs should be stored
00184   //!@name Input Offsets
00185 
00186   //! holds offsets to different buttons in WorldState::buttons[]
00187   /*! Should be a straight mapping to the ButtonSourceIDs
00188    *
00189    *  Note that the chest (power) button is not a normal button.  It kills
00190    *  power to the motors at a hardware level, and isn't sensed in the
00191    *  normal way.  If you want to know when it is pressed (and you are
00192    *  about to shut down) see PowerSrcID::PauseSID.
00193    *
00194    *  @see WorldState::buttons @see ButtonSourceID_t
00195    * @hideinitializer */
00196   enum ButtonOffset_t { GreenButOffset, RedButOffset, YellowButOffset };
00197 
00198   //! Provides a string name for each button
00199   const char* const buttonNames[NumButtons+1] = { "GreenBut", "RedBut", "YellowBut", NULL };
00200 
00201   //! holds offset to different sensor values in WorldState::sensors[]
00202   /*! @see WorldState::sensors[] */
00203   enum SensorOffset_t {
00204     LeftIRDistOffset,
00205     CenterIRDistOffset,
00206     IRDistOffset = CenterIRDistOffset,
00207     RightIRDistOffset,
00208     LeftLuminosityOffset,
00209     CenterLuminosityOffset,
00210     RightLuminosityOffset,
00211     MicVolumeOffset,
00212     MicSpikeCountOffset,
00213     PowerRemainOffset, //! estimate of power capacity as percentage, 0-1
00214     PowerThermoOffset, //!< degrees Celcius
00215     PowerVoltageOffset, //!< volts
00216   };
00217 
00218   //! Provides a string name for each sensor
00219   const char* const sensorNames[NumSensors+1] = {
00220     "LeftIRDist", "CenterIRDist", "RightIRDist",
00221     "LeftLuminosity", "CenterLuminosity", "RightLuminosity",
00222     "MicVolume", "MicSpikeCount",
00223     "PowerRemain", "PowerThermo", "PowerVoltage", NULL
00224   };
00225 
00226   //@}
00227   
00228   
00229   //! Names for each of the outputs
00230   const char* const outputNames[NumReferenceFrames+1] = {
00231     // servos:
00232     "RFr:rotor",
00233     "RFr:sweep","RFr:elvtr","RFr:knee",
00234     "LFr:sweep","LFr:elvtr","LFr:knee",
00235     "RMd:sweep","RMd:elvtr","RMd:knee",
00236     "LMd:sweep","LMd:elvtr","LMd:knee",
00237     "RBk:sweep","RBk:elvtr","RBk:knee",
00238     "LBk:sweep","LBk:elvtr","LBk:knee",
00239     "ARM:shldr","ARM:elbow","ARM:wristYaw","ARM:wristPitch","ARM:gripperLeft","ARM:gripperRight",
00240     "NECK:pan","NECK:tilt",
00241     
00242     // note we don't expose ALL of the dynamixel LEDs... can't see most of them anyway,
00243     // so don't bother wasting storage/computation... these are the more visible ones:
00244     "LED:RFr:knee","LED:LFr:knee",
00245     "LED:RMd:knee","LED:LMd:knee",
00246     "LED:RBk:knee","LED:LBk:knee",
00247     "LED:NECK:pan",
00248     
00249     // reference frames:
00250     "BaseFrame",
00251     "RFrFootFrame",
00252     "LFrFootFrame",
00253     "RMdFootFrame",
00254     "LMdFootFrame",
00255     "RBkFootFrame",
00256     "LBkFootFrame",
00257     "GripperFrame",
00258     "CameraFrame",
00259     "LeftIRFrame",
00260     "CenterIRFrame",
00261     "RightIRFrame",
00262     NULL
00263   };
00264   
00265   //! provides polymorphic robot capability detection/mapping
00266   class ChiaraCapabilities : public Capabilities {
00267   public:
00268     //! constructor
00269     ChiaraCapabilities()
00270     : Capabilities(TargetName,NumReferenceFrames,outputNames,NumButtons,buttonNames,NumSensors,sensorNames,PIDJointOffset,NumPIDJoints,LEDOffset,NumLEDs,NumOutputs)
00271     {
00272       frameToIndex["ARM:Wrist"] = WristYawOffset;
00273       frameToIndex["NECK:nod"] = HeadTiltOffset;
00274       frameToIndex["IRFrame"] = IRFrameOffset; // aliased to the center IR sensor
00275       sensorToIndex["IRDist"]=IRDistOffset; // aliased to the center IR sensor
00276     }
00277   };
00278   //! allocation declared in RobotInfo.cc
00279   extern const ChiaraCapabilities capabilities;
00280   
00281   
00282   //! offsets into DefaultPIDs, since Dynamixel servos don't actually use PID control, but a different set of parameters
00283   enum ServoParam_t {
00284     DYNAMIXEL_SLOPE=0, //!< compliance slope, the proportional control (P in PID)
00285     DYNAMIXEL_PUNCH, //!< punch, a constant added to the slope once error exceeds compliance margin
00286     DYNAMIXEL_MARGIN //!< compliance margin, the amount of error to tolerate before triggering a torque response
00287   };
00288   
00289   //! Dynamixel servos don't use PID control.  Instead, these values indicate compliance slope (P), punch (add to P*error), compliance margin (min error to start applying torque) (see ServoParam_t)
00290   /*! I believe the torque calculation goes something like: torque = (error<compliance) ? 0 : punch + P*error
00291    *  Dynamixel servos allow different values to be supplied for CW vs. CCW motion, but we just use the same value for each */
00292   const float DefaultPIDs[NumPIDJoints][3] = {
00293     {32,32,0},
00294     {32,32,0}, {32,32,0}, {32,32,0}, 
00295     {32,32,0}, {32,32,0}, {32,32,0}, 
00296     {32,32,0}, {32,32,0}, {32,32,0}, 
00297     {32,32,0}, {32,32,0}, {32,32,0}, 
00298     {32,32,0}, {32,32,0}, {32,32,0}, 
00299     {32,32,0}, {32,32,0}, {32,32,0}, 
00300     {32,32,0}, {32,32,0}, {32,32,0}, {32,32,0}, {32,32,0}, {32,32,0}, 
00301     {32,32,0}, {32,32,0},
00302   };
00303   
00304   //!These values are our recommended maximum joint velocities, in rad/ms
00305   /*! a value <= 0 means infinite speed (e.g. LEDs)
00306    *  
00307    *  These limits are <b>not</b> enforced by the framework.  They are simply available for you to use as you see fit.
00308    *  HeadPointerMC and PostureMC are primary examples of included classes which do respect these values (although they can be overridden)
00309    *  
00310    *  These values were obtained from the administrators of the Sony OPEN-R BBS */
00311   const float MaxOutputSpeed[NumOutputs] = {
00312     // servos
00313     0,
00314     0,0,0,
00315     0,0,0,
00316     0,0,0,
00317     0,0,0,
00318     0,0,0,
00319     0,0,0,
00320     0,0,0,0,0,0,
00321     0,0,
00322     // leds
00323     0,0,
00324     0,0,
00325     0,0,
00326     0,
00327   };
00328 
00329   #ifndef RAD
00330     //!Just a little macro for converting degrees to radians
00331   #define RAD(deg) (((deg) * (float)M_PI ) / 180.0f)
00332     //!a flag so we undef these after we're done - do you have a cleaner solution?
00333   #define __RI_RAD_FLAG
00334   #endif
00335   
00336   //! This table holds the software limits of each of the outputs, first index is the output offset, second index is MinMaxRange_t (i.e. MinRange or MaxRange)
00337   const float outputRanges[NumOutputs][2] = {
00338     // servos
00339     {RAD(-17),RAD(90)},
00340     {RAD(-102),RAD(67)}, {RAD(-100),RAD(100)}, {RAD(-55),RAD(160)}, // right front
00341     {RAD(-53),RAD(58)}, {RAD(-100),RAD(100)}, {RAD(-55),RAD(160)}, // left front
00342     {RAD(-53),RAD(53)}, {RAD(-100),RAD(100)}, {RAD(-55),RAD(160)}, // right mid
00343     {RAD(-53),RAD(53)}, {RAD(-100),RAD(100)}, {RAD(-55),RAD(160)}, // left mid
00344     {RAD(-53),RAD(53)}, {RAD(-100),RAD(100)}, {RAD(-55),RAD(160)}, // right back
00345     {RAD(-73),RAD(53)}, {RAD(-100),RAD(100)}, {RAD(-55),RAD(160)}, // left back   
00346     {RAD(-95),RAD(95)}, {RAD(-95),RAD(95)}, {RAD(-100),RAD(100)}, {RAD(-90),RAD(90)}, {RAD(-90),RAD(90)}, {RAD(-90),RAD(90)},
00347     {RAD(-150),RAD(150)}, {RAD(-92),RAD(75)}, 
00348     
00349     // LED
00350     {0,1}, {0,1},
00351     {0,1}, {0,1},
00352     {0,1}, {0,1},
00353     {0,1}, 
00354   };
00355 
00356   //! This table holds the mechanical limits of each of the outputs, first index is the output offset, second index is MinMaxRange_t (i.e. MinRange or MaxRange)
00357   /*! Same as #outputRanges, don't know actual values because they were never specified by Sony */
00358   const float mechanicalLimits[NumOutputs][2] = {
00359     // servos
00360     {RAD(-17),RAD(90)},
00361     {RAD(-102),RAD(67)}, {RAD(-100),RAD(100)}, {RAD(-55),RAD(160)}, // right front
00362     {RAD(-53),RAD(58)}, {RAD(-100),RAD(100)}, {RAD(-55),RAD(160)}, // left front
00363     {RAD(-53),RAD(53)}, {RAD(-100),RAD(100)}, {RAD(-55),RAD(160)}, // right mid
00364     {RAD(-53),RAD(53)}, {RAD(-100),RAD(100)}, {RAD(-55),RAD(160)}, // left mid
00365     {RAD(-53),RAD(53)}, {RAD(-100),RAD(100)}, {RAD(-55),RAD(160)}, // right back
00366     {RAD(-73),RAD(53)}, {RAD(-100),RAD(100)}, {RAD(-55),RAD(160)}, // left back   
00367     {RAD(-95),RAD(95)}, {RAD(-95),RAD(95)}, {RAD(-100),RAD(100)}, {RAD(-90),RAD(90)}, {RAD(-90),RAD(90)}, {RAD(-90),RAD(90)},
00368     {RAD(-150),RAD(150)}, {RAD(-92),RAD(75)},     
00369 
00370     // LED
00371     {0,1}, {0,1},
00372     {0,1}, {0,1},
00373     {0,1}, {0,1},
00374     {0,1}, 
00375   };
00376 
00377 #ifdef __RI_RAD_FLAG
00378 #undef RAD
00379 #undef __RI_RAD_FLAG
00380 #endif
00381 }
00382 
00383 /*! @file
00384  * @brief Defines some capabilities of the Chiara hexapod robots
00385  * @author ejt (Creator)
00386  */
00387 
00388 #endif

Tekkotsu v5.1CVS
Generated Fri Mar 16 05:26:35 2012 by Doxygen 1.6.3