Robot Workbench: Difference between revisions

From FreeCAD Documentation
(Tutorials)
(translate)
Line 1: Line 1:
<translate>
[[Image:KukaKR16FreeCAD.jpg|right|400px]]
[[Image:KukaKR16FreeCAD.jpg|right|400px]]


Line 15: Line 16:
== Tools ==
== Tools ==
Here the principal commands you can use to create a robot set-up.
Here the principal commands you can use to create a robot set-up.

=== Robots ===
=== Robots ===
The tools to create and manage the 6-Axis robots
The tools to create and manage the 6-Axis robots
Line 21: Line 23:
* [[Image:Robot_Simulate.png|30px]] [[Robot_Simulate|Simulate a trajectory]]: Opens the simulation dialog and let you simulate
* [[Image:Robot_Simulate.png|30px]] [[Robot_Simulate|Simulate a trajectory]]: Opens the simulation dialog and let you simulate
* [[Image:Robot_Export.png|30px]] [[Robot_Export|Export a trajectory]]: Export a robot program file
* [[Image:Robot_Export.png|30px]] [[Robot_Export|Export a trajectory]]: Export a robot program file

* [[Image:Robot_SetHomePos.png|30px]] [[Robot_SetHomePos|Set home positon]]: Set the home position of an robot
* [[Image:Robot_SetHomePos.png|30px]] [[Robot_SetHomePos|Set home positon]]: Set the home position of an robot
* [[Image:Robot_RestoreHomePos.png|30px]] [[Robot_RestoreHomePos|Restore home positon]]: move the robot to its home position
* [[Image:Robot_RestoreHomePos.png|30px]] [[Robot_RestoreHomePos|Restore home positon]]: move the robot to its home position
Line 27: Line 28:
=== Trajectories ===
=== Trajectories ===
Tools to creat and manipulate trajectories. There are two kinds, the parametric and non parametric ones.
Tools to creat and manipulate trajectories. There are two kinds, the parametric and non parametric ones.

==== non parametric ====
==== non parametric ====
* [[Image:Robot_CreateTrajectory.png|30px]] [[Robot_CreateTrajectory|Create a trajectory]]: Insert a new robot into the scene
* [[Image:Robot_CreateTrajectory.png|30px]] [[Robot_CreateTrajectory|Create a trajectory]]: Insert a new robot into the scene
Line 40: Line 42:


== Scripting ==
== Scripting ==

This section is generated out of: http://sourceforge.net/p/free-cad/code/ci/master/tree/src/Mod/Robot/RobotExample.py
This section is generated out of: http://sourceforge.net/p/free-cad/code/ci/master/tree/src/Mod/Robot/RobotExample.py
You can use this file directly if you want.
You can use this file directly if you want.
Line 48: Line 49:
It works mostly with the basic types Placement, Vector and Matrix. So we need
It works mostly with the basic types Placement, Vector and Matrix. So we need
only:
only:
</translate>
from Robot import *
from Robot import *
from Part import *
from Part import *
from FreeCAD import *
from FreeCAD import *
<translate>
=== Basic robot stuff ===
=== Basic robot stuff ===
create the robot. If you do not specify another kinematic it becomes a Puma 560
create the robot. If you do not specify another kinematic it becomes a Puma 560
</translate>
rob = Robot6Axis()
rob = Robot6Axis()
print rob
print rob
<translate>
accessing the axis and the Tcp. Axes go from 1-6 and are in degree:
accessing the axis and the Tcp. Axes go from 1-6 and are in degree:
</translate>
Start = rob.Tcp
Start = rob.Tcp
print Start
print Start
print rob.Axis1
print rob.Axis1
<translate>
move the first axis of the robot:
move the first axis of the robot:
</translate>
rob.Axis1 = 5.0
rob.Axis1 = 5.0
<translate>
the Tcp has changed (forward kinematic)
the Tcp has changed (forward kinematic)
</translate>
print rob.Tcp
print rob.Tcp
<translate>
move the robot back to start position (reverse kinematic):
move the robot back to start position (reverse kinematic):
</translate>
rob.Tcp = Start
rob.Tcp = Start
print rob.Axis1
print rob.Axis1
<translate>
the same with axis 2:
the same with axis 2:
</translate>
rob.Axis2 = 5.0
rob.Axis2 = 5.0
print rob.Tcp
print rob.Tcp
rob.Tcp = Start
rob.Tcp = Start
print rob.Axis2
print rob.Axis2
<translate>
Waypoints:
Waypoints:
</translate>
w = Waypoint(Placement(),name="Pt",type="LIN")
w = Waypoint(Placement(),name="Pt",type="LIN")
print w.Name,w.Type,w.Pos,w.Cont,w.Velocity,w.Base,w.Tool
print w.Name,w.Type,w.Pos,w.Cont,w.Velocity,w.Base,w.Tool
<translate>
generate more. The trajectory always finds automatically a unique name for the waypoints
generate more. The trajectory always finds automatically a unique name for the waypoints
</translate>
l = [w]
l = [w]
for i in range(5):
for i in range(5):
l.append(Waypoint(Placement(Vector(0,0,i*100),Vector(1,0,0),0),"LIN","Pt"))
l.append(Waypoint(Placement(Vector(0,0,i*100),Vector(1,0,0),0),"LIN","Pt"))
<translate>
create a trajectory
create a trajectory
</translate>
t = Trajectory(l)
t = Trajectory(l)
print t
print t
for i in range(7):
for i in range(7):
t.insertWaypoints(Waypoint(Placement(Vector(0,0,i*100+500),Vector(1,0,0),0),"LIN","Pt"))
t.insertWaypoints(Waypoint(Placement(Vector(0,0,i*100+500),Vector(1,0,0),0),"LIN","Pt"))
<translate>
see a list of all waypoints:
see a list of all waypoints:
</translate>
print t.Waypoints
print t.Waypoints
del rob,Start,t,l,w
del rob,Start,t,l,w
<translate>
=== working with the document ===
=== working with the document ===


