MarkerBodiesRelativeTranslationCoordinate
A coordinate-based Marker attached to two rigid bodies or beams which computes the relative translation between the bodies according to the given axis. This marker can be used together with coordinate-based constraints and connectors (e.g., CoordinateSpringDamper and CoordinateConstraint). NOTE: it is assumed that the two bodies can only move along the given axis (e.g., constrained by a prismatic joint) – otherwise results may be unexpected. NOTE: this approach is not compatible with FFRF-based flexible bodies and currently requires and intermediate rigid body.
Interface
Provides:
CoordinateConnectors, constraints and loads that can use it: ObjectConnectorCoordinateSpringDamper, ObjectConnectorCoordinateSpringDamperExt, ObjectConnectorCoordinate, ObjectContactCoordinate, LoadCoordinate
Parameters
The parameters of the item; in a dictionary, its type is ‘BodiesRelativeTranslationCoordinate’:
name |
type |
size |
default |
description |
|---|---|---|---|---|
name |
String |
‘’ |
marker’s unique name |
|
bodyNumbers |
ArrayObjectIndex |
[ invalid (-1), invalid (-1) ] |
(symbol: \([b_0,b_1]\tp\)) list of body numbers for which relative coordinate is computed |
|
localPosition0 |
Vector3D |
3 |
[0.,0.,0.] |
(symbol: \(\LU{m_0}{\pv}_0\)) local position on body 0; i.e. local (body-fixed) position where position is measured and force is applied to |
localPosition1 |
Vector3D |
3 |
[0.,0.,0.] |
(symbol: \(\LU{m_1}{\pv}_1\)) local position on body 1; i.e. local (body-fixed) position where position is measured and force is applied to |
axis0 |
Vector3D |
3 |
[1.,0.,0.] |
(symbol: \(\LU{m_0}{\av}_0\)) axis defined in body 0, along which the relative translation is measured |
offset |
Real |
0. |
(symbol: \(x_\mathrm{off}\)) translation offset [SI:m] subtracted from the translation; can be used to change the zero position |
|
visualization |
VMarkerBodiesRelativeTranslationCoordinate |
parameters for visualization of item |
Visualization parameters
The parameters of VMarkerBodiesRelativeTranslationCoordinate, 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
The marker consists of two bodies, body \(b_0\) and body \(b_1\) with respective global marker positions \(\LU{0}{\pv}_{m0}\) and \(\LU{0}{\pv}_{m1}\), depending on local positions \(\LU{m_0}{\pv}_0\) and \(\LU{m_1}{\pv}_1\), and marker orientations \(\LU{0,m_0}{\Rot}_{m0}\) and \(\LU{0,m_1}{\Rot}_{m1}\). The global axis is computed as
The relative translation marker computes the relative translation from the equation
The translational velocity, which may be used in coordinate spring-dampers or for velocity-level constraints, is computed as
Jacobians are computed according to the relative translational velocity, ignoring the \(\dot \av_0\) part. Using this approach, coordinate constraints can be added to mechanisms to purely add internal drives, not affecting global momenta. Furthermore, coupling to a relative rotation marker MarkerBodiesRelativeRotationCoordinate can be used to create advanced mechanisms and gears.
It is a coordinate marker: coordinate connectors, coordinate constraints and LoadCoordinate use it.
Body 0 must provide position and orientation, body 1 a position, both at a local point - a rigid body,
and for body 1 also a mass point; Assemble() refuses other bodies.
Mini example
#the translation of body 1 relative to body 0 along an axis of body 0, held by a coordinate constraint
inertia = InertiaCuboid(density=1000, sideLengths=[0.4,0.2,0.1])
node = mbs.AddNode(NodeRigidBodyRxyz(referenceCoordinates=[0,0,0, 0,0,0]))
body = mbs.AddObject(ObjectRigidBody(nodeNumber=node, mass=inertia.Mass(),
inertia=inertia.GetInertia6D()))
mRel = mbs.AddMarker(MarkerBodiesRelativeTranslationCoordinate(bodyNumbers=[oGround, body], axis0=[1,0,0]))
mGround = mbs.AddMarker(MarkerNodeCoordinate(nodeNumber=nGround, coordinate=0))
mbs.AddObject(ObjectConnectorCoordinate(markerNumbers=[mGround, mRel], offset=0.3))
mbs.Assemble()
mbs.SolveDynamic()
#the body is held 0.3 along x of the ground
exu.sys['testResult'] = mbs.GetNodeOutput(node, exu.OutputVariableType.Position)[0] #0.3
Relevant Examples (Ex) and TestModels (TM) with weblink to github: involuteGearGraphics.py (Ex), relativeRotationTranslationMechanism.py (TM)