#!/usr/bin/env python
"""
@author: Peter Corke
"""
# from math import pi
import numpy as np
from roboticstoolbox import DHRobot, RevoluteDH
[docs]class Hyper3d(DHRobot):
    """
    Create model of a hyper redundant manipulator
    :param N: number of links, defaults to 10
    :type N: int, optional
    :param a: link length, defaults total ``1/N`` giving a reach of 1
    :type a: int or symbolic, optional
    :param symbolic: [description], defaults to False
    :type symbolic: bool, optional
    - ``Hyper3d()`` is an object which describes the kinematics of a serial link
      manipulator with 10 joints which moves in the xy-plane, using standard DH
      conventions. At zero angles it forms a straight line along the x-axis.
    - ``Hyper3d(N)`` as above, but models a robot with ``N`` joints.
    .. runblock:: pycon
        >>> import roboticstoolbox as rtb
        >>> robot = rtb.models.DH.Hyper3d()
        >>> print(robot)
    Defined joint configurations are:
    - qz, zero joint angle configuration
    :References:
      - "A divide and conquer articulated-body algorithm for parallel O(log(n))
      calculation of rigid body dynamics, Part 2",
      Int. J. Robotics Research, 18(9), pp 876-892.
    :seealso: :func:`Coil`, :func:`Ball`
    .. codeauthor:: Peter Corke
    """  # noqa
    def __init__(self, N=10, a=None, symbolic=False):
        if symbolic:
            import spatialmath.base.symbolic as sym
            # zero = sym.zero()
            pi = sym.pi()
        else:
            from math import pi
            # zero = 0.0
        if a is None:
            a = 1 / N
        links = []
        for i in range(N):
            links.append(RevoluteDH(a=a, alpha=pi / 2))
        super().__init__(
            links, name="Hyper3d" + str(N), keywords=("symbolic",), symbolic=symbolic
        )
        self.qr = np.array(N)
        self.qz = np.zeros(N)
        self.addconfiguration("qr", self.qr)
        self.addconfiguration("qz", self.qz) 
if __name__ == "__main__":  # pragma nocover
    hyper = Hyper3d(N=10, symbolic=False)
    print(hyper)
    # hyper.plot([2]*10, block=True)
    # print(hyper.fkine(hyper.qz))