Working with the robot document objects:
Working with the robot document objects:
first create a robot in the active document
first create a robot in the active document
</translate>
if(App.activeDocument() == None):App.newDocument()
if(App.activeDocument() == None):App.newDocument()
App.activeDocument().addObject("Robot::RobotObject","Robot")
App.activeDocument().addObject("Robot::RobotObject","Robot")
<translate>
Define the visual representation and the kinematic definition (see [[6-Axis Robot]] and [[VRML Preparation for Robot Simulation]] for details about that)
Define the visual representation and the kinematic definition (see [[6-Axis Robot]] and [[VRML Preparation for Robot Simulation]] for details about that)
</translate>
App.activeDocument().Robot.RobotVrmlFile = App.getResourceDir()+"Mod/Robot/Lib/Kuka/kr500_1.wrl"
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"
App.activeDocument().Robot.RobotKinematicFile = App.getResourceDir()+"Mod/Robot/Lib/Kuka/kr500_1.csv"
<translate>
start positon of the Axis (only that which differ from 0)
start positon of the Axis (only that which differ from 0)
</translate>
App.activeDocument().Robot.Axis2 = -90
App.activeDocument().Robot.Axis2 = -90
App.activeDocument().Robot.Axis3 = 90
App.activeDocument().Robot.Axis3 = 90
<translate>
retrieve the Tcp position
retrieve the Tcp position
</translate>
pos = FreeCAD.getDocument("Unnamed").getObject("Robot").Tcp
pos = FreeCAD.getDocument("Unnamed").getObject("Robot").Tcp
<translate>
move the robot
move the robot
</translate>
pos.move(App.Vector(-10,0,0))
pos.move(App.Vector(-10,0,0))
FreeCAD.getDocument("Unnamed").getObject("Robot").Tcp = pos
FreeCAD.getDocument("Unnamed").getObject("Robot").Tcp = pos
<translate>
create an empty Trajectory object in the active document
create an empty Trajectory object in the active document
</translate>
App.activeDocument().addObject("Robot::TrajectoryObject","Trajectory")
App.activeDocument().addObject("Robot::TrajectoryObject","Trajectory")
<translate>
get the Trajectory
get the Trajectory
</translate>
t = App.activeDocument().Trajectory.Trajectory
t = App.activeDocument().Trajectory.Trajectory
<translate>
add the actual TCP position of the robot to the trajectory
add the actual TCP position of the robot to the trajectory
</translate>
StartTcp = App.activeDocument().Robot.Tcp
StartTcp = App.activeDocument().Robot.Tcp
t.insertWaypoints(StartTcp)
t.insertWaypoints(StartTcp)
App.activeDocument().Trajectory.Trajectory = t
App.activeDocument().Trajectory.Trajectory = t
print App.activeDocument().Trajectory.Trajectory
print App.activeDocument().Trajectory.Trajectory
<translate>
insert some more Waypoints and the start point at the end again:
insert some more Waypoints and the start point at the end again:
</translate>
for i in range(7):
for i in range(7):
t.insertWaypoints(Waypoint(Placement(Vector(0,1000,i*100+500),Vector(1,0,0),i),"LIN","Pt"))
t.insertWaypoints(Waypoint(Placement(Vector(0,1000,i*100+500),Vector(1,0,0),i),"LIN","Pt"))
Line 134: Line 161:
App.activeDocument().Trajectory.Trajectory = t
App.activeDocument().Trajectory.Trajectory = t
print App.activeDocument().Trajectory.Trajectory
print App.activeDocument().Trajectory.Trajectory
<translate>

