Arm Robot Animation#

Tutorial on making a robot arm animation in FURY.

import numpy as np
from fury import actor, window
from fury.animation import Animation, Timeline
from fury.utils import set_actor_origin

scene = window.Scene()

showm = window.ShowManager(scene,
                           size=(900, 768), reset_camera=False,
                           order_transparent=True)
showm.initialize()

Creating robot arm components

base = actor.cylinder(np.array([[0, 0, 0]]), np.array([[0, 1, 0]]),
                      colors=(0, 1, 0), radius=1)
main_arm = actor.box(np.array([[0, 0, 0]]), colors=(1, 0.5, 0),
                     scales=(12, 1, 1))

sub_arm = actor.box(np.array([[0, 0, 0]]), colors=(0, 0.5, 0.8),
                    scales=(8, 0.7, 0.7))
joint_1 = actor.sphere(np.array([[0, 0, 0]]), colors=np.array([1, 0, 1]),
                       radii=1.2)
joint_2 = actor.sphere(np.array([[0, 0, 0]]), colors=np.array([1, 0, 1]))

end = actor.cone(np.array([[0, 0, 0]]), np.array([[1, 0, 0]]),
                 np.array([[1, 0, 0]]), heights=2.2, resolution=6)

Setting the center of both shafts to the beginning.

set_actor_origin(main_arm, np.array([-6, 0, 0]))
set_actor_origin(sub_arm, np.array([-4, 0, 0]))

Creating a timeline

timeline = Timeline(playback_panel=True)

Creating animations

main_arm_animation = Animation([main_arm, joint_1], length=2 * np.pi)
child_arm_animation = Animation([sub_arm, joint_2])
drill_animation = Animation(end)

Adding other Animations in hierarchical order

Creating Arm joints time dependent animation functions.

def rot_main_arm(t):
    return np.array([np.sin(t / 2) * 180, np.cos(t / 2) * 180, 0])


def rot_sub_arm(t):
    return np.array([np.sin(t) * 180, np.cos(t) * 70, np.cos(t) * 40])


def rot_drill(t):
    return np.array([t * 1000, 0, 0])

Setting timelines (joints) relative position 1- Placing the main arm on the cube static base.

2- Translating the timeline containing the sub arm to the end of the first arm.

3- Translating the timeline containing the drill to the end of the sub arm.

Setting rotation time-based evaluators

main_arm_animation.set_rotation_interpolator(rot_main_arm, is_evaluator=True)
child_arm_animation.set_rotation_interpolator(rot_sub_arm, is_evaluator=True)
drill_animation.set_rotation_interpolator(rot_drill, is_evaluator=True)

Setting camera position to observe the robot arm.

scene.camera().SetPosition(0, 0, 90)

Adding the base actor to the scene

scene.add(base)

Adding the main parent animation to the Timeline.

Now we add the timeline to the ShowManager

showm.add_animation(timeline)

interactive = False

if interactive:
    showm.start()

window.record(scene, out_path='viz_robot_arm.png',
              size=(900, 768))
viz robot arm animation

Total running time of the script: ( 0 minutes 0.112 seconds)

Gallery generated by Sphinx-Gallery