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:
| Name | Description | Units | Default value |
|---|---|---|---|
frame_in | – | MultibodyComponents.ResolveInFrame.FrameA() | |
frame_out | – | MultibodyComponents.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
| Name | Description | Units |
|---|---|---|
R1 | – | |
rotation_matrix | – | |
r_in | – | |
r_out | – |
Behavior
Source
"""
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
endFlattened Source
"""
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 {}
endTest Cases
No test cases defined.
Related
Examples
Experiments
Analyses