GraphIK
A library for solving inverse kinematics with graphical models and distance geometry.
Install / Use
/learn @utiasSTARS/GraphIKREADME
GraphIK
GraphIK is a library for solving inverse kinematics problems by modelling robots as geometric graphs and using concepts from distance geometry.
<img src="https://raw.githubusercontent.com/utiasSTARS/GraphIK/main/assets/graph_ik_logo.png" width="250px"/>Dependencies
GraphIK is implemented in Python 3. See setup.py for a full list of dependencies.
Usage
Use of GraphIK can be summarized by four key steps, which we'll walk through below (see the scripts in experiments/ for more details).
1. Load a Robot
In this example, we'll parse a URDF file describing a Schunk LWA4P manipulator.
from graphik.utils.roboturdf import load_schunk_lwa4d
robot, graph = load_schunk_lwa4d()
GraphIK's interface between robot models and IK solvers is the abstract ProblemGraph class. For the LWA4P, we'll use ProblemGraphRevolute, a subclass of ProblemGraph that can represent 3D robots with revolute joints.
2. Instantiate a ProblemGraph Object with Obstacles
If you are considering an environment with spherical obstacles, you can include constraints that prevent collisions. In this example, we will use a set of spheres that approximate a table:
from graphik.utils.utils import table_environment
obstacles = table_environment()
# This loop is not needed if you are not using obstacle avoidance constraints
for idx, obs in enumerate(obstacles):
graph.add_spherical_obstacle(f"o{idx}", obs[0], obs[1])
3. Specify a Goal Pose
Interfaces to our solvers require a goal pose defined by the liegroups library. For this simple example, using the robot's forward kinematics is the fastest way to get a sample goal pose:
q_goal = robot.random_configuration()
T_goal = robot.pose(q_goal, f"p{robot.n}")
4. Solve the IK Problem
The main purpose of our graphical interpretation of robot kinematics is to develop distance-geometric IK solvers. One example is the Riemannian optimization-based solver implemented in RiemannianSolver.
from graphik.solvers.riemannian_solver import solve_with_riemannian
q_sol, solution_points = solve_with_riemannian(graph, T_goal, jit=False) # Returns None if infeasible or didn't solve
For faster computation, precompile costs and gradients using numba by running python costs.py in graphik/solvers/.
For a similar example using CIDGIK, a convex optimization-based approach, please see experiments/cidgik_example.py.
Publications and Related Work
If you use any of this code in your research work, please kindly cite the relevant publications listed here.
Riemannian Optimization
IEEE Transactions on Robotics: Riemannian Optimization for Distance-Geometric Inverse Kinematics
@article{marić2022riemannian,
author = {Filip Mari\'{c} and Matthew Giamou and Adam W. Hall and Soroush Khoubyarian and Ivan Petrović and Jonathan Kelly},
journal = {{IEEE} Transactions on Robotics},
month = {June},
number = {3},
pages = {1703--1722},
title = {Riemannian Optimization for Distance-Geometric Inverse Kinematics},
volume = {38},
year = {2022}
}
arXiv: Riemannian Optimization for Distance-Geometric Inverse Kinematics
@misc{marić2021riemannian_arxiv,
author={Filip Marić and Matthew Giamou and Adam W. Hall and Soroush Khoubyarian and Ivan Petrović and Jonathan Kelly},
title={Riemannian Optimization for Distance-Geometric Inverse Kinematics},
year={2021},
eprint={2108.13720},
archivePrefix={arXiv},
primaryClass={cs.RO}
}
arXiv: Inverse Kinematics as Low-Rank Euclidean Distance Matrix Completion
Semidefinite Programming (SDP) Relaxations
CIDGIK
IEEE Robotics & Automation Letters: Convex Iteration for Distance-Geometric Inverse Kinematics
@article{giamou2022convex,
author = {Matthew Giamou and Filip Marić and David M. Rosen and Valentin Peretroukhin and Nicholas Roy and Ivan Petrović and Jonathan Kelly},
journal = {{IEEE} Robotics and Automation Letters},
month = {April},
number = {2},
pages = {1952--1959},
title = {Convex Iteration for Distance-Geometric Inverse Kinematics},
volume = {7},
year = {2022}
}
arXiv: Convex Iteration for Distance-Geometric Inverse Kinematics
@misc{giamou2022convex_arxiv,
author={Matthew Giamou and Filip Marić and David M. Rosen and Valentin Peretroukhin and Nicholas Roy and Ivan Petrović and Jonathan Kelly},
title={Convex Iteration for Distance-Geometric Inverse Kinematics},
year={2022},
eprint={2109.03374},
archivePrefix={arXiv},
primaryClass={cs.RO}
}
Sparse Sum-of-Squares Optimization for Planar and Spherical IK
IEEE ICRA 2020: Inverse Kinematics for Serial Kinematic Chains via Sum of Squares Optimization
@inproceedings{marić2020inverse,
address = {Paris, France},
author = {Filip Marić and Matthew Giamou and Soroush Khoubyarian and Ivan Petrović and Jonathan Kelly},
booktitle = {Proceedings of the {IEEE} International Conference on Robotics and Automation {(ICRA})},
pages = {7101--7107},
title = {Inverse Kinematics for Serial Kinematic Chains via Sum of Squares Optimization},
year = {2020}
}
arXiv: Inverse Kinematics for Serial Kinematic Chains via Sum of Squares Optimization
@misc{marić2022convex_arxiv,
author={Filip Marić and {Matthew Giamou and Soroush Khoubyarian and Ivan Petrović and Jonathan Kelly},
title={Inverse Kinematics for Serial Kinematic Chains via Sum of Squares Optimization},
year={2020},
eprint={1909.09318},
archivePrefix={arXiv},
primaryClass={cs.RO}
}
MATLAB Code: https://github.com/utiasSTARS/sos-ik
Related Skills
node-connect
339.5kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
83.9kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
339.5kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
commit-push-pr
83.9kCommit, push, and open a PR
