3.5. Full examples
Note
The following examples use the ROS backend and the MoveI! planner with the Franka Emika Panda robots. Before running them, please make sure you have the ROS backend correctly configured and the Panda Demo started.
The following lists the 4 main features of the integrated motion planning framework: forward and inverse kinematics, cartesian and kinematic planning including loading the entire robot model over ROS, and a complete Grasshopper canvas as a playground for these features.
3.5.1. Forward Kinematics
from compas_fab.backends import RosClient
from compas_fab.robots import Configuration
with RosClient() as client:
robot = client.load_robot()
configuration = Configuration.from_prismatic_and_revolute_values([0.], [-2.238, -1.153, -2.174, 0.185, 0.667, 0.])
frame_WCF = robot.forward_kinematics(configuration)
print("Frame in the world coordinate system")
print(frame_WCF)
3.5.2. Inverse Kinematics
from compas.geometry import Frame
from compas_fab.backends import RosClient
with RosClient() as client:
robot = client.load_robot()
frame_WCF = Frame([0.3, 0.1, 0.5], [1, 0, 0], [0, 1, 0])
start_configuration = robot.zero_configuration()
configuration = robot.inverse_kinematics(frame_WCF, start_configuration)
print("Found configuration", configuration)
3.5.3. Plan cartesian motion
from compas.geometry import Frame
from compas_fab.backends import RosClient
from compas_fab.robots import Configuration
with RosClient() as client:
robot = client.load_robot()
group = robot.main_group_name
frames = []
frames.append(Frame((0.2925, 0.3949, 0.5066), (0, 1, 0), (0, 0, 1)))
frames.append(Frame((0.5103, 0.2827, 0.4074), (0, 1, 0), (0, 0, 1)))
start_configuration = Configuration.from_revolute_values((0.667, -0.298, 0.336, -2.333, -1.787, 2.123, 0.571))
trajectory = robot.plan_cartesian_motion(frames,
start_configuration,
max_step=0.01,
avoid_collisions=True,
group=group)
print("Computed cartesian path with %d configurations, " % len(trajectory.points))
print("following %d%% of requested trajectory." % (trajectory.fraction * 100))
print("Executing this path at full speed would take approx. %.3f seconds." % trajectory.time_from_start)
3.5.4. Plan motion
import math
from compas.geometry import Frame
from compas_fab.backends import RosClient
from compas_fab.robots import Configuration
with RosClient() as client:
robot = client.load_robot()
group = robot.main_group_name
frame = Frame([0.4, 0.3, 0.4], [0, 1, 0], [0, 0, 1])
tolerance_position = 0.001
tolerance_axes = [math.radians(1)] * 3
start_configuration = Configuration.from_revolute_values(
(0.667, -0.298, 0.336, -2.333, -1.787, 2.123, 0.571))
# create goal constraints from frame
goal_constraints = robot.constraints_from_frame(frame,
tolerance_position,
tolerance_axes,
group)
trajectory = robot.plan_motion(goal_constraints,
start_configuration,
group,
planner_id='RRT')
print("Computed kinematic path with %d configurations." % len(trajectory.points))
print("Executing this path at full speed would take approx. %.3f seconds." % trajectory.time_from_start)
3.5.5. Grasshopper playground
The following Grasshopper canvas demonstrate all these features combined in a single document, as a reference of how these features could be integrated: