Basic IKΒΆ

Simplest Inverse Kinematics Example using PyRoki.

All examples can be run by first cloning the PyRoki repository, which includes the pyroki_snippets implementation details.

 1import time
 2
 3import numpy as np
 4import pyroki as pk
 5import viser
 6from robot_descriptions.loaders.yourdfpy import load_robot_description
 7from viser.extras import ViserUrdf
 8
 9import pyroki_snippets as pks
10
11
12def main():
13    """Main function for basic IK."""
14
15    urdf = load_robot_description("panda_description")
16    target_link_name = "panda_hand"
17
18    # Create robot.
19    robot = pk.Robot.from_urdf(urdf)
20
21    # Set up visualizer.
22    server = viser.ViserServer()
23    server.scene.add_grid("/ground", width=2, height=2)
24    urdf_vis = ViserUrdf(server, urdf, root_node_name="/base")
25
26    # Create interactive controller with initial position.
27    ik_target = server.scene.add_transform_controls(
28        "/ik_target", scale=0.2, position=(0.61, 0.0, 0.56), wxyz=(0, 0, 1, 0)
29    )
30    timing_handle = server.gui.add_number("Elapsed (ms)", 0.001, disabled=True)
31
32    while True:
33        # Solve IK.
34        start_time = time.time()
35        solution = pks.solve_ik(
36            robot=robot,
37            target_link_name=target_link_name,
38            target_position=np.array(ik_target.position),
39            target_wxyz=np.array(ik_target.wxyz),
40        )
41
42        # Update timing handle.
43        elapsed_time = time.time() - start_time
44        timing_handle.value = 0.99 * timing_handle.value + 0.01 * (elapsed_time * 1000)
45
46        # Update visualizer.
47        urdf_vis.update_cfg(solution)
48
49
50if __name__ == "__main__":
51    main()