Kinemat is the beginnings of a library for solving forward and reverse kinematics of robotic systems and graphical simulations.
Find a file
2018-01-26 14:35:05 +13:00
config Reconstruction of prior Kinemat repo using new angle package. 2017-11-05 19:51:49 +13:00
lib Small tweaks. 2018-01-26 14:35:05 +13:00
test Start adding joint types. 2018-01-19 15:36:45 +13:00
.credo.exs Update to Elixir 1.6 2018-01-19 10:40:56 +13:00
.gitignore Reconstruction of prior Kinemat repo using new angle package. 2017-11-05 19:51:49 +13:00
.gitlab-ci.yml Add gitlab-ci yaml. 2017-11-05 19:53:21 +13:00
mix.exs Update to Elixir 1.6 2018-01-19 10:40:56 +13:00
mix.lock Update to Elixir 1.6 2018-01-19 10:40:56 +13:00
README.md Reconstruction of prior Kinemat repo using new angle package. 2017-11-05 19:51:49 +13:00

Kinemat

Kinemat is the beginnings of a library for solving forward and reverse kinematics of robotic systems and graphical simulations.

Installation

As this package currently doesn't do what it says on the tin, I've not published a version to hex yet. Maybe when it looks more complete.

For now, you can install it as a Git dependency:

def deps do
  [{:kinemat, "~> 0.1.0"}]
end

Usage

Representing angles regardless of unit

Since Angles are probably something you want to use, both Degrees and Radians can be represented by using either Degrees or Radians module, in conjunction with the Angle protocol.

iex> use Kinemat
...> Degrees.init(30)
...> |> Angle.to_radians()
#Kinemat.Angle<0.5235987755982988 rad (30.0°)>

The Angle protocol contains lots of useful angle manipulations.

Representing spacial coordiantes

Kinemat uses the Point protocol to handle manipulations of spacial coordiantes. The protocol is implemneted by Cartesian, Cylindrical and Spherical.

iex> use Kinemat
...> Cartesian.init(3,4,5)
...> |> Point.to_cylindrical()
#Kinemat.Point<[azimuth: #Kinemat.Angle<0.9272952180016122 rad (53.13°)>,
                radial: 5.0,
                vertical: 5]>

Representing spacial orientations

Kinemat uses the Orientation module to allow manipulations and conversions between the three primary orientation modules; Euler, RotationMatrix and Quaternion.

Note that not all Euler orders are supported, but only so-called "Tait-Bryan" angles.

iex> use Kinemat
...> Euler.init(:xyz, Degrees.init(10), Degrees.init(20), Degrees.init(30))
...> Orientation.to_quaternion()
#Kinemat.Orientation<[type: :quaternion,
                      w: 0.943714364147489,
                      x: 0.12767944069578063,
                      y: 0.14487812541736914,
                      z: 0.2685358227515692]>

Representing frames of reference

Kinemat can build a Frame given the combination of an Orientation and a Point;

iex> use Kinemat
...> point = Cylindrical.init(10, Degrees.init(20), 30)
...> orientation = Euler.init(:xyz, Degrees.init(10), Degrees.init(20), Degrees.init(30))
...> frame = Frame.init(point, orientation)
#Kinemat.Frame<[orientation: #Kinemat.Orientation<[euler: :xyz,
  x: #Kinemat.Angle<10°>, y: #Kinemat.Angle<20°>, z: #Kinemat.Angle<30°>]>,
 point: #Kinemat.Point<[azimuth: #Kinemat.Angle<20°>, radial: 10,
  vertical: 30]>]>

And frames can be converted to homogeneous transformations

...> Kinemat.HomogeneousTransformation.to_homogeneous_transformation(frame)
{ 0.8137976813493738,  0.5438381424823255, -0.20487412870286215,  9.396926207859085,
 -0.46984631039295416, 0.823172944645501,   0.3187957775971678,   3.420201433256687,
  0.3420201433256687, -0.16317591116653482, 0.9254165783983234,  30,
  0.0,                 0.0,                 0.0,                  1.0}

Documentation can be generated with ExDoc and published on HexDocs. Once published, the docs can be found at https://hexdocs.pm/kinemat.