如何在Python 3中从无限循环线程中获得实时返回值

3

我试图创建一个线程,不断从我的机器人传感器中读取数据,以便在不同的运行方案中使用输出的“转向”值来控制电机的旋转、定时等。我找到了类似的东西(Python返回无限循环线程的值),但这没有帮助,因为它只在我停止循环(即:断开传感器连接)后打印出值。以下是我的代码:

from sensor_and_motor_startup import *
import threading
import queue

DEFAULT_SPEED = 60

# PID Values --These are subjective and need to be tuned to the robot and mat
# Kp must be augmented or decreased until the robot follows the line smoothly --Higher Kp = Stronger corrections
# Same with Ki, after Kp is done --- note, Ki is not used in this case (error accumulation)
# Kd to 1, and move up or done until smooth, after Kp and Ki
# This process can take a VERY long time to fine-tune
K_PROPORTIONAL = 0.2
K_INTEGRAL = 0
K_DERIVATIVE = 0


class OneSensorLineFollower:
    target = 24
    error = 0
    last_error = 0
    derivative = 0
    integral = 0

    def __init__(self, color_sensor):
        self.__color_sensor = color_sensor

    def follower(self, side_of_line=None, kp=K_PROPORTIONAL):
        if side_of_line is None:
            side_of_line = self.SideOfLine.left
        else:
            side_of_line = self.SideOfLine.right
        self.error = self.target - (self.__color_sensor.value(3) / 2)
        self.integral = self.error + self.integral
        self.derivative = self.error - self.last_error
        motor_steering = ((self.error * kp) + (self.integral * K_INTEGRAL) + (self.derivative * K_DERIVATIVE
                                                                                          )) * float(side_of_line)
        self.last_error = self.error
        return motor_steering

    class SideOfLine:
        left = 1
        right = -1


def hisp_center_corrector(out_que):
    while True:
        follow = OneSensorLineFollower(left_side_sensor)
        steering = follow.follower(kp=0.15)
        out_que.put(steering)
        sleep(0.1)


def low_speed_follower(speed=DEFAULT_SPEED, rotations=5):
    follower = OneSensorLineFollower(center_sensor)
    steer_pair.on_for_rotations(follower.follower(kp=0.3), speed, rotations)


que = queue.Queue()
t = threading.Thread(target=hisp_center_corrector, args=(que,))
t.start()
t.join()
while True:
    value = que.get()
    print(value)

据我所记,您需要先将事物放入队列中,然后才能将它们取出...也许这就是问题的一部分?您应该编辑您的帖子,包括您的脚本输出及其与您期望的结果之间的差异。 - Reedinationer
1个回答

4
你正在调用.join()方法,这会导致主线程等待该线程完成。
将你的线程设置为守护线程并不要让主线程等待它完成:
threading.Thread(target=hisp_center_corrector, args=(que,), daemon=True).start()

否则,您的value = que.get()代码将无法运行。

@ArthurGoetzke-Coburn 如果您得到了答案,请考虑通过点击绿色勾号接受答案。 - ramazan polat
1
哦,是的,我是新手,抱歉,现在已经完成了。 - Arthur Goetzke-Coburn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接