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 | addPrunableMotion (const SharedObjectBase &sm, float priority=kStdPriority) |
| LOCKS MotionManager adds a new motion (wrapped in a SharedObject) and marks that it should be automatically deleted when the MotionCommand::isAlive() returns false.
|
MC_ID | addPersistentMotion (const SharedObjectBase &sm, float priority=kStdPriority) |
| LOCKS MotionManager adds a new motion (wrapped in a SharedObject) and marks that it should not be deleted, until removeMotion(MC_ID mcid) is called.
|
void | removeMotion (MC_ID mcid) |
| LOCKS MotionManager removes the specified MotionCommand
|
|
MC_ID | addMotion (const SharedObjectBase &sm) __attribute__((deprecated)) |
| deprecated, we're recommending users call either addPrunableMotion() or addPersistentMotion() so there are no surprises
|
MC_ID | addMotion (const SharedObjectBase &sm, bool autoprune) __attribute__((deprecated)) |
| deprecated, we're recommending users call either addPrunableMotion() or addPersistentMotion() so there are no surprises
|
MC_ID | addMotion (const SharedObjectBase &sm, float priority) __attribute__((deprecated)) |
| deprecated, we're recommending users call either addPrunableMotion() or addPersistentMotion() so there are no surprises
|
MC_ID | addMotion (const SharedObjectBase &sm, float priority, bool autoprune) __attribute__((deprecated)) |
| deprecated, we're recommending users call either addPrunableMotion() or addPersistentMotion() so there are no surprises
|
|
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 |
static const unsigned int | MAX_ACCESS = 2 |
| This is the number of processes which will be accessing the MotionManager.
|
static const unsigned int | MAX_MOTIONS = 64 |
| This is the maximum number of Motions which can be managed, can probably be increased reasonably without trouble.
|
static 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)
|
static const float | kIgnoredPriority = -1 |
| won't be expressed, handy if you want to temporarily pause something
|
static const float | kBackgroundPriority = 0 |
| will only be expressed if *nothing* else is using that joint
|
static const float | kLowPriority = 5 |
| for stuff that's not background but lower than standard
|
static const float | kStdPriority = 10 |
| for every-day commands
|
static const float | kHighPriority = 50 |
| for stuff that should override standard stuff
|
static 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 |
MC_ID | doAddMotion (const SharedObjectBase &sm, bool autoprune, float priority) |
| does the actual work of adding a motion
|
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 |
static 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...
|
Classes |
struct | CommandEntry |
| All the information we need to maintain about a MotionCommand. More...
|
class | OutputState |
| holds the full requested value of an output More...
|
struct | PIDUpdate |
| used to request pids for a given joint More...
|
Member Typedef Documentation
|
type to use to refer to accessors of MotionManager (or its locks)
Definition at line 198 of file MotionManager.h. |
|
use this type when referring to the ID numbers that MotionManager hands out
Definition at line 76 of file MotionManager.h. |
Constructor & Destructor Documentation
MotionManager::MotionManager |
( |
|
) |
|
|
|
this shouldn't be called...
|
Member Function Documentation
|
LOCKS MotionManager adds a new motion (wrapped in a SharedObject) and marks that it should not be deleted, until removeMotion(MC_ID mcid) is called.
Definition at line 130 of file MotionManager.h.
Referenced by WaypointWalkControl::activate(), PostureEditor::activate(), WalkToTargetNode::DoStart(), WalkControllerBehavior::DoStart(), ToggleHeadLightBehavior::DoStart(), TailWagNode::DoStart(), StareAtPawBehavior2::DoStart(), StareAtPawBehavior::DoStart(), StareAtBallBehavior::DoStart(), SimpleChaseBallBehavior::DoStart(), RelaxBehavior::DoStart(), LookForSoundBehavior::DoStart(), LedNode::DoStart(), KinematicSampleBehavior2::DoStart(), KinematicSampleBehavior::DoStart(), HeadPointerNode::DoStart(), HeadPointControllerBehavior::DoStart(), HeadLevelBehavior::DoStart(), FollowHeadBehavior::DoStart(), DriveMeBehavior::DoStart(), Controller::DoStart(), ChaseBallBehavior::DoStart(), CameraBehavior::DoStart(), AlanBehavior::DoStart(), Aibo3DControllerBehavior::DoStart(), BanditMachine::PressNode::PressNode(), HeadLevelBehavior::processEvent(), RunSequenceControl< SequenceSize >::selectedFile(), ExploreMachine::setup(), BatteryMonitorBehavior::startWarning(), WalkNode::updateWalk(), and BanditMachine::WaitNode::WaitNode(). |
|
LOCKS MotionManager adds a new motion (wrapped in a SharedObject) and marks that it should be automatically deleted when the MotionCommand::isAlive() returns false.
Definition at line 128 of file MotionManager.h.
Referenced by MotionStressTestBehavior::addMS(), WallTestBehavior::DoStart(), MotionStressTestBehavior::DoStart(), MCRepeater::DoStart(), BanditMachine::DoStart(), RelaxBehavior::DoStop(), StareAtPawBehavior2::processEvent(), StareAtPawBehavior::processEvent(), MCRepeater::processEvent(), KinematicSampleBehavior2::processEvent(), KinematicSampleBehavior::processEvent(), GroundPlaneBehavior::processEvent(), FollowHeadBehavior::processEvent(), AutoGetupBehavior::processEvent(), RunSequenceControl< SequenceSize >::runFile(), LoadPostureControl::selectedFile(), and PlayMotionSequenceNode< SIZE >::updateMS(). |
MC_ID MotionManager::begin |
( |
|
) |
const [inline] |
|
void MotionManager::checkinMotion |
( |
MC_ID |
mcid |
) |
|
|
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. |
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 214 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 145 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 653 of file MotionManager.cc.
Referenced by WaypointWalkControl::deactivate(), PostureEditor::deactivate(), WalkToTargetNode::DoStop(), WalkControllerBehavior::DoStop(), ToggleHeadLightBehavior::DoStop(), TailWagNode::DoStop(), StareAtPawBehavior2::DoStop(), StareAtPawBehavior::DoStop(), StareAtBallBehavior::DoStop(), SimpleChaseBallBehavior::DoStop(), RelaxBehavior::DoStop(), PlayMotionSequenceNode< SIZE >::DoStop(), MotionStressTestBehavior::DoStop(), LookForSoundBehavior::DoStop(), LedNode::DoStop(), KinematicSampleBehavior2::DoStop(), KinematicSampleBehavior::DoStop(), HeadPointerNode::DoStop(), HeadPointControllerBehavior::DoStop(), HeadLevelBehavior::DoStop(), FollowHeadBehavior::DoStop(), DriveMeBehavior::DoStop(), Controller::DoStop(), ChaseBallBehavior::DoStop(), CameraBehavior::DoStop(), BanditMachine::DoStop(), AlanBehavior::DoStop(), Aibo3DControllerBehavior::DoStop(), getOutputs(), RunSequenceControl< SequenceSize >::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 185 of file MotionManager.cc. |
|
LOCKS MotionManager Requests a value and PID be set for the specified output
Definition at line 159 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 138 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 107 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 84 of file MotionManager.cc. |
|
LOCKS MotionManager Requests a value be set for the specified output, copies cmd across frames
Definition at line 60 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(), OldHeadPointerMC::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 677 of file MotionManager.cc.
Referenced by getOutputs(), and setOutput(). |
void MotionManager::setPriority |
( |
MC_ID |
mcid, |
|
|
float |
p |
|
) |
[inline] |
|
unsigned int MotionManager::size |
( |
|
) |
const [inline] |
|
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 451 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 checkoutMotion(), doAddMotion(), 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 228 of file MotionManager.h.
Referenced by begin(), checkinMotion(), checkoutLevel(), checkoutMotion(), doAddMotion(), 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 doAddMotion(), 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 195 of file MotionManager.h.
Referenced by setPID(), and updatePIDs(). |
The documentation for this class was generated from the following files:
|