The Wristy Twisty Solver is an open-source kinematics tool designed for 6-DOF robots with a wrist offset, such as the ABB GoFa series and Yaskawa Motoman. It is initially developed for the open-source Rhinoceros Grasshopper plugin Robot Components. Unlike numerical solvers that prioritize the closest configuration to the current pose, this solver computes all possible poses for a given end-effector position, including the singularity positions, making it ideal for offline programming environments. The solver is based on the principles and work of Trinh et al. (2015) but follows the notations and part of the solution from the OPW kinematics solver by Brandstötter et al. (2014).
Click the image below to watch a demonstration of the ABB GoFa series integration within the Rhinoceros Grasshopper plugin, Robot Components:
The kinematics solver relies on specific geometric parameters, following the model introduced by Brandstötter et al. (2014). These parameters include the shoulder offset
| Robot type | ||||||||
|---|---|---|---|---|---|---|---|---|
| ABB GoFa 5 | 0 | -110 | -80 | 0 | 265 | 444 | 470 | 101 |
| ABB GoFa 10 | 150 | -110 | -80 | 0 | 400 | 707 | 637 | 101 |
| ABB GoFa 12 | 0 | -110 | -80 | 0 | 338 | 707 | 534 | 101 |
| Yaskawa Motoman MA1400 | 150 | -200 | -30 | 0 | 450 | 614 | 640 | 200 |
| Yaskawa Motoman MA1800 | 150 | -220 | -45 | 0 | 555 | 760 | 870 | 185 |
| Yaskawa Motoman MA1900 | 150 | -220 | -30 | 0 | 505 | 760 | 970 | 200 |
Wristy Twisty Solver is currently in development. This repository contains code for the .NET implementation and Python implementation. Both are fully functional, however, the Python implementation is slow and purely meant for testing and educational purposes. A C++ version including Python bindings is currently in development. Additionally, the documentation of the inverse and forward kinematics solution (mathematical notation with explanation) is in development and will be added later. For now, users are referred to the two papers mentioned in this README for details.
The kinematics class provides two distinct properties containing the inverse kinematics solutions. The number of solutions depends on the given endplane, ranging from a minimum of 8 to a maximum of 16.
The solver always computes 8 solutions, consistent with the OPW kinematics solver for spherical wrist robots, as developed by Brandstötter et al. (2014). However, when the rotation of joint 5 is near 0 or 180 degrees, the solver identifies two additional inverse kinematics solutions. In traditional spherical wrist robots, a joint 5 position of exactly 0 or 180 degrees represents a wrist singularity. Due to the wrist offset, this singularity position no longer exists precisely at these angles. Instead, near these positions, two additional solutions emerge when the robot transitions between configurations. This means the robot’s endplane can traverse via a limited number of distinct paths when moving from one configuration to another, rather than the infinite solutions found in traditional spherical wrist robots. This behavior classifies the offset wrist robot as a cuspidal robot.
For the ABB GoFa series, when 4 solutions are found for a given set of equations, the ABB controller may still raise a wrist singularity error. Since the 8 "main" solutions (similar to the OPW kinematics solver) are typically the most important, the class provides two properties:
Solutions: Contains the sorted 8 main solutions.Solutions2: Contains all found solutions.
The 8 main solutions are filtered and ordered as follows:
| Solution | Wrist center (relative to axis 1) | Wrist center (relative to lower arm) | Angle joint 5 |
|---|---|---|---|
| 0 | In front of | In front of | |
| 1 | In front of | Behind | |
| 2 | Behind | In front of | |
| 3 | Behind | Behind | |
| 4 | In front of | In front of | |
| 5 | In front of | Behind | |
| 6 | Behind | In front of | |
| 7 | Behind | Behind |
These solutions are accessible via the Solutions property, which is an array containing the joint positions. The presence of shoulder, elbow, and wrist singularities is indicated in the corresponding boolean arrays IsShoulderSingularity, IsElbowSingularity, and IsWristSingularity. If a wrist singularity is detected, it indicates that 4 sub-solutions are found instead of 2.
In addition to the 8 main solutions, all solutions are provided in the Solutions2 property. The singularities for these solutions are indicated in the respective properties ending with 2 (e.g., IsWristSingularity2).
Important notes:
- The
Solutions2property is an array of length 16, but this does not imply that 16 solutions are always found. The actual number of solutions is provided by theNumSolutions2property. - The solutions in
Solutions2are not ordered in any specific way; they are listed in the order they were found by the solver.
The kinematics solver is based on the algorithm developed by Brandstötter et al. (2014) and implemented in C++ by Jonathan Meyer. Known as the OPW Kinematics solver, this implementation has been integrated into numerous software packages.
The solver's API design reflects elements of Meyer's solution, offering flexibility in defining joint signs and offsets for various robotic arm brands. The 8 main solutions are ordered in the same way to ensure compatibility and ease of integration with existing systems. This compatibility ensures that the solver can be easily adapted to different robotic platforms and software ecosystems.
Thank you for considering contributing to Wristy Twisty Solver! Your contributions help make this project better for everyone. Before you start contributing, please take a moment to read the following guidelines.
If you're considering making a contribution or have questions about the project, please contact me beforehand to discuss your ideas. This helps avoid misunderstandings and ensures your contributions align with the project's goals.
Wristy Twisty Solver is a free-to-use software package, and we kindly ask you to cite it if used. By citing the software, you recognize the work that went into its development and allow us to track its usage. More importantly, citing the software and providing details on the tools used ensures that results can be reproduced. See How to cite and describe software for more details and an in-depth discussion.
For general references to this software package, the Zenodo record can be cited. The BibTeX entry is provided below:
@misc{WristyTwisty_Zenodo,
author = {A. Deetman},
title = {{W}risty {T}wisty {S}olver: {A}n open-source kinematics solver for {6R} robots with wrist offset},
publisher = {Zenodo},
year = {2026},
doi = {10.5281/zenodo.19132741},
note = {Zenodo. doi:10.5281/zenodo.19132741}
}On the Zenodo page, you can find how to cite specific versions of the software.
Wristy Twisty solver is an open-source project initiated and developed by Arjen Deetman and supported by The Computational Hive. The solver is based on the kinematics principles from Trinh et al. (2015) and the analytical solution framework of the OPW kinematics solver from Brandstötter et al. (2014).
Copyright (c) 2024-2026 Arjen Deetman
Wristy Twisty Solver is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 3.0 as published by the Free Software Foundation.
Wristy Twisty Solver is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with Wristy Twisty Solver; If not, see http://www.gnu.org/licenses/.
@license GPL-3.0 https://www.gnu.org/licenses/gpl-3.0.html