summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--digital/ai/tools/guybrush.py46
-rw-r--r--digital/ai/tools/test_simu.py3
-rw-r--r--digital/ai/tools/test_simu_control_guybrush.py72
-rw-r--r--digital/io-hub/tools/io_hub/init.py2
-rw-r--r--digital/io-hub/tools/io_hub/io_hub.py4
-rw-r--r--host/simu/robots/guybrush/__init__.py0
-rw-r--r--host/simu/robots/guybrush/link/__init__.py0
-rw-r--r--host/simu/robots/guybrush/link/bag.py36
-rw-r--r--host/simu/robots/guybrush/model/__init__.py0
-rw-r--r--host/simu/robots/guybrush/model/bag.py52
-rw-r--r--host/simu/robots/guybrush/view/__init__.py0
-rw-r--r--host/simu/robots/guybrush/view/bag.py44
-rw-r--r--host/simu/robots/guybrush/view/robot.py74
13 files changed, 332 insertions, 1 deletions
diff --git a/digital/ai/tools/guybrush.py b/digital/ai/tools/guybrush.py
new file mode 100644
index 00000000..d5124e9b
--- /dev/null
+++ b/digital/ai/tools/guybrush.py
@@ -0,0 +1,46 @@
+import asserv
+import asserv.init
+import mimot
+import mimot.init
+import io_hub
+import io_hub.init
+
+from proto.popen_io import PopenIO
+import math
+
+class Robot:
+ """Guybrush robot instance."""
+
+ import simu.model.table_eurobot2012 as table_model
+ import simu.view.table_eurobot2012 as table_view
+
+ import simu.robots.guybrush.link.bag as robot_link
+ import simu.robots.guybrush.model.bag as robot_model
+ import simu.robots.guybrush.view.bag as robot_view
+
+ robot_start_pos = {
+ False: (300, 2000 - 200, math.radians (180)),
+ True: (3000 - 300, 2000 - 200, math.radians (0))
+ }
+
+ client_nb = 3
+
+ def __init__ (self, proto_time, instance = 'robot0'):
+ self.instance = instance
+ def proto (proto_class, cmd, init):
+ cmd = [ s.format (instance = instance) for s in cmd ]
+ return proto_class (PopenIO (cmd), proto_time, **init)
+ asserv_cmd = ('../../asserv/src/asserv/asserv.host',
+ '-i{instance}:asserv0', '-m9', 'robospierre')
+ mimot_cmd = ('../../mimot/src/dirty/dirty.host',
+ '-i{instance}:mimot0', '-m9', 'robospierre')
+ io_hub_cmd = ('../../io-hub/src/guybrush/io_hub.host',
+ '-i{instance}:io0')
+ self.asserv = proto (asserv.Proto, asserv_cmd,
+ asserv.init.host['robospierre'])
+ self.mimot = proto (mimot.Proto, mimot_cmd,
+ mimot.init.host['robospierre'])
+ self.io = proto (io_hub.ProtoGuybrush, io_hub_cmd,
+ io_hub.init.host['guybrush'])
+ self.protos = (self.asserv, self.mimot, self.io)
+
diff --git a/digital/ai/tools/test_simu.py b/digital/ai/tools/test_simu.py
index 1b804e22..c5655f87 100644
--- a/digital/ai/tools/test_simu.py
+++ b/digital/ai/tools/test_simu.py
@@ -128,6 +128,9 @@ def run (default_robot, test_class = TestSimu):
elif options.robot == 'robospierre':
import robospierre
robot = robospierre.Robot
+ elif options.robot == 'guybrush':
+ import guybrush
+ robot = guybrush.Robot
else:
parser.error ("unknown robot")
app = test_class (robot, options.robot_nb)
diff --git a/digital/ai/tools/test_simu_control_guybrush.py b/digital/ai/tools/test_simu_control_guybrush.py
new file mode 100644
index 00000000..9170b838
--- /dev/null
+++ b/digital/ai/tools/test_simu_control_guybrush.py
@@ -0,0 +1,72 @@
+# io - Input & Output with Artificial Intelligence (ai) support on AVR. {{{
+#
+# Copyright (C) 2012 Nicolas Schodet
+#
+# APBTeam:
+# Web: http://apbteam.org/
+# Email: team AT apbteam DOT org
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# }}}
+from test_simu import TestSimu, run
+from Tkinter import *
+import math
+
+class TestSimuControl (TestSimu):
+ """Interface with extra control."""
+
+ def __init__ (self, robot_class, *args):
+ TestSimu.__init__ (self, robot_class, *args, color_switch = False)
+ self.io = self.robots[0].io
+ self.asserv = self.robots[0].asserv
+ self.mimot = self.robots[0].mimot
+ self.robot_model = self.robots[0].model
+
+ def create_widgets (self):
+ TestSimu.create_widgets (self)
+ self.control_frame = Frame (self)
+ self.control_frame.pack (side = 'left', before = self.table_view,
+ fill = 'y')
+ self.backward_var = IntVar ()
+ self.backward_button = Checkbutton (self.control_frame,
+ text = 'Backward', variable = self.backward_var)
+ self.backward_button.pack ()
+ self.goto_var = IntVar ()
+ self.goto_button = Checkbutton (self.control_frame,
+ text = 'Goto FSM', variable = self.goto_var)
+ self.goto_button.pack ()
+ self.table_view.bind ('<1>', self.move)
+ self.table_view.bind ('<3>', self.orient)
+
+ def move (self, ev):
+ pos = self.table_view.screen_coord ((ev.x, ev.y))
+ if self.goto_var.get ():
+ self.io.goto (pos[0], pos[1], self.backward_var.get ())
+ else:
+ self.asserv.goto (pos[0], pos[1], self.backward_var.get ())
+
+ def orient (self, ev):
+ x, y = self.table_view.screen_coord ((ev.x, ev.y))
+ robot_pos = self.robot_model.position.pos
+ if robot_pos is not None:
+ a = math.atan2 (y - robot_pos[1], x - robot_pos[0])
+ self.asserv.goto_angle (a)
+
+ def change_color (self, *dummy):
+ pass
+
+if __name__ == '__main__':
+ run ('guybrush', TestSimuControl)
diff --git a/digital/io-hub/tools/io_hub/init.py b/digital/io-hub/tools/io_hub/init.py
index 2adaa85c..c9aae2c9 100644
--- a/digital/io-hub/tools/io_hub/init.py
+++ b/digital/io-hub/tools/io_hub/init.py
@@ -2,5 +2,7 @@
host = {
'robospierre': dict (
),
+ 'guybrush': dict (
+ ),
}
target = host
diff --git a/digital/io-hub/tools/io_hub/io_hub.py b/digital/io-hub/tools/io_hub/io_hub.py
index bf038cf2..d7407cb8 100644
--- a/digital/io-hub/tools/io_hub/io_hub.py
+++ b/digital/io-hub/tools/io_hub/io_hub.py
@@ -23,7 +23,7 @@
# }}}
import proto, time
-__all__ = [ 'Proto', 'ProtoRobospierre' ]
+__all__ = [ 'Proto', 'ProtoRobospierre', 'ProtoGuybrush' ]
class Proto:
@@ -81,4 +81,6 @@ class ProtoRobospierre (Proto):
def clamp_openclose (self, open_):
self.proto.send ('d', 'BB', 0xff, (0, 1)[open_])
+class ProtoGuybrush (Proto):
+ pass
diff --git a/host/simu/robots/guybrush/__init__.py b/host/simu/robots/guybrush/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/host/simu/robots/guybrush/__init__.py
diff --git a/host/simu/robots/guybrush/link/__init__.py b/host/simu/robots/guybrush/link/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/host/simu/robots/guybrush/link/__init__.py
diff --git a/host/simu/robots/guybrush/link/bag.py b/host/simu/robots/guybrush/link/bag.py
new file mode 100644
index 00000000..a1ccd741
--- /dev/null
+++ b/host/simu/robots/guybrush/link/bag.py
@@ -0,0 +1,36 @@
+# simu - Robot simulation. {{{
+#
+# Copyright (C) 2012 Nicolas Schodet
+#
+# APBTeam:
+# Web: http://apbteam.org/
+# Email: team AT apbteam DOT org
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# }}}
+"""Guybrush bag of links."""
+import io_hub.mex
+import asserv.mex
+import mimot.mex
+
+class Bag:
+
+ def __init__ (self, node, instance = 'robot0'):
+ self.asserv = asserv.mex.Mex (node, '%s:asserv0' % instance)
+ self.io_hub = io_hub.mex.Mex (node, '%s:io0' % instance,
+ contact_nb = 3)
+ self.mimot = mimot.mex.Mex (node, '%s:mimot0' % instance)
+
diff --git a/host/simu/robots/guybrush/model/__init__.py b/host/simu/robots/guybrush/model/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/host/simu/robots/guybrush/model/__init__.py
diff --git a/host/simu/robots/guybrush/model/bag.py b/host/simu/robots/guybrush/model/bag.py
new file mode 100644
index 00000000..fda35ce0
--- /dev/null
+++ b/host/simu/robots/guybrush/model/bag.py
@@ -0,0 +1,52 @@
+# simu - Robot simulation. {{{
+#
+# Copyright (C) 2012 Nicolas Schodet
+#
+# APBTeam:
+# Web: http://apbteam.org/
+# Email: team AT apbteam DOT org
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# }}}
+"""Guybrush bag of models."""
+from simu.model.switch import Switch
+from simu.model.position import Position
+from simu.model.distance_sensor_sensopart import DistanceSensorSensopart
+from math import pi
+import random
+
+class Bag:
+
+ def __init__ (self, scheduler, table, link_bag):
+ self.color_switch = Switch (link_bag.io_hub.contact[0], invert = True)
+ self.color_switch.state = random.choice ((False, True))
+ self.color_switch.notify ()
+ self.jack = Switch (link_bag.io_hub.contact[1], invert = True)
+ self.strat_switch = Switch (link_bag.io_hub.contact[2], invert = True)
+ self.position = Position (link_bag.asserv.position)
+ self.distance_sensor = [
+ DistanceSensorSensopart (link_bag.io_hub.adc[0], scheduler, table,
+ (20, 20), pi * 10 / 180, (self.position, ), 2),
+ DistanceSensorSensopart (link_bag.io_hub.adc[1], scheduler, table,
+ (20, -20), -pi * 10 / 180, (self.position, ), 2),
+ DistanceSensorSensopart (link_bag.io_hub.adc[2], scheduler, table,
+ (-20, -20), pi + pi * 10 / 180, (self.position, ), 2),
+ DistanceSensorSensopart (link_bag.io_hub.adc[3], scheduler, table,
+ (-20, 20), pi - pi * 10 / 180, (self.position, ), 2),
+ ]
+ self.path = link_bag.io_hub.path
+ self.pos_report = link_bag.io_hub.pos_report
+
diff --git a/host/simu/robots/guybrush/view/__init__.py b/host/simu/robots/guybrush/view/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/host/simu/robots/guybrush/view/__init__.py
diff --git a/host/simu/robots/guybrush/view/bag.py b/host/simu/robots/guybrush/view/bag.py
new file mode 100644
index 00000000..7af72be6
--- /dev/null
+++ b/host/simu/robots/guybrush/view/bag.py
@@ -0,0 +1,44 @@
+# simu - Robot simulation. {{{
+#
+# Copyright (C) 2012 Nicolas Schodet
+#
+# APBTeam:
+# Web: http://apbteam.org/
+# Email: team AT apbteam DOT org
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# }}}
+"""Guybrush bag of views."""
+from simu.view.switch import Switch
+from simu.view.distance_sensor_us import DistanceSensorUS
+from simu.view.path import Path
+from simu.view.pos_report import PosReport
+from simu.robots.guybrush.view.robot import Robot
+
+class Bag:
+
+ def __init__ (self, table, actuator_view, sensor_frame, model_bag):
+ self.jack = Switch (sensor_frame, model_bag.jack, 'Jack')
+ self.color_switch = Switch (sensor_frame, model_bag.color_switch,
+ 'Color')
+ self.strat_switch = Switch (sensor_frame, model_bag.strat_switch,
+ 'Strat')
+ self.robot = Robot (table, model_bag.position)
+ self.distance_sensor = [DistanceSensorUS (self.robot, ds)
+ for ds in model_bag.distance_sensor]
+ self.path = Path (table, model_bag.path)
+ self.pos_report = PosReport (table, model_bag.pos_report)
+
diff --git a/host/simu/robots/guybrush/view/robot.py b/host/simu/robots/guybrush/view/robot.py
new file mode 100644
index 00000000..52f4d509
--- /dev/null
+++ b/host/simu/robots/guybrush/view/robot.py
@@ -0,0 +1,74 @@
+# simu - Robot simulation. {{{
+#
+# Copyright (C) 2012 Nicolas Schodet
+#
+# APBTeam:
+# Web: http://apbteam.org/
+# Email: team AT apbteam DOT org
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# }}}
+"""Guybrush robot view."""
+import simu.inter.drawable
+from math import pi
+
+COLOR_ROBOT = '#000000'
+COLOR_AXES = '#202040'
+
+class Robot (simu.inter.drawable.Drawable):
+
+ def __init__ (self, onto, position_model):
+ """Construct and make connections."""
+ simu.inter.drawable.Drawable.__init__ (self, onto)
+ self.position_model = position_model
+ self.position_model.register (self.__position_notified)
+
+ def __position_notified (self):
+ """Called on position modifications."""
+ self.pos = self.position_model.pos
+ self.angle = self.position_model.angle
+ self.update ()
+
+ def draw (self):
+ """Draw the robot."""
+ self.reset ()
+ if self.pos is not None:
+ self.trans_translate (self.pos)
+ self.trans_rotate (self.angle)
+ # Draw robot body.
+ self.draw_polygon ((0, 190), (150, 110), (95, 95), (55, 55),
+ (40, -0), (55, -55), (95, -95), (150, -110), (0, -190),
+ (-150, -110), (-95, -95), (-55, -55), (-40, -0),
+ (-55, 55), (-95, 95), (-150, 110), (0, 190),
+ fill = COLOR_ROBOT)
+ self.draw_arc ((0, 0), 190, start = pi * 35 / 180,
+ extent = pi * 110 / 180, style = 'chord',
+ outline = COLOR_ROBOT, fill = COLOR_ROBOT)
+ self.draw_arc ((0, 0), 190, start = pi + pi * 35 / 180,
+ extent = pi * 110 / 180, style = 'chord',
+ outline = COLOR_ROBOT, fill = COLOR_ROBOT)
+ # Draw Robot axis.
+ self.draw_line ((-50, 0), (50, 0), fill = COLOR_AXES,
+ arrow = 'last')
+ # Draw Robot wheels.
+ f = 221 # Wheel spacing
+ wr = 60 / 2 # Wheel radius
+ self.draw_line ((0, +f / 2), (0, -f / 2), fill = COLOR_AXES)
+ self.draw_line ((-wr, f / 2), (+wr, f / 2), fill = COLOR_AXES)
+ self.draw_line ((-wr, -f / 2), (+wr, -f / 2), fill = COLOR_AXES)
+ # Extends.
+ simu.inter.drawable.Drawable.draw (self)
+