我已经做了几年的Web应用程序开发人员,现在正在使用Python和Robotics。
我已经设置了基于javascript websocket命令运行的Python Tornado。 这很棒,移动电机,打开LED。不是问题。
我想做的2件事。
1)闪烁LED
2)使用超声波范围传感器,停止FORWARD动作IF范围< X
我知道如何在自己内部做两件事。
但是,我的python方式如下
WS.py
import tornado.httpserver
import tornado.websocket
import tornado.ioloop
import tornado.web
import time
# My Over python module
import tank
class WSHandler(tornado.websocket.WebSocketHandler):
def open(self):
print 'New connection was opened'
self.write_message("Welcome to my websocket!")
tank.init()
def on_message(self, message):
print 'Incoming message:', message
tank.run(message)
self.write_message("You said: " + message)
def on_close(self):
tank.end()
print 'Connection was closed...'
def check_origin(self, origin):
return True
application = tornado.web.Application([
(r'/ws', WSHandler),
])
if __name__ == "__main__":
http_server = tornado.httpserver.HTTPServer(application)
http_server.listen(8888)
tornado.ioloop.IOLoop.instance().start()
TANK.py 将RPi.GPIO导入为gpio 进口时间
def init():
#Setting up all my pins, Not going to add all
def moveForward():
#open GPIO pins to move motors forward
def stop():
# close all GPIO pins to stop motors
def run(action):
# the method called by the IOLoop
if action == 'go':
moveForward()
elif action == 'stop':
stop()
else:
print "Oops, i cocked up"
注意:tank.py是摘要而非实际代码。
我的JS在Mouse Down上工作,用go,mouse up,call stop
调用我的python WS正如我所说,工作精细
但是如果我在moveForward()方法上添加一个while循环来计算范围并在关闭时停止,那么我的WS将被绑定而不是监听STOP
同样,如果我运行一个方法可以打开LED,睡眠,关闭,睡眠,我的WS将无法收听任何命令。
答案 0 :(得分:5)
听起来你需要屈服于IOLoop,因此它可以处理更多输入,同时继续执行“moveForward”。
如果你需要在moveForward中的循环之间暂停,请执行以下操作:
@gen.coroutine
def moveForward():
while True:
do_something()
# Allow other processing while we wait 1 sec.
yield gen.sleep(1)
永远不要在Tornado回调或协程中使用“time.sleep”,它会阻止整个过程的所有事件处理。改为使用IOLoop.add_timeout或“yield gen.sleep(n)”。