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

Tekkotsu v5.1CVS
Generated Mon May 9 04:58:36 2016 by Doxygen 1.6.3