pykin

Python Interface for the Robot Kinematics Library

This library has been created simply by referring to ikpy.

Features

  • Pure python library

  • Support only URDF file

  • Compute Forward, Inverse Kinematics and Jacobian

  • There are two ways to find the IK solution, referring to the Introduction to Humanoid Robotics book.

  • Compute Collision checkinkg

  • Plot Robot Kinematic Chain and Robot Mesh (STL file)

Installation

Requirements

You need a python-fcl package to do object collision checking.

  • For Ubuntu, using apt

sudo apt install liboctomap-dev

sudo apt install libfcl-dev - For Mac, First, Download the source and build it.

  • octomap

    git clone https://github.com/OctoMap/octomap.git

    $ cd octomap
    $ mkdir build
    $ cd build
    $ cmake ..
    $ make
    $ make install
    
  • fcl

    git clone https://github.com/flexible-collision-library/fcl.git

    Since python-fcl uses version 0.5.0 of fcl, checkout with tag 0.5.0

    $ cd fcl
    $ git checkout 0.5.0
    $ mkdir build
    $ cd build
    $ cmake ..
    $ make
    $ make install
    

If the above installation is complete

pip install python-fcl

Install Pykin

pip install pykin

When git clone, use the –recurse-submodules option.

The download may take a long time due to the large urdf file size.

git clone --recurse-submodules https://github.com/jdj2261/pykin.git

Quick Start

  • Robot Info

You can see 4 example robot information.

baxter, iiwa14, panda, and sawyer

import sys

from pykin.robot import Robot
from pykin.utils import plot_utils as plt

file_path = '../../assets/urdf/baxter/baxter.urdf'

if len(sys.argv) > 1:
    robot_name = sys.argv[1]
    file_path = '../../assets/urdf/' + robot_name + '/' + robot_name + '.urdf'
robot = Robot(file_path)

fig, ax = plt.init_3d_figure("URDF")

"""
Only baxter and sawyer robots can see collisions.
It is not visible unless sphere, cylinder, and box are defined in collision/geometry tags in urdf.
"""
# If only_visible_geom is True, visualize collision
plt.plot_robot(robot,
                transformations=robot.transformations,
                ax=ax,
                name=robot.robot_name,
                visible_visual=False,
                only_visible_geom=True,
                mesh_path='../../assets/urdf/baxter/')
ax.legend()
plt.show_figure()
  • Forward Kinematics

from pykin.robot import Robot from
pykin.kinematics.transform import Transform from pykin.utils.kin\_utils
import ShellColors as sc

# baxter\_example file\_path = '../assets/urdf/baxter/baxter.urdf' robot
= Robot(file\_path, Transform(rot=[0.0, 0.0, 0.0], pos=[0, 0, 0]))

# set input joints head\_thetas = [0.0] right\_arm\_thetas = [0, 0, 0,
0, 0, 0, 0] left\_arm\_thetas = [0, 0, 0, 0, 0, 0, 0] thetas =
head\_thetas + right\_arm\_thetas + left\_arm\_thetas

# compute FK fk = robot.kin.forward\_kinematics(thetas) for link,
transform in fk.items(): print(f"{sc.HEADER}{link}{sc.ENDC},
{transform.rot}, {transform.pos}")
  • Jacobian

from pykin.kinematics import transform as tf from
pykin.robot import Robot

# import jacobian from pykin.kinematics import jacobian as jac

file\_path = '../assets/urdf/baxter/baxter.urdf' robot =
Robot(file\_path, tf.Transform(rot=[0.0, 0.0, 0.0], pos=[0, 0, 0]))

left\_arm\_thetas = [0, 0, 0, 0, 0, 0, 0]

# Before compute Jacobian, you must set from start link to end link
robot.set\_desired\_frame("base", "left\_wrist") fk =
robot.kin.forward\_kinematics(left\_arm\_thetas)

# If you want to get Jacobian, use calc\_jacobian function J =
jac.calc\_jacobian(robot.desired\_frames, fk, len(left\_arm\_thetas))
print(J)

right\_arm\_thetas = [0, 0, 0, 0, 0, 0, 0]
robot.set\_desired\_frame("base", "right\_wrist") fk =
robot.kin.forward\_kinematics(right\_arm\_thetas) J =
jac.calc\_jacobian(robot.desired\_frames, fk, len(right\_arm\_thetas))
print(J)
  • Inverse Kinematics

import numpy as np from pykin.robot import Robot from
pykin.kinematics.transform import Transform

# baxter\_example file\_path = '../assets/urdf/baxter/baxter.urdf' robot
= Robot(file\_path, Transform(rot=[0.0, 0.0, 0.0], pos=[0, 0, 0]))

# set joints for targe pose right\_arm\_thetas = np.random.randn(7)

# set init joints init\_right\_thetas = np.random.randn(7)

# Before compute IK, you must set from start link to end link
robot.set\_desired\_frame("base", "right\_wrist")

# Compute FK for target pose target\_fk =
robot.kin.forward\_kinematics(right\_arm\_thetas)

# get target pose target\_r\_pose =
np.hstack((target\_fk["right\_wrist"].pos,
target\_fk["right\_wrist"].rot))

# Compute IK Solution using LM(Levenberg-Marquardt) or
NR(Newton-Raphson) method ik\_right\_result, \_ =
robot.kin.inverse\_kinematics(init\_right\_thetas, target\_r\_pose,
method="LM")

# Compare error btween Target pose and IK pose result\_fk =
robot.kin.forward\_kinematics(ik\_right\_result) error =
robot.compute\_pose\_error(
target\_fk["right\_wrist"].homogeneous\_matrix,
result\_fk["right\_wrist"].homogeneous\_matrix)
print(error)

API Reference