Commits

German Larrain committed 8991972

file structure reorganization according to popular guidelines.
-executables are separated from the library.
-tests too

Comments (0)

Files changed (26)

+install
+	sudo checkinstall python setup.py install
+run
+	python RagdollPyOdeVtk.py
+remove
+	dpkg -r ragdoll3
+
+
+documentation
+	epydoc generates API documentation for Python modules, based on their docstrings
+	
+	to build it, run the following command from the project main directory
+		epydoc -v --config epydoc.cfg ars/
+Simulation of a falling ragdoll onto an obstacle.
+Physics engine: ODE (via PyODE Python wrapper)
+Programming language: Python
+Visualization library: VTK
+IDE: Eclipse 3.7.1 (Indigo SR 1) with PyDev and MercurialEclipse
+SCM: Mercurial 1.7.5
+
+documentation:
+API documentation generation tool: epydoc 3.0.1
+Automatic graph drawings generation: graphviz 2.20.2

ars/CasterSim.py

-#!/usr/bin/env python
-
-# Created on 2011.11.16
-# Last modified on 2011.11.22
-#
-# @author: german
-
-"""
-Runs a simulation of a vehicle with 2 powered wheels and a caster wheel.
-"""
-
-import sys
-
-from app import Program
-
-class CasterSim(Program):
-	
-	TORQUE = 100
-	
-	def __init__(self):
-		Program.__init__(self)
-		self.key_press_functions.add('up', self.go_forwards)
-		self.key_press_functions.add('down', self.go_backwards)
-		self.key_press_functions.add('left', self.turn_left)
-		self.key_press_functions.add('right', self.turn_right)
-	
-	def create_sim_objects(self):
-		offset = (1,1,1)
-		wheelR = self.sim.add_cylinder(1, 0.3, 0.4, (0,0,0)) # POR: point of reference
-		wheelL = self.sim.add_cylinder(1, 0.3, 0.4, (0,0,1))
-		caster = self.sim.add_sphere(1, 0.2, (1,-0.5,0.5))
-		chassis = self.sim.add_box(10, (1.3,0.2,0.6), (0.5,0,0.5))
-		
-		self.sim.get_object(wheelR).offset_by_position(offset)
-		self.sim.get_object(wheelL).offset_by_position(offset)
-		self.sim.get_object(caster).offset_by_position(offset)
-		self.sim.get_object(chassis).offset_by_position(offset)
-		
-		self.sim.add_rotary_joint('r1', self.sim.get_object(chassis), 
-							self.sim.get_object(wheelR), (1,1,1), (0,0,1))
-		self.sim.add_rotary_joint('r2', self.sim.get_object(chassis), 
-							self.sim.get_object(wheelL), (1,1,2), (0,0,1))
-		self.sim.add_ball_socket_joint('bs', self.sim.get_object(chassis), 
-								self.sim.get_object(caster), (2,0.5,1.5))
-	
-	def go_forwards(self):
-		""" Rotate both powered wheels in the same direction, forwards """
-		self.sim.get_joint('r1').add_torque(self.TORQUE)
-		self.sim.get_joint('r2').add_torque(self.TORQUE)
-	
-	def go_backwards(self):
-		""" Rotate both powered wheels in the same direction, backwards """
-		self.sim.get_joint('r1').add_torque(-self.TORQUE)
-		self.sim.get_joint('r2').add_torque(-self.TORQUE)
-		
-	def turn_left(self):
-		"""
-		Rotate both powered wheels in different directions,
-		with a global counter-clockwise rotation (from above).
-		"""
-		self.sim.get_joint('r1').add_torque(-self.TORQUE)
-		self.sim.get_joint('r2').add_torque(self.TORQUE)
-		
-	def turn_right(self):
-		self.sim.get_joint('r1').add_torque(self.TORQUE)
-		self.sim.get_joint('r2').add_torque(-self.TORQUE)
-
-if __name__ == '__main__':
-	print('this is CasterSim.py')
-	a = CasterSim()
-	a.start()
-	sys.exit(None)

