Skip to content
LIBRARY
PlanarMechanics.TransformRelativeVector.md

PlanarMechanics.TransformRelativeVector

Rotates a relative vector between frames via a two-step rotation through the world frame: input frame -> world -> output frame. Supports World, FrameA, FrameB, and FrameResolve. Angular quantities are frame-invariant in 2D so phi_out = phi_in when using the R1[3,3] matrix (no phi offset column).

Usage

MultibodyComponents.PlanarMechanics.TransformRelativeVector()

Parameters:

NameDescriptionUnitsDefault value
frame_inMultibodyComponents.ResolveInFrame.FrameA()
frame_outMultibodyComponents.ResolveInFrame.FrameA()

Connectors

  • frame_a - Coordinate system (2-dim.) fixed to the component with one cut-force and cut-torque.

All variables are resolved in the planar world frame. (Frame2D)

  • frame_b - Coordinate system (2-dim.) fixed to the component with one cut-force and cut-torque.

All variables are resolved in the planar world frame. (Frame2D)

  • frame_resolve - Coordinate system (2-dim.) fixed to the component with one cut-force and cut-torque.

All variables are resolved in the planar world frame. (Frame2D)

  • x_in - This connector represents a real signal as an input to a component (RealInput)

  • y_in - This connector represents a real signal as an input to a component (RealInput)

  • phi_in - This connector represents a real signal as an input to a component (RealInput)

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

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

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

Variables

NameDescriptionUnits
R1
rotation_matrix
r_in
r_out

Behavior

frame_a.fx(t)=0frame_a.fy(t)=0frame_a.tau(t)=0frame_b.fx(t)=0frame_b.fy(t)=0frame_b.tau(t)=0x_out(t)=x_in(t)y_out(t)=y_in(t)phi_out(t)=phi_in(t)

Source

dyad
"""
Rotates a relative vector between frames via a two-step rotation through the
world frame: input frame -> world -> output frame. Supports World, FrameA,
FrameB, and FrameResolve. Angular quantities are frame-invariant in 2D so
phi_out = phi_in when using the R1[3,3] matrix (no phi offset column).
"""
component TransformRelativeVector
  frame_a = Frame2D()
  frame_b = Frame2D()
  frame_resolve = Frame2D() if (frame_in == MultibodyComponents.ResolveInFrame.FrameResolve()) or (frame_out == MultibodyComponents.ResolveInFrame.FrameResolve())
  x_in = RealInput()
  y_in = RealInput()
  phi_in = RealInput()
  x_out = RealOutput()
  y_out = RealOutput()
  phi_out = RealOutput()
  structural parameter frame_in::MultibodyComponents.ResolveInFrame = MultibodyComponents.ResolveInFrame.FrameA()
  structural parameter frame_out::MultibodyComponents.ResolveInFrame = MultibodyComponents.ResolveInFrame.FrameA()
  variable R1::Real[3, 3] if frame_out != frame_in
  variable rotation_matrix::Real[3, 3] if frame_out != frame_in
  variable r_in::Real[3] if frame_out != frame_in
  variable r_out::Real[3] if frame_out != frame_in
relations
  frame_a.fx = 0
  frame_a.fy = 0
  frame_a.tau = 0
  frame_b.fx = 0
  frame_b.fy = 0
  frame_b.tau = 0
  if (frame_in == MultibodyComponents.ResolveInFrame.FrameResolve()) or (frame_out == MultibodyComponents.ResolveInFrame.FrameResolve())
    frame_resolve.fx = 0
    frame_resolve.fy = 0
    frame_resolve.tau = 0
  end
  if frame_out == frame_in
    x_out = x_in
    y_out = y_in
    phi_out = phi_in
  else
    r_in = [x_in, y_in, phi_in]
    if frame_in == MultibodyComponents.ResolveInFrame.World()
      R1 = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
    end
    if frame_in == MultibodyComponents.ResolveInFrame.FrameA()
      R1 = [[cos(frame_a.phi), -sin(frame_a.phi), 0], [sin(frame_a.phi), cos(frame_a.phi), 0], [0, 0, 1]]
    end
    if frame_in == MultibodyComponents.ResolveInFrame.FrameB()
      R1 = [[cos(frame_b.phi), -sin(frame_b.phi), 0], [sin(frame_b.phi), cos(frame_b.phi), 0], [0, 0, 1]]
    end
    if frame_in == MultibodyComponents.ResolveInFrame.FrameResolve()
      R1 = [[cos(frame_resolve.phi), -sin(frame_resolve.phi), 0], [sin(frame_resolve.phi), cos(frame_resolve.phi), 0], [0, 0, 1]]
    end
    if frame_out == MultibodyComponents.ResolveInFrame.World()
      rotation_matrix = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
      r_out = R1 * r_in
    end
    if frame_out == MultibodyComponents.ResolveInFrame.FrameA()
      rotation_matrix = [[cos(frame_a.phi), -sin(frame_a.phi), 0], [sin(frame_a.phi), cos(frame_a.phi), 0], [0, 0, 1]]
      r_out = transpose(rotation_matrix) * (R1 * r_in)
    end
    if frame_out == MultibodyComponents.ResolveInFrame.FrameB()
      rotation_matrix = [[cos(frame_b.phi), -sin(frame_b.phi), 0], [sin(frame_b.phi), cos(frame_b.phi), 0], [0, 0, 1]]
      r_out = transpose(rotation_matrix) * (R1 * r_in)
    end
    if frame_out == MultibodyComponents.ResolveInFrame.FrameResolve()
      rotation_matrix = [[cos(frame_resolve.phi), -sin(frame_resolve.phi), 0], [sin(frame_resolve.phi), cos(frame_resolve.phi), 0], [0, 0, 1]]
      r_out = transpose(rotation_matrix) * (R1 * r_in)
    end
    [x_out, y_out, phi_out] = r_out
  end