=== Simulation ===
=== Simulation ===
To be done..... ;-)
To be done..... ;-)
Line 141: Line 168:
The trajectory is exported by Python. That means for every control cabinet type there is a post-processor
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
Python module. Here is in detail the Kuka post-processor described
</translate>
from KukaExporter import ExportCompactSub
from KukaExporter import ExportCompactSub
ExportCompactSub(App.activeDocument().Robot,App.activeDocument().Trajectory,'D:/Temp/TestOut.src')
ExportCompactSub(App.activeDocument().Robot,App.activeDocument().Trajectory,'D:/Temp/TestOut.src')
<translate>
and that's kind of how it's done:
and that's kind of how it's done:
</translate>
for w in App.activeDocument().Trajectory.Trajectory.Waypoints:
for w in App.activeDocument().Trajectory.Trajectory.Waypoints:
(A,B,C) = (w.Pos.Rotation.toEuler())
(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))
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))


<translate>

== Tutorials ==
== Tutorials ==
* [[6-Axis_Robot|6-Axis_Robot]]
* [[6-Axis_Robot|6-Axis_Robot]]
Line 157: Line 186:
[[Category:User Documentation]]
[[Category:User Documentation]]


</translate>
{{languages |{{cn|Robot Workbench/cn}} {{de|Robot Workbench/de}} {{es|Robot Workbench/es}} {{fr|Robot Workbench/fr}} {{it|Robot Module/it}} {{jp|Robot Module/jp}} {{ru|Robot Workbench/ru}} {{se|Robot Workbench/se}} }}

<languages/>

Revision as of 17:09, 24 July 2014

The robot workbench is a tool to simulate industrial grade 6-Axis Robots, like e.g. Kuka. You can do 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

An examples you can find here: Example files or try the Robot tutorial.

Tools

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

Robots

The tools to create and manage the 6-Axis robots

Trajectories

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

non parametric

parametric

Scripting

This section is generated out of: http://sourceforge.net/p/free-cad/code/ci/master/tree/src/Mod/Robot/RobotExample.py 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

Waypoints:

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):
  l.append(Waypoint(Placement(Vector(0,0,i*100),Vector(1,0,0),0),"LIN","Pt"))

create a trajectory

t = Trajectory(l)
print t
for i in range(7):
  t.insertWaypoints(Waypoint(Placement(Vector(0,0,i*100+500),Vector(1,0,0),0),"LIN","Pt"))

see a list of all waypoints:

print t.Waypoints

del rob,Start,t,l,w

working with the document

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

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

App.activeDocument().addObject("Robot::RobotObject","Robot")

Define the visual representation and the kinematic definition (see 6-Axis Robot 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

pos.move(App.Vector(-10,0,0))
FreeCAD.getDocument("Unnamed").getObject("Robot").Tcp = pos

create an empty Trajectory object in the active document

App.activeDocument().addObject("Robot::TrajectoryObject","Trajectory")

get the Trajectory

t = App.activeDocument().Trajectory.Trajectory

add the actual TCP position of the robot to the trajectory

StartTcp = App.activeDocument().Robot.Tcp
t.insertWaypoints(StartTcp)
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(Waypoint(Placement(Vector(0,1000,i*100+500),Vector(1,0,0),i),"LIN","Pt"))

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

Simulation

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

ExportCompactSub(App.activeDocument().Robot,App.activeDocument().Trajectory,'D:/Temp/TestOut.src')

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))

Tutorials

Arch Module
Macros