Skip to content
LIBRARY
RelativeSensor.md

RelativeSensor

Combined, toggleable relative-motion sensor between two frame connectors.

r_rel/angles/w_rel are resolved directly in resolve_in_frame. v_rel/a_rel/z_rel are first differentiated in resolve_in_frame, then separately rotated into resolve_in_frame_after_differentiation (defaults to resolve_in_frame, i.e. a no-op rotation by default) – this differs from the standalone RelativeVelocity, which always differentiates in frame_a regardless of its own resolve_in_frame.

Usage

MultibodyComponents.RelativeSensor()

Parameters:

NameDescriptionUnitsDefault value
resolve_in_frameResolveInFrame.FrameA()
resolve_in_frame_after_differentiationFrame in which v_rel/a_rel/z_rel are resolved after differentiationresolve_in_frame
sequenceAxis sequence used for angles (only meaningful when get_angles = true)[1, 2, 3]
get_r_relOutput the relative position r_relfalse
get_v_relOutput the relative velocity v_relfalse
get_a_relOutput the relative acceleration a_relfalse
get_w_relOutput the relative angular velocity w_relfalse
get_z_relOutput the relative angular acceleration z_relfalse
get_anglesOutput the relative Euler/Cardan anglesfalse
need_posWhether the relative-position chain is needed by r_rel, v_rel, or a_rel((get_r_rel...(get_a_rel)
need_angvelWhether the relative-angular-velocity chain is needed by w_rel or z_rel(get_w_rel)...(get_z_rel)

Connectors

  • frame_a - Frame3D is the fundamental 3D connector used for 6DOF motion. Most components have one or several Frame

connectors that can be connected together (Frame3D)

  • frame_b - Frame3D is the fundamental 3D connector used for 6DOF motion. Most components have one or several Frame

connectors that can be connected together (Frame3D)

  • frame_resolve - Frame3D is the fundamental 3D connector used for 6DOF motion. Most components have one or several Frame

connectors that can be connected together (Frame3D)

  • r_rel_x - This connector represents a real signal as an output from a component (RealOutput)

  • r_rel_y - This connector represents a real signal as an output from a component (RealOutput)

  • r_rel_z - This connector represents a real signal as an output from a component (RealOutput)

  • v_rel_x - This connector represents a real signal as an output from a component (RealOutput)

  • v_rel_y - This connector represents a real signal as an output from a component (RealOutput)

  • v_rel_z - This connector represents a real signal as an output from a component (RealOutput)

  • a_rel_x - This connector represents a real signal as an output from a component (RealOutput)

  • a_rel_y - This connector represents a real signal as an output from a component (RealOutput)

  • a_rel_z - This connector represents a real signal as an output from a component (RealOutput)

  • w_rel_x - This connector represents a real signal as an output from a component (RealOutput)

  • w_rel_y - This connector represents a real signal as an output from a component (RealOutput)

  • w_rel_z - This connector represents a real signal as an output from a component (RealOutput)

  • z_rel_x - This connector represents a real signal as an output from a component (RealOutput)

  • z_rel_y - This connector represents a real signal as an output from a component (RealOutput)

  • z_rel_z - This connector represents a real signal as an output from a component (RealOutput)

  • angle_1 - This connector represents a real signal as an output from a component (RealOutput)

  • angle_2 - This connector represents a real signal as an output from a component (RealOutput)

  • angle_3 - This connector represents a real signal as an output from a component (RealOutput)

Variables

NameDescriptionUnits
v_rel0_xder(r_rel), resolved in resolve_in_frame (feeds v_rel and a_rel)m/s
v_rel0_ym/s
v_rel0_zm/s
a_rel0_xder(v_rel0), resolved in resolve_in_framem/s2
a_rel0_ym/s2
a_rel0_zm/s2
z_rel0_xder(w_rel), resolved in resolve_in_framerad/s2
z_rel0_yrad/s2
z_rel0_zrad/s2

Behavior

Source

dyad
"""
Combined, toggleable relative-motion sensor between two frame connectors.

`r_rel`/`angles`/`w_rel` are resolved directly in `resolve_in_frame`.
`v_rel`/`a_rel`/`z_rel` are first differentiated in `resolve_in_frame`, then
separately rotated into `resolve_in_frame_after_differentiation` (defaults to
`resolve_in_frame`, i.e. a no-op rotation by default) -- this differs from the
standalone `RelativeVelocity`, which always differentiates in frame_a
regardless of its own `resolve_in_frame`.
"""
component RelativeSensor
  frame_a = Frame3D() {
    "Dyad": {"placement": {"diagram": {"x1": -50, "y1": 460, "x2": 50, "y2": 540}}}
  }
  frame_b = Frame3D() {
    "Dyad": {"placement": {"diagram": {"x1": 950, "y1": 460, "x2": 1050, "y2": 540}}}
  }
  frame_resolve = Frame3D() if case(resolve_in_frame, ResolveInFrame.FrameResolve) or case(resolve_in_frame_after_differentiation, ResolveInFrame.FrameResolve) {
    "Dyad": {"placement": {"diagram": {"x1": 450, "y1": -50, "x2": 550, "y2": 50}}}
  }
  r_rel_x = RealOutput() if get_r_rel {
    "Dyad": {
      "placement": {"diagram": {"x1": 20, "y1": 950, "x2": 100, "y2": 1030, "rot": 90}}
    }
  }
  r_rel_y = RealOutput() if get_r_rel {
    "Dyad": {
      "placement": {"diagram": {"x1": 20, "y1": 1030, "x2": 100, "y2": 1110, "rot": 90}}
    }
  }
  r_rel_z = RealOutput() if get_r_rel {
    "Dyad": {
      "placement": {"diagram": {"x1": 20, "y1": 1110, "x2": 100, "y2": 1190, "rot": 90}}
    }
  }
  v_rel_x = RealOutput() if get_v_rel {
    "Dyad": {
      "placement": {"diagram": {"x1": 190, "y1": 950, "x2": 270, "y2": 1030, "rot": 90}}
    }
  }
  v_rel_y = RealOutput() if get_v_rel {
    "Dyad": {
      "placement": {"diagram": {"x1": 190, "y1": 1030, "x2": 270, "y2": 1110, "rot": 90}}
    }
  }
  v_rel_z = RealOutput() if get_v_rel {
    "Dyad": {
      "placement": {"diagram": {"x1": 190, "y1": 1110, "x2": 270, "y2": 1190, "rot": 90}}
    }
  }
  a_rel_x = RealOutput() if get_a_rel {
    "Dyad": {
      "placement": {"diagram": {"x1": 360, "y1": 950, "x2": 440, "y2": 1030, "rot": 90}}
    }
  }
  a_rel_y = RealOutput() if get_a_rel {
    "Dyad": {
      "placement": {"diagram": {"x1": 360, "y1": 1030, "x2": 440, "y2": 1110, "rot": 90}}
    }
  }
  a_rel_z = RealOutput() if get_a_rel {
    "Dyad": {
      "placement": {"diagram": {"x1": 360, "y1": 1110, "x2": 440, "y2": 1190, "rot": 90}}
    }
  }
  w_rel_x = RealOutput() if get_w_rel {
    "Dyad": {
      "placement": {"diagram": {"x1": 530, "y1": 950, "x2": 610, "y2": 1030, "rot": 90}}
    }
  }
  w_rel_y = RealOutput() if get_w_rel {
    "Dyad": {
      "placement": {"diagram": {"x1": 530, "y1": 1030, "x2": 610, "y2": 1110, "rot": 90}}
    }
  }
  w_rel_z = RealOutput() if get_w_rel {
    "Dyad": {
      "placement": {"diagram": {"x1": 530, "y1": 1110, "x2": 610, "y2": 1190, "rot": 90}}
    }
  }
  z_rel_x = RealOutput() if get_z_rel {
    "Dyad": {
      "placement": {"diagram": {"x1": 700, "y1": 950, "x2": 780, "y2": 1030, "rot": 90}}
    }
  }
  z_rel_y = RealOutput() if get_z_rel {
    "Dyad": {
      "placement": {"diagram": {"x1": 700, "y1": 1030, "x2": 780, "y2": 1110, "rot": 90}}
    }
  }
  z_rel_z = RealOutput() if get_z_rel {
    "Dyad": {
      "placement": {"diagram": {"x1": 700, "y1": 1110, "x2": 780, "y2": 1190, "rot": 90}}
    }
  }
  angle_1 = RealOutput() if get_angles {
    "Dyad": {
      "placement": {"diagram": {"x1": 870, "y1": 950, "x2": 950, "y2": 1030, "rot": 90}}
    }
  }
  angle_2 = RealOutput() if get_angles {
    "Dyad": {
      "placement": {"diagram": {"x1": 870, "y1": 1030, "x2": 950, "y2": 1110, "rot": 90}}
    }
  }
  angle_3 = RealOutput() if get_angles {
    "Dyad": {
      "placement": {"diagram": {"x1": 870, "y1": 1110, "x2": 950, "y2": 1190, "rot": 90}}
    }
  }
  rel_pos = RelativePosition(resolve_in_frame = resolve_in_frame) if need_pos {
    "Dyad": {"placement": {"diagram": {"x1": 450, "x2": 550, "y1": 450, "y2": 550}}}
  }
  rel_angvel = RelativeAngularVelocity(resolve_in_frame = resolve_in_frame) if need_angvel {
    "Dyad": {"placement": {"diagram": {"x1": 200, "x2": 300, "y1": 500, "y2": 600}}}
  }
  rel_ang = RelativeAngles(sequence = sequence) if get_angles {
    "Dyad": {"placement": {"diagram": {"x1": 500, "x2": 600, "y1": 200, "y2": 300}}}
  }
  v_transform = TransformRelativeVector(frame_r_in = resolve_in_frame, frame_r_out = resolve_in_frame_after_differentiation) if get_v_rel {
    "Dyad": {"placement": {"diagram": {"x1": 450, "x2": 550, "y1": 700, "y2": 800}}}
  }
  a_transform = TransformRelativeVector(frame_r_in = resolve_in_frame, frame_r_out = resolve_in_frame_after_differentiation) if get_a_rel {
    "Dyad": {"placement": {"diagram": {"x1": 700, "x2": 800, "y1": 450, "y2": 550}}}
  }
  z_transform = TransformRelativeVector(frame_r_in = resolve_in_frame, frame_r_out = resolve_in_frame_after_differentiation) if get_z_rel {
    "Dyad": {"placement": {"diagram": {"x1": 200, "x2": 300, "y1": 250, "y2": 350}}}
  }
  structural parameter resolve_in_frame::ResolveInFrame = ResolveInFrame.FrameA()
  "Frame in which v_rel/a_rel/z_rel are resolved after differentiation"
  structural parameter resolve_in_frame_after_differentiation::ResolveInFrame = resolve_in_frame
  "Axis sequence used for `angles` (only meaningful when get_angles = true)"
  structural parameter sequence::Integer[3] = [1, 2, 3]
  "Output the relative position r_rel"
  structural parameter get_r_rel::Boolean = false
  "Output the relative velocity v_rel"
  structural parameter get_v_rel::Boolean = false
  "Output the relative acceleration a_rel"
  structural parameter get_a_rel::Boolean = false
  "Output the relative angular velocity w_rel"
  structural parameter get_w_rel::Boolean = false
  "Output the relative angular acceleration z_rel"
  structural parameter get_z_rel::Boolean = false
  "Output the relative Euler/Cardan angles"
  structural parameter get_angles::Boolean = false
  "Whether the relative-position chain is needed by r_rel, v_rel, or a_rel"
  final structural parameter need_pos::Boolean = get_r_rel or get_v_rel or get_a_rel
  "Whether the relative-angular-velocity chain is needed by w_rel or z_rel"
  final structural parameter need_angvel::Boolean = get_w_rel or get_z_rel
  "der(r_rel), resolved in resolve_in_frame (feeds v_rel and a_rel)"
  variable v_rel0_x::Velocity if get_v_rel or get_a_rel
  variable v_rel0_y::Velocity if get_v_rel or get_a_rel
  variable v_rel0_z::Velocity if get_v_rel or get_a_rel
  "der(v_rel0), resolved in resolve_in_frame"
  variable a_rel0_x::Acceleration if get_a_rel
  variable a_rel0_y::Acceleration if get_a_rel
  variable a_rel0_z::Acceleration if get_a_rel
  "der(w_rel), resolved in resolve_in_frame"
  variable z_rel0_x::AngularAcceleration if get_z_rel
  variable z_rel0_y::AngularAcceleration if get_z_rel
  variable z_rel0_z::AngularAcceleration if get_z_rel
relations
  if need_pos
    connect(frame_a, rel_pos.frame_a)
    connect(frame_b, rel_pos.frame_b)
    if case(resolve_in_frame, ResolveInFrame.FrameResolve)
      connect(frame_resolve, rel_pos.frame_resolve)
    end
  end
  if get_r_rel
    r_rel_x = rel_pos.r_rel_x
    r_rel_y = rel_pos.r_rel_y
    r_rel_z = rel_pos.r_rel_z
  end
  if need_angvel
    connect(frame_a, rel_angvel.frame_a)
    connect(frame_b, rel_angvel.frame_b)
    if case(resolve_in_frame, ResolveInFrame.FrameResolve)
      connect(frame_resolve, rel_angvel.frame_resolve)
    end
  end
  if get_w_rel
    w_rel_x = rel_angvel.w_rel_x
    w_rel_y = rel_angvel.w_rel_y
    w_rel_z = rel_angvel.w_rel_z
  end
  if get_angles
    connect(frame_a, rel_ang.frame_a)
    connect(frame_b, rel_ang.frame_b)
    angle_1 = rel_ang.angle_1
    angle_2 = rel_ang.angle_2
    angle_3 = rel_ang.angle_3
  end
  if get_v_rel or get_a_rel
    v_rel0_x = der(rel_pos.r_rel_x)
    v_rel0_y = der(rel_pos.r_rel_y)
    v_rel0_z = der(rel_pos.r_rel_z)
  end
  if get_v_rel
    connect(frame_a, v_transform.frame_a)
    connect(frame_b, v_transform.frame_b)
    if case(resolve_in_frame, ResolveInFrame.FrameResolve) or case(resolve_in_frame_after_differentiation, ResolveInFrame.FrameResolve)
      connect(frame_resolve, v_transform.frame_resolve)
    end
    v_transform.r_in_x = v_rel0_x
    v_transform.r_in_y = v_rel0_y
    v_transform.r_in_z = v_rel0_z
    v_rel_x = v_transform.r_out_x
    v_rel_y = v_transform.r_out_y
    v_rel_z = v_transform.r_out_z
  end
  if get_a_rel
    a_rel0_x = der(v_rel0_x)
    a_rel0_y = der(v_rel0_y)
    a_rel0_z = der(v_rel0_z)
    connect(frame_a, a_transform.frame_a)
    connect(frame_b, a_transform.frame_b)
    if case(resolve_in_frame, ResolveInFrame.FrameResolve) or case(resolve_in_frame_after_differentiation, ResolveInFrame.FrameResolve)
      connect(frame_resolve, a_transform.frame_resolve)
    end
    a_transform.r_in_x = a_rel0_x
    a_transform.r_in_y = a_rel0_y
    a_transform.r_in_z = a_rel0_z
    a_rel_x = a_transform.r_out_x
    a_rel_y = a_transform.r_out_y
    a_rel_z = a_transform.r_out_z
  end
  if get_z_rel
    z_rel0_x = der(rel_angvel.w_rel_x)
    z_rel0_y = der(rel_angvel.w_rel_y)
    z_rel0_z = der(rel_angvel.w_rel_z)
    connect(frame_a, z_transform.frame_a)
    connect(frame_b, z_transform.frame_b)
    if case(resolve_in_frame, ResolveInFrame.FrameResolve) or case(resolve_in_frame_after_differentiation, ResolveInFrame.FrameResolve)
      connect(frame_resolve, z_transform.frame_resolve)
    end
    z_transform.r_in_x = z_rel0_x
    z_transform.r_in_y = z_rel0_y
    z_transform.r_in_z = z_rel0_z
    z_rel_x = z_transform.r_out_x
    z_rel_y = z_transform.r_out_y
    z_rel_z = z_transform.r_out_z
  end
metadata {
  "Dyad": {
    "icons": {"default": "dyad://MultibodyComponents/TwoFrameSensor.svg"},
    "labels": [
      {
        "label": "$(instance)",
        "x": 500,
        "y": 150,
        "rot": 0,
        "attrs": {"font-size": "140"}
      },
      {"label": "rel sensor", "x": 500, "y": 680, "rot": 0}
    ]
  }
}
end
Flattened Source
dyad
"""
Combined, toggleable relative-motion sensor between two frame connectors.

`r_rel`/`angles`/`w_rel` are resolved directly in `resolve_in_frame`.
`v_rel`/`a_rel`/`z_rel` are first differentiated in `resolve_in_frame`, then
separately rotated into `resolve_in_frame_after_differentiation` (defaults to
`resolve_in_frame`, i.e. a no-op rotation by default) -- this differs from the
standalone `RelativeVelocity`, which always differentiates in frame_a
regardless of its own `resolve_in_frame`.
"""
component RelativeSensor
  frame_a = Frame3D() {
    "Dyad": {"placement": {"diagram": {"x1": -50, "y1": 460, "x2": 50, "y2": 540}}}
  }
  frame_b = Frame3D() {
    "Dyad": {"placement": {"diagram": {"x1": 950, "y1": 460, "x2": 1050, "y2": 540}}}
  }
  frame_resolve = Frame3D() if case(resolve_in_frame, ResolveInFrame.FrameResolve) or case(resolve_in_frame_after_differentiation, ResolveInFrame.FrameResolve) {
    "Dyad": {"placement": {"diagram": {"x1": 450, "y1": -50, "x2": 550, "y2": 50}}}
  }
  r_rel_x = RealOutput() if get_r_rel {
    "Dyad": {
      "placement": {"diagram": {"x1": 20, "y1": 950, "x2": 100, "y2": 1030, "rot": 90}}
    }
  }
  r_rel_y = RealOutput() if get_r_rel {
    "Dyad": {
      "placement": {"diagram": {"x1": 20, "y1": 1030, "x2": 100, "y2": 1110, "rot": 90}}
    }
  }
  r_rel_z = RealOutput() if get_r_rel {
    "Dyad": {
      "placement": {"diagram": {"x1": 20, "y1": 1110, "x2": 100, "y2": 1190, "rot": 90}}
    }
  }
  v_rel_x = RealOutput() if get_v_rel {
    "Dyad": {
      "placement": {"diagram": {"x1": 190, "y1": 950, "x2": 270, "y2": 1030, "rot": 90}}
    }
  }
  v_rel_y = RealOutput() if get_v_rel {
    "Dyad": {
      "placement": {"diagram": {"x1": 190, "y1": 1030, "x2": 270, "y2": 1110, "rot": 90}}
    }
  }
  v_rel_z = RealOutput() if get_v_rel {
    "Dyad": {
      "placement": {"diagram": {"x1": 190, "y1": 1110, "x2": 270, "y2": 1190, "rot": 90}}
    }
  }
  a_rel_x = RealOutput() if get_a_rel {
    "Dyad": {
      "placement": {"diagram": {"x1": 360, "y1": 950, "x2": 440, "y2": 1030, "rot": 90}}
    }
  }
  a_rel_y = RealOutput() if get_a_rel {
    "Dyad": {
      "placement": {"diagram": {"x1": 360, "y1": 1030, "x2": 440, "y2": 1110, "rot": 90}}
    }
  }
  a_rel_z = RealOutput() if get_a_rel {
    "Dyad": {
      "placement": {"diagram": {"x1": 360, "y1": 1110, "x2": 440, "y2": 1190, "rot": 90}}
    }
  }
  w_rel_x = RealOutput() if get_w_rel {
    "Dyad": {
      "placement": {"diagram": {"x1": 530, "y1": 950, "x2": 610, "y2": 1030, "rot": 90}}
    }
  }
  w_rel_y = RealOutput() if get_w_rel {
    "Dyad": {
      "placement": {"diagram": {"x1": 530, "y1": 1030, "x2": 610, "y2": 1110, "rot": 90}}
    }
  }
  w_rel_z = RealOutput() if get_w_rel {
    "Dyad": {
      "placement": {"diagram": {"x1": 530, "y1": 1110, "x2": 610, "y2": 1190, "rot": 90}}
    }
  }
  z_rel_x = RealOutput() if get_z_rel {
    "Dyad": {
      "placement": {"diagram": {"x1": 700, "y1": 950, "x2": 780, "y2": 1030, "rot": 90}}
    }
  }
  z_rel_y = RealOutput() if get_z_rel {
    "Dyad": {
      "placement": {"diagram": {"x1": 700, "y1": 1030, "x2": 780, "y2": 1110, "rot": 90}}
    }
  }
  z_rel_z = RealOutput() if get_z_rel {
    "Dyad": {
      "placement": {"diagram": {"x1": 700, "y1": 1110, "x2": 780, "y2": 1190, "rot": 90}}
    }
  }
  angle_1 = RealOutput() if get_angles {
    "Dyad": {
      "placement": {"diagram": {"x1": 870, "y1": 950, "x2": 950, "y2": 1030, "rot": 90}}
    }
  }
  angle_2 = RealOutput() if get_angles {
    "Dyad": {
      "placement": {"diagram": {"x1": 870, "y1": 1030, "x2": 950, "y2": 1110, "rot": 90}}
    }
  }
  angle_3 = RealOutput() if get_angles {
    "Dyad": {
      "placement": {"diagram": {"x1": 870, "y1": 1110, "x2": 950, "y2": 1190, "rot": 90}}
    }
  }
  rel_pos = RelativePosition(resolve_in_frame = resolve_in_frame) if need_pos {
    "Dyad": {"placement": {"diagram": {"x1": 450, "x2": 550, "y1": 450, "y2": 550}}}
  }
  rel_angvel = RelativeAngularVelocity(resolve_in_frame = resolve_in_frame) if need_angvel {
    "Dyad": {"placement": {"diagram": {"x1": 200, "x2": 300, "y1": 500, "y2": 600}}}
  }
  rel_ang = RelativeAngles(sequence = sequence) if get_angles {
    "Dyad": {"placement": {"diagram": {"x1": 500, "x2": 600, "y1": 200, "y2": 300}}}
  }
  v_transform = TransformRelativeVector(frame_r_in = resolve_in_frame, frame_r_out = resolve_in_frame_after_differentiation) if get_v_rel {
    "Dyad": {"placement": {"diagram": {"x1": 450, "x2": 550, "y1": 700, "y2": 800}}}
  }
  a_transform = TransformRelativeVector(frame_r_in = resolve_in_frame, frame_r_out = resolve_in_frame_after_differentiation) if get_a_rel {
    "Dyad": {"placement": {"diagram": {"x1": 700, "x2": 800, "y1": 450, "y2": 550}}}
  }
  z_transform = TransformRelativeVector(frame_r_in = resolve_in_frame, frame_r_out = resolve_in_frame_after_differentiation) if get_z_rel {
    "Dyad": {"placement": {"diagram": {"x1": 200, "x2": 300, "y1": 250, "y2": 350}}}
  }
  structural parameter resolve_in_frame::ResolveInFrame = ResolveInFrame.FrameA()
  "Frame in which v_rel/a_rel/z_rel are resolved after differentiation"
  structural parameter resolve_in_frame_after_differentiation::ResolveInFrame = resolve_in_frame
  "Axis sequence used for `angles` (only meaningful when get_angles = true)"
  structural parameter sequence::Integer[3] = [1, 2, 3]
  "Output the relative position r_rel"
  structural parameter get_r_rel::Boolean = false
  "Output the relative velocity v_rel"
  structural parameter get_v_rel::Boolean = false
  "Output the relative acceleration a_rel"
  structural parameter get_a_rel::Boolean = false
  "Output the relative angular velocity w_rel"
  structural parameter get_w_rel::Boolean = false
  "Output the relative angular acceleration z_rel"
  structural parameter get_z_rel::Boolean = false
  "Output the relative Euler/Cardan angles"
  structural parameter get_angles::Boolean = false
  "Whether the relative-position chain is needed by r_rel, v_rel, or a_rel"
  final structural parameter need_pos::Boolean = get_r_rel or get_v_rel or get_a_rel
  "Whether the relative-angular-velocity chain is needed by w_rel or z_rel"
  final structural parameter need_angvel::Boolean = get_w_rel or get_z_rel
  "der(r_rel), resolved in resolve_in_frame (feeds v_rel and a_rel)"
  variable v_rel0_x::Velocity if get_v_rel or get_a_rel
  variable v_rel0_y::Velocity if get_v_rel or get_a_rel
  variable v_rel0_z::Velocity if get_v_rel or get_a_rel
  "der(v_rel0), resolved in resolve_in_frame"
  variable a_rel0_x::Acceleration if get_a_rel
  variable a_rel0_y::Acceleration if get_a_rel
  variable a_rel0_z::Acceleration if get_a_rel
  "der(w_rel), resolved in resolve_in_frame"
  variable z_rel0_x::AngularAcceleration if get_z_rel
  variable z_rel0_y::AngularAcceleration if get_z_rel
  variable z_rel0_z::AngularAcceleration if get_z_rel
relations
  if need_pos
    connect(frame_a, rel_pos.frame_a)
    connect(frame_b, rel_pos.frame_b)
    if case(resolve_in_frame, ResolveInFrame.FrameResolve)
      connect(frame_resolve, rel_pos.frame_resolve)
    end
  end
  if get_r_rel
    r_rel_x = rel_pos.r_rel_x
    r_rel_y = rel_pos.r_rel_y
    r_rel_z = rel_pos.r_rel_z
  end
  if need_angvel
    connect(frame_a, rel_angvel.frame_a)
    connect(frame_b, rel_angvel.frame_b)
    if case(resolve_in_frame, ResolveInFrame.FrameResolve)
      connect(frame_resolve, rel_angvel.frame_resolve)
    end
  end
  if get_w_rel
    w_rel_x = rel_angvel.w_rel_x
    w_rel_y = rel_angvel.w_rel_y
    w_rel_z = rel_angvel.w_rel_z
  end
  if get_angles
    connect(frame_a, rel_ang.frame_a)
    connect(frame_b, rel_ang.frame_b)
    angle_1 = rel_ang.angle_1
    angle_2 = rel_ang.angle_2
    angle_3 = rel_ang.angle_3
  end
  if get_v_rel or get_a_rel
    v_rel0_x = der(rel_pos.r_rel_x)
    v_rel0_y = der(rel_pos.r_rel_y)
    v_rel0_z = der(rel_pos.r_rel_z)
  end
  if get_v_rel
    connect(frame_a, v_transform.frame_a)
    connect(frame_b, v_transform.frame_b)
    if case(resolve_in_frame, ResolveInFrame.FrameResolve) or case(resolve_in_frame_after_differentiation, ResolveInFrame.FrameResolve)
      connect(frame_resolve, v_transform.frame_resolve)
    end
    v_transform.r_in_x = v_rel0_x
    v_transform.r_in_y = v_rel0_y
    v_transform.r_in_z = v_rel0_z
    v_rel_x = v_transform.r_out_x
    v_rel_y = v_transform.r_out_y
    v_rel_z = v_transform.r_out_z
  end
  if get_a_rel
    a_rel0_x = der(v_rel0_x)
    a_rel0_y = der(v_rel0_y)
    a_rel0_z = der(v_rel0_z)
    connect(frame_a, a_transform.frame_a)
    connect(frame_b, a_transform.frame_b)
    if case(resolve_in_frame, ResolveInFrame.FrameResolve) or case(resolve_in_frame_after_differentiation, ResolveInFrame.FrameResolve)
      connect(frame_resolve, a_transform.frame_resolve)
    end
    a_transform.r_in_x = a_rel0_x
    a_transform.r_in_y = a_rel0_y
    a_transform.r_in_z = a_rel0_z
    a_rel_x = a_transform.r_out_x
    a_rel_y = a_transform.r_out_y
    a_rel_z = a_transform.r_out_z
  end
  if get_z_rel
    z_rel0_x = der(rel_angvel.w_rel_x)
    z_rel0_y = der(rel_angvel.w_rel_y)
    z_rel0_z = der(rel_angvel.w_rel_z)
    connect(frame_a, z_transform.frame_a)
    connect(frame_b, z_transform.frame_b)
    if case(resolve_in_frame, ResolveInFrame.FrameResolve) or case(resolve_in_frame_after_differentiation, ResolveInFrame.FrameResolve)
      connect(frame_resolve, z_transform.frame_resolve)
    end
    z_transform.r_in_x = z_rel0_x
    z_transform.r_in_y = z_rel0_y
    z_transform.r_in_z = z_rel0_z
    z_rel_x = z_transform.r_out_x
    z_rel_y = z_transform.r_out_y
    z_rel_z = z_transform.r_out_z
  end
metadata {
  "Dyad": {
    "icons": {"default": "dyad://MultibodyComponents/TwoFrameSensor.svg"},
    "labels": [
      {
        "label": "$(instance)",
        "x": 500,
        "y": 150,
        "rot": 0,
        "attrs": {"font-size": "140"}
      },
      {"label": "rel sensor", "x": 500, "y": 680, "rot": 0}
    ]
  }
}
end


Test Cases

No test cases defined.

  • Examples

  • Experiments

  • Analyses