【发布时间】:2021-10-17 16:11:41
【问题描述】:
我正在尝试根据一些教程创建用于控制 djitello 的应用程序,并且我想创建点击一些 gui 选项卡并在通过键盘控制无人机期间的可能性。 所以我考虑过使用线程,但我不会写。现在,当我使用我的应用程序时,它在单击激活键盘控制方法的按钮后冻结。有人可以解释我做错了什么吗?
这是keyboardControl的类:
from Modules.KeyPressModule import GetKeyPressed as keyPressed
from time import sleep
import logging
class KeyboardControlService():
def __init__(self,passedTello):
self.tello = passedTello
self.startControl = False
def Initialize(self,ui):
self.ui = ui
def GetKeyboardInput(self):
lr,fb,ud,yv = 0,0,0,0
speed = 30
if(keyPressed("left")): lr = speed
elif (keyPressed("right")): lr = -speed
if(keyPressed("up")): fb = speed
elif (keyPressed("down")): fb = -speed
if(keyPressed("w")): ud = speed
elif (keyPressed("s")): ud = -speed
if(keyPressed("a")): yv = speed
elif (keyPressed("d")): yv = -speed
if(keyPressed("q")): self.tello.land()
elif (keyPressed("e")): self.tello.takeoff()
return [lr,fb,ud,yv]
def StartControl(self):
self.startControl = True
while self.startControl:
values = self.GetKeyboardInput()
print("test")
#self.tello.send_rc_control(values[0],values[1],values[2],values[3])
sleep(0.05)
def EndControl(self):
self.startControl = False
该类用于按钮点击响应:
from djitellopy import Tello
from threading import Thread
from Services.KeyboardControlService import KeyboardControlService as keyboardControlService
class TelloService():
def __init__(self):
self.tello = Tello()
self.keyboardControlService = keyboardControlService(self.tello)
def UseKeyboardControl(self,UseIt,UI):
if(UseIt == True):
self.keyboardControlService.Initialize(UI)
self.keyboardThread = Thread(target=self.keyboardControlService.StartControl(), daemon=True)
self.keyboardThread.start()
else:
self.keyboardControlService.EndControl()
self.keyboardThread.join()
【问题讨论】:
-
如果您从代码中删除不必要的部分,并且只保留导致问题的部分,这会有所帮助
-
我想展示整个两个类,我认为主要的问题是创建线程或获取键盘输入。在 UseKeyboardControl 方法中创建线程,在 StartControl 方法中使用键盘输入
-
是的,你必须传递一个函数,而不是调用函数。这意味着您必须在
StartControl之后删除括号() -
哦,好吧,这改变了很多,但我不确定我如何编写没有 self 的函数,并且仍然参考 Tello(无人机)而没有我无法移动他
-
我不确定现在的问题是什么?多线程解决了吗?
标签: python multithreading tello-drone