ars/INSTALL.txt

-install
-	sudo checkinstall python setup.py install
-run
-	python RagdollPyOdeVtk.py
-remove
-	dpkg -r ragdoll3
-
-
-documentation
-	epydoc generates API documentation for Python modules, based on their docstrings
-	
-	to build it, run the following command from the project main directory
-		epydoc -v --config epydoc.cfg ars/

ars/README.txt

-Simulation of a falling ragdoll onto an obstacle.
-Physics engine: ODE (via PyODE Python wrapper)
-Programming language: Python
-Visualization library: VTK
-IDE: Eclipse 3.7.1 (Indigo SR 1) with PyDev and MercurialEclipse
-SCM: Mercurial 1.7.5
-
-documentation:
-API documentation generation tool: epydoc 3.0.1
-Automatic graph drawings generation: graphviz 2.20.2

ars/RagdollSim.py

-#!/usr/bin/env python
-
-# Created on 2011.10.14 (in RagdollPyOdeVtk.py)
-# Last modified on 2011.11.22
-#
-# @author: german
-
-import sys
-
-from app import Program
-
-DO_TEST = True
-
-class RagdollSim(Program):
-
-	def create_sim_objects(self):
-		
-		# create the objects specific to this program: ragdoll and obstacle
-		self.sim.add_ragdoll(density=500, offset=(0.0,1.9,0.0))
-		self.sim.add_obstacle(length=0.5, radius=0.2)
-		
-		#test
-		if DO_TEST:
-			self.sim.add_sphere(50, 0.5, (0,5,0))
-			box1 = self.sim.add_box(50, (1,1,1), (-1,2,-1))
-			sphere1 = self.sim.add_sphere(50, 0.5, (-1,3,-1))
-			box2 = self.sim.add_box(50, (1,1,1), (-1,4,-1))
-			self.sim.add_box(50, (1,1,1), (-1,5.2,-1))
-			
-			self.sim.add_box(50, (1,0.9,1), (-2,0.5,0))
-			box4 = self.sim.add_box(50, (1,0.9,1), (-2.2,1.5,0.2))
-			box5 = self.sim.add_box(50, (1,0.5,2), (-2.4,2.5,0.4))
-			
-			self.sim.add_box(50, (0.3,0.3,0.3), (-0.7,1,-0.7))
-			
-			self.sim.add_cylinder(100, 2, 0.3, (3,1,3))
-			self.sim.add_cylinder(100, 2, 0.3, (3,1,3))
-			
-			self.sim.add_ball_socket_joint('bs', self.sim.get_object(box1), self.sim.get_object(sphere1), (-1,3,-1))
-			self.sim.add_fixed_joint(self.sim.get_object(sphere1), self.sim.get_object(box2))
-			self.sim.add_rotary_joint('r1', self.sim.get_object(box4), self.sim.get_object(box5), (-2.4,2.5,0.2), (0,1,0))
-
-
-if __name__ == '__main__':
-	print('this is RagdollSim.py')
-	a = RagdollSim()
-	a.start()
-	sys.exit(None)

ars/VehicleSim.py

