Skip to content
LIBRARY
Damper.md

Damper

Linear damper acting as line force between frame_a and frame_b.

A force f = d * D(s) is exerted along the line from frame_a to frame_b, where d is the damping coefficient and s is the distance between frames.

This component extends from PartialLineForce This component extends from Renderable

Usage

MultibodyComponents.Damper(s_small=1e-10, render=true, color=[0.5, 0.5, 0.5, 1], specular_coefficient=1.5, d=1.0, radius=world_default_force_width(), length_fraction=world_default_force_length())

Parameters:

NameDescriptionUnitsDefault value
fixed_rotation_at_frame_afalse
fixed_rotation_at_frame_bfalse
s_small1e-10
rendertrue
color[0.5, 0.5, 0.5, 1]
specular_coefficient1.5
dDamping coefficientN.s/m1.0
radiusRadius of damper in animationsworld_defau...rce_width()
length_fractionFraction of the length renderedworld_defau...ce_length()

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)

Variables

NameDescriptionUnits
lengthDistance between the origin of frame_a and the origin of frame_bm
s(Guarded) distance between the origin of frame_a and the origin of frame_b (>= s_small))m
r_rel_0Position vector from frame_a to frame_b resolved in world framem
e_rel_0Unit vector in direction from frame_a to frame_b, resolved in world frame
r_rel_aPosition vector from frame_a to frame_b, resolved in frame_am
e_aUnit vector from frame_a to frame_b, resolved in frame_a
fScalar line force (positive = tension)N

Behavior

Dict{MIME{Symbol("text/plain")}, String} with 1 entry: MIME type text/plain => "Error displaying result"

Source

dyad
"""
Linear damper acting as line force between `frame_a` and `frame_b`.

A force `f = d * D(s)` is exerted along the line from frame_a to frame_b,
where `d` is the damping coefficient and `s` is the distance between frames.
"""
component Damper
  extends PartialLineForce
  extends Renderable(color = [0.5, 0.5, 0.5, 1])
  # Visualization shape
  shape = CylinderShape(render = render, color = color, r = frame_a.r_0, length_direction = e_rel_0, length = length_fraction, width = 2 * radius, height = 2 * radius)
  "Damping coefficient"
  parameter d::TranslationalDampingConstant = 1.0
  "Radius of damper in animations"
  parameter radius::Real = world_default_force_width()
  "Fraction of the length rendered"
  parameter length_fraction::Real = world_default_force_length()
relations
  f = d * der(s)
metadata {
  "Dyad": {
    "icons": {"default": "dyad://MultibodyComponents/Damper.svg"},
    "labels": [
      {
        "label": "$(instance)",
        "x": 500,
        "y": 280,
        "rot": 0,
        "attrs": {"font-size": "160"}
      }
    ]
  }
}
end
Flattened Source
dyad
"""
Linear damper acting as line force between `frame_a` and `frame_b`.

A force `f = d * D(s)` is exerted along the line from frame_a to frame_b,
where `d` is the damping coefficient and `s` is the distance between frames.
"""
component Damper
  frame_a = Frame3D() {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": -50, "y1": 450, "x2": 50, "y2": 550, "rot": 0}
      },
      "tags": []
    }
  }
  frame_b = Frame3D() {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 950, "y1": 450, "x2": 1050, "y2": 550, "rot": 0}
      },
      "tags": []
    }
  }
  structural parameter fixed_rotation_at_frame_a::Boolean = false
  structural parameter fixed_rotation_at_frame_b::Boolean = false
  parameter s_small::Real = 1e-10
  "Distance between the origin of frame_a and the origin of frame_b"
  variable length::Length
  "(Guarded) distance between the origin of frame_a and the origin of frame_b (>= s_small))"
  variable s::Length
  "Position vector from frame_a to frame_b resolved in world frame"
  variable r_rel_0::Position[3]
  "Unit vector in direction from frame_a to frame_b, resolved in world frame"
  variable e_rel_0::Real[3]
  "Position vector from frame_a to frame_b, resolved in frame_a"
  variable r_rel_a::Position[3]
  "Unit vector from frame_a to frame_b, resolved in frame_a"
  variable e_a::Real[3]
  "Scalar line force (positive = tension)"
  variable f::Dyad.Force
  parameter render::Boolean = true
  parameter color::Real[4] = [0.5, 0.5, 0.5, 1.0]
  parameter specular_coefficient::Real = 1.5
  # Visualization shape
  shape = CylinderShape(render = render, color = color, r = frame_a.r_0, length_direction = e_rel_0, length = length_fraction, width = 2 * radius, height = 2 * radius)
  "Damping coefficient"
  parameter d::TranslationalDampingConstant = 1.0
  "Radius of damper in animations"
  parameter radius::Real = world_default_force_width()
  "Fraction of the length rendered"
  parameter length_fraction::Real = world_default_force_length()
relations
  # Relative position and distance
  r_rel_0 = frame_b.r_0 - frame_a.r_0
  length = norm_(r_rel_0)
  assert(length > s_small, "The distance between the origin of frame_a and the origin of frame_b of a line force component became smaller than parameter s_small.")
  s = max(length, s_small)
  e_rel_0 = r_rel_0 / s
  # frame_a: fix rotation to identity or set tau = 0
  if fixed_rotation_at_frame_a
    frame_a.R = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
  else
    frame_a.tau = [0, 0, 0]
  end
  # frame_b: fix rotation to identity or set tau = 0
  if fixed_rotation_at_frame_b
    frame_b.R = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
  else
    frame_b.tau = [0, 0, 0]
  end
  r_rel_a = resolve2(frame_a.R, r_rel_0)
  e_a = r_rel_a / s
  frame_a.f = -e_a * f
  frame_b.f = -resolve2(frame_b.R, resolve1(frame_a.R, frame_a.f))
  f = d * der(s)
metadata {
  "Dyad": {
    "icons": {"default": "dyad://MultibodyComponents/Damper.svg"},
    "labels": [
      {
        "label": "$(instance)",
        "x": 500,
        "y": 280,
        "rot": 0,
        "attrs": {"font-size": "160"}
      }
    ]
  }
}
end


Test Cases

No test cases defined.