summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorNicolas Schodet2012-02-09 21:23:47 +0100
committerNicolas Schodet2012-02-09 21:29:30 +0100
commit8ddd21a6f3c65cd94b794cb25e6fa74dc20da3cc (patch)
tree980d91d9707c7499a6909433136501f693fdd25f
parent7872d2b5c319862f943d2c1340ecee1d7721d7f4 (diff)
digital/ai/tools, host/simu/robots: simulate several robots
-rw-r--r--digital/ai/tools/marcel.py58
-rw-r--r--digital/ai/tools/robospierre.py62
-rw-r--r--digital/ai/tools/test_simu.py80
-rw-r--r--host/simu/robots/aquajim/link/bag.py6
-rw-r--r--host/simu/robots/giboulee/link/bag.py6
-rw-r--r--host/simu/robots/marcel/link/bag.py8
-rw-r--r--host/simu/robots/robospierre/link/bag.py8
7 files changed, 113 insertions, 115 deletions
diff --git a/digital/ai/tools/marcel.py b/digital/ai/tools/marcel.py
index 08314ca3..001eca5e 100644
--- a/digital/ai/tools/marcel.py
+++ b/digital/ai/tools/marcel.py
@@ -1,10 +1,3 @@
-import simu.model.table_eurobot2010
-import simu.view.table_eurobot2010
-
-import simu.robots.marcel.link.bag
-import simu.robots.marcel.model.bag
-import simu.robots.marcel.view.bag
-
import asserv
import asserv.init
import mimot
@@ -16,24 +9,37 @@ from proto.popen_io import PopenIO
import math
class Robot:
+ """Marcel robot instance."""
+
+ import simu.model.table_eurobot2010 as table_model
+ import simu.view.table_eurobot2010 as table_view
+
+ import simu.robots.marcel.link.bag as robot_link
+ import simu.robots.marcel.model.bag as robot_model
+ import simu.robots.marcel.view.bag as robot_view
+
+ robot_start_pos = {
+ False: (300, 2100 - 305, math.radians (-270)),
+ True: (3000 - 300, 2100 - 305, math.radians (-270))
+ }
+
+ client_nb = 3
- def __init__ (self, proto_time):
- self.table_model = simu.model.table_eurobot2010
- self.table_view = simu.view.table_eurobot2010
- self.robot_link = simu.robots.marcel.link.bag
- self.robot_model = simu.robots.marcel.model.bag
- self.robot_view = simu.robots.marcel.view.bag
- asserv_cmd = ('../../asserv/src/asserv/asserv.host', '-m9', 'marcel')
- mimot_cmd = ('../../mimot/src/dirty/dirty.host', '-m9', 'marcel')
- io_cmd = ('../../io/src/io.host')
- self.asserv = asserv.Proto (PopenIO (asserv_cmd), proto_time,
- **asserv.init.host['marcel'])
- self.mimot = mimot.Proto (PopenIO (mimot_cmd), proto_time,
- **mimot.init.host['marcel'])
- self.io = io.Proto (PopenIO (io_cmd), proto_time,
- **io.init.host['marcel'])
- self.robot_start_pos = {
- False: (300, 2100 - 305, math.radians (-270)),
- True: (3000 - 300, 2100 - 305, math.radians (-270))
- }
+ 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', 'marcel')
+ mimot_cmd = ('../../mimot/src/dirty/dirty.host',
+ '-i{instance}:mimot0', '-m9', 'marcel')
+ io_cmd = ('../../io/src/io.host', '-i{instance}:io0')
+ self.asserv = proto (asserv.Proto, asserv_cmd,
+ asserv.init.host['marcel'])
+ self.mimot = proto (mimot.Proto, mimot_cmd,
+ mimot.init.host['marcel'])
+ self.io = proto (io.Proto, io_cmd,
+ io.init.host['marcel'])
+ self.protos = (self.asserv, self.mimot, self.io)
diff --git a/digital/ai/tools/robospierre.py b/digital/ai/tools/robospierre.py
index 6a44883e..0d258b34 100644
--- a/digital/ai/tools/robospierre.py
+++ b/digital/ai/tools/robospierre.py
@@ -1,10 +1,3 @@
-import simu.model.table_eurobot2011
-import simu.view.table_eurobot2011
-
-import simu.robots.robospierre.link.bag
-import simu.robots.robospierre.model.bag
-import simu.robots.robospierre.view.bag
-
import asserv
import asserv.init
import mimot
@@ -16,26 +9,39 @@ from proto.popen_io import PopenIO
import math
class Robot:
+ """Robospierre robot instance."""
+
+ import simu.model.table_eurobot2011 as table_model
+ import simu.view.table_eurobot2011 as table_view
+
+ import simu.robots.robospierre.link.bag as robot_link
+ import simu.robots.robospierre.model.bag as robot_model
+ import simu.robots.robospierre.view.bag as robot_view
+
+ robot_start_pos = {
+ # In real life, better place the robot in green zone.
+ False: (300, 2100 - 200, math.radians (180)),
+ True: (3000 - 300, 2100 - 200, math.radians (0))
+ }
+
+ client_nb = 3
- def __init__ (self, proto_time):
- self.table_model = simu.model.table_eurobot2011
- self.table_view = simu.view.table_eurobot2011
- self.robot_link = simu.robots.robospierre.link.bag
- self.robot_model = simu.robots.robospierre.model.bag
- self.robot_view = simu.robots.robospierre.view.bag
- asserv_cmd = ('../../asserv/src/asserv/asserv.host', '-m9',
- 'robospierre')
- mimot_cmd = ('../../mimot/src/dirty/dirty.host', '-m9', 'robospierre')
- io_hub_cmd = ('../../io-hub/src/robospierre/io_hub.host')
- self.asserv = asserv.Proto (PopenIO (asserv_cmd), proto_time,
- **asserv.init.host['robospierre'])
- self.mimot = mimot.Proto (PopenIO (mimot_cmd), proto_time,
- **mimot.init.host['robospierre'])
- self.io = io_hub.Proto (PopenIO (io_hub_cmd), proto_time,
- **io_hub.init.host['robospierre'])
- self.robot_start_pos = {
- # In real life, better place the robot in green zone.
- False: (300, 2100 - 200, math.radians (180)),
- True: (3000 - 300, 2100 - 200, math.radians (0))
- }
+ 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/robospierre/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.Proto, io_hub_cmd,
+ io_hub.init.host['robospierre'])
+ 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 80008bb9..50eaf265 100644
--- a/digital/ai/tools/test_simu.py
+++ b/digital/ai/tools/test_simu.py
@@ -49,32 +49,29 @@ class ObstacleWithBeacon (obstacle_view.RoundObstacle):
class TestSimu (InterNode):
"""Interface, with simulated programs."""
- def __init__ (self, robot_class):
+ def __init__ (self, robot_class, robot_nb = 1):
# Hub.
- self.hub = mex.hub.Hub (min_clients = 4)
+ self.hub = mex.hub.Hub (min_clients = 1 + robot_class.client_nb
+ * robot_nb)
self.forked_hub = utils.forked.Forked (self.hub.wait)
# InterNode.
InterNode.__init__ (self)
def proto_time ():
return self.node.date / self.node.tick
- # Robot parameters.
- robot = robot_class (proto_time)
- self.robot = robot
- # Asserv.
- self.asserv = robot.asserv
- self.asserv.async = True
- self.tk.createfilehandler (self.asserv, READABLE, self.asserv_read)
- # Mimot.
- self.mimot = robot.mimot
- self.mimot.async = True
- self.tk.createfilehandler (self.mimot, READABLE, self.mimot_read)
- # Io.
- self.io = robot.io
- self.io.async = True
- self.tk.createfilehandler (self.io, READABLE, self.io_read)
+ # Robot instances.
+ self.robots = [ robot_class (proto_time, 'robot%d' % i)
+ for i in xrange (robot_nb) ]
+ for r in self.robots:
+ for prog in r.protos:
+ prog.async = True
+ def prog_read (f, mask, prog = prog):
+ prog.proto.read ()
+ prog.proto.sync ()
+ self.tk.createfilehandler (prog, READABLE, prog_read)
# Add table.
- self.table_model = robot.table_model.Table ()
- self.table = robot.table_view.Table (self.table_view, self.table_model)
+ self.table_model = robot_class.table_model.Table ()
+ self.table = robot_class.table_view.Table (self.table_view,
+ self.table_model)
self.obstacle = obstacle_model.RoundObstacle (150)
self.table_model.obstacles.append (self.obstacle)
self.obstacle_beacon = obstacle_model.RoundObstacle (40, 2)
@@ -82,43 +79,30 @@ class TestSimu (InterNode):
self.obstacle_view = ObstacleWithBeacon (self.table, self.obstacle,
self.obstacle_beacon)
self.table_view.bind ('<2>', self.place_obstacle)
- # Add robot.
- self.robot_link = robot.robot_link.Bag (self.node)
- self.robot_model = robot.robot_model.Bag (self.node, self.table_model,
- self.robot_link)
- self.robot_view = robot.robot_view.Bag (self.table,
- self.actuator_view, self.sensor_frame, self.robot_model)
- # Color switch.
- self.robot_model.color_switch.register (self.change_color)
+ # Add robots.
+ for r in self.robots:
+ r.link = r.robot_link.Bag (self.node, r.instance)
+ r.model = r.robot_model.Bag (self.node, self.table_model, r.link)
+ r.view = r.robot_view.Bag (self.table, self.actuator_view,
+ self.sensor_frame, r.model)
+ # Color switch.
+ def change_color (r = r):
+ i = r.model.color_switch.state
+ r.asserv.set_simu_pos (*r.robot_start_pos[i]);
+ r.model.color_switch.register (change_color)
def close (self):
self.forked_hub.kill ()
import time
time.sleep (1)
- def asserv_read (self, file, mask):
- self.asserv.proto.read ()
- self.asserv.proto.sync ()
-
- def mimot_read (self, file, mask):
- self.mimot.proto.read ()
- self.mimot.proto.sync ()
-
- def io_read (self, file, mask):
- self.io.proto.read ()
- self.io.proto.sync ()
-
def step (self):
"""Overide step to handle retransmissions, could be made cleaner using
simulated time."""
InterNode.step (self)
- self.asserv.proto.sync ()
- self.mimot.proto.sync ()
- self.io.proto.sync ()
-
- def change_color (self, *dummy):
- i = self.robot_model.color_switch.state
- self.asserv.set_simu_pos (*self.robot.robot_start_pos[i]);
+ for r in self.robots:
+ for prog in r.protos:
+ prog.proto.sync ()
def place_obstacle (self, ev):
pos = self.table_view.screen_coord ((ev.x, ev.y))
@@ -132,6 +116,8 @@ def run (default_robot, test_class = TestSimu):
parser = optparse.OptionParser ()
parser.add_option ('-r', '--robot', help = "use specified robot",
metavar = 'NAME', default = default_robot)
+ parser.add_option ('-n', '--robot-nb', help = "number of robots",
+ type = 'int', metavar = 'NB', default = 1)
(options, args) = parser.parse_args ()
if args:
parser.error ("too many arguments")
@@ -143,7 +129,7 @@ def run (default_robot, test_class = TestSimu):
robot = robospierre.Robot
else:
parser.error ("unknown robot")
- app = test_class (robot)
+ app = test_class (robot, options.robot_nb)
app.mainloop ()
app.close ()
diff --git a/host/simu/robots/aquajim/link/bag.py b/host/simu/robots/aquajim/link/bag.py
index 3cb9e1b2..f0f96b9d 100644
--- a/host/simu/robots/aquajim/link/bag.py
+++ b/host/simu/robots/aquajim/link/bag.py
@@ -27,7 +27,7 @@ import asserv.mex
class Bag:
- def __init__ (self, node):
- self.asserv = asserv.mex.Mex (node)
- self.io = io.mex.Mex (node)
+ def __init__ (self, node, instance = 'robot0'):
+ self.asserv = asserv.mex.Mex (node, '%s:asserv0' % instance)
+ self.io = io.mex.Mex (node, '%s:io0' % instance)
diff --git a/host/simu/robots/giboulee/link/bag.py b/host/simu/robots/giboulee/link/bag.py
index c8c1b285..4dbf0554 100644
--- a/host/simu/robots/giboulee/link/bag.py
+++ b/host/simu/robots/giboulee/link/bag.py
@@ -27,7 +27,7 @@ import asserv.mex
class Bag:
- def __init__ (self, node):
- self.asserv = asserv.mex.Mex (node)
- self.io = io.mex.Mex (node)
+ def __init__ (self, node, instance = 'robot0'):
+ self.asserv = asserv.mex.Mex (node, '%s:asserv0' % instance)
+ self.io = io.mex.Mex (node, '%s:io0' % instance)
diff --git a/host/simu/robots/marcel/link/bag.py b/host/simu/robots/marcel/link/bag.py
index 7cb34c28..c0e36dea 100644
--- a/host/simu/robots/marcel/link/bag.py
+++ b/host/simu/robots/marcel/link/bag.py
@@ -28,8 +28,8 @@ import mimot.mex
class Bag:
- def __init__ (self, node):
- self.asserv = asserv.mex.Mex (node)
- self.io = io.mex.Mex (node)
- self.mimot = mimot.mex.Mex (node)
+ def __init__ (self, node, instance = 'robot0'):
+ self.asserv = asserv.mex.Mex (node, '%s:asserv0' % instance)
+ self.io = io.mex.Mex (node, '%s:io0' % instance)
+ self.mimot = mimot.mex.Mex (node, '%s:mimot0' % instance)
diff --git a/host/simu/robots/robospierre/link/bag.py b/host/simu/robots/robospierre/link/bag.py
index ac68889a..e3368d55 100644
--- a/host/simu/robots/robospierre/link/bag.py
+++ b/host/simu/robots/robospierre/link/bag.py
@@ -28,8 +28,8 @@ import mimot.mex
class Bag:
- def __init__ (self, node):
- self.asserv = asserv.mex.Mex (node)
- self.io_hub = io_hub.mex.Mex (node)
- self.mimot = mimot.mex.Mex (node)
+ 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)
+ self.mimot = mimot.mex.Mex (node, '%s:mimot0' % instance)