Tekkotsu Homepage
Demos
Overview
Downloads
Dev. Resources
Reference
Credits

HandEyeZInfo.h

Go to the documentation of this file.
00001 //-*-c++-*-
00002 #ifndef INCLUDED_HandEyeZInfo_h
00003 #define INCLUDED_HandEyeZInfo_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_HANDEYEZ)
00012 #  define TGT_IS_BIOLOID
00013 #  define TGT_IS_HANDEYEZ
00014 #  define TGT_HAS_CAMERA 1
00015 //UPGRADE: set TGT_HAS_LEDS to 7
00016 #  define TGT_HAS_LEDS 5
00017 #  define TGT_HAS_ARMS 1
00018 #  define TGT_HAS_HEAD 1
00019 #  define WALKMC_NO_WARN_NOOP
00020 #endif
00021 
00022 //! Declares configuration of the modified HandEye planar arm robot, such as number of joints, LEDs, etc.
00023 namespace HandEyeZInfo {
00024 
00025   // *******************************
00026   //       ROBOT CONFIGURATION
00027   // *******************************
00028 
00029   extern const char* const TargetName; //!< the name of the model, to be used for logging and remote GUIs
00030 
00031   const unsigned int FrameTime=32;        //!< time between frames in the motion system (milliseconds)
00032   const unsigned int NumFrames=1;        //!< the number of frames per buffer (don't forget also double buffered)
00033   const unsigned int SoundBufferTime=32; //!< the number of milliseconds per sound buffer... I'm not sure if this can be changed
00034   
00035   //!@name Output Types Information
00036   const unsigned NumWheels      =  0;
00037   
00038   const unsigned JointsPerArm   =  5; // UPGRADE: 5;
00039   const unsigned NumArms        =  1;
00040   const unsigned NumArmJoints   =  JointsPerArm*NumArms;
00041   
00042   const unsigned JointsPerLeg   =  0; //!< The number of joints per leg
00043   const unsigned NumLegs        =  0; //!< The number of legs
00044   const unsigned NumLegJoints   =  JointsPerLeg*NumLegs; //!< the TOTAL number of joints on ALL legs
00045   const unsigned NumHeadJoints  =  2; //!< The number of joints in the pantilt
00046   const unsigned NumTailJoints  =  0; //!< The number of joints assigned to the tail
00047   const unsigned NumMouthJoints =  0; //!< the number of joints that control the mouth
00048   const unsigned NumEarJoints   =  0; //!< The number of joints which control the ears (NOT per ear, is total)
00049   const unsigned NumButtons     =  3; //!< the number of buttons that are available
00050   const unsigned NumSensors     =  2;  //!< the number of sensors available
00051   const unsigned NumFacePanelLEDs = 0; //!< The number of face panel LEDs
00052 
00053   // UPGRADE: NumLEDs to 9
00054   const unsigned NumLEDs        =  7; //!< The number of LEDs which can be controlled (one per dynamixel servo)
00055   const unsigned NumPIDJoints   = NumWheels + NumArmJoints + NumLegJoints+NumHeadJoints+NumTailJoints+NumMouthJoints;; //!< servo pins
00056   
00057   const unsigned NumOutputs     = NumWheels + NumPIDJoints + NumLEDs; //!< the total number of outputs
00058   const unsigned NumReferenceFrames = NumOutputs + 1 + NumArms + 1; //!< for the base, gripper (* NumArms), and camera reference frames
00059 
00060   using namespace Camera75DOF;
00061   //@}
00062 
00063 
00064   // *******************************
00065   //         OUTPUT OFFSETS
00066   // *******************************
00067 
00068   //!Corresponds to entries in ERS7Info::PrimitiveName, defined at the end of this file
00069   //!@name Output Offsets
00070 
00071   
00072   const unsigned PIDJointOffset = 0; //!< The beginning of the PID Joints
00073   
00074   const unsigned ArmOffset   = PIDJointOffset;  //!< beginning of arm joints, don't add anything, just use ArmOffset_t entries directly
00075   
00076   const unsigned HeadOffset  = ArmOffset+NumArmJoints;   //!< the offset of the beginning of the head joints, add TPROffset_t to get specific joint
00077 
00078   const unsigned LEDOffset   = PIDJointOffset + NumPIDJoints; //!< the offset of LEDs in WorldState::outputs and MotionCommand functions, see LedOffset_t for specific offsets
00079 
00080   const unsigned BaseFrameOffset   = NumOutputs; //!< Use with kinematics to refer to base reference frame
00081   const unsigned GripperFrameOffset    = BaseFrameOffset+1; //!< Use with kinematics to refer to paw reference frames (add appropriate LegOrder_t to specify which paw)
00082   const unsigned CameraFrameOffset = GripperFrameOffset+NumArms; //!< Use with kinematics to refer to camera reference frame
00083 
00084   //! These are 'absolute' offsets for the arm joints
00085   enum ArmOffset_t {
00086     ArmShoulderOffset = ArmOffset,
00087     ArmElbowOffset,
00088     WristOffset,
00089     WristYawOffset = WristOffset,
00090     LeftGripperOffset,
00091     RightGripperOffset,
00092     //WristPitchOffset, // UPGRADE
00093     //GripperOffset, // UPGRADE
00094   };
00095   
00096   //! The offsets of appendages with pan (heading), tilt (elevation), note that this should be added to HeadOffset, otherwise use HeadOffset_t (#HeadPanOffset and #HeadTiltOffset)
00097   enum TPROffset_t {
00098     PanOffset = 0,      //!< pan/heading (horizontal)
00099     TiltOffset, //!< tilt/elevation (vertical)
00100   };
00101   
00102   //! These are 'absolute' offsets for the neck joints, don't need to add to HeadOffset like TPROffset_t values do
00103   enum HeadOffset_t {
00104     HeadPanOffset = HeadOffset,      //!< pan/heading (horizontal)
00105     HeadTiltOffset, //!< tilt/elevation (vertical)
00106   };
00107   
00108   //! The offsets of the individual LEDs
00109   /*! @hideinitializer */
00110   enum LEDOffset_t {
00111     ArmShoulderLEDOffset = LEDOffset, //!< Small led on the shoulder servo
00112     ArmElbowLEDOffset, //!< Small LED on the elbow servo
00113     ArmWristLEDOffset, //!< Small LED on the wrist servo
00114     ArmLeftGripperLEDOffset, //!< Small LED on the left gripper
00115     ArmRightGripperLEDOffset, //!< Small LED on the right gripper
00116     NeckPanLEDOffset, //!< Small LED on the neck pan servo
00117     NeckTiltLEDOffset //!< Small LED on the neck tilt servo
00118         };
00119   
00120   typedef unsigned int LEDBitMask_t; //!< So you can be clear when you're refering to a LED bitmask
00121   const LEDBitMask_t ArmShoulderLEDMask     = 1 << (ArmShoulderLEDOffset-LEDOffset); //!< Mask corresponding to ArmShoulderLEDOffset
00122   const LEDBitMask_t ArmElbowLEDMask        = 1 << (ArmElbowLEDOffset-LEDOffset); //!< Mask corresponding to ArmElbowLEDOffset
00123   const LEDBitMask_t ArmWristLEDMask        = 1 << (ArmWristLEDOffset-LEDOffset); //!< Mask corresponding to ArmWristLEDOffset
00124   const LEDBitMask_t ArmLeftGripperLEDMask  = 1 << (ArmLeftGripperLEDOffset-LEDOffset); //!< Mask corresponding to ArmLeftGripperLEDOffset
00125   const LEDBitMask_t ArmRightGripperLEDMask = 1 << (ArmRightGripperLEDOffset-LEDOffset); //!< Mask corresponding to ArmRightGripperLEDOffset
00126   const LEDBitMask_t NeckPanLEDMask         = 1 << (NeckPanLEDOffset-LEDOffset); //!< Mask corresponding to NeckPanLEDOffset
00127   const LEDBitMask_t NeckTiltLEDMask        = 1 << (NeckTiltLEDOffset-LEDOffset); //!< Mask corresponding to NeckTiltLEDOffset
00128 
00129   //! LEDs for the face panel (all FaceLEDPanelMask<<(0:NumFacePanelLEDs-1) entries)
00130   const LEDBitMask_t FaceLEDMask = 0;
00131 
00132   //! selects all of the leds
00133   const LEDBitMask_t AllLEDMask  = (LEDBitMask_t)~0;
00134   //@}
00135 
00136 
00137   //! Offset needed so that the centroid of the robot is correct relative to the bounding box
00138   const fmat::Column<3> AgentBoundingBoxBaseFrameOffset = fmat::pack(0,0,0); 
00139 
00140   //! Half of the length, width, and height of the robot
00141   const fmat::Column<3> AgentBoundingBoxHalfDims = fmat::pack(304.8/2, 304.8/2, 0);
00142 
00143   // *******************************
00144   //          INPUT OFFSETS
00145   // *******************************
00146 
00147 
00148   //! The order in which inputs should be stored
00149   //!@name Input Offsets
00150 
00151   //! holds offsets to different buttons in WorldState::buttons[]
00152   /*! Should be a straight mapping to the ButtonSourceIDs
00153    *
00154    *  @see WorldState::buttons @see ButtonSourceID_t
00155    * @hideinitializer */
00156   enum ButtonOffset_t { GreenButOffset, RedButOffset, YellowButOffset };
00157 
00158   //! Provides a string name for each button
00159   const char* const buttonNames[NumButtons+1] = { "GreenBut", "RedBut", "YellowBut", NULL };
00160 
00161   //! holds offset to different sensor values in WorldState::sensors[]
00162   /*! @see WorldState::sensors[] */
00163   enum SensorOffset_t {
00164     PowerThermoOffset, //!< degrees Celcius
00165     PowerVoltageOffset, //!< volts
00166   };
00167   
00168   //! Provides a string name for each sensor
00169   const char* const sensorNames[NumSensors+1] = {
00170     "PowerThermo","PowerVoltage", NULL
00171   };
00172   
00173   //@}
00174 
00175 
00176   //! Names for each of the outputs
00177   const char* const outputNames[NumReferenceFrames+1] = {
00178     "ARM:shldr","ARM:elbow","ARM:wristYaw", "Arm:LeftGripper", "ArmRightGripper",
00179     "NECK:pan", "NECK:tilt",
00180 
00181     "LED:ARM:shldr",
00182     "LED:ARM:elbow",
00183     "LED:ARM:wrist",
00184     "LED ARM:lgrip",
00185     "LED ARM:rgrip",
00186     "LED:NECK:pan",
00187     "LED:NECK:tilt",
00188     //"LED:00007", // UPGRADE
00189     //"LED:00008", // UPGRADE
00190     
00191     "BaseFrame",
00192     "GripperFrame",
00193     "CameraFrame",
00194     NULL
00195   };
00196   
00197   //! provides polymorphic robot capability detection/mapping
00198   class HandEyeZCapabilities : public Capabilities {
00199   public:
00200     //! constructor
00201     HandEyeZCapabilities()
00202     : Capabilities(TargetName,NumReferenceFrames,outputNames,NumButtons,buttonNames,NumSensors,sensorNames,PIDJointOffset,NumPIDJoints,LEDOffset,NumLEDs,NumOutputs)
00203     {
00204       frameToIndex["ARM:wrist"] = WristYawOffset;
00205       frameToIndex["NECK:nod"] = HeadTiltOffset;
00206     }
00207   };
00208   //! allocation declared in RobotInfo.cc
00209   extern const HandEyeZCapabilities capabilities;
00210   
00211   //! 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)
00212   /*! I believe the torque calculation goes something like: torque = (error<compliance) ? 0 : punch + P*error
00213    *  Dynamixel servos allow different values to be supplied for CW vs. CCW motion, but we just use the same value for each */
00214   const float DefaultPIDs[NumPIDJoints][5] = {
00215     {32,32,0}, {32,32,0}, {32,32,0}, {32,32,0}, {32,32,0},// UPGRADE: {32,32,0}, {32,32,0}, 
00216     {32,32,0}, {32,32,0},
00217   };
00218   
00219   //!These values are our recommended maximum joint velocities, in rad/ms
00220   /*! a value <= 0 means infinite speed (e.g. LEDs)
00221    *  
00222    *  These limits are <b>not</b> enforced by the framework.  They are simply available for you to use as you see fit.
00223    *  HeadPointerMC and PostureMC are primary examples of included classes which do respect these values (although they can be overridden)
00224    */
00225   const float MaxOutputSpeed[NumOutputs] = {
00226     // servos
00227     0,0,0,0,0,0,0,// UPGRADE: 0,0,
00228     // leds
00229     0,0,0,0,0,// UPGRADE: 0,0,
00230   };
00231 
00232   #ifndef RAD
00233     //!Just a little macro for converting degrees to radians
00234   #define RAD(deg) (((deg) * (float)M_PI ) / 180.0f)
00235     //!a flag so we undef these after we're done - do you have a cleaner solution?
00236   #define __RI_RAD_FLAG
00237   #endif
00238   
00239   //! 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)
00240   const float outputRanges[NumOutputs][2] = {
00241     // servos
00242     {RAD(-130),RAD(130)}, {RAD(-150),RAD(150)}, {RAD(-150),RAD(150)}, {-0.5f,0.5f}, {-0.5f,0.5f}, //UPGRADE: {0,RAD(300)}, {0,RAD(300)}, 
00243     {RAD(-63),RAD(63)}, {RAD(-95),RAD(68)},
00244 
00245     // LED
00246     {0,1}, {0,1}, {0,1}, {0,1}, {0,1}, // UPGRADE: {0,1}, {0,1}, 
00247     {0,1}, {0,1},
00248   };
00249 
00250   //! 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)
00251   const float mechanicalLimits[NumOutputs][2] = {
00252     // servos
00253     {RAD(-120),RAD(120)}, {RAD(-120),RAD(120)}, {RAD(-120),RAD(120)}, {-0.5f, 0.5f} ,{-0.5f, 0.5f}, //UPGRADE: {0,RAD(300)}, {0,RAD(300)}, 
00254     {RAD(-150),RAD(150)}, {RAD(-92),RAD(75)},
00255     
00256     // LED
00257     {0,1}, {0,1}, {0,1}, {0,1}, {0,1}, // UPGRADE: {0,1}, {0,1}, 
00258     {0,1}, {0,1},
00259   };
00260 
00261 #ifdef __RI_RAD_FLAG
00262 #undef RAD
00263 #undef __RI_RAD_FLAG
00264 #endif
00265 }
00266 
00267 /*! @file
00268  * @brief Defines some capabilities of the modified HandEye planar arm robot
00269  * @author ejt (Creator)
00270  */
00271 
00272 #endif

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