-#!/usr/bin/env python
-
-# Created on 2011.11.16
-# Last modified on 2011.11.22
-#
-# @author: german
-
-import sys
-
-from app import Program
-
-class VehicleSim(Program):
-	
-	TORQUE = 1000
-	
-	def __init__(self):
-		Program.__init__(self)
-		self.key_press_functions.add('up', self.go_forwards)
-		self.key_press_functions.add('down', self.go_backwards)
-		self.key_press_functions.add('left', self.turn_left)
-		self.key_press_functions.add('right', self.turn_right)
-	
-	def create_sim_objects(self):
-		wheel1 = self.sim.add_cylinder(1, 0.1, 0.2, (1,1,1)) # POR: point of reference
-		
-		wheel2 = self.sim.add_cylinder(1, 0.1, 0.2, (0,0,1))
-		wheel3 = self.sim.add_cylinder(1, 0.1, 0.2, (1,0,0))
-		wheel4 = self.sim.add_cylinder(1, 0.1, 0.2, (1,0,1))
-		
-		chassis = self.sim.add_box(10, (1.3,0.2,0.6), (0.5,0,0.5))
-		
-		self.sim.get_object(wheel2).offset_by_object(self.sim.get_object(wheel1))
-		self.sim.get_object(wheel3).offset_by_object(self.sim.get_object(wheel1))
-		self.sim.get_object(wheel4).offset_by_object(self.sim.get_object(wheel1))
-		self.sim.get_object(chassis).offset_by_object(self.sim.get_object(wheel1))
-		
-		self.sim.add_rotary_joint('r1', self.sim.get_object(chassis), self.sim.get_object(wheel1), (1,1,1), (0,0,1))
-		self.sim.add_rotary_joint('r2', self.sim.get_object(chassis), self.sim.get_object(wheel2), (1,1,2), (0,0,1))
-		self.sim.add_rotary_joint('r3', self.sim.get_object(chassis), self.sim.get_object(wheel3), (2,1,1), (0,0,1))
-		self.sim.add_rotary_joint('r4', self.sim.get_object(chassis), self.sim.get_object(wheel4), (2,1,2), (0,0,1))
-	
-	def go_forwards(self):
-		self.sim.get_joint('r1').add_torque(self.TORQUE)
-		self.sim.get_joint('r2').add_torque(self.TORQUE)
-	
-	def go_backwards(self):
-		self.sim.get_joint('r1').add_torque(-self.TORQUE)
-		self.sim.get_joint('r2').add_torque(-self.TORQUE)
-		
-	def turn_left(self):
-		self.sim.get_joint('r1').add_torque(-self.TORQUE/2)
-		self.sim.get_joint('r3').add_torque(-self.TORQUE/2)
-		self.sim.get_joint('r2').add_torque(self.TORQUE/2)
-		self.sim.get_joint('r4').add_torque(self.TORQUE/2)
-		
-	def turn_right(self):
-		self.sim.get_joint('r1').add_torque(self.TORQUE/2)
-		self.sim.get_joint('r3').add_torque(self.TORQUE/2)
-		self.sim.get_joint('r2').add_torque(-self.TORQUE/2)
-		self.sim.get_joint('r4').add_torque(-self.TORQUE/2)
-
-if __name__ == '__main__':
-	print('this is VehicleSim.py')
-	a = VehicleSim()
-	a.start()
-	sys.exit(None)

ars/app/__init__.py

 import sys
 from abc import abstractmethod
 
-import graphics.adapters as gp
-from model.simulator import Simulation
+import ars.graphics.adapters as gp
+from ars.model.simulator import Simulation
 
 # TODO: move Program constants into the class
 WRITE_DATA_FILES = False

ars/app/exceptions.py

-'''
-Created on 2011.10.31
-Last modified on 2011.10.31
-
-@author: german
-'''
-
-class PhysicsEngineException(Exception):
-	pass
-
-class JointCreationError(PhysicsEngineException):
-	pass

ars/exceptions.py

+'''
+Created on 2011.10.31
+Last modified on 2011.10.31
+
+@author: german
+'''
+
+from __builtin__ import Exception
+
+class PhysicsEngineException(Exception):
+	def __init__(self):
+		print("PhysicsEngineException constructor")
+
+class JointCreationError(PhysicsEngineException):
+	def __init__(self):
+		print("JointCreationError constructor")

ars/graphics/__init__.py

 
 import vtk
 
-import utilities.mathematical as mut
+from ..utilities import mathematical as mut
 
 TIMER_PERIOD = 50 # milliseconds
 TIMER_EVENT = 'TimerEvent'

