MarkerKinematicTreeRigid
A position and orientation (rigid-body) marker attached to a kinematic tree. The marker is attached to the ObjectKinematicTree object and additionally needs a link number as well as a local position, similar to the SensorKinematicTree. The marker allows to attach loads (LoadForceVector and LoadTorqueVector) at arbitrary links or position. It also allows to attach connectors (e.g., spring dampers or actuators) to the kinematic tree. Finally, joint constraints can be attached, which allows for realization of closed loop structures. NOTE, however, that it is less efficient to attach many markers to a kinematic tree, therefor for forces or joint control use the structures available in kinematic tree whenever possible.
Interface
Provides:
Position,OrientationBodies it can be placed on: ObjectKinematicTree
Connectors, constraints and loads that can use it: ObjectConnectorSpringDamper, ObjectConnectorCartesianSpringDamper, ObjectConnectorRigidBodySpringDamper, ObjectConnectorLinearSpringDamper, ObjectConnectorTorsionalSpringDamper, ObjectConnectorGravity, ObjectConnectorHydraulicActuatorSimple, ObjectConnectorDistance, ObjectConnectorRollingDiscPenalty, ObjectContactConvexRoll, ObjectContactSphereSphere, ObjectContactSphereTorus, ObjectContactSphereTriangle, ObjectContactCurveCircles, ObjectJointGeneric, ObjectJointRevoluteZ, ObjectJointPrismaticX, ObjectJointSpherical, ObjectJointRollingDisc, ObjectJointRevolute2D, ObjectJointPrismatic2D, LoadForceVector, LoadTorqueVector
Parameters
The parameters of the item; in a dictionary, its type is ‘KinematicTreeRigid’:
name |
type |
size |
default |
description |
|---|---|---|---|---|
name |
String |
‘’ |
marker’s unique name |
|
objectNumber |
ObjectIndex |
invalid (-1) |
(symbol: \(n_b\)) body number to which marker is attached to |
|
linkNumber |
UInt |
invalid (-1) |
(symbol: \(n_l\)) number of link in KinematicTree to which marker is attached to; must be given: the default is only a placeholder |
|
localPosition |
Vector3D |
3 |
None (zero) |
(symbol: \(\LU{l}{\bv}\)) local (link-fixed) position of marker at link \(n_l\), using the link (\(n_l\)) coordinate system; the translation of localHT |
localHT |
HomogeneousTransformation |
None (identity) |
(symbol: \(\LU{l}{\Hm}_{m}\)) the frame of the marker in the link frame, as homogeneous transformation: its translation is localPosition, its rotation turns the marker frame against the link; a 4x4 matrix, its 16 values row by row or an exu.HT; None: not given; given together with localPosition, both must agree |
|
visualization |
VMarkerKinematicTreeRigid |
parameters for visualization of item |
Visualization parameters
The parameters of VMarkerKinematicTreeRigid, given as visualization:
name |
type |
size |
default |
description |
|---|---|---|---|---|
show |
Bool |
True |
set true, if item is shown in visualization and false if it is not shown |
Drawing
Drawn as all markers.
Detailed description
Marker quantities
The link frame of link \(n_l\) - its position \(\LU{0}{\pv}_{l}\), rotation \(\LU{0l}{\Rot}\), velocity
\(\LU{l}{\vv}_{l}\) and angular velocity \(\LU{l}{\tomega}_{l}\) in link coordinates - comes from the joint
transformations of ObjectKinematicTree, evaluated from the base to the link.
marker quantity |
symbol |
description |
|---|---|---|
marker position |
\(\LU{0}{\pv}_{m} = \LU{0}{\pv}_{l} + \LU{0l}{\Rot} \LU{l}{\bv}\) |
global position of the local position \(\LU{l}{\bv}\) on link \(n_l\) |
marker velocity |
\(\LU{0}{\vv}_{m} = \LU{0l}{\Rot} \left(\LU{l}{\vv}_{l} + \LU{l}{\tomega}_{l} \times \LU{l}{\bv} \right)\) |
global velocity |
marker rotation matrix |
\(\LU{0m}{\Rot} = \LU{0l}{\Rot} \LU{lm}{\Rot}\) |
the rotation of the link frame, turned by the rotation \(\LU{lm}{\Rot}\) of |
marker angular velocity |
\(\LU{0}{\tomega}_{m} = \LU{0l}{\Rot} \LU{l}{\tomega}_{l}\) |
global; the local angular velocity is \(\LU{lm}{\Rot}\tp \LU{l}{\tomega}_{l}\) |
Jacobians
The Jacobians have one column per link of the tree, \(\qv\) being the joint coordinates. Only the link \(n_l\) and its parents down to the base have non-zero columns; for such a link \(j\), with its joint axis \(\av_j\) and the origin \(\LU{0}{\pv}_j\) of its joint frame, both global,
A force and a torque on the marker act on the joint coordinates as \(\Qm = \Jm_{pos}\tp \LU{0}{\fv} + \Jm_{rot}\tp \LU{0}{\ttau}\).
The derivative of the Jacobians is not implemented: a connector that needs it raises an error with this
marker; newton.numericalDifferentiation.forODE2Connectors = True computes the connector’s Jacobian
numerically instead.
Mini example
#a rigid body marker on link 0 of a kinematic tree with one prismatic joint along x
nTree = mbs.AddNode(NodeGenericODE2(referenceCoordinates=[0.], initialCoordinates=[0.],
initialCoordinates_t=[0.], numberOfODE2Coordinates=1))
oTree = mbs.AddObject(ObjectKinematicTree(nodeNumber=nTree, jointTypes=[exu.JointType.PrismaticX], linkParents=[-1],
jointTransformations=exu.Matrix3DList([np.eye(3)]),
jointOffsets=exu.Vector3DList([[0,0,0]]),
linkInertiasCOM=exu.Matrix3DList([np.eye(3)]),
linkCOMs=exu.Vector3DList([[0,0,0]]), linkMasses=[2.]))
mLink = mbs.AddMarker(MarkerKinematicTreeRigid(objectNumber=oTree, linkNumber=0, localPosition=[0.5,0,0]))
mbs.AddLoad(LoadForceVector(markerNumber=mLink, loadVector=[1,0,0]))
mbs.Assemble()
mbs.SolveDynamic()
#q = F/(2m)*t^2 at t=1
exu.sys['testResult'] = mbs.GetNodeOutput(nTree, exu.OutputVariableType.Coordinates) #0.25
Relevant Examples (Ex) and TestModels (TM) with weblink to github: humanRobotInteraction.py (Ex), openAIgymNLinkAdvanced.py (Ex), reinforcementLearningRobot.py (Ex), serialRobotKinematicTreeDigging.py (Ex), stiffFlyballGovernorKT.py (Ex), kinematicTreeConstraintTest.py (TM), kinematicTreePrismaticJacobianTest.py (TM)