Homepage Demos Overview Downloads Tutorials Reference
Credits

WalkMC.h

Go to the documentation of this file.
00001 //-*-c++-*-
00002 
00003 //This class is ported from Carnegie Mellon's 2001 Robosoccer entry, and falls under their license:
00004 /*=========================================================================
00005     CMPack'02 Source Code Release for OPEN-R SDK v1.0
00006     Copyright (C) 2002 Multirobot Lab [Project Head: Manuela Veloso]
00007     School of Computer Science, Carnegie Mellon University
00008   -------------------------------------------------------------------------
00009     This software is distributed under the GNU General Public License,
00010     version 2.  If you do not have a copy of this licence, visit
00011     www.gnu.org, or write: Free Software Foundation, 59 Temple Place,
00012     Suite 330 Boston, MA 02111-1307 USA.  This program is distributed
00013     in the hope that it will be useful, but WITHOUT ANY WARRANTY,
00014     including MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
00015   -------------------------------------------------------------------------
00016     Additionally licensed to Sony Corporation under the following terms:
00017 
00018     This software is provided by the copyright holders AS IS and any
00019     express or implied warranties, including, but not limited to, the
00020     implied warranties of merchantability and fitness for a particular
00021     purpose are disclaimed.  In no event shall authors be liable for
00022     any direct, indirect, incidental, special, exemplary, or consequential
00023     damages (including, but not limited to, procurement of substitute
00024     goods or services; loss of use, data, or profits; or business
00025     interruption) however caused and on any theory of liability, whether
00026     in contract, strict liability, or tort (including negligence or
00027     otherwise) arising in any way out of the use of this software, even if
00028     advised of the possibility of such damage.
00029   =========================================================================
00030 */
00031 
00032 #ifndef INCLUDED_WalkMC_h
00033 #define INCLUDED_WalkMC_h
00034 
00035 #include "MotionCommand.h"
00036 #include "Geometry.h"
00037 #include "Kinematics.h"
00038 #include "Path.h"
00039 #include "Shared/get_time.h"
00040 #include "OutputCmd.h"
00041 
00042 //! A nice walking class from Carnegie Mellon University's 2001 Robosoccer team, modified to fit this framework, see their <a href="../CMPack_license.txt">license</a>
00043 /*! Moves the feet through a looping path in order to walk - default parameters use
00044  *  a walk low to the ground so you don't walk over the ball.
00045  *
00046  *  This portion of the code falls under CMPack's license:
00047  *  @verbinclude CMPack_license.txt
00048  *
00049  *  @bug the legs try (briefly) to straighten out when first starting to move
00050  */
00051 class WalkMC : public MotionCommand {
00052 public:
00053   typedef SplinePath<vector3d,double> splinepath; //!<for convenience
00054   typedef HermiteSplineSegment<vector3d,double> spline; //!<for convenience
00055 
00056   //! holds state about each leg's path
00057   struct LegWalkState {
00058     LegWalkState() : airpath(), air(0) {} //!< constructor
00059     spline airpath; //!< the path to follow
00060     bool air; //!< true if in the air
00061   };
00062   
00063   //! holds parameters about how to move each leg
00064   struct LegParam {
00065     LegParam() : neutral(), lift_vel(), down_vel(), lift_time(0), down_time(0) {} //!< constructor
00066     vector3d neutral; //!< defines the "neutral" point of each leg - where it is in midstep
00067     vector3d lift_vel; //!< give the velocities to use when raising the paw
00068     vector3d down_vel; //!< give the velocities to use when lowering the paw
00069     double lift_time; //!< the time (as percentage of WalkParam::period) in the cycle to lift (so you can set different offsets between the paws)
00070     double down_time; //!< the time (as percentage of WalkParam::period) in the cycle to put down (so you can set different offsets between the paws)
00071   };
00072 
00073   //! holds more general parameters about the walk
00074   struct WalkParam {
00075     WalkParam() : body_height(0), body_angle(0), hop(0), sway(0), period(0), reserved() {} //!< constructor
00076     LegParam leg[4]; //!< a set of LegParam's, one for each leg
00077     double body_height; //!< the height to hold the body (mm)
00078     double body_angle; //!< the angle to hold the body (rad - 0 is level)
00079     double hop;  //!< sinusoidal hop amplitude
00080     double sway; //!< sinusoidal sway in y direction
00081     long period; //!< the time between steps
00082     long reserved; //!< live with it
00083   };
00084 
00085   //! constructor
00086   WalkMC(const char* pfile=NULL);
00087 
00088   virtual void DoStart(); //!< sends an activate LocomotionEvent
00089   virtual void DoStop();  //!< sends a deactivate LocomotionEvent
00090 
00091   virtual int updateOutputs(); //!< calculates current positions of the paws
00092   
00093   //! Returns true if we are walking. This modified isDirty allows the AIBO to slow down to a stop rather than stopping immediately.
00094   virtual int isDirty();
00095   
00096   //! always true - never autoprunes
00097   virtual int isAlive() { return true; }
00098 
00099   //! loads parameters from a file (@todo use LoadSave)
00100   void load(const char* pfile);
00101   //! saves parameters to a file (@todo use LoadSave)
00102   void save(const char* pfile) const;
00103   //! set the direction to walk - can specify x (forward), y (left), and angular (counterclockwise) velocities
00104   void setTargetVelocity(double dx,double dy,double da);
00105   //! returns current velocity we're trying to go
00106   const vector3d& getTargetVelocity() { return target_vel_xya; }
00107   //! returns the velocity we're actually moving (subject to clipping at max_accel_xya), doesn't reflect value of getPaused()...
00108   const vector3d& getCurVelocity() const { return vel_xya;}
00109   //! returns the time we've been traveling along the current vector
00110   unsigned int getTravelTime() { return get_time()-travelTime; }
00111   
00112   void setPaused(bool p) { isPaused=p; } //!< if set to true, will stop moving
00113   bool getPaused() const { return isPaused; } //!< if is true, we aren't moving
00114   void setHeight(double h) { wp.body_height=h; } //!< sets WalkParam::body_height of #wp
00115   double getHeight() { return wp.body_height; } //!< gets WalkParam::body_height of #wp
00116   void setAngle(double a) { wp.body_angle=a; } //!< sets WalkParam::body_angle of #wp
00117   double getAngle() { return wp.body_angle; } //!< gets WalkParam::body_angle of #wp
00118   void setHop(double h) { wp.hop=h; } //!< sets WalkParam::hop of #wp
00119   double getHop() { return wp.hop; } //!< gets WalkParam::hop of #wp
00120   void setSway(double h) { wp.sway=h; } //!< sets WalkParam::sway of #wp
00121   double getSway() { return wp.sway; } //!< gets WalkParam::sway of #wp
00122   void setPeriod(long p) { wp.period=p; } //!< sets WalkParam::period of #wp
00123   long getPeriod() { return wp.period; } //!< gets WalkParam::period of #wp
00124   void setSlowMo(float p) { slowmo=p; } //!< sets slowmo
00125   float* getSlowMo() { return &slowmo; } //!< gets slowmo
00126 
00127   WalkParam & getWP() { return wp; }; //!< returns the current walk parameter structure
00128   
00129   //! takes current leg positions from WorldState and tries to match the point in the cycle most like it
00130   void resetLegPos();
00131 
00132   static const float MAX_DX; //!< ==180 mm/sec
00133   static const float MAX_DY; //!< ==140 mm/sec
00134   static const float MAX_DA; //!< ==1.8 rad/sec
00135 // tss "SmoothWalk" modification follows (actually only comment is changed)
00136   // static const vector3d max_accel_xya; //!< vector version of MAX_DX,MAX_DY,MAX_DA
00137   static const vector3d max_accel_xya; //!< maximum acceleration of x, y, and a velocity
00138 
00139  protected:
00140   //! holds current joint commands
00141   OutputCmd cmds[NumOutputs][NumFrames];
00142 
00143  protected:
00144   //! does some setup stuff, calls load(pfile)
00145   void init(const char* pfile);
00146 
00147   bool isPaused; //!< true if we are paused
00148 
00149   WalkParam wp; //!< current walking parameters (note that it's not static - different WalkMC's can have different setting, handy...
00150   LegWalkState legw[NumLegs]; //!< current state of each leg
00151   vector3d legpos[NumLegs]; //!< current position of each leg
00152   splinepath body_loc; //!< the path the body goes through while walking (?)
00153   splinepath body_angle; //!< the path the body goes through while walking (?)
00154 
00155   vector3d pos_delta; //!< how much we've moved
00156   double angle_delta; //!< how much we've turned
00157   
00158   unsigned int travelTime; //!< the time since the last call to setTargetVelocity - handy to check the time we've been traveling current vector
00159   int time; //!< time of last call to updateJointCmds() (scaled by slowmo)
00160   int TimeStep; //!< time to pretend passes between each call to updateJointCmds() - usually RobotInfo::FrameTime
00161   float slowmo; //!< scales time values to make the walk move in slow motion for analysis (or fast forward)
00162 
00163   // tss "SmoothWalk" addition follows
00164   /*! The CycleOffset variable is used to ensure that each time the AIBO
00165    *  starts walking, it starts at the same point in the walk cycle as
00166    *  where it stopped. This measure is intended to decrease the amount
00167    *  of jerking (and hence deviation) that occurs when the AIBO starts
00168    *  walking forward and then suddenly stops. */
00169   int CycleOffset;
00170   /*! Each CycleOffset corresponds to a different TimeOffset once the
00171    *  robot starts walking again. Consider this example: the robot
00172    *  stops 2/3 of the way through the cycle, then starts again 1/3
00173    *  of the way through the cycle on the absolute clock. The time
00174    *  offset to advance the clock to the right part of the cycle is
00175    *  1/3 of a cycle, so we set TimeOffset to 1/3 cycle and add that to
00176    *  every clock value used in the walk code. */
00177   int TimeOffset;
00178   /*! Every time we stop, we know we'll have a new CycleOffset, and we'll
00179    *  need to compute a new TimeOffset. This boolean says as much. */
00180   bool NewCycleOffset;
00181 // tss "SmoothWalk" addition ends
00182 
00183   vector3d vel_xya; //!< the current velocity we're moving
00184   vector3d target_vel_xya; //!< the velocity that was requested
00185 };
00186 
00187 /* struct LegState{
00188    long attr,reserved;
00189    point3d pos;
00190    double angles[3];
00191    };
00192    
00193    struct HeadState{
00194    long attr,reserved;
00195    vector3d target;
00196    double angles[3];
00197    };
00198    
00199    struct BodyState{
00200    BodyPosition pos;
00201    LegState leg[4];
00202    HeadState head;
00203    }; 
00204 */
00205 
00206 /*! @file
00207  * @brief Describes WalkMC, a MotionCommand for walking around
00208  * @author CMU RoboSoccer 2001-2002 (Creator)
00209  * @author ejt (ported)
00210  * @author PA Gov. School for the Sciences 2003 Team Project - Haoqian Chen, Yantian Martin, Jon Stahlman (modifications)
00211  * 
00212  * @verbinclude CMPack_license.txt
00213  *
00214  * $Author: ejt $
00215  * $Name: tekkotsu-1_5 $
00216  * $Revision: 1.14 $
00217  * $State: Rel $
00218  * $Date: 2003/10/07 01:00:40 $
00219  */
00220 
00221 #endif

Tekkotsu v1.5
Generated Fri Oct 10 15:52:00 2003 by Doxygen 1.3.4