ars/graphics/adapters.py

 
 import vtk
 
-import graphics as gp
-import utilities.mathematical as mut
+#import graphics as gp
+from ars import graphics as gp #TODO: change to import ars.graphics as gp
+from ..utilities import mathematical as mut
 
 class VtkAdapter(gp.Adapter):
 	

ars/model/contrib/ragdoll.py

 
 import ode
 
-import utilities.mathematical as mut
-from model.simulator import physics as phs
+import ars.utilities.mathematical as mut
+from ars.model.simulator import physics as phs
 
 class RagDoll:
 	

ars/model/robot/joints.py

 
 import ode
 
-import app.exceptions as exc
+import ars.exceptions as exc
 
 class Joint:
 	'''

ars/model/simulator/__init__.py

 
 import random, time
 
-import utilities.generic as gu
-import graphics.adapters as gp
-import utilities.mathematical as mu
-from . import physics as phs
-from . import collision as coll
-import model.contrib.ragdoll as cb
-import model.robot.joints as jo
+from ars.utilities import generic as gu
+from ars.graphics import adapters as gp
+from ars.utilities import mathematical as mu
+import physics as phs
+import collision as coll
+import ars.model.contrib.ragdoll as cb
+import ars.model.robot.joints as jo
 
 class Simulation:
 

ars/model/simulator/physics.py

 from abc import ABCMeta, abstractmethod
 
 import ode
-import utilities.mathematical as mut
+from ars.utilities import mathematical as mut
 
 class Engine:
 	pass

ars/setup.cfg

-# see file:///usr/share/doc/python2.6/html/distutils/configfile.html
-# see file:///usr/share/doc/python2.6/html/install/index.html#inst-config-syntax
-[build_ext]
-inplace=1

ars/setup.py

-# coding: utf-8
-
-'''
-Created on Nov 2, 2011
-Last modified on Nov 2, 2011
-
-@author: german
-'''
-
-'''
-Sometimes things go wrong, and the setup script doesn’t do what the developer wants.
-Distutils catches any exceptions when running the setup script, and print a simple error message
-before the script is terminated.
-
-The DISTUTILS_DEBUG environment variable can be set to anything except an empty string,
-and distutils will now print detailed information what it is doing, and prints the full traceback
-in case an exception occurs.
-
-from file:///usr/share/doc/python2.6/html/distutils/setupscript.html
-'''
-
-from distutils.core import setup #, Extension
-
-# only name, version, url are required. Other fields are optional.
-setup(name='Autonomous Robot Simulator',
-	version='0.0.0', # It is recommended that versions take the form major.minor[.patch[.sub]].
-	description='A great simulator', # A single line of text, not more than 200 characters
-	long_description='', # Multiple lines of plain text in reStructuredText format
-	author='German Larrain',
-	author_email='gelarrai@uc.cl',
-	url='http://ral.ing.puc.cl/',
-	download_url='',
-	platforms='',
-	license='',
-	#classifiers=[], # e.g. Development Status, Environment, Intended Audience, License, Operating System, Programming Language, Topic
-	requires=[],
-	#package_dir=[] 
-	packages=['app', 'graphics', 'gui',
-			'model', 'model.contrib', 'model.geometry', 'model.robot', 'model.simulator',
-			'utilities'],
-	py_modules=['RagdollPyOdeVtk'],
-	#ext_modules=[]
-	#libraries=[]
-	#scripts=[],
-	#package_data={},
-	#data_files=[]
-)
+#!/usr/bin/env python
+
+# Created on 2011.11.16
+# Last modified on 2011.11.22
+#
+# @author: german
+
+"""
+Runs a simulation of a vehicle with 2 powered wheels and a caster wheel.
+"""
+
+import sys
+
+from ars.app import Program
+
+class CasterSim(Program):
+	
+	TORQUE = 100
+	
+	def __init__(self):
+		Program.__init__(self)
+		self.key_press_functions.add('up', self.go_forwards)
+		self.key_press_functions.add('down', self.go_backwards)
+		self.key_press_functions.add('left', self.turn_left)
+		self.key_press_functions.add('right', self.turn_right)
+	
+	def create_sim_objects(self):
+		offset = (1,1,1)
+		wheelR = self.sim.add_cylinder(1, 0.3, 0.4, (0,0,0)) # POR: point of reference
+		wheelL = self.sim.add_cylinder(1, 0.3, 0.4, (0,0,1))
+		caster = self.sim.add_sphere(1, 0.2, (1,-0.5,0.5))
+		chassis = self.sim.add_box(10, (1.3,0.2,0.6), (0.5,0,0.5))
+		
+		self.sim.get_object(wheelR).offset_by_position(offset)
+		self.sim.get_object(wheelL).offset_by_position(offset)
+		self.sim.get_object(caster).offset_by_position(offset)
+		self.sim.get_object(chassis).offset_by_position(offset)
+		
+		self.sim.add_rotary_joint('r1', self.sim.get_object(chassis), 
+							self.sim.get_object(wheelR), (1,1,1), (0,0,1))
+		self.sim.add_rotary_joint('r2', self.sim.get_object(chassis), 
+							self.sim.get_object(wheelL), (1,1,2), (0,0,1))
+		self.sim.add_ball_socket_joint('bs', self.sim.get_object(chassis), 
+								self.sim.get_object(caster), (2,0.5,1.5))
+	
+	def go_forwards(self):
+		""" Rotate both powered wheels in the same direction, forwards """
+		self.sim.get_joint('r1').add_torque(self.TORQUE)
+		self.sim.get_joint('r2').add_torque(self.TORQUE)
+	
+	def go_backwards(self):
+		""" Rotate both powered wheels in the same direction, backwards """
+		self.sim.get_joint('r1').add_torque(-self.TORQUE)
+		self.sim.get_joint('r2').add_torque(-self.TORQUE)
+		
+	def turn_left(self):
+		"""
+		Rotate both powered wheels in different directions,
+		with a global counter-clockwise rotation (from above).
+		"""
+		self.sim.get_joint('r1').add_torque(-self.TORQUE)
+		self.sim.get_joint('r2').add_torque(self.TORQUE)
+		
+	def turn_right(self):
+		self.sim.get_joint('r1').add_torque(self.TORQUE)
+		self.sim.get_joint('r2').add_torque(-self.TORQUE)
+
+if __name__ == '__main__':
+	print('this is CasterSim.py')
+	a = CasterSim()
+	a.start()
+	sys.exit(None)

bin/RagdollSim.py

+#!/usr/bin/env python
+
+# Created on 2011.10.14 (in RagdollPyOdeVtk.py)
+# Last modified on 2011.11.22
+#
+# @author: german
+
+import sys
+
+from ars.app import Program
+
+DO_TEST = True
+
+class RagdollSim(Program):
+
+	def create_sim_objects(self):
+		
+		# create the objects specific to this program: ragdoll and obstacle
+		self.sim.add_ragdoll(density=500, offset=(0.0,1.9,0.0))
+		self.sim.add_obstacle(length=0.5, radius=0.2)
+		
+		#test
+		if DO_TEST:
+			self.sim.add_sphere(50, 0.5, (0,5,0))
+			box1 = self.sim.add_box(50, (1,1,1), (-1,2,-1))
+			sphere1 = self.sim.add_sphere(50, 0.5, (-1,3,-1))
+			box2 = self.sim.add_box(50, (1,1,1), (-1,4,-1))
+			self.sim.add_box(50, (1,1,1), (-1,5.2,-1))
+			
+			self.sim.add_box(50, (1,0.9,1), (-2,0.5,0))
+			box4 = self.sim.add_box(50, (1,0.9,1), (-2.2,1.5,0.2))
+			box5 = self.sim.add_box(50, (1,0.5,2), (-2.4,2.5,0.4))
+			
+			self.sim.add_box(50, (0.3,0.3,0.3), (-0.7,1,-0.7))
+			
+			self.sim.add_cylinder(100, 2, 0.3, (3,1,3))
+			self.sim.add_cylinder(100, 2, 0.3, (3,1,3))
+			
+			self.sim.add_ball_socket_joint('bs', self.sim.get_object(box1), self.sim.get_object(sphere1), (-1,3,-1))
+			self.sim.add_fixed_joint(self.sim.get_object(sphere1), self.sim.get_object(box2))
+			self.sim.add_rotary_joint('r1', self.sim.get_object(box4), self.sim.get_object(box5), (-2.4,2.5,0.2), (0,1,0))
+
+
+if __name__ == '__main__':
+	print('this is RagdollSim.py')
+	a = RagdollSim()
+	a.start()
+	sys.exit(None)

bin/VehicleSim.py

+#!/usr/bin/env python
+
+# Created on 2011.11.16
+# Last modified on 2011.11.22
+#
+# @author: german
+
+import sys
+
+from ars.app import Program
+
+class VehicleSim(Program):
+	
+	TORQUE = 100
+	
+	def __init__(self):
+		Program.__init__(self)
+		self.key_press_functions.add('up', self.go_forwards)
+		self.key_press_functions.add('down', self.go_backwards)
+		self.key_press_functions.add('left', self.turn_left)
+		self.key_press_functions.add('right', self.turn_right)
+	
+	def create_sim_objects(self):
+		wheel1 = self.sim.add_cylinder(1, 0.1, 0.2, (1,1,1)) # POR: point of reference
+		
+		wheel2 = self.sim.add_cylinder(1, 0.1, 0.2, (0,0,1))
+		wheel3 = self.sim.add_cylinder(1, 0.1, 0.2, (1,0,0))
+		wheel4 = self.sim.add_cylinder(1, 0.1, 0.2, (1,0,1))
+		
+		chassis = self.sim.add_box(10, (1.3,0.2,0.6), (0.5,0,0.5))
+		
+		self.sim.get_object(wheel2).offset_by_object(self.sim.get_object(wheel1))
+		self.sim.get_object(wheel3).offset_by_object(self.sim.get_object(wheel1))
+		self.sim.get_object(wheel4).offset_by_object(self.sim.get_object(wheel1))
+		self.sim.get_object(chassis).offset_by_object(self.sim.get_object(wheel1))
+		
+		self.sim.add_rotary_joint('r1', self.sim.get_object(chassis), self.sim.get_object(wheel1), (1,1,1), (0,0,1))
+		self.sim.add_rotary_joint('r2', self.sim.get_object(chassis), self.sim.get_object(wheel2), (1,1,2), (0,0,1))
+		self.sim.add_rotary_joint('r3', self.sim.get_object(chassis), self.sim.get_object(wheel3), (2,1,1), (0,0,1))
+		self.sim.add_rotary_joint('r4', self.sim.get_object(chassis), self.sim.get_object(wheel4), (2,1,2), (0,0,1))
+	
+	def go_forwards(self):
+		self.sim.get_joint('r1').add_torque(self.TORQUE)
+		self.sim.get_joint('r2').add_torque(self.TORQUE)
+	
+	def go_backwards(self):
+		self.sim.get_joint('r1').add_torque(-self.TORQUE)
+		self.sim.get_joint('r2').add_torque(-self.TORQUE)
+		
+	def turn_left(self):
+		self.sim.get_joint('r1').add_torque(-self.TORQUE/2)
+		self.sim.get_joint('r3').add_torque(-self.TORQUE/2)
+		self.sim.get_joint('r2').add_torque(self.TORQUE/2)
+		self.sim.get_joint('r4').add_torque(self.TORQUE/2)
+		
+	def turn_right(self):
+		self.sim.get_joint('r1').add_torque(self.TORQUE/2)
+		self.sim.get_joint('r3').add_torque(self.TORQUE/2)
+		self.sim.get_joint('r2').add_torque(-self.TORQUE/2)
+		self.sim.get_joint('r4').add_torque(-self.TORQUE/2)
+
+if __name__ == '__main__':
+	print('this is VehicleSim.py')
+	a = VehicleSim()
+	a.start()
+	sys.exit(None)
+[epydoc]
+
+name: Autonomous Robot Simulator
+url: http://sourceforge.net/projects/arsproject/
+
+# The list of modules to document.  Modules can be named using
+# dotted names, module filenames, or package directory names.
+# This option may be repeated.
+#modules: sys, os.path, re
+#modules: my/project/driver.py
+
+# Write html output to the directory "html_docs"
+output: html
+target: html_docs/
+
+# Include all automatically generated graphs.  These graphs are generated using Graphviz dot.
+graph: all
+
+# if not in the system path, set the location of graphviz dot executable
+# dotpath: /usr/local/bin/dot

epydoc.cfg

-[epydoc]
-
-name: Autonomous Robot Simulator
-url: http://sourceforge.net/projects/arsproject/
-
-# The list of modules to document.  Modules can be named using
-# dotted names, module filenames, or package directory names.
-# This option may be repeated.
-#modules: sys, os.path, re
-#modules: my/project/driver.py
-
-# Write html output to the directory "html_docs"
-output: html
-target: html_docs/
-
-# Include all automatically generated graphs.  These graphs are generated using Graphviz dot.
-graph: all
-
-# if not in the system path, set the location of graphviz dot executable
-# dotpath: /usr/local/bin/dot
+according to
+	http://stackoverflow.com/questions/193161/what-is-the-best-project-structure-for-a-python-application/193181#193181
+this folder is for your C-language libraries
+# see file:///usr/share/doc/python2.6/html/distutils/configfile.html
+# see file:///usr/share/doc/python2.6/html/install/index.html#inst-config-syntax
+[build_ext]
+inplace=1
+# coding: utf-8
+
+'''
+Created on Nov 2, 2011
+Last modified on Nov 2, 2011
+
+@author: german
+'''
+
+'''
+Sometimes things go wrong, and the setup script doesn’t do what the developer wants.
+Distutils catches any exceptions when running the setup script, and print a simple error message
+before the script is terminated.
+
+The DISTUTILS_DEBUG environment variable can be set to anything except an empty string,
+and distutils will now print detailed information what it is doing, and prints the full traceback
+in case an exception occurs.
+
+from file:///usr/share/doc/python2.6/html/distutils/setupscript.html
+'''
+
+from distutils.core import setup #, Extension
+
+# only name, version, url are required. Other fields are optional.
+setup(name='Autonomous Robot Simulator',
+	version='0.0.0', # It is recommended that versions take the form major.minor[.patch[.sub]].
+	description='A great simulator', # A single line of text, not more than 200 characters
+	long_description='', # Multiple lines of plain text in reStructuredText format
+	author='German Larrain',
+	author_email='gelarrai@uc.cl',
+	url='http://ral.ing.puc.cl/',
+	download_url='',
+	platforms='',
+	license='',
+	#classifiers=[], # e.g. Development Status, Environment, Intended Audience, License, Operating System, Programming Language, Topic
+	requires=[],
+	#package_dir=[] 
+	packages=['app', 'graphics', 'gui',
+			'model', 'model.contrib', 'model.geometry', 'model.robot', 'model.simulator',
+			'utilities'],
+	py_modules=['RagdollPyOdeVtk'],
+	#ext_modules=[]
+	#libraries=[]
+	#scripts=[],
+	#package_data={},
+	#data_files=[]
+)