{"id":13732134,"url":"https://github.com/ramakarl/invk","last_synced_at":"2026-03-17T15:31:25.875Z","repository":{"id":73768179,"uuid":"185286404","full_name":"ramakarl/invk","owner":"ramakarl","description":"Invk - Inverse Kinematics Library with Quaternions","archived":false,"fork":false,"pushed_at":"2025-11-24T06:14:05.000Z","size":541,"stargazers_count":29,"open_issues_count":1,"forks_count":3,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-12-28T11:35:12.292Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"lgpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ramakarl.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2019-05-06T23:33:18.000Z","updated_at":"2025-12-17T21:26:26.000Z","dependencies_parsed_at":"2023-03-23T23:46:44.488Z","dependency_job_id":null,"html_url":"https://github.com/ramakarl/invk","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/ramakarl/invk","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ramakarl%2Finvk","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ramakarl%2Finvk/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ramakarl%2Finvk/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ramakarl%2Finvk/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ramakarl","download_url":"https://codeload.github.com/ramakarl/invk/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ramakarl%2Finvk/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30626814,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-17T14:16:03.965Z","status":"ssl_error","status_checked_at":"2026-03-17T14:16:03.380Z","response_time":56,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-08-03T02:01:47.252Z","updated_at":"2026-03-17T15:31:25.848Z","avatar_url":"https://github.com/ramakarl.png","language":"C++","funding_links":[],"categories":["Physics"],"sub_categories":[],"readme":"\n\nInvK - Inverse Kinematics Library using Quaternions\n------------------------------------------------\n\nby Rama Hoetzlein ([ramakarl.com](http://ramakarl.com))\n\nThis is a simple library that demonsrates an efficient solution to\ninverse kinematic chains using the Jacobian Transpose method over\nquaternions. The goal of this library is to enable a baseline \nimplementation with few dependencies upon which to build larger projects.\n\n**Video demo here**:\u003cbr\u003e\n[Youtube link](https://youtu.be/j6bwD-kF_BI)\u003cbr\u003e\n\n**Citations**:\nYou can cite this work as follows:\u003cbr\u003e\nHoetzlein, Rama. \"INVK - A lightweight Inverse Kinematics Library using Quaternions\", May 6th, 2019. Online at: github.com/ramakarl/invk\u003cbr\u003e\n\u003cbr\u003e\nMore useful reading material:\n\u003cbr\u003e\nSteve Rotenberg, Inverse Kinematics (part 1), UCSB. [Slides](https://cseweb.ucsd.edu/classes/wi17/cse169-a/slides/CSE169_08.pdf)\u003cbr\u003e\nSteve Rotenberg, Inverse Kinematics (part 2), UCSB. [Slides](https://cseweb.ucsd.edu/classes/wi17/cse169-a/slides/CSE169_09.pdf)\u003cbr\u003e\nAndreas Aristidou and Joan Lasenby, Inverse Kinematics: a review of existing techniques and introduction of a new fast iterative solver. [Tech Report](http://www.andreasaristidou.com/publications/papers/CUEDF-INFENG,%20TR-632.pdf)\u003cbr\u003e\n\nIK and Quaternions\n------------------\nQuaternions allow for several benefits over Euler angles. First, axis boundaries are greatly simplified as quaternions can interpolate thru two arbitrary vectors. Second, IK requires incremental changes in angles which are well suited to quaternions. Third, quaternions are more efficient to compute for certain operations. \n\nThere are two drawbacks to using quaternions for inverse kinematics. Per-axis angle range limits are more easily computed with Euler angles, so there is a conversion performed in the LimitQuaternion function to handle this. Finally, care must be taken to normalize the quaternions frequently during calculations. \n\nQuaternions can represent an orientation (a local coordinate system), or they can represent a rotation (amount to rotate around a given axis), which makes it easy to compute changes in orientation. For example, a key operation during IK is to rotate a joint around its local coordinate X,Y or Z axis by an incremental angle. This is easily accomplished by observing that a joint which is oriented by a quaternion is **locally** rotated by performed a post-multiplying with a rotational quaternion.\n\u003cbr\u003e\u003cbr\u003e\nP.fromAngleAxis ( angle, Vector3DF(0, 1, 0) );    // where angle is a scalar, vec\u003c0,1,0\u003e = Y-axis\u003cbr\u003e\nQ = Q * P;         // post-multiply to perform a rotation around the **local** Y-axis of Q.\u003cbr\u003e\nQ = P * Q;         // pre-multiply to perform a rotation around the **global** Y-axis of Q.\u003cbr\u003e\n\u003cbr\u003e\nWhere Q is a quaternion for local orientation, and P is a rotational quaternion. Notice the output Q is not a point but another quaternion (a new orientation).\n\nRevision History\n--------\nMay 6, 2019 - v1.0 - Support for hinge and ball joints, with joint limits. \n\nHow to Build\n-------\n* You will need to install cmake\n1. Clone into a folder for invk\n2. Create a build folder somewhere, eg. invk/build\n3. From inside that folder: invk/build\u003e cmake .. -DCMAKE_HELPERS_PATH=invk/helpers\n4. When compile \u0026 generate succeed, run 'make'\n\nLICENSE\n-------\nThis library is licensed under the LGPLv3 license.\n  https://www.gnu.org/licenses/lgpl-3.0.txt\n\nShort summary:\n- Public changes to the library itself must be back-contributed or forked as LGPL\n- Use in larger projects that are not LGPL are allowed\n\nRama Hoetzlein (c) May 2019\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Framakarl%2Finvk","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Framakarl%2Finvk","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Framakarl%2Finvk/lists"}