Split up communication update method to get better odometry handling. Implemented rudimentary blocked path handling. Some more work ok main loop and communication/map handling.
This commit is contained in:
parent
c479954960
commit
aa6b049ce5
4 changed files with 50 additions and 20 deletions
|
@ -105,19 +105,21 @@ class Communication:
|
||||||
def status(self):
|
def status(self):
|
||||||
return self._status
|
return self._status
|
||||||
|
|
||||||
def update(self, odometry, edges): # TODO: FINISH
|
def update(self, odometry): # TODO: FINISH
|
||||||
if(odometry is not None): # use odometry to send data
|
if(odometry is not None): # use odometry to send data
|
||||||
self.encode_message(Command.PATH, ((self.planet.getcurnode(), self.planet.getcurdir()), ((self.planet.getcurnode()[0] + odometry[0][0], self.planet.getcurnode()[1] + odometry[0][1]), (odometry[1] - 180) % 360), odometry[2]))
|
self.encode_message(Command.PATH, ((self.planet.getcurnode(), self.planet.getcurdir()), ((self.planet.getcurnode()[0] + odometry[0][0], self.planet.getcurnode()[1] + odometry[0][1]), (odometry[1] - 180) % 360), odometry[2]))
|
||||||
if(self._status is Mode.GOTOSTATION or self._status is Mode.TARGET):
|
if(self._status is Mode.GOTOSTATION or self._status is Mode.TARGET):
|
||||||
self.encode_message(Command.PATH, ((self.navto[0][0], self.navto[0][1]), (self.planet._planetmap[self.navto[0][0]][self.navto[0][1]][0], self.planet._planetmap[self.navto[0][0]][self.navto[0][1]][1]), self.planet._planetmap[self.navto[0][0]][self.navto[0][1]][2]))
|
self.encode_message(Command.PATH, ((self.navto[0][0], self.navto[0][1]), (self.planet._planetmap[self.navto[0][0]][self.navto[0][1]][0], self.planet._planetmap[self.navto[0][0]][self.navto[0][1]][1]), self.planet._planetmap[self.navto[0][0]][self.navto[0][1]][2]))
|
||||||
self.navto.pop(0)
|
self.navto.pop(0)
|
||||||
self.process_messages() # this should update curnode and curdir
|
self.process_messages() # this should update curnode and curdir
|
||||||
else:
|
|
||||||
self.process_messages() # this should update curnode and curdir
|
def process(self, edges):
|
||||||
edges = self.planet.checkedges(edges)
|
edges = self.planet.checkedges(edges)
|
||||||
if(edges == [] and self._status is Mode.EXPLORE):
|
if(edges == [] and self._status is Mode.EXPLORE):
|
||||||
if(self.planet.unexedge == []):
|
if(self.planet.unexedge == []):
|
||||||
self.encode_message(Command.COMPLETE, None)
|
self.encode_message(Command.COMPLETE, None)
|
||||||
|
self._status = Mode.Complete
|
||||||
|
self.process_messages()
|
||||||
else:
|
else:
|
||||||
self.navto = next(filter(lambda x: x is not None, map(lambda edge: self.planet.shortest_path(self.planet.getcurnode(), edge), self.planet.unexedge)))
|
self.navto = next(filter(lambda x: x is not None, map(lambda edge: self.planet.shortest_path(self.planet.getcurnode(), edge), self.planet.unexedge)))
|
||||||
self._status = Mode.GOTOSTATION
|
self._status = Mode.GOTOSTATION
|
||||||
|
@ -139,9 +141,9 @@ class Communication:
|
||||||
if(msgtype == Command.READY):
|
if(msgtype == Command.READY):
|
||||||
self.msg_queue.append(("explorer/" + self.uid, Command.SEND + Command.READY))
|
self.msg_queue.append(("explorer/" + self.uid, Command.SEND + Command.READY))
|
||||||
if(msgtype == Command.TARGET):
|
if(msgtype == Command.TARGET):
|
||||||
self.msg_queue.append("explorer/" + self.uid, Command.SEND + Command.TARGET + "reached!")
|
self.msg_queue.append(("explorer/" + self.uid, Command.SEND + Command.TARGET + "reached!"))
|
||||||
if(msgtype == Command.COMPLETE):
|
if(msgtype == Command.COMPLETE):
|
||||||
self.msg_queue.append("explorer/" + self.uid, Command.SEND + Command.COMPLETE)
|
self.msg_queue.append(("explorer/" + self.uid, Command.SEND + Command.COMPLETE))
|
||||||
if(msgtype == Command.PATH):
|
if(msgtype == Command.PATH):
|
||||||
self.msg_queue.append(("planet/" + self.planetname, Command.SEND + Command.PATH + self.pathtostring(msgdata[0], msgdata[1], msgdata[2])))
|
self.msg_queue.append(("planet/" + self.planetname, Command.SEND + Command.PATH + self.pathtostring(msgdata[0], msgdata[1], msgdata[2])))
|
||||||
|
|
||||||
|
@ -155,15 +157,16 @@ class Communication:
|
||||||
print("Incoming Message is:", messages.payload.decode('utf-8'))
|
print("Incoming Message is:", messages.payload.decode('utf-8'))
|
||||||
self.comexec(messages.payload.decode('utf-8')[4:])
|
self.comexec(messages.payload.decode('utf-8')[4:])
|
||||||
self.msg_queue.clear()
|
self.msg_queue.clear()
|
||||||
sleep(2)
|
sleep(3)
|
||||||
|
|
||||||
def comexec(self, message):
|
def comexec(self, message):
|
||||||
if not any([message.startswith(instruction) for instruction in Command]): # is planet name and starting position
|
if not any([message.startswith(instruction) for instruction in Command]): # is planet name and starting position
|
||||||
[self.planetname, startnode] = message.rsplit(' ')
|
[self.planetname, startnode] = message.rsplit(' ')
|
||||||
self.subscribetochannel("planet/" + self.planetname)
|
self.subscribetochannel("planet/" + self.planetname)
|
||||||
self.planet.setcurnode(str2tuple(*startnode.rsplit(',')))
|
self.planet.setcurnode(str2tuple(*startnode.rsplit(',')))
|
||||||
# Fake Message to set start as blocked
|
# Fake Message send and add entry to set start as blocked
|
||||||
self.encode_message(Command.PATH, [(self.planet.getcurnode(), Direction.SOUTH), (self.planet.getcurnode(), Direction.SOUTH), -1])
|
self.encode_message(Command.PATH, [(self.planet.getcurnode(), Direction.SOUTH), (self.planet.getcurnode(), Direction.SOUTH), -1])
|
||||||
|
self.planet.add_path((self.planet.getcurnode(), Direction.SOUTH), (self.planet.getcurnode(), Direction.SOUTH), -1)
|
||||||
elif message.startswith(Command.PATH):
|
elif message.startswith(Command.PATH):
|
||||||
self.stringtopath(*message[5:].rsplit(' '))
|
self.stringtopath(*message[5:].rsplit(' '))
|
||||||
elif message.startswith(Command.TARGET):
|
elif message.startswith(Command.TARGET):
|
||||||
|
@ -179,6 +182,7 @@ class Communication:
|
||||||
self.planet.add_path(snode, tnode, int(weight))
|
self.planet.add_path(snode, tnode, int(weight))
|
||||||
if(snode[0] == self.planet.getcurnode() or self.planet.getcurnode is None):
|
if(snode[0] == self.planet.getcurnode() or self.planet.getcurnode is None):
|
||||||
self.planet.setcurnode(tnode[0])
|
self.planet.setcurnode(tnode[0])
|
||||||
|
self.planet.setcurdir((tnode[1] - 180) % 360)
|
||||||
|
|
||||||
def pathtostring(self, start, target, blocked):
|
def pathtostring(self, start, target, blocked):
|
||||||
if(blocked == -1):
|
if(blocked == -1):
|
||||||
|
|
10
src/main.py
10
src/main.py
|
@ -25,7 +25,10 @@ def run():
|
||||||
communication.process_messages()
|
communication.process_messages()
|
||||||
|
|
||||||
# run first time not in loop because odometry data is not relevant
|
# run first time not in loop because odometry data is not relevant
|
||||||
communication.update(None, move.getstationedges()) # TODO: Register in map
|
communication.update(None) # TODO: Register in map
|
||||||
|
# correct odometry right here otherwise list of edges will be incorrect
|
||||||
|
move.setcurdir(communication.getdir())
|
||||||
|
communication.process(move.getstationedges())
|
||||||
move.turnto(communication.navto[0][1]) # TODO: add control mechanism to communication class
|
move.turnto(communication.navto[0][1]) # TODO: add control mechanism to communication class
|
||||||
sleep(4)
|
sleep(4)
|
||||||
communication.planet.setcurdir(communication.navto[0][1])
|
communication.planet.setcurdir(communication.navto[0][1])
|
||||||
|
@ -43,7 +46,10 @@ def run():
|
||||||
move.turnto(instructions[1])
|
move.turnto(instructions[1])
|
||||||
move.traversetonextstation(True)
|
move.traversetonextstation(True)
|
||||||
|
|
||||||
communication.update(move.getstats(), move.getstationedges()) # TODO: Register in map
|
communication.update(move.getstats()) # TODO: Register in map
|
||||||
|
# correct odometry right here otherwise list of edges will be incorrect
|
||||||
|
move.setcurdir(communication.getdir())
|
||||||
|
communication.process(move.getstationedges())
|
||||||
move.turnto(communication.navto[0][1]) # TODO: add control mechanism to communication class
|
move.turnto(communication.navto[0][1]) # TODO: add control mechanism to communication class
|
||||||
sleep(4)
|
sleep(4)
|
||||||
communication.planet.setcurdir(communication.navto[0][1])
|
communication.planet.setcurdir(communication.navto[0][1])
|
||||||
|
|
27
src/move.py
27
src/move.py
|
@ -70,8 +70,9 @@ class Move:
|
||||||
self._sensor.refresh()
|
self._sensor.refresh()
|
||||||
self._wheel_l.stop()
|
self._wheel_l.stop()
|
||||||
self._wheel_r.stop()
|
self._wheel_r.stop()
|
||||||
self._wheel_l.turnbyamount(40, 40)
|
self._wheel_l.turnbyamount(20, 40)
|
||||||
self._wheel_r.turnbyamount(-40, 40)
|
self._wheel_r.turnbyamount(-20, 40)
|
||||||
|
sleep(1)
|
||||||
|
|
||||||
def setcurcir(self, curdir):
|
def setcurcir(self, curdir):
|
||||||
self.odometry.angle_set(curdir[1])
|
self.odometry.angle_set(curdir[1])
|
||||||
|
@ -132,7 +133,7 @@ class Move:
|
||||||
self._sensor.refresh()
|
self._sensor.refresh()
|
||||||
self._sensor.checkbumper()
|
self._sensor.checkbumper()
|
||||||
self._sensor.getcolor()
|
self._sensor.getcolor()
|
||||||
if (not (self._sensor.lastcolor is None)):
|
if(self._sensor.lastcolor is not None):
|
||||||
break
|
break
|
||||||
self._wheel_l.speed_set(capat100(self._sensor.edgebrightness/2 - self._sensor.getbrightness()/2)+self.defaultspeed)
|
self._wheel_l.speed_set(capat100(self._sensor.edgebrightness/2 - self._sensor.getbrightness()/2)+self.defaultspeed)
|
||||||
self._wheel_r.speed_set(capat100(self._sensor.getbrightness()/2 - self._sensor.edgebrightness/2)+self.defaultspeed)
|
self._wheel_r.speed_set(capat100(self._sensor.getbrightness()/2 - self._sensor.edgebrightness/2)+self.defaultspeed)
|
||||||
|
@ -140,6 +141,26 @@ class Move:
|
||||||
self._odometry.pos_update((self._wheel_l.getmovement(), self._wheel_r.getmovement()))
|
self._odometry.pos_update((self._wheel_l.getmovement(), self._wheel_r.getmovement()))
|
||||||
self._wheel_l.stop()
|
self._wheel_l.stop()
|
||||||
self._wheel_r.stop()
|
self._wheel_r.stop()
|
||||||
|
if(self._sensor._bumper_r):
|
||||||
|
self._wheel_l.turnbyamount(-200, 120)
|
||||||
|
self._wheel_r.turnbyamount(-200, 120)
|
||||||
|
sleep(1)
|
||||||
|
self._wheel_l.turnbyamount(320, 120)
|
||||||
|
self._wheel_r.turnbyamount(-320, 120)
|
||||||
|
sleep(2)
|
||||||
|
self._aligntoedge()
|
||||||
|
self._wheel_l.run()
|
||||||
|
self._wheel_r.run()
|
||||||
|
while(True):
|
||||||
|
self._sensor.refresh()
|
||||||
|
self._sensor.getcolor()
|
||||||
|
if(self._sensor.lastcolor is not None):
|
||||||
|
break
|
||||||
|
self._wheel_l.speed_set(capat100(self._sensor.edgebrightness/2 - self._sensor.getbrightness()/2)+self.defaultspeed)
|
||||||
|
self._wheel_r.speed_set(capat100(self._sensor.getbrightness()/2 - self._sensor.edgebrightness/2)+self.defaultspeed)
|
||||||
|
if(not isknownstation):
|
||||||
|
self._odometry.pos_update((self._wheel_l.getmovement(), self._wheel_r.getmovement()))
|
||||||
|
|
||||||
self._wheel_l.turnbyamount(200, 90)
|
self._wheel_l.turnbyamount(200, 90)
|
||||||
self._wheel_r.turnbyamount(200, 90)
|
self._wheel_r.turnbyamount(200, 90)
|
||||||
sleep(2)
|
sleep(2)
|
||||||
|
|
|
@ -81,19 +81,18 @@ class Planet:
|
||||||
def getcurdir(self):
|
def getcurdir(self):
|
||||||
return self._curdir
|
return self._curdir
|
||||||
|
|
||||||
def addtounexedge(self, node_edge_list):
|
|
||||||
self.unexedge = self.unexedge + node_edge_list
|
|
||||||
|
|
||||||
def exploreedge(self, node_edge):
|
|
||||||
self.unexedge.remove(node_edge)
|
|
||||||
|
|
||||||
def checkedges(self, testnode):
|
def checkedges(self, testnode):
|
||||||
if(self._curnode not in self._planetmap):
|
if(self._curnode not in self._planetmap):
|
||||||
self._planetmap[self._curnode] = {}
|
self._planetmap[self._curnode] = {}
|
||||||
for edges in testnode:
|
for edges in testnode:
|
||||||
if(edges in self._planetmap[self._curnode]):
|
if(edges in self._planetmap[self._curnode]):
|
||||||
testnode.remove(edges)
|
testnode.remove(edges)
|
||||||
# maybe do some explored node stuff here?
|
if(testnode != [] and self._curnode not in self.unexedge):
|
||||||
|
self.unexedge.append(self._curnode)
|
||||||
|
if(testnode == [] and self._curnode in self.unexedge):
|
||||||
|
self.unexedge.remove(self._curnode)
|
||||||
|
print("MAP:", self._planetmap[self._curnode])
|
||||||
|
print("NODES:", testnode)
|
||||||
return testnode
|
return testnode
|
||||||
|
|
||||||
'''
|
'''
|
||||||
|
|
Loading…
Reference in a new issue