Tekkotsu Homepage | Demos | Overview | Downloads | Dev. Resources | Reference | Credits |
HandEyeInfo.hGo 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 |