This is a lightweight Python wrapper over OpenRave's generated IKFast C++ executables for the UR5 robot arm (e-series XML files included). IKFast "analytically solves robot inverse kinematics equations and generates optimized C++ files" for fast runtime speeds (more about IKFast here). IKFast can be used in tandem with URScript speedj commands on UR robot arms for real-time motion planning, which was used to create the visual servoing demo shown on the right (part of an ongoing project on closed-loop grasping with deep learning). Why speedj? See this UR performance analysis report.
Note: this package can be easily modified to support other robot arms.
- ur5.robot.xml - a custom OpenRave XML file describing the kinematics of the UR5 robot arm. Modify this if you change the arm or tool center point (TCP) position.
- ikfast61.cpp - C++ code at the heart of IKFast, generated by OpenRave using ur5.robot.xml. No need to modify this.
- ikfast.h - a C++ header file necessary for compiling ikfast61.cpp. No need to modify this.
- ikfast_wrapper.cpp - a C++ wrapper around ikfast61.cpp. Includes forward kinematics in addition to the inverse kinematics provided byikfast61.cpp. Modify this to change how FK and IK results are passed to your code.
- ikfastpy.pyx, Kinematics.hpp, setup.py - Cython code to link C++ with Python.
- demo.py - a demo in Python to test FK and IK calls to IKFast.
This implementation requires the following dependencies (tested on Ubuntu 16.04.4 LTS):
- NumPy, Cython. You can quickly install/update these dependencies by running the following:
pip install --user numpy Cython 
- Checkout this repository and compile the Cython wrapper:
git clone https://github.com/andyzeng/ikfastpy.git cd ikfastpy python setup.py build_ext --inplace
- Run the demo in Python to test FK and IK calls to IKFast:
python demo.py 
Important: ensure all rotation matrices are valid before feeding into IKFast, otherwise no IK solution will be detected. R is a rotation matrix if and only if R is orthogonal, i.e. RRT = RTR = I, and det(R) = 1.
Note: IKFast does not return solutions for singularities. In most cases, an approximate IK solution can be found for singularities by slightly perturbing the target end effector pose before re-computing IK solutions.
- 
Download and install OpenRave. See these installation instructions for Ubuntu 16.04. 
- 
Modify the kinematics of the arm or TCP position (link6) by changing ur5.robot.xmlrespectively. You can find a description of the OpenRave XML file format here.
- 
(Optional) Debug the kinematics using OpenRave's viewer: openrave ur5.robot.xml 
- 
(Optional) Check the links in your file: openrave-robot.py ur5.robot.xml --info links 
- 
Use OpenRave to re-generate the IKFast C++ code ikfast61.cpp.python `openrave-config --python-dir`/openravepy/_openravepy_/ikfast.py --robot=ur5.robot.xml --iktype=transform6d --baselink=0 --eelink=6 --savefile=ikfast61.cpp --maxcasedepth 1
If you find IKFast useful, please cite OpenRave:
@phdthesis{diankov_thesis,
  author = "Rosen Diankov",
  title = "Automated Construction of Robotic Manipulation Programs",
  school = "Carnegie Mellon University, Robotics Institute",
  month = "August",
  year = "2010",
  number= "CMU-RI-TR-10-29",
  url={http://www.programmingvision.com/rosen_diankov_thesis.pdf},
}
This module was also a part of Visual Pushing and Grasping. If you find it useful in your work, please consider citing:
@inproceedings{zeng2018learning,
  title={Learning Synergies between Pushing and Grasping with Self-supervised Deep Reinforcement Learning},
  author={Zeng, Andy and Song, Shuran and Welker, Stefan and Lee, Johnny and Rodriguez, Alberto and Funkhouser, Thomas},
  booktitle={IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)},
  year={2018}
}