end
Flattened Source
dyad
"""
Rotates a relative vector between frames via a two-step rotation through the
world frame: input frame -> world -> output frame. Supports World, FrameA,
FrameB, and FrameResolve. Angular quantities are frame-invariant in 2D so
phi_out = phi_in when using the R1[3,3] matrix (no phi offset column).
"""
component TransformRelativeVector
  frame_a = Frame2D()
  frame_b = Frame2D()
  frame_resolve = Frame2D() if (frame_in == MultibodyComponents.ResolveInFrame.FrameResolve()) or (frame_out == MultibodyComponents.ResolveInFrame.FrameResolve())
  x_in = RealInput()
  y_in = RealInput()
  phi_in = RealInput()
  x_out = RealOutput()
  y_out = RealOutput()
  phi_out = RealOutput()
  structural parameter frame_in::MultibodyComponents.ResolveInFrame = MultibodyComponents.ResolveInFrame.FrameA()
  structural parameter frame_out::MultibodyComponents.ResolveInFrame = MultibodyComponents.ResolveInFrame.FrameA()
  variable R1::Real[3, 3] if frame_out != frame_in
  variable rotation_matrix::Real[3, 3] if frame_out != frame_in
  variable r_in::Real[3] if frame_out != frame_in
  variable r_out::Real[3] if frame_out != frame_in
relations
  frame_a.fx = 0
  frame_a.fy = 0
  frame_a.tau = 0
  frame_b.fx = 0
  frame_b.fy = 0
  frame_b.tau = 0
  if (frame_in == MultibodyComponents.ResolveInFrame.FrameResolve()) or (frame_out == MultibodyComponents.ResolveInFrame.FrameResolve())
    frame_resolve.fx = 0
    frame_resolve.fy = 0
    frame_resolve.tau = 0
  end
  if frame_out == frame_in
    x_out = x_in
    y_out = y_in
    phi_out = phi_in
  else
    r_in = [x_in, y_in, phi_in]
    if frame_in == MultibodyComponents.ResolveInFrame.World()
      R1 = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
    end
    if frame_in == MultibodyComponents.ResolveInFrame.FrameA()
      R1 = [[cos(frame_a.phi), -sin(frame_a.phi), 0], [sin(frame_a.phi), cos(frame_a.phi), 0], [0, 0, 1]]
    end
    if frame_in == MultibodyComponents.ResolveInFrame.FrameB()
      R1 = [[cos(frame_b.phi), -sin(frame_b.phi), 0], [sin(frame_b.phi), cos(frame_b.phi), 0], [0, 0, 1]]
    end
    if frame_in == MultibodyComponents.ResolveInFrame.FrameResolve()
      R1 = [[cos(frame_resolve.phi), -sin(frame_resolve.phi), 0], [sin(frame_resolve.phi), cos(frame_resolve.phi), 0], [0, 0, 1]]
    end
    if frame_out == MultibodyComponents.ResolveInFrame.World()
      rotation_matrix = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
      r_out = R1 * r_in
    end
    if frame_out == MultibodyComponents.ResolveInFrame.FrameA()
      rotation_matrix = [[cos(frame_a.phi), -sin(frame_a.phi), 0], [sin(frame_a.phi), cos(frame_a.phi), 0], [0, 0, 1]]
      r_out = transpose(rotation_matrix) * (R1 * r_in)
    end
    if frame_out == MultibodyComponents.ResolveInFrame.FrameB()
      rotation_matrix = [[cos(frame_b.phi), -sin(frame_b.phi), 0], [sin(frame_b.phi), cos(frame_b.phi), 0], [0, 0, 1]]
      r_out = transpose(rotation_matrix) * (R1 * r_in)
    end
    if frame_out == MultibodyComponents.ResolveInFrame.FrameResolve()
      rotation_matrix = [[cos(frame_resolve.phi), -sin(frame_resolve.phi), 0], [sin(frame_resolve.phi), cos(frame_resolve.phi), 0], [0, 0, 1]]
      r_out = transpose(rotation_matrix) * (R1 * r_in)
    end
    [x_out, y_out, phi_out] = r_out
  end
metadata {}
end


Test Cases

No test cases defined.

  • Examples

  • Experiments

  • Analyses