EAIK


NameEAIK JSON
Version 1.2.0 PyPI version JSON
download
home_pageNone
SummaryToolbox for Efficient Analytical Inverse Kinematics by Subproblem Decomposition.
upload_time2025-07-26 20:54:20
maintainerNone
docs_urlNone
authorNone
requires_python>=3.9
licenseNone
keywords analytical inverse kinematics inverse kinematics robot kinematics
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # EAIK: A Toolbox for Efficient Analytical Inverse Kinematics by Subproblem Decomposition
This toolbox is based on the scientific publication "Automatic Geometric Decomposition for Analytical Inverse Kinematics"
**Authors:** Daniel Ostermeier,
Jonathan Külz and Matthias Althoff<br><br>
The scientific publication related to this website was accepted to the IEEE Robotics and Automation Letters (RAL) July 17th 2025.<br>
We will update this reference accordingly once our work has been officially published.
Until then you may find a pre-print version of our work on the [arXiv](https://arxiv.org/abs/2409.14815).

[![arxiv.org](https://img.shields.io/badge/cs.RO-%09arXiv%3A2409.14815-red)](https://arxiv.org/abs/2409.14815)<br>

Please cite the above work when using this code within your own projects.

Please visit our [website](https://eaik.cps.cit.tum.de) for further informations.

Additional derivations that were used within this toolbox are contained in [this PDF](https://github.com/OstermD/EAIK/blob/webpage/PDFs/EAIK_extended_appendix.pdf).
Feel free to contact us if you have any questions or suggestions: 
Open up a [GitHub issue](https://github.com/OstermD/EAIK/issues).

## Overview
With this toolbox, we propose a method for automatic inverse kinematic derivation.
We exploit intersecting and parallel axes to remodel a manipulator's kinematic chain.

This allows for a hard-coded decomposition algorithm to solve its inverse kinematics by employing pre-solved subproblems.
Our approach surpasses current analytical methods in terms of usability and derivation speed without compromising computation time or the completeness of the overall solution set.

The following figure illustrates a robot with a spherical wrist and the geometric representation of a subproblem we use to solve parts of its IK:

<figure figcaption align="center">
  <img width="50%" src="https://github.com/OstermD/EAIK/raw/PyPi/Images/Titlefigure.png"/>
</figure>

We adopt the solutions and overall canonical subproblem set from Elias et al.:<br>
A. J. Elias and J. T. Wen, “IK-Geo: Unified robot inverse kinematics
using subproblem decomposition,” Mechanism and Machine Theory,
vol. 209, no. 105971, 2025.<br>
Check out their [publication](https://www.sciencedirect.com/science/article/pii/S0094114X25000606) and [implementation](https://github.com/rpiRobotics/ik-geo).


## Capabilities of this Toolbox
The current implementation supports automatic derivation of solutions for the following 6R and 5R manipulators, as well as their mirrored version (switched base and endeffector), and all non-redundant 1-4R manipulators.
In addition, we allow the user to solve arbitrary nR manipulators that, by locking individual joints, corrspond to one of the below kinematic families.

<br>
<figure figcaption align="center">
  <img src="https://github.com/OstermD/EAIK/raw/PyPi/Images/Kinematic_types.png"/>
  <figcaption>Robot configurations (without their mirrored version) that can be solved by the current EAIK implementation. NR-Robots that contain these structures as kinematic subchains are solvable if the leftover redundant joints are locked in place.
  For the 5R manipulators, all (non-redundant) specializations of the shown classes (i.e., with additional intersecting/parallel axes) are solvable as well.</figcaption>
</figure>

<br>

We implement an user friendly interface for parametrizing a robot by a URDF file, DH parameters, or simply the homogeneous transformations that correspond to the joint axes placements.

The following figure shows an overview of our interface and a superficial showcase of our method:

<figure figcaption align="center">
  <img src="https://github.com/OstermD/EAIK/raw/PyPi/Images/Poster_Method.png"/>
</figure>

If you require a vast amount of IK problems to be computed at once, we also implement a multithreaded batched version that allows you to make full use of your processor.

## Installation
## Dependencies and Installation
We use [Eigen 3.4](https://eigen.tuxfamily.org/index.php?title=Main_Page) for a fast implementation of the linear algebra operations within this toolbox.
Make sure you have your Eigen headers placed in their standard directory ('/usr/include/eigen3', '/usr/local/include/eigen3') - otherwise the following step will not work for you.

We suggest using our pip-installable [PyPI package](https://pypi.org/project/EAIK/#description). Simply use the following command on your Linux machine:

```
pip install EAIK
```



## Usage Example
We currently provide support parametrizing a robot via DH parameters, homogeneous transformations of each joint in zero-pose with respect to the basis, as well as [ROS URDF](http://wiki.ros.org/urdf) files.
Some quick examples that demonstrate the usability of our implementation are shown in the following code-snippets:

#### DH Parameters
```python
import numpy as np
from eaik.IK_DH import DhRobot

"""
Example DH parametrization + forward kinematics for a random robot kinematic
"""

d = np.array([0.67183, 0.13970, 0, 0.43180, 0, 0.0565])
alpha = np.array([-np.pi/2, 0, np.pi/2, -np.pi/2, np.pi/2, 0])
a = np.array([0,0.43180, -0.02032, 0,0,0])
bot = Robot(alpha, a, d)

print(bot.hasKnownDecomposition())
print(bot.fwdKin(np.array([1,1,1,1,1,1])))

```

#### Robot from a URDF file and IK on random poses
```python
import numpy as np
import random
from eaik.IK_URDF import UrdfRobot
import evaluate_ik as eval


def urdf_example(path, batch_size):
    """
    Loads spherical-wrist robot from urdf, calculates IK using subproblems and checks the solution for a certian batch size
    """

    bot = UrdfRobot(path)

    # Example desired pose
    test_angles = []
    for i in range(batch_size):
        rand_angles = np.array([random.random(), random.random(), random.random(), random.random(), random.random(),random.random()])
        rand_angles *= 2*np.pi
        test_angles.append(rand_angles)
    poses = []

    for angles in test_angles:
       poses.append(bot.fwdKin(angles))
        
    for pose in poses:
        ik_solutions = bot.IK(pose)

        # Print forward kinematics for all solutions
        for Q in ik_solutions.Q:
            pose_fwd = bot.fwdKin(Q)
            print(pose_fwd)
```
Even more examples for the python interface are available [here](https://github.com/OstermD/EAIK/tree/main/examples).

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "EAIK",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.9",
    "maintainer_email": null,
    "keywords": "Analytical Inverse Kinematics, Inverse Kinematics, Robot Kinematics",
    "author": null,
    "author_email": "Daniel Ostermeier <daniel.sebastian.ostermeier@tum.de>",
    "download_url": "https://files.pythonhosted.org/packages/d4/c6/813614c99faba26d8a528554a6530fcc1d4ede216d7fb40959f146323a1d/eaik-1.2.0.tar.gz",
    "platform": null,
    "description": "# EAIK: A Toolbox for Efficient Analytical Inverse Kinematics by Subproblem Decomposition\nThis toolbox is based on the scientific publication \"Automatic Geometric Decomposition for Analytical Inverse Kinematics\"\n**Authors:** Daniel Ostermeier,\nJonathan K\u00fclz and Matthias Althoff<br><br>\nThe scientific publication related to this website was accepted to the IEEE Robotics and Automation Letters (RAL) July 17th 2025.<br>\nWe will update this reference accordingly once our work has been officially published.\nUntil then you may find a pre-print version of our work on the [arXiv](https://arxiv.org/abs/2409.14815).\n\n[![arxiv.org](https://img.shields.io/badge/cs.RO-%09arXiv%3A2409.14815-red)](https://arxiv.org/abs/2409.14815)<br>\n\nPlease cite the above work when using this code within your own projects.\n\nPlease visit our [website](https://eaik.cps.cit.tum.de) for further informations.\n\nAdditional derivations that were used within this toolbox are contained in [this PDF](https://github.com/OstermD/EAIK/blob/webpage/PDFs/EAIK_extended_appendix.pdf).\nFeel free to contact us if you have any questions or suggestions: \nOpen up a [GitHub issue](https://github.com/OstermD/EAIK/issues).\n\n## Overview\nWith this toolbox, we propose a method for automatic inverse kinematic derivation.\nWe exploit intersecting and parallel axes to remodel a manipulator's kinematic chain.\n\nThis allows for a hard-coded decomposition algorithm to solve its inverse kinematics by employing pre-solved subproblems.\nOur approach surpasses current analytical methods in terms of usability and derivation speed without compromising computation time or the completeness of the overall solution set.\n\nThe following figure illustrates a robot with a spherical wrist and the geometric representation of a subproblem we use to solve parts of its IK:\n\n<figure figcaption align=\"center\">\n  <img width=\"50%\" src=\"https://github.com/OstermD/EAIK/raw/PyPi/Images/Titlefigure.png\"/>\n</figure>\n\nWe adopt the solutions and overall canonical subproblem set from Elias et al.:<br>\nA. J. Elias and J. T. Wen, \u201cIK-Geo: Unified robot inverse kinematics\nusing subproblem decomposition,\u201d Mechanism and Machine Theory,\nvol. 209, no. 105971, 2025.<br>\nCheck out their [publication](https://www.sciencedirect.com/science/article/pii/S0094114X25000606) and [implementation](https://github.com/rpiRobotics/ik-geo).\n\n\n## Capabilities of this Toolbox\nThe current implementation supports automatic derivation of solutions for the following 6R and 5R manipulators, as well as their mirrored version (switched base and endeffector), and all non-redundant 1-4R manipulators.\nIn addition, we allow the user to solve arbitrary nR manipulators that, by locking individual joints, corrspond to one of the below kinematic families.\n\n<br>\n<figure figcaption align=\"center\">\n  <img src=\"https://github.com/OstermD/EAIK/raw/PyPi/Images/Kinematic_types.png\"/>\n  <figcaption>Robot configurations (without their mirrored version) that can be solved by the current EAIK implementation. NR-Robots that contain these structures as kinematic subchains are solvable if the leftover redundant joints are locked in place.\n  For the 5R manipulators, all (non-redundant) specializations of the shown classes (i.e., with additional intersecting/parallel axes) are solvable as well.</figcaption>\n</figure>\n\n<br>\n\nWe implement an user friendly interface for parametrizing a robot by a URDF file, DH parameters, or simply the homogeneous transformations that correspond to the joint axes placements.\n\nThe following figure shows an overview of our interface and a superficial showcase of our method:\n\n<figure figcaption align=\"center\">\n  <img src=\"https://github.com/OstermD/EAIK/raw/PyPi/Images/Poster_Method.png\"/>\n</figure>\n\nIf you require a vast amount of IK problems to be computed at once, we also implement a multithreaded batched version that allows you to make full use of your processor.\n\n## Installation\n## Dependencies and Installation\nWe use [Eigen 3.4](https://eigen.tuxfamily.org/index.php?title=Main_Page) for a fast implementation of the linear algebra operations within this toolbox.\nMake sure you have your Eigen headers placed in their standard directory ('/usr/include/eigen3', '/usr/local/include/eigen3') - otherwise the following step will not work for you.\n\nWe suggest using our pip-installable [PyPI package](https://pypi.org/project/EAIK/#description). Simply use the following command on your Linux machine:\n\n```\npip install EAIK\n```\n\n\n\n## Usage Example\nWe currently provide support parametrizing a robot via DH parameters, homogeneous transformations of each joint in zero-pose with respect to the basis, as well as [ROS URDF](http://wiki.ros.org/urdf) files.\nSome quick examples that demonstrate the usability of our implementation are shown in the following code-snippets:\n\n#### DH Parameters\n```python\nimport numpy as np\nfrom eaik.IK_DH import DhRobot\n\n\"\"\"\nExample DH parametrization + forward kinematics for a random robot kinematic\n\"\"\"\n\nd = np.array([0.67183, 0.13970, 0, 0.43180, 0, 0.0565])\nalpha = np.array([-np.pi/2, 0, np.pi/2, -np.pi/2, np.pi/2, 0])\na = np.array([0,0.43180, -0.02032, 0,0,0])\nbot = Robot(alpha, a, d)\n\nprint(bot.hasKnownDecomposition())\nprint(bot.fwdKin(np.array([1,1,1,1,1,1])))\n\n```\n\n#### Robot from a URDF file and IK on random poses\n```python\nimport numpy as np\nimport random\nfrom eaik.IK_URDF import UrdfRobot\nimport evaluate_ik as eval\n\n\ndef urdf_example(path, batch_size):\n    \"\"\"\n    Loads spherical-wrist robot from urdf, calculates IK using subproblems and checks the solution for a certian batch size\n    \"\"\"\n\n    bot = UrdfRobot(path)\n\n    # Example desired pose\n    test_angles = []\n    for i in range(batch_size):\n        rand_angles = np.array([random.random(), random.random(), random.random(), random.random(), random.random(),random.random()])\n        rand_angles *= 2*np.pi\n        test_angles.append(rand_angles)\n    poses = []\n\n    for angles in test_angles:\n       poses.append(bot.fwdKin(angles))\n        \n    for pose in poses:\n        ik_solutions = bot.IK(pose)\n\n        # Print forward kinematics for all solutions\n        for Q in ik_solutions.Q:\n            pose_fwd = bot.fwdKin(Q)\n            print(pose_fwd)\n```\nEven more examples for the python interface are available [here](https://github.com/OstermD/EAIK/tree/main/examples).\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "Toolbox for Efficient Analytical Inverse Kinematics by Subproblem Decomposition.",
    "version": "1.2.0",
    "project_urls": {
        "GitHub": "https://github.com/OstermD/EAIK",
        "Homepage": "https://ostermd.github.io/EAIK/",
        "Paper-Preprint": "https://arxiv.org/abs/2409.14815"
    },
    "split_keywords": [
        "analytical inverse kinematics",
        " inverse kinematics",
        " robot kinematics"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "d4c6813614c99faba26d8a528554a6530fcc1d4ede216d7fb40959f146323a1d",
                "md5": "7f7fa21560425bc208add958ff408715",
                "sha256": "62e7d160056a1bcb88add2285e1c65147f97eede43124fb5736c3263352c2b44"
            },
            "downloads": -1,
            "filename": "eaik-1.2.0.tar.gz",
            "has_sig": false,
            "md5_digest": "7f7fa21560425bc208add958ff408715",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.9",
            "size": 33941,
            "upload_time": "2025-07-26T20:54:20",
            "upload_time_iso_8601": "2025-07-26T20:54:20.241200Z",
            "url": "https://files.pythonhosted.org/packages/d4/c6/813614c99faba26d8a528554a6530fcc1d4ede216d7fb40959f146323a1d/eaik-1.2.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-07-26 20:54:20",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "OstermD",
    "github_project": "EAIK",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "lcname": "eaik"
}
        
Elapsed time: 1.62698s