我正在研究一个机器人,想在我的树莓派上完成所有的处理。我开始研究多线程,这看起来很有前途,但当我试图做更多的操作时,rpi正在节流。
这是一个类,它获取坐标并告诉我们是向上向下移动还是向右向左移动。
我已经从我的main.py文件中添加了要更改的变量
是否有可能在不同的CPU中工作,或者我应该改变我的方法?
Controller.py
from dataPointObject.dataPointObjectClass import *
import threading
class Drive:
def __init__(self, frameInfo=FrameInfo()):
self.facePoint = FacePoint() // changing from main.py
self.obstaclePoint = ObstaclePoint() // changing from main.py
self.frameInfo = frameInfo
self.isDetected = False // changing from main.py
self.stopped = False // changing from main.py
def start(self):
print('Started')
threading.Thread(name='Drive', target=self.drive).start()
threading.Thread(name='AdjustCamera', target=self.adjustCamera).start()
return self
def drive(self):
while not self.stopped:
while self.isDetected:
if self.facePoint.x+self.facePoint.w > self.frameInfo.frameWidthLimitR: # Right Screen Margin
print('LEFT')
elif self.facePoint.x < self.frameInfo.frameWidthLimitL: # Left Screen Margin
print('RIGHT')
def adjustCamera(self):
while not self.stopped:
while self.isDetected:
if self.facePoint.y < self.frameInfo.frameHeightLimitT: # Top Screen Margin
print('DOWN')
elif self.facePoint.y + self.facePoint.h > self.frameInfo.frameHeightLimitB: # Bottom Screen Margin
print('UP')
def stop(self):
self.isDetected = False
self.stopped = True
def faceDetected(self , isDetected = False):
self.isDetected = isDetected
def setFacePoint(self,facePoint):
self.facePoint = facePoint
这是我调用来开始处理的函数。VideoGet和VideoShow在不同的线程上工作
def start(source=0):
video_getter = VideoGet(source).start()
video_shower = VideoShow(video_getter.frame , video_getter.frameInfo).start()
drive = Drive(frameInfo = video_getter.frameInfo).start()
while True:
drive.faceDetected(video_shower.facePoint != FacePoint())
drive.setFacePoint(video_shower.facePoint)
if video_getter.stopped or video_shower.stopped:
video_shower.stop()
video_getter.stop()
drive.stop()
break
frame = video_getter.frame
video_shower.frame = frame
在命令行中通过top命令查看%CPU。如果它是100%左右,那么程序只使用单核。Python线程受到GIL的限制,为了使用所有可用的cpu,我们必须使用多处理而不是多线程。
或者,如果rpi因为高温而节流,那么您可以在while roop中设置适当的毫秒睡眠时间(如time.sleep(0.02))。这是一个非常简单的解决方案,它有效。