Robot Workbench

From FreeCAD Documentation
Jump to: navigation, search
Other languages:
čeština • ‎Deutsch • ‎English • ‎español • ‎français • ‎Bahasa Indonesia • ‎italiano • ‎polski • ‎português • ‎português do Brasil • ‎română • ‎русский • ‎svenska • ‎Türkçe • ‎українська • ‎中文 • ‎中文(中国大陆)‎ • ‎中文(台灣)‎

The robot workbench is a tool to simulate industrial grade Robot 6-Axis, like e.g. Kuka. You can do the following tasks:

  • set up a simulation environment with a robot and work pieces
  • create and fill up trajectories
  • decompose features of an CAD part to a trajectory
  • simulate the robot movement and reachability
  • export the trajectory to a robot program file

You can find an example here: Example files or try the Robot tutorial.


Here the principal commands you can use to create a robot set-up.


The tools to create and manage the 6-Axis robots


Tools to create and manipulate trajectories. There are two kinds, the parametric and non parametric ones.

non parametric trajectories

parametric trajectories


This section is generated out of: You can use this file directly if you want.

Example how to use the basic robot class Robot6Axis which represents a 6-axis industrial robot. The Robot module is dependent on Part but not on other modules. It works mostly with the basic types Placement, Vector and Matrix. So we need only:

from Robot import *
from Part import *
from FreeCAD import * 

Basic robot stuff

create the robot. If you do not specify another kinematic it becomes a Puma 560

rob = Robot6Axis()
print rob 

accessing the axis and the Tcp. Axes go from 1-6 and are in degree:

Start = rob.Tcp
print Start
print rob.Axis1 

move the first axis of the robot:

rob.Axis1 = 5.0 

the Tcp has changed (forward kinematic)

print rob.Tcp 

move the robot back to start position (reverse kinematic):

rob.Tcp = Start
print rob.Axis1 

the same with axis 2:

rob.Axis2 = 5.0
print rob.Tcp
rob.Tcp = Start
print rob.Axis2 


w = Waypoint(Placement(),name="Pt",type="LIN")
print w.Name,w.Type,w.Pos,w.Cont,w.Velocity,w.Base,w.Tool 

generate more. The trajectory always finds automatically a unique name for the waypoints

l = [w]
for i in range(5):

create a trajectory

t = Trajectory(l)
print t
for i in range(7):

see a list of all waypoints:

print t.Waypoints
del rob,Start,t,l,w 

Working with the document objects

Working with the robot document objects: first create a robot in the active document

if(App.activeDocument() == None):App.newDocument()

Define the visual representation and the kinematic definition (see Robot 6-Axis and VRML Preparation for Robot Simulation for details about that)

App.activeDocument().Robot.RobotVrmlFile = App.getResourceDir()+"Mod/Robot/Lib/Kuka/kr500_1.wrl"
App.activeDocument().Robot.RobotKinematicFile = App.getResourceDir()+"Mod/Robot/Lib/Kuka/kr500_1.csv" 

start positon of the Axis (only that which differ from 0)

App.activeDocument().Robot.Axis2 = -90
App.activeDocument().Robot.Axis3 = 90 

retrieve the Tcp position

pos = FreeCAD.getDocument("Unnamed").getObject("Robot").Tcp 

move the robot

FreeCAD.getDocument("Unnamed").getObject("Robot").Tcp = pos 

create an empty Trajectory object in the active document


get the Trajectory

t = App.activeDocument().Trajectory.Trajectory 

add the actual TCP position of the robot to the trajectory

StartTcp = App.activeDocument().Robot.Tcp
App.activeDocument().Trajectory.Trajectory = t
print App.activeDocument().Trajectory.Trajectory 

insert some more Waypoints and the start point at the end again:

for i in range(7):

t.insertWaypoints(StartTcp) # end point of the trajectory
App.activeDocument().Trajectory.Trajectory = t
print App.activeDocument().Trajectory.Trajectory 


To be done.....

Exporting the trajectory

The trajectory is exported by Python. That means for every control cabinet type there is a post-processor Python module. Here is in detail the Kuka post-processor described

from KukaExporter import ExportCompactSub


and that's kind of how it's done:

for w in App.activeDocument().Trajectory.Trajectory.Waypoints:
	(A,B,C) = (w.Pos.Rotation.toEuler())
	print ("LIN {X %.3f,Y %.3f,Z %.3f,A %.3f,B %.3f,C %.3f} ; %s"%(w.Pos.Base.x,w.Pos.Base.y,w.Pos.Base.z,A,B,C,w.Name))