Homepage | Demos | Overview | Downloads | Tutorials | Reference | Credits |
#include <MotionManager.h>
Since MotionObject and MainObject run as separate processes, they could potentially try to access the same motion command at the same time, leading to unpredictable behavior. The MotionManager enforces a set of locks to solve this
The other problem is that we are sharing between processes. MotionManager will do what's necessary to distribute new MotionCommand's to all the processes (currently just MainObj and MotoObj)
You should be able to create and add a new motion in one line:
motman->addMotion(SharedObject<YourMC>([arg1,[arg2,...]]) [, priority [, autoprune] ]);
arg1
, arg2
, ... params) then you would want to do something like the following: SharedObject<YourMC> tmpvar([arg1,[arg2,...]]); tmpvar->cmd1(); tmpvar->cmd2(); //... motman->addMotion(tmpvar [, ...]);
Notice that tmpvar is of type SharedObject, but you're calling YourMC functions on it... SharedObject is a "smart pointer" which will pass your function calls on to the underlying templated type. Isn't C++ great? :)
MMAccessor for information on accessing motions after you've added them to MotionManager.
Definition at line 56 of file MotionManager.h.
Public Types | |
typedef MotionManagerMsg::MC_ID | MC_ID |
use this type when referring to the ID numbers that MotionManager hands out | |
Public Member Functions | |
MotionManager () | |
Constructor, sets all the outputs to 0. | |
void | InitAccess (OSubject *subj) |
LOCKS MotionManager Everyone who is planning to use the MotionManager needs to call this before they access it or suffer a horrible fate | |
void | receivedMsg (const ONotifyEvent &event) |
LOCKS MotionManager This gets called by an OObject when it receives a message from one of the other OObject's MotionManagerComm Subject | |
MotionCommand Safe | |
void | setOutput (const MotionCommand *caller, unsigned int output, const OutputCmd &cmd) |
LOCKS MotionManager Requests a value be set for the specified output, copies cmd across frames | |
void | setOutput (const MotionCommand *caller, unsigned int output, const OutputCmd &cmd, unsigned int frame) |
LOCKS MotionManager Requests a value be set for the specified output in the specified frame | |
void | setOutput (const MotionCommand *caller, unsigned int output, const OutputCmd cmd[NumFrames]) |
LOCKS MotionManager Requests a value be set for the specified output across frames | |
void | setOutput (const MotionCommand *caller, unsigned int output, const OutputPID &pid) |
LOCKS MotionManager Requests a PID be set for the specified output, notice that this might be overruled by a higher priority motion | |
void | setOutput (const MotionCommand *caller, unsigned int output, const OutputCmd &cmd, const OutputPID &pid) |
LOCKS MotionManager Requests a value and PID be set for the specified output | |
void | setOutput (const MotionCommand *caller, unsigned int output, const OutputCmd cmd[NumFrames], const OutputPID &pid) |
LOCKS MotionManager Requests a value and PID be set for the specified output | |
const OutputCmd & | getOutputCmd (unsigned int output) const |
Returns the value of the output last sent to the OS. Note that this will differ from the sensed value in state, even when staying still. There is no corresponding getOutputPID because this value *will* duplicate the value in state. | |
void | setPriority (MC_ID mcid, float p) |
sets the priority level of a MotionCommand | |
float | getPriority (MC_ID mcid) const |
returns priority level of a MotionCommand | |
MC_ID | begin () const |
returns the MC_ID of the first MotionCommand | |
MC_ID | next (MC_ID cur) const |
returns the MC_ID of MotionCommand following the one that is passed | |
MC_ID | end () const |
returns the MC_ID of the one-past-the-end MotionCommand (like the STL) | |
unsigned int | size () const |
returns the number of MotionCommands being managed | |
MotionCommand "Risky" | |
You can have one MC check out and modify another, but make sure the other MC doesn't call setOutput() | |
MotionCommand * | checkoutMotion (MC_ID mcid, bool block=true) |
locks the command and possibly performs RTTI conversion; supports recursive calls | |
void | checkinMotion (MC_ID mcid) |
marks a MotionCommand as unused | |
MotionCommand * | peekMotion (MC_ID mcid) |
allows access to a MotionCommand without checking it out; warning never call a function based on this, only access member fields through it | |
unsigned int | checkoutLevel (MC_ID mcid) |
returns the number of times mcid has been checked out minus the times it's been checked in | |
bool | isOwner (MC_ID mcid) |
locks the command and possibly performs RTTI conversion; supports recursive calls | |
MotionCommand Unsafe | |
MC_ID | addMotion (const SharedObjectBase &sm) |
LOCKS MotionManager Creates a new MotionCommand, automatically sharing it between processes (there is some lag time here) | |
MC_ID | addMotion (const SharedObjectBase &sm, float priority) |
LOCKS MotionManager allows a quick way to set a priority level of a new MotionCommand | |
MC_ID | addMotion (const SharedObjectBase &sm, bool autoprune) |
LOCKS MotionManager allows a quick was to set the autoprune flag | |
MC_ID | addMotion (const SharedObjectBase &sm, float priority, bool autoprune) |
LOCKS MotionManager Call one of these to add a MotionCommand to the MotionManager, using the SharedObject class | |
void | removeMotion (MC_ID mcid) |
LOCKS MotionManager removes the specified MotionCommand | |
void | lock () |
gets an exclusive lock on MotionManager - functions marked LOCKS MotionManager will cause (and require) this to happen automatically | |
bool | trylock () |
tries to get a lock without blocking | |
void | release () |
releases a lock on the motion manager | |
void | getOutputs (float outputs[NumFrames][NumOutputs]) |
LOCKS MotionManager called by MotionObject to fill in the output values for the next ::NumFrames frames (only MotoObj should call this...) | |
void | updateWorldState () |
call this when you want MotionManager to set the WorldState to reflect what things should be for unsensed outputs (LEDs, ears) (only MotoObj should be calling this...) | |
bool | updatePIDs (OPrimitiveID primIDs[NumOutputs]) |
call this when you want MotionManager to update modified PID values, returns true if changes made (only MotoObj should be calling this...), see PIDMC for general PID documentation | |
Static Public Attributes | |
const unsigned int | MAX_ACCESS = 2 |
This is the number of processes which will be accessing the MotionManager. | |
const unsigned int | MAX_MOTIONS = 64 |
This is the maximum number of Motions which can be managed, can probably be increased reasonably without trouble. | |
const MC_ID | invalid_MC_ID = MotionManagerMsg::invalid_MC_ID |
for errors and undefined stuff | |
Priority Level Constants | |
Just to give you a general idea what values to use for different priority levels | |
const float | kIgnoredPriority = -1 |
won't be expressed, handy if you want to temporarily pause something | |
const float | kBackgroundPriority = 0 |
will only be expressed if *nothing* else is using that joint | |
const float | kLowPriority = 5 |
for stuff that's not background but lower than standard | |
const float | kStdPriority = 10 |
for every-day commands | |
const float | kHighPriority = 50 |
for stuff that should over ride standard stuff | |
const float | kEmergencyPriority = 100 |
for really important stuff, such as the emergency stop | |
Protected Types | |
typedef unsigned short | accID_t |
type to use to refer to accessors of MotionManager (or its locks) | |
typedef ListMemBuf< OutputState, MAX_MOTIONS > | cmdstatelist_t |
shorthand for a list of OutputState's | |
Protected Member Functions | |
void | setPID (unsigned int j, const float p[3]) |
LOCKS MotionManager, called internally to do the work of setting the PID... you probably want to call setOutput with an OutputPID argument, not this... | |
void | func_begin () |
called at the begining of many functions to lock MotionManager | |
void | func_end () |
called at the end of a function which called func_begin() to release it | |
template<class T> T | func_end (T val) |
same as func_end(), except passes return value through | |
MC_ID | skip_ahead (MC_ID mcid) const |
during iteration, skips over motioncommands which are still in transit from on OObject to another | |
MC_ID | pop_free () |
pulls an entry from cmdlist's free section and returns its index | |
void | push_free (MC_ID a) |
puts an entry back into cmdlist's free section | |
Protected Attributes | |
ListMemBuf< PIDUpdate, NumPIDJoints > | pidchanges |
stores PID updates, up to one per joint (if same is set more than once, it's just overwrites previous update) | |
ListMemBuf< CommandEntry, MAX_MOTIONS, MC_ID > | cmdlist |
the list where MotionCommands are stored, remember, we're in a shared memory region with different base addresses - no pointers! | |
MC_ID | cur_cmd |
MC_ID of the MotionCommand currently being updated by getOutputs(), or NULL if not in getOutputs. This is used by the setOutput()'s to tell which MotionCommand is calling. | |
MutexLock< MAX_ACCESS > | MMlock |
The main lock for the class. | |
cmdstatelist_t | cmdstates [NumOutputs] |
requested positions by each of the MC's for each of the outputs | |
float | cmdSums [NumOutputs] |
Holds the final values for the outputs of the last frame generated. | |
OutputCmd | cmds [NumOutputs] |
Holds the weighted values and total weight for the outputs of the last frame. | |
accID_t | numAcc |
The number of accessors who have registered with InitAccess(). | |
OSubject * | subjs [MAX_ACCESS] |
The OSubject for each process (accessor) on which it should be broadcast when a command is added. | |
Static Protected Attributes | |
int | _MMaccID = -1U |
Stores the accessor for the current process. | |
Private Member Functions | |
MotionManager (const MotionManager &) | |
this shouldn't be called... | |
MotionManager & | operator= (const MotionManager &) |
this shouldn't be called... |
|
type to use to refer to accessors of MotionManager (or its locks)
Definition at line 173 of file MotionManager.h. Referenced by checkoutMotion(). |
|
shorthand for a list of OutputState's
Definition at line 212 of file MotionManager.h. Referenced by getOutputs(), and setOutput(). |
|
|
Constructor, sets all the outputs to 0.
Definition at line 31 of file MotionManager.cc. |
|
this shouldn't be called...
|
|
LOCKS MotionManager Call one of these to add a MotionCommand to the MotionManager, using the SharedObject class
Definition at line 543 of file MotionManager.cc. |
|
LOCKS MotionManager allows a quick was to set the autoprune flag
Definition at line 533 of file MotionManager.cc. |
|
LOCKS MotionManager allows a quick way to set a priority level of a new MotionCommand
Definition at line 525 of file MotionManager.cc. |
|
|
returns the MC_ID of the first MotionCommand
Definition at line 98 of file MotionManager.h. Referenced by getOutputs(). |
|
marks a MotionCommand as unused
Definition at line 625 of file MotionManager.cc. Referenced by MMAccessor< MC_t >::checkin(), MCValueEditControl< T >::doSelect(), getOutputs(), WalkToTargetMachine::processEvent(), StareAtBallBehavior::processEvent(), DriveMeBehavior::processEvent(), ChaseBallBehavior::processEvent(), removeMotion(), LoadWalkControl::selectedFile(), SaveWalkControl::takeInput(), and Aibo3DControllerBehavior::updateRC(). |
|
returns the number of times mcid has been checked out minus the times it's been checked in
Definition at line 109 of file MotionManager.h. |
|
locks the command and possibly performs RTTI conversion; supports recursive calls
Definition at line 594 of file MotionManager.cc. Referenced by MMAccessor< MC_t >::checkout(), MCValueEditControl< T >::doSelect(), getOutputs(), WalkToTargetMachine::processEvent(), StareAtBallBehavior::processEvent(), DriveMeBehavior::processEvent(), ChaseBallBehavior::processEvent(), removeMotion(), LoadWalkControl::selectedFile(), SaveWalkControl::takeInput(), and Aibo3DControllerBehavior::updateRC(). |
|
returns the MC_ID of the one-past-the-end MotionCommand (like the STL)
Definition at line 100 of file MotionManager.h. Referenced by addMotion(), and getOutputs(). |
|
called at the begining of many functions to lock MotionManager
Definition at line 175 of file MotionManager.h. Referenced by addMotion(), getOutputs(), receivedMsg(), removeMotion(), setOutput(), and setPID(). |
|
same as func_end(), except passes return value through
Definition at line 177 of file MotionManager.h. |
|
called at the end of a function which called func_begin() to release it
Definition at line 176 of file MotionManager.h. Referenced by addMotion(), func_end(), getOutputs(), receivedMsg(), removeMotion(), setOutput(), and setPID(). |
|
Returns the value of the output last sent to the OS. Note that this will differ from the sensed value in state, even when staying still. There is no corresponding getOutputPID because this value *will* duplicate the value in state.
Definition at line 92 of file MotionManager.h. |
|
LOCKS MotionManager called by MotionObject to fill in the output values for the next ::NumFrames frames (only MotoObj should call this...) What's worse? A plethora of functions which are only called, and only useful at one place, or a big massive function which doesn't pollute the namespace? This is the latter, for better or worse. Definition at line 202 of file MotionManager.cc. Referenced by MMCombo::ReadySendJoints(). |
|
returns priority level of a MotionCommand
Definition at line 94 of file MotionManager.h. Referenced by setOutput(). |
|
LOCKS MotionManager Everyone who is planning to use the MotionManager needs to call this before they access it or suffer a horrible fate
Definition at line 44 of file MotionManager.cc. Referenced by MMCombo::DoInit(), and MMCombo::GotMotionManager(). |
|
locks the command and possibly performs RTTI conversion; supports recursive calls
Definition at line 110 of file MotionManager.h. Referenced by MMAccessor< MC_t >::checkin(), MMAccessor< MC_t >::MMAccessor(), and MMAccessor< MC_t >::operator=(). |
|
gets an exclusive lock on MotionManager - functions marked LOCKS MotionManager will cause (and require) this to happen automatically
Definition at line 125 of file MotionManager.h. |
|
returns the MC_ID of MotionCommand following the one that is passed
Definition at line 99 of file MotionManager.h. Referenced by getOutputs(). |
|
this shouldn't be called...
|
|
allows access to a MotionCommand without checking it out; warning never call a function based on this, only access member fields through it
Definition at line 108 of file MotionManager.h. Referenced by MMAccessor< MC_t >::MMAccessor(), Controller::setEStopID(), and BatteryMonitorBehavior::startWarning(). |
|
pulls an entry from cmdlist's free section and returns its index
Definition at line 207 of file MotionManager.h. Referenced by addMotion(). |
|
puts an entry back into cmdlist's free section
Definition at line 208 of file MotionManager.h. Referenced by removeMotion(). |
|
LOCKS MotionManager This gets called by an OObject when it receives a message from one of the other OObject's MotionManagerComm Subject
Definition at line 558 of file MotionManager.cc. Referenced by MMCombo::GotMotionMsg(). |
|
releases a lock on the motion manager
Definition at line 127 of file MotionManager.h. |
|
|
LOCKS MotionManager Requests a value and PID be set for the specified output
Definition at line 174 of file MotionManager.cc. |
|
LOCKS MotionManager Requests a value and PID be set for the specified output
Definition at line 149 of file MotionManager.cc. |
|
LOCKS MotionManager Requests a PID be set for the specified output, notice that this might be overruled by a higher priority motion
Definition at line 129 of file MotionManager.cc. |
|
LOCKS MotionManager Requests a value be set for the specified output across frames
Definition at line 107 of file MotionManager.cc. |
|
LOCKS MotionManager Requests a value be set for the specified output in the specified frame
Definition at line 86 of file MotionManager.cc. |
|
LOCKS MotionManager Requests a value be set for the specified output, copies cmd across frames
Definition at line 64 of file MotionManager.cc. Referenced by Controller::deactivate(), Controller::DoStop(), FollowHeadBehavior::processEvent(), EmergencyStopMC::releaseJoints(), LedEngine::updateLEDs(), WalkMC::updateOutputs(), TailWagMC::updateOutputs(), RemoteControllerMC::updateOutputs(), PostureMC::updateOutputs(), PIDMC::updateOutputs(), MotionSequenceMC< MAXMOVE >::updateOutputs(), LedMC::updateOutputs(), HeadPointerMC::updateOutputs(), and DynamicMotionSequence::updateOutputs(). |
|
LOCKS MotionManager, called internally to do the work of setting the PID... you probably want to call setOutput with an OutputPID argument, not this... Note that we don't actually set the PIDs in the system here, we just queue them up. PID changes seem to be an expensive operation, so may only want to clear the queue at some reduced rate (although that's not actually currently being done, it just could be) Definition at line 658 of file MotionManager.cc. Referenced by getOutputs(), and setOutput(). |
|
sets the priority level of a MotionCommand
Definition at line 93 of file MotionManager.h. Referenced by Controller::activate(), addMotion(), Controller::deactivate(), and BatteryMonitorBehavior::processEvent(). |
|
returns the number of MotionCommands being managed
Definition at line 101 of file MotionManager.h. |
|
during iteration, skips over motioncommands which are still in transit from on OObject to another
Definition at line 693 of file MotionManager.cc. |
|
tries to get a lock without blocking
Definition at line 126 of file MotionManager.h. |
|
call this when you want MotionManager to update modified PID values, returns true if changes made (only MotoObj should be calling this...), see PIDMC for general PID documentation This function handles the conversion from the Tekkotsu format (one regular IEEE float per parameter, to the OPEN-R format (which takes a specialized, reduced precision floating point number) This is all documented in PIDMC as well. In order to send Tekkotsu's PIDs to the system, they are converted to the gain/shift format. On the ERS-2xx, we could dynamically choose shift values to allow more precision in setting values. With the ERS-7, all shifts are shared, so they must be set to a common set of values, defined by WorldState::DefaultPIDShifts. This limits the range of gains which can then be set. Due to the mysterious warning which would occur with the 2xx, (AGRMSDriver::SetGain() : 0x0A IS USED FOR GAIN SHIFT VALUE.) and since this seems to be the way things are going, all models now, by default, use global shift values (which can vary from model to model, just global for each model) You can revert to the dynamic shift selection by commenting-in the noted code section below. A final note: the OPENR::SetJointGain function seems to be a rather costly function call. You should probably try to avoid setting PIDs at too high a frequency. Definition at line 439 of file MotionManager.cc. Referenced by MMCombo::ReadySendJoints(). |
|
call this when you want MotionManager to set the WorldState to reflect what things should be for unsensed outputs (LEDs, ears) (only MotoObj should be calling this...)
Definition at line 384 of file MotionManager.cc. Referenced by MMCombo::ReadySendJoints(). |
|
Stores the accessor for the current process.
Definition at line 13 of file MotionManager.cc. Referenced by addMotion(), checkoutMotion(), func_begin(), InitAccess(), isOwner(), lock(), peekMotion(), receivedMsg(), removeMotion(), skip_ahead(), and trylock(). |
|
the list where MotionCommands are stored, remember, we're in a shared memory region with different base addresses - no pointers!
Definition at line 203 of file MotionManager.h. Referenced by addMotion(), begin(), checkinMotion(), checkoutLevel(), checkoutMotion(), end(), getOutputs(), getPriority(), InitAccess(), isOwner(), next(), peekMotion(), pop_free(), push_free(), receivedMsg(), removeMotion(), setPriority(), size(), and skip_ahead(). |
|
Holds the weighted values and total weight for the outputs of the last frame.
Definition at line 215 of file MotionManager.h. Referenced by getOutputCmd(), and getOutputs(). |
|
requested positions by each of the MC's for each of the outputs
Definition at line 213 of file MotionManager.h. Referenced by getOutputs(), and setOutput(). |
|
Holds the final values for the outputs of the last frame generated.
Definition at line 214 of file MotionManager.h. Referenced by getOutputs(), MotionManager(), setOutput(), and updateWorldState(). |
|
MC_ID of the MotionCommand currently being updated by getOutputs(), or NULL if not in getOutputs. This is used by the setOutput()'s to tell which MotionCommand is calling.
Definition at line 204 of file MotionManager.h. Referenced by getOutputs(), and setOutput(). |
|
|
will only be expressed if *nothing* else is using that joint
Definition at line 16 of file MotionManager.cc. Referenced by setOutput(). |
|
for really important stuff, such as the emergency stop
Definition at line 20 of file MotionManager.cc. Referenced by PostureEditor::activate(), Controller::activate(), StartupBehavior::DoStart(), BatteryMonitorBehavior::processEvent(), RunSequenceControl< SequenceSize >::selectedFile(), LoadPostureControl::selectedFile(), and BatteryMonitorBehavior::startWarning(). |
|
for stuff that should over ride standard stuff
Definition at line 19 of file MotionManager.cc. Referenced by RelaxBehavior::DoStart(), HeadLevelBehavior::processEvent(), and AutoGetupBehavior::processEvent(). |
|
won't be expressed, handy if you want to temporarily pause something
Definition at line 15 of file MotionManager.cc. Referenced by Controller::deactivate(), and BatteryMonitorBehavior::processEvent(). |
|
for stuff that's not background but lower than standard
Definition at line 17 of file MotionManager.cc. |
|
for every-day commands
Definition at line 18 of file MotionManager.cc. Referenced by addMotion(), DriveMeBehavior::DoStart(), and BanditMachine::PressNode::PressNode(). |
|
This is the number of processes which will be accessing the MotionManager. Probably just MainObject and MotionObject Isn't really a hard maximum, but should be actual expected, need to know when they're all connected Definition at line 61 of file MotionManager.h. Referenced by addMotion(), and InitAccess(). |
|
This is the maximum number of Motions which can be managed, can probably be increased reasonably without trouble.
Definition at line 63 of file MotionManager.h. Referenced by checkoutMotion(), and MMCombo::DoInit(). |
|
The main lock for the class.
Definition at line 210 of file MotionManager.h. Referenced by func_begin(), func_end(), InitAccess(), lock(), release(), and trylock(). |
|
The number of accessors who have registered with InitAccess().
Definition at line 218 of file MotionManager.h. Referenced by addMotion(), and InitAccess(). |
|
stores PID updates, up to one per joint (if same is set more than once, it's just overwrites previous update)
Definition at line 170 of file MotionManager.h. Referenced by setPID(), and updatePIDs(). |
|
The OSubject for each process (accessor) on which it should be broadcast when a command is added.
Definition at line 219 of file MotionManager.h. Referenced by addMotion(), InitAccess(), and removeMotion(). |
Tekkotsu v2.0 |
Generated Wed Jan 21 03:23:18 2004 by Doxygen 1.3.4 |