"""Link module."""
from abc import abstractmethod
from collections.abc import Sized
import attr
import numpy as np
import numpy.typing as npt
from pybotics.json_encoder import JSONEncoder
[docs]@attr.s
class Link(Sized):
"""Links: connected joints allowing relative motion of neighboring link."""
[docs] def to_json(self) -> str:
"""Encode model as JSON."""
encoder = JSONEncoder(sort_keys=True)
return encoder.encode(self)
def __len__(self) -> int:
"""Get number of parameters."""
return self.size
[docs] @abstractmethod
def displace(self, q: float) -> npt.NDArray[np.float64]:
"""
Generate a vector of the new link state given a displacement.
:param q: given displacement
:return vector of new displacement state
"""
raise NotImplementedError
@property
@abstractmethod
def vector(self) -> npt.NDArray[np.float64]:
"""
Return the vector representation of the link.
:return: vectorized kinematic chain
"""
raise NotImplementedError
@property
@abstractmethod
def size(self) -> int:
"""Get number of parameters."""
raise NotImplementedError
[docs]@attr.s
class MDHLink(Link):
"""
Link class that uses Modified DH parameters.
https://en.wikipedia.org/wiki/Denavit%E2%80%93Hartenberg_parameters
"""
_size = 4
alpha = attr.ib(0, type=float)
a = attr.ib(0, type=float)
theta = attr.ib(0, type=float)
d = attr.ib(0, type=float)
@property
def size(self) -> int:
"""Get number of parameters."""
return self._size
@property
def vector(self) -> npt.NDArray[np.float64]:
"""
Return the vector representation of the link.
:return: vectorized kinematic chain
"""
return np.array([self.alpha, self.a, self.theta, self.d], dtype=float)
# noinspection PyMethodOverriding
@vector.setter
def vector(self, value: npt.NDArray[np.float64]) -> None:
"""Set parameters."""
self.alpha = value[0]
self.a = value[1]
self.theta = value[2]
self.d = value[3]
[docs]@attr.s
class RevoluteMDHLink(MDHLink):
"""
Link class that uses Modified DH parameters for a revolute joint.
https://en.wikipedia.org/wiki/Denavit%E2%80%93Hartenberg_parameters
"""
[docs] def displace(self, q: float = 0) -> npt.NDArray[np.float64]:
"""
Generate a vector of the new link state given a displacement.
:param q: given displacement
:return vector of new displacement state
"""
v = self.vector.copy()
v[2] += q
return v
[docs]@attr.s
class PrismaticMDHLink(MDHLink):
"""
Link class that uses Modified DH parameters for a revolute joint.
https://en.wikipedia.org/wiki/Denavit%E2%80%93Hartenberg_parameters
"""
[docs] def displace(self, q: float = 0) -> npt.NDArray[np.float64]:
"""
Generate a vector of the new link state given a displacement.
:param q: given displacement
:return vector of new displacement state
"""
v = self.vector.copy()
v[3] += q
return v