kinemat/lib/kinemat/joints/revolute.ex
2018-01-19 15:36:45 +13:00

32 lines
1,003 B
Elixir

defmodule Kinemat.Joints.Revolute do
alias __MODULE__
alias Kinemat.{Frame, Joint}
use Angle
defstruct [:frame, :limits, :position]
@moduledoc """
Describes a [Revolute](https://en.wikipedia.org/wiki/Revolute_joint) (AKA Hinged) joint.
"""
@type t :: %Revolute{frame: Frame.t(), limits: nil | Join.rotation_limit(), position: Angle.t()}
@doc """
Initialize a new revolute joint from a reference frame.
"""
@spec init(Frame.t()) :: Revolute.t()
def init(%Frame{} = frame) do
%Revolute{frame: frame, limits: nil, position: ~a(0)}
end
@doc """
Initialize a new revolute joint from a reference frame including rotation limits.
"""
@spec init(Frame.t(), [{:limits, Joint.rotation_limit()}]) :: Revolute.t()
def init(%Frame{} = frame, limits: {%Angle{} = lower, %Angle{} = upper}) do
%Revolute{frame: frame, limits: {lower, upper}, position: lower}
end
end
defimpl Kinemat.Joint, for: Kinemat.Joints.Revolute do
def degrees_of_freedom(_joint), do: 1
end