I'm trying to set up my simulator to operate robots using a simple
continuous-time recurrent neural network. At the moment I'm just
configuring it by setting all of the parameters by hand; the settings
below should allow the robot to chase after lights similar to a
Braitenburg vehicle. But, behaviour aside, it seems this code is
crashing the simulator instead!
The line "self.motors(leftoutput, rightoutput)" seems to be the
problem. It is meant to set the motors to the output from two of the
nodes in the network. When I include this line, the simulator hangs
without printing any of the statements I included below, and I have to
abort the Python process. But if I comment this line out and replace
it with something like "self.motors(rightinput, leftinput)," so that
the light input is used directly to determine the motor output, the
simulator works as expected.
I can't figure out why one would work but the other wouldn't when both
seem to be acceptable parameters to the method. Does anyone have an
idea? I'm running version 5.0.0 on OSX 10.5.2.
Dave
--- code below ---
# CTRNNBrain.py
from pyrobot.brain import Brain
from pyrobot.brain.ctrnn import *
class CTRNNBrain(Brain):
def setup(self):
self.robot.light[0].units = "scaled"
self.maxvalue = self.robot.light[0].getMaxvalue()
self.net = CTRNN(name="brain")
self.net.addNeuron(name="input_left", state=1.0,
bias=-1.0, tau=0.5)
self.net.addNeuron(name="input_right", state=1.0,
bias=-1.0, tau=0.5)
self.net.addNeuron(name="hidden", state=6.0,
bias=-6.0, tau=0.5)
self.net.addNeuron(name="motor_left", state=10.0,
bias=-10.0, tau=0.2)
self.net.addNeuron(name="motor_right", state=10.0,
bias=-10.0, tau=0.2)
self.net.setConnectionWeight("input_left", "hidden", 1.5)
self.net.setConnectionWeight("input_right", "hidden", 1.5)
self.net.setConnectionWeight("hidden", "hidden",
12.0)
self.net.setConnectionWeight("input_right", "motor_left", 4.0)
self.net.setConnectionWeight("hidden", "motor_left", 4.0)
self.net.setConnectionWeight("motor_left", "motor_left", 7.0)
self.net.setConnectionWeight("input_left", "motor_right", 4.0)
self.net.setConnectionWeight("hidden", "motor_right", 4.0)
self.net.setConnectionWeight("motor_right", "motor_right", 7.0)
def step(self):
# Get the inputs
leftinput = max([s.value for s in self.robot.light[0]["left"]])
rightinput = max([s.value for s in self.robot.light[0]
["right"]])
print "left input = %f, right input = %f" % (leftinput,
rightinput)
self.net.setNeuronOutput("input_left", leftinput)
self.net.setNeuronOutput("input_right", rightinput)
self.net.EulerStep(0.01)
leftoutput = self.net.getNeuronOutput("motor_left")
rightoutput = self.net.getNeuronOutput("motor_right")
print "left state = %f, right state = %f" %
(self
.net
.getNeuronState("motor_left"),self.net.getNeuronState("motor_right"))
print "left output = %f, right output = %f" % (leftoutput,
rightoutput)
#self.motors(rightinput, leftinput)
self.motors(leftoutput, rightoutput)
def INIT(eng):
return CTRNNBrain(engine=eng)
_______________________________________________
Pyro-users mailing list
Pyro-users@pyrorobotics.org
http://emergent.brynmawr.edu/mailman/listinfo/pyro-users