MotionManager Class Reference#include <MotionManager.h>
List of all members.
Detailed Description
The purpose of this class is to provide mutually exclusive access to the MotionCommands and simplify their sharing between memory spaces.
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:
But if you want to do some more initializations not handled by the constructor (the arg1 , arg2 , ... params) then you would want to do something like the following:
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? :)
- Warning:
- Once the MotionCommand has been added you must check it out to modify it or risk concurrent access problems.
- See also:
- MotionCommand for information on creating new motion primitives.
MMAccessor for information on accessing motions after you've added them to MotionManager.
Definition at line 66 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
|
|
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
|
|
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
|
|
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
|
|
Just to give you some guidelines for what values to use for different priority levels, but you can pick any value you like (that's why they are floats)
|
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 override 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...
|
Member Typedef Documentation
|
use this type when referring to the ID numbers that MotionManager hands out
Definition at line 76 of file MotionManager.h.
Referenced by WalkCalibration::activate(), ValueSetControl< T >::activate(), ValueEditControl< T >::activate(), ToggleControl::activate(), ShutdownControl::activate(), RebootControl::activate(), ProfilerCheckControl::activate(), PostureEditor::activate(), NullControl::activate(), HelpControl::activate(), FileBrowserControl::activate(), ControlBase::activate(), BehaviorSwitchControlBase::activate(), BehaviorSwitchActivatorControl::activate(), BehaviorActivatorControl::activate(), BatteryCheckControl::activate(), addMotion(), begin(), checkinMotion(), checkoutLevel(), checkoutMotion(), MCRepeater::DoStart(), end(), EStopControllerBehavior::EStopControllerBehavior(), ControlBase::getDisplay(), PlayMotionSequenceNode< SIZE >::getMSid(), getOutputs(), getPriority(), WalkNode::getWalkID(), WalkControllerBehavior::getWalkID(), isOwner(), LoadPostureControl::LoadPostureControl(), LoadWalkControl::LoadWalkControl(), MCValueEditControl< T >::MCValueEditControl(), MMAccessor< MC_t >::MMAccessor(), next(), MotionManager::OutputState::OutputState(), peekMotion(), pop_free(), MCRepeater::processEvent(), AutoGetupBehavior::processEvent(), push_free(), receivedMsg(), removeMotion(), RunSequenceControl< SequenceSize >::RunSequenceControl(), SaveWalkControl::SaveWalkControl(), RunSequenceControl< SequenceSize >::selectedFile(), LoadWalkControl::selectedFile(), LoadPostureControl::selectedFile(), ControlBase::setDisplay(), Controller::setEStopID(), setPriority(), WalkNode::setWalkID(), skip_ahead(), and SaveWalkControl::takeInput(). |
Constructor & Destructor Documentation
MotionManager::MotionManager |
( |
|
) |
|
|
|
this shouldn't be called...
|
Member Function Documentation
|
LOCKS MotionManager allows a quick was to set the autoprune flag
Definition at line 549 of file MotionManager.cc. |
|
LOCKS MotionManager Creates a new MotionCommand, automatically sharing it between processes (there is some lag time here)
Definition at line 502 of file MotionManager.cc.
Referenced by PostureEditor::activate(), addMotion(), WalkToTargetMachine::DoStart(), WalkControllerBehavior::DoStart(), ToggleHeadLightBehavior::DoStart(), StartupBehavior::DoStart(), StareAtBallBehavior::DoStart(), SimpleChaseBallBehavior::DoStart(), RelaxBehavior::DoStart(), MCRepeater::DoStart(), HeadPointControllerBehavior::DoStart(), HeadLevelBehavior::DoStart(), FollowHeadBehavior::DoStart(), DriveMeBehavior::DoStart(), Controller::DoStart(), ChaseBallBehavior::DoStart(), CameraBehavior::DoStart(), BanditMachine::DoStart(), AlanBehavior::DoStart(), Aibo3DControllerBehavior::DoStart(), RelaxBehavior::DoStop(), BanditMachine::PressNode::PressNode(), MCRepeater::processEvent(), HeadLevelBehavior::processEvent(), FollowHeadBehavior::processEvent(), AutoGetupBehavior::processEvent(), RunSequenceControl< SequenceSize >::selectedFile(), LoadPostureControl::selectedFile(), ExploreMachine::setup(), BatteryMonitorBehavior::startWarning(), PlayMotionSequenceNode< SIZE >::updateMS(), WalkNode::updateWalk(), and BanditMachine::WaitNode::WaitNode(). |
MC_ID MotionManager::begin |
( |
|
) |
const [inline] |
|
void MotionManager::checkinMotion |
( |
MC_ID |
mcid |
) |
|
|
|
marks a MotionCommand as unused
Definition at line 641 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(). |
unsigned int MotionManager::checkoutLevel |
( |
MC_ID |
mcid |
) |
[inline] |
|
|
returns the number of times mcid has been checked out minus the times it's been checked in
Definition at line 120 of file MotionManager.h. |
|
locks the command and possibly performs RTTI conversion; supports recursive calls
Definition at line 610 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(). |
MC_ID MotionManager::end |
( |
|
) |
const [inline] |
|
void MotionManager::func_begin |
( |
|
) |
[inline, protected] |
|
template<class T> |
T MotionManager::func_end |
( |
T |
val |
) |
[inline, protected] |
|
void MotionManager::func_end |
( |
|
) |
[inline, protected] |
|
const OutputCmd& MotionManager::getOutputCmd |
( |
unsigned int |
output |
) |
const [inline] |
|
|
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 103 of file MotionManager.h. |
void MotionManager::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...)
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 218 of file MotionManager.cc.
Referenced by MMCombo::ReadySendJoints(). |
float MotionManager::getPriority |
( |
MC_ID |
mcid |
) |
const [inline] |
|
void MotionManager::InitAccess |
( |
OSubject * |
subj |
) |
|
|
bool MotionManager::isOwner |
( |
MC_ID |
mcid |
) |
[inline] |
|
void MotionManager::lock |
( |
|
) |
[inline] |
|
|
gets an exclusive lock on MotionManager - functions marked LOCKS MotionManager will cause (and require) this to happen automatically
Definition at line 136 of file MotionManager.h. |
MC_ID MotionManager::next |
( |
MC_ID |
cur |
) |
const [inline] |
|
|
this shouldn't be called...
|
MC_ID MotionManager::pop_free |
( |
|
) |
[inline, protected] |
|
void MotionManager::push_free |
( |
MC_ID |
a |
) |
[inline, protected] |
|
void MotionManager::receivedMsg |
( |
const ONotifyEvent & |
event |
) |
|
|
void MotionManager::release |
( |
|
) |
[inline] |
|
void MotionManager::removeMotion |
( |
MC_ID |
mcid |
) |
|
|
|
LOCKS MotionManager removes the specified MotionCommand
Definition at line 647 of file MotionManager.cc.
Referenced by PostureEditor::deactivate(), WalkToTargetMachine::DoStop(), WalkControllerBehavior::DoStop(), ToggleHeadLightBehavior::DoStop(), StartupBehavior::DoStop(), StareAtBallBehavior::DoStop(), SimpleChaseBallBehavior::DoStop(), RelaxBehavior::DoStop(), PlayMotionSequenceNode< SIZE >::DoStop(), HeadPointControllerBehavior::DoStop(), HeadLevelBehavior::DoStop(), FollowHeadBehavior::DoStop(), DriveMeBehavior::DoStop(), Controller::DoStop(), ChaseBallBehavior::DoStop(), CameraBehavior::DoStop(), BanditMachine::DoStop(), AlanBehavior::DoStop(), Aibo3DControllerBehavior::DoStop(), getOutputs(), StartupBehavior::processEvent(), HeadLevelBehavior::processEvent(), WalkNode::setWalkID(), BatteryMonitorBehavior::stopWarning(), WalkNode::teardown(), PlayMotionSequenceNode< SIZE >::teardown(), ExploreMachine::teardown(), BanditMachine::PressNode::~PressNode(), and BanditMachine::WaitNode::~WaitNode(). |
|
LOCKS MotionManager Requests a value and PID be set for the specified output
Definition at line 189 of file MotionManager.cc. |
|
LOCKS MotionManager Requests a value and PID be set for the specified output
Definition at line 163 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 142 of file MotionManager.cc. |
void MotionManager::setOutput |
( |
const MotionCommand * |
caller, |
|
|
unsigned int |
output, |
|
|
const OutputCmd |
cmd[NumFrames] |
|
) |
|
|
|
LOCKS MotionManager Requests a value be set for the specified output across frames
Definition at line 111 of file MotionManager.cc. |
void MotionManager::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
Definition at line 88 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(). |
void MotionManager::setPID |
( |
unsigned int |
joint, |
|
|
const float |
pids[3] |
|
) |
[protected] |
|
|
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 674 of file MotionManager.cc.
Referenced by getOutputs(), and setOutput(). |
void MotionManager::setPriority |
( |
MC_ID |
mcid, |
|
|
float |
p |
|
) |
[inline] |
|
unsigned int MotionManager::size |
( |
|
) |
const [inline] |
|
|
returns the number of MotionCommands being managed
Definition at line 112 of file MotionManager.h. |
bool MotionManager::trylock |
( |
|
) |
[inline] |
|
bool MotionManager::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
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 455 of file MotionManager.cc.
Referenced by MMCombo::ReadySendJoints(). |
void MotionManager::updateWorldState |
( |
|
) |
|
|
Member Data Documentation
|
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 214 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(). |
|
for really important stuff, such as the emergency stop
Definition at line 20 of file MotionManager.cc. |
|
for stuff that should override standard stuff
Definition at line 19 of file MotionManager.cc. |
|
won't be expressed, handy if you want to temporarily pause something
Definition at line 15 of file MotionManager.cc. |
|
for stuff that's not background but lower than standard
Definition at line 17 of file MotionManager.cc. |
|
This is the number of processes which will be accessing the MotionManager.
Probably just MainObject and MotionObject... This isn't really a hard maximum, but should be actual expected, need to know when they're all connected
Definition at line 72 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 74 of file MotionManager.h.
Referenced by checkoutMotion(). |
|
stores PID updates, up to one per joint (if same is set more than once, it's just overwrites previous update)
Definition at line 181 of file MotionManager.h.
Referenced by setPID(), and updatePIDs(). |
The documentation for this class was generated from the following files:
|