Tekkotsu Homepage
Demos
Overview
Downloads
Dev. Resources
Reference
Credits

HandEyeInfo.h

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

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