Robot Workbench: Difference between revisions

From FreeCAD Documentation
No edit summary
Line 1: Line 1:
The robot workbench is tool to simulate industrial grade 6-Axis robots, like e.g. [http://kuka.com/ Kuka].
The robot workbench is a tool to simulate industrial grade 6-axis robots, like e.g. [http://kuka.com/ Kuka].


== General use ==
== General use ==
[[Image:KukaKR16FreeCAD.jpg|right|400px]]
[[Image:KukaKR16FreeCAD.jpg|right|400px]]


This Workbench is an ongoing efort to implement an Offline programming tool for 6-Axis industrial robots into FreeCAD.
This workbench is an ongoing effort to implement an off-line programming tool for 6-axis industrial robots into FreeCAD.


== Tools ==
== Tools ==
Line 12: Line 12:


This section is generated out of: http://free-cad.svn.sourceforge.net/viewvc/free-cad/trunk/src/Mod/Robot/RobotExample.py?view=markup
This section is generated out of: http://free-cad.svn.sourceforge.net/viewvc/free-cad/trunk/src/Mod/Robot/RobotExample.py?view=markup
You can use this file directly if you whant.
You can use this file directly if you want.


Example hwo to use the basic robot class Robot6Axis which represent a 6-Axis
Example how to use the basic robot class Robot6Axis which represents a 6-axis
industrial robot. The Robot Module is dependend on Part but nor on other Modules.
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
It works mostly with the basic types Placement, Vector and Matrix. So we need
only:
only:
Line 23: Line 23:
=== Basic robot stuff ===
=== Basic robot stuff ===
create the robot. If you not specify a other kinematic it becomes a Puma 560
create the robot. If you do not specify another kinematic it becomes a Puma 560
rob = Robot6Axis()
rob = Robot6Axis()
print rob
print rob
accessing the axis and the Tcp. Axis go from 1-6 and are in degrees:
accessing the axis and the Tcp. Axes go from 1-6 and are in degree:
Start = rob.Tcp
Start = rob.Tcp
print Start
print Start
print rob.Axis1
print rob.Axis1
move the first Axis of the robot:
move the first axis of the robot:
rob.Axis1 = 5.0
rob.Axis1 = 5.0
the Tcp has changed (forward kinematic)
the Tcp has changed (forward kinematic)
Line 51: Line 51:
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
generate more. The Trajectory find allways outomatically a unique name for the waypoints
generate more. The trajectory always finds automatically a unique name for the waypoints
l = [w]
l = [w]
for i in range(5):
for i in range(5):
Line 70: Line 70:


Working with the robot document objects:
Working with the robot document objects:
first creat a robot in the active document
first create a robot in the active document
if(App.activeDocument() == None):App.newDocument()
if(App.activeDocument() == None):App.newDocument()
Line 81: Line 81:
App.activeDocument().Robot.Axis3 = 90
App.activeDocument().Robot.Axis3 = 90
retrive the Tcp position
retrieve the Tcp position
pos = FreeCAD.getDocument("Unnamed").getObject("Robot").Tcp
pos = FreeCAD.getDocument("Unnamed").getObject("Robot").Tcp
move the robot
move the robot
Line 109: Line 109:
=== Exporting the trajectory ===
=== Exporting the trajectory ===
the Trajectory is exported by python. That means for every Control Cabinet type 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 Postprocessor descriped
Python module. Here is in detail the Kuka post-processor described
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')
and thats kind of how its done:
and that's kind of how it's done:
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())

Revision as of 09:46, 15 December 2009

The robot workbench is a tool to simulate industrial grade 6-axis robots, like e.g. Kuka.

General use

This workbench is an ongoing effort to implement an off-line programming tool for 6-axis industrial robots into FreeCAD.

Tools

Scripting

This section is generated out of: http://free-cad.svn.sourceforge.net/viewvc/free-cad/trunk/src/Mod/Robot/RobotExample.py?view=markup 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 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))