From 8ddd21a6f3c65cd94b794cb25e6fa74dc20da3cc Mon Sep 17 00:00:00 2001 From: Nicolas Schodet Date: Thu, 9 Feb 2012 21:23:47 +0100 Subject: digital/ai/tools, host/simu/robots: simulate several robots --- digital/ai/tools/marcel.py | 58 ++++++++++++++++-------------- digital/ai/tools/robospierre.py | 62 +++++++++++++++++--------------- digital/ai/tools/test_simu.py | 80 +++++++++++++++++------------------------ 3 files changed, 99 insertions(+), 101 deletions(-) (limited to 'digital') 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 () -- cgit v1.2.3