WalkMC Class Reference#include <WalkMC.h>
Inheritance diagram for WalkMC:
[legend]List of all members.
Detailed Description
A nice walking class from Carnegie Mellon University's 2001 Robosoccer team, modified to fit this framework, see their license.
Moves the feet through a looping path in order to walk - default parameters use a walk low to the ground so you don't walk over the ball.
There are around 50 parameters which control the walk - these are loaded from a file and can modify almost every aspect of the the gait. It's a binary file format, I recommend using our Walk Edit menu to edit the parameters in real time and get immediate feedback. It's a tricky job to find a good set of parameters.
And then, once you have it walking, there's a whole different problem of actually moving at the speed that's requested. That's what the calibration parameters do - map the requested target speed to the command to pass to the engine so the resulting motion will hopefully match what you asked for.
You'll probably want to take a look at the setTargetVelocity() function to control the direction of the walk.
This class is in some dire need of some cleanup - we (Tekkotsu) didn't write it, never really bothered to get a deep understanding of it, but have none the less hacked around and added stuff on top of it. So pardon the mess, unless you're feeling ambitious to write your own ;)
This portion of the code falls under CMPack's license:
=========================================================================
CMPack'02 Source Code Release for OPEN-R SDK v1.0
Copyright (C) 2002 Multirobot Lab [Project Head: Manuela Veloso]
School of Computer Science, Carnegie Mellon University
-------------------------------------------------------------------------
This software is distributed under the GNU General Public License,
version 2. If you do not have a copy of this licence, visit
www.gnu.org, or write: Free Software Foundation, 59 Temple Place,
Suite 330 Boston, MA 02111-1307 USA. This program is distributed
in the hope that it will be useful, but WITHOUT ANY WARRANTY,
including MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-------------------------------------------------------------------------
Additionally licensed to Sony Corporation under the following terms:
This software is provided by the copyright holders AS IS and any
express or implied warranties, including, but not limited to, the
implied warranties of merchantability and fitness for a particular
purpose are disclaimed. In no event shall authors be liable for
any direct, indirect, incidental, special, exemplary, or consequential
damages (including, but not limited to, procurement of substitute
goods or services; loss of use, data, or profits; or business
interruption) however caused and on any theory of liability, whether
in contract, strict liability, or tort (including negligence or
otherwise) arising in any way out of the use of this software, even if
advised of the possibility of such damage.
=========================================================================
Definition at line 71 of file WalkMC.h.
|
Public Types |
typedef SplinePath< vector3d,
float > | splinepath |
| for convenience
|
typedef HermiteSplineSegment<
vector3d, float > | spline |
| for convenience
|
enum | AccelerationStyle_t { CALIBRATION_ACCEL,
INF_ACCEL,
DEFAULT_ACCEL
} |
| used to specify value for acc_style More...
|
Public Member Functions |
| WalkMC (const char *pfile=NULL) |
| constructor
|
virtual void | DoStart () |
| sends an activate LocomotionEvent
|
virtual void | DoStop () |
| sends a deactivate LocomotionEvent
|
virtual int | updateOutputs () |
| calculates current positions of the paws
|
virtual int | isDirty () |
| Returns true if we are walking. This modified isDirty allows the AIBO to slow down to a stop rather than stopping immediately.
|
virtual int | isAlive () |
| always true - never autoprunes
|
virtual unsigned int | getBinSize () const |
| calculates space needed to save - if you can't precisely add up the size, overestimate and things will still work.
|
virtual unsigned int | LoadBuffer (const char buf[], unsigned int len) |
| Load from a saved buffer.
|
virtual unsigned int | SaveBuffer (char buf[], unsigned int len) const |
| Save to a given buffer.
|
virtual unsigned int | LoadFile (const char *filename) |
| initiate opening of the specified file and loading/saving of all appropriate information.
|
virtual unsigned int | SaveFile (const char *filename) const |
| initiate opening of the specified file and loading/saving of all appropriate information.
|
void | setTargetVelocity (double dx, double dy, double da, int n=-1) |
| set the direction to walk
|
const vector3d & | getTargetVelocity () |
| returns current velocity we're trying to go
|
const vector3d & | getCurVelocity () const |
| returns the velocity we're actually moving (subject to clipping at max_accel_xya), doesn't reflect value of getPaused()...
|
unsigned int | getStartTravelTime () |
| returns the time at which we started traveling along the current vector
|
unsigned int | getTravelTime () |
| returns the amount of time we've been traveling along the current vector
|
void | setTargetDisplacement (double dx, double dy, double da, unsigned int n) |
| recalculates the target velocity so steps are of a given length to achieve the specified displacement in n steps
|
int | getRemainingSteps () |
| returns remaining steps (step_count) (negative means infinite)
|
void | setPaused (bool p) |
| if set to true, will stop moving
|
bool | getPaused () const |
| if is true, we aren't moving
|
void | setHeight (double h) |
| sets WalkParam::body_height of wp
|
double | getHeight () |
| gets WalkParam::body_height of wp
|
void | setAngle (double a) |
| sets WalkParam::body_angle of wp
|
double | getAngle () |
| gets WalkParam::body_angle of wp
|
void | setHop (double h) |
| sets WalkParam::hop of wp
|
double | getHop () |
| gets WalkParam::hop of wp
|
void | setSway (double h) |
| sets WalkParam::sway of wp
|
double | getSway () |
| gets WalkParam::sway of wp
|
void | setPeriod (long p) |
| sets WalkParam::period of wp
|
long | getPeriod () |
| gets WalkParam::period of wp
|
void | setSlowMo (float p) |
| sets slowmo
|
float * | getSlowMo () |
| gets slowmo
|
virtual void | setAccelerationStyle (AccelerationStyle_t acc) |
| sets acc_style
|
virtual AccelerationStyle_t | getAccelerationStyle () const |
| returns acc_style
|
const vector3d & | getLegPosition (LegOrder_t i) const |
| returns the current leg position of leg i
|
WalkParam & | getWP () |
CalibrationParam & | getCP () |
void | resetLegPos () |
| takes current leg positions from WorldState and tries to match the point in the cycle most like it
|
Static Public Attributes |
static const float | MAX_DX = 180 |
| ==180 mm/sec
|
static const float | MAX_DY = 140 |
| ==140 mm/sec
|
static const float | MAX_DA = 1.8 |
| ==1.8 rad/sec
|
static const vector3d | max_accel_xya |
| maximum acceleration of x, y, and a velocity
|
Protected Member Functions |
void | init (const char *pfile) |
| does some setup stuff, calls LoadFile(pfile)
|
Static Protected Member Functions |
static void | applyCalibration (const float mat[3][11], const vector3d &in, vector3d &out) |
| converts in to calibration parameters and multiplies through the calibration matrix
|
Protected Attributes |
OutputCmd | cmds [NumOutputs][NumFrames] |
| holds current joint commands
|
bool | isPaused |
| true if we are paused
|
WalkParam | wp |
| current walking parameters (note that it's not static - different WalkMC's can have different setting, handy...
|
CalibrationParam | cp |
| calibration parameters for current walk.
|
LegWalkState | legw [NumLegs] |
| current state of each leg
|
vector3d | legpos [NumLegs] |
| current position of each leg
|
splinepath | body_loc |
| the path the body goes through while walking (?)
|
splinepath | body_angle |
| the path the body goes through while walking (?)
|
vector3d | liftPos [NumLegs] |
| position each of the feet was last lifted
|
vector3d | downPos [NumLegs] |
| position each of the feet is next going to be set down
|
AccelerationStyle_t | acc_style |
| lets you switch between finite or infinite acceleration models
|
int | step_count |
| number of steps to take before stopping; if negative, walk forever.
|
double | last_cycle |
| where the walk is in it its cycle, updated at the end of each call to updateOutputs()
|
vector3d | pos_delta |
| how much we've moved
|
float | angle_delta |
| how much we've turned
|
unsigned int | travelTime |
| the time of the last call to setTargetVelocity - handy to check the time we've been traveling current vector
|
int | time |
| time of last call to updateOutputs() (scaled by slowmo)
|
int | TimeStep |
| time to pretend passes between each call to updateOutputs() - usually RobotInfo::FrameTime
|
float | slowmo |
| scales time values to make the walk move in slow motion for analysis (or fast forward)
|
int | CycleOffset |
int | TimeOffset |
bool | NewCycleOffset |
vector3d | vel_xya |
| the current velocity we're moving
|
vector3d | target_vel_xya |
| the velocity that was requested
|
vector3d | last_target_vel_xya |
| the velocity that was last sent to motion
|
Classes |
struct | CalibrationParam |
| holds information to correct for slippage, non-idealities More...
|
struct | LegParam |
| holds parameters about how to move each leg More...
|
struct | LegWalkState |
| holds state about each leg's path More...
|
struct | WalkParam |
| holds more general parameters about the walk More...
|
Member Typedef Documentation
|
for convenience
Definition at line 74 of file WalkMC.h. |
|
for convenience
Definition at line 73 of file WalkMC.h. |
Member Enumeration Documentation
|
used to specify value for acc_style
- Enumeration values:
-
CALIBRATION_ACCEL |
use the acceleration specified by the calibration parameters |
INF_ACCEL |
ignore calibration acceleration (attempt infinite acceleration) |
DEFAULT_ACCEL |
reference the value of Config::motion_config::walk_acceleration |
Definition at line 194 of file WalkMC.h. |
Constructor & Destructor Documentation
WalkMC::WalkMC |
( |
const char * |
pfile = NULL |
) |
|
|
Member Function Documentation
void WalkMC::applyCalibration |
( |
const float |
mat[3][11], |
|
|
const vector3d & |
in, |
|
|
vector3d & |
out |
|
) |
[static, protected] |
|
|
converts in to calibration parameters and multiplies through the calibration matrix
Definition at line 566 of file WalkMC.cc.
Referenced by updateOutputs(). |
void WalkMC::DoStart |
( |
|
) |
[virtual] |
|
void WalkMC::DoStop |
( |
|
) |
[virtual] |
|
double WalkMC::getAngle |
( |
|
) |
[inline] |
|
unsigned int WalkMC::getBinSize |
( |
|
) |
const [virtual] |
|
|
calculates space needed to save - if you can't precisely add up the size, overestimate and things will still work.
- Returns:
- number of bytes read/written, 0 if error (or empty)
Implements LoadSave.
Definition at line 140 of file WalkMC.cc. |
const vector3d& WalkMC::getCurVelocity |
( |
|
) |
const [inline] |
|
|
returns the velocity we're actually moving (subject to clipping at max_accel_xya), doesn't reflect value of getPaused()...
Definition at line 158 of file WalkMC.h. |
double WalkMC::getHeight |
( |
|
) |
[inline] |
|
double WalkMC::getHop |
( |
|
) |
[inline] |
|
const vector3d& WalkMC::getLegPosition |
( |
LegOrder_t |
i |
) |
const [inline] |
|
|
returns the current leg position of leg i
Definition at line 203 of file WalkMC.h. |
bool WalkMC::getPaused |
( |
|
) |
const [inline] |
|
|
if is true, we aren't moving
Definition at line 179 of file WalkMC.h. |
long WalkMC::getPeriod |
( |
|
) |
[inline] |
|
int WalkMC::getRemainingSteps |
( |
|
) |
[inline] |
|
float* WalkMC::getSlowMo |
( |
|
) |
[inline] |
|
unsigned int WalkMC::getStartTravelTime |
( |
|
) |
[inline] |
|
|
returns the time at which we started traveling along the current vector
Definition at line 160 of file WalkMC.h.
Referenced by getTravelTime(). |
double WalkMC::getSway |
( |
|
) |
[inline] |
|
const vector3d& WalkMC::getTargetVelocity |
( |
|
) |
[inline] |
|
|
returns current velocity we're trying to go
Definition at line 156 of file WalkMC.h. |
unsigned int WalkMC::getTravelTime |
( |
|
) |
[inline] |
|
|
returns the amount of time we've been traveling along the current vector
Definition at line 162 of file WalkMC.h.
Referenced by updateOutputs(). |
void WalkMC::init |
( |
const char * |
pfile |
) |
[protected] |
|
|
does some setup stuff, calls LoadFile(pfile)
Definition at line 102 of file WalkMC.cc.
Referenced by WalkMC(). |
virtual int WalkMC::isAlive |
( |
|
) |
[inline, virtual] |
|
int WalkMC::isDirty |
( |
|
) |
[virtual] |
|
|
Returns true if we are walking. This modified isDirty allows the AIBO to slow down to a stop rather than stopping immediately.
Implements MotionCommand.
Definition at line 125 of file WalkMC.cc.
Referenced by updateOutputs(). |
unsigned int WalkMC::LoadBuffer |
( |
const char |
buf[], |
|
|
unsigned int |
len |
|
) |
[virtual] |
|
|
Load from a saved buffer.
- Parameters:
-
| buf | pointer to the memory where you should begin loading |
| len | length of buf available (this isn't all yours, might be more stuff saved after yours) |
- Returns:
- the number of bytes actually used
Implements LoadSave.
Definition at line 148 of file WalkMC.cc. |
unsigned int WalkMC::LoadFile |
( |
const char * |
filename |
) |
[virtual] |
|
void WalkMC::resetLegPos |
( |
|
) |
|
|
unsigned int WalkMC::SaveBuffer |
( |
char |
buf[], |
|
|
unsigned int |
len |
|
) |
const [virtual] |
|
|
Save to a given buffer.
- Parameters:
-
| buf | pointer to the memory where you should begin writing |
| len | length of buf available. (this isn't all yours, constrain yourself to what you returned in getBinSize() ) |
- Returns:
- the number of bytes actually used
Implements LoadSave.
Definition at line 224 of file WalkMC.cc. |
unsigned int WalkMC::SaveFile |
( |
const char * |
filename |
) |
const [virtual] |
|
void WalkMC::setAngle |
( |
double |
a |
) |
[inline] |
|
void WalkMC::setHeight |
( |
double |
h |
) |
[inline] |
|
void WalkMC::setHop |
( |
double |
h |
) |
[inline] |
|
void WalkMC::setPaused |
( |
bool |
p |
) |
[inline] |
|
|
if set to true, will stop moving
Definition at line 178 of file WalkMC.h. |
void WalkMC::setPeriod |
( |
long |
p |
) |
[inline] |
|
void WalkMC::setSlowMo |
( |
float |
p |
) |
[inline] |
|
void WalkMC::setSway |
( |
double |
h |
) |
[inline] |
|
void WalkMC::setTargetDisplacement |
( |
double |
dx, |
|
|
double |
dy, |
|
|
double |
da, |
|
|
unsigned int |
n |
|
) |
|
|
|
recalculates the target velocity so steps are of a given length to achieve the specified displacement in n steps
- Parameters:
-
| dx | length of displacement in millimeters along body's x axis |
| dy | length of displacement in millimeters along body's y axis |
| da | amount to turn in radians, counter-clockwise viewed from above |
| n | number of steps to take step_count will be set to n, so if the required velocity is beyond the abilities of the robot, it will stop on the n'th step, regardless of distance remaining. |
Definition at line 271 of file WalkMC.cc. |
void WalkMC::setTargetVelocity |
( |
double |
dx, |
|
|
double |
dy, |
|
|
double |
da, |
|
|
int |
n = -1 |
|
) |
|
|
int WalkMC::updateOutputs |
( |
|
) |
[virtual] |
|
Member Data Documentation
|
the path the body goes through while walking (?)
Definition at line 235 of file WalkMC.h.
Referenced by init(). |
|
the path the body goes through while walking (?)
Definition at line 234 of file WalkMC.h.
Referenced by init(). |
|
The CycleOffset variable is used to ensure that each time the AIBO starts walking, it starts at the same point in the walk cycle as where it stopped. This measure is intended to decrease the amount of jerking (and hence deviation) that occurs when the AIBO starts walking forward and then suddenly stops.
Definition at line 259 of file WalkMC.h.
Referenced by updateOutputs(). |
|
maximum acceleration of x, y, and a velocity
Referenced by updateOutputs(). |
|
Every time we stop, we know we'll have a new CycleOffset, and we'll need to compute a new TimeOffset. This boolean says as much.
Definition at line 270 of file WalkMC.h.
Referenced by updateOutputs(). |
|
Each CycleOffset corresponds to a different TimeOffset once the robot starts walking again. Consider this example: the robot stops 2/3 of the way through the cycle, then starts again 1/3 of the way through the cycle on the absolute clock. The time offset to advance the clock to the right part of the cycle is 1/3 of a cycle, so we set TimeOffset to 1/3 cycle and add that to every clock value used in the walk code.
Definition at line 267 of file WalkMC.h.
Referenced by updateOutputs(). |
|
current walking parameters (note that it's not static - different WalkMC's can have different setting, handy...
Definition at line 230 of file WalkMC.h.
Referenced by getAngle(), getBinSize(), getHeight(), getHop(), getPeriod(), getSway(), getWP(), init(), LoadBuffer(), resetLegPos(), SaveBuffer(), setAngle(), setHeight(), setHop(), setPeriod(), setSway(), setTargetDisplacement(), and updateOutputs(). |
The documentation for this class was generated from the following files:
|