Python 无法在循环中获得正确的运动

Python 无法在循环中获得正确的运动,python,loops,while-loop,nxt,lego,Python,Loops,While Loop,Nxt,Lego,下面的代码显示了一个程序,它告诉机器人移动到一个球并踢它。这个动作将在一个循环中重复,循环中包含三种重要的方法:旋转到(…)、移动到(…)和踢球()。传递给这三种方法的值基于通过服务器接收的数据,该服务器连接到摄像机,摄像机在方法更新_坐标中显示机器人和球的实时检测。get_ballxy()和get_robotxya()返回机器人和球的坐标和角度。这里的问题是,如果我在没有循环的情况下运行此代码没有问题,但是如果我想在循环中继续运动,那么将值传递给机器人似乎有问题。在循环中,它第一次工作良好,成

下面的代码显示了一个程序,它告诉机器人移动到一个球并踢它。这个动作将在一个循环中重复,循环中包含三种重要的方法:旋转到(…)、移动到(…)和踢球()。传递给这三种方法的值基于通过服务器接收的数据,该服务器连接到摄像机,摄像机在方法更新_坐标中显示机器人和球的实时检测。get_ballxy()和get_robotxya()返回机器人和球的坐标和角度。这里的问题是,如果我在没有循环的情况下运行此代码没有问题,但是如果我想在循环中继续运动,那么将值传递给机器人似乎有问题。在循环中,它第一次工作良好,成功地转向球,移动到球并踢它,但是第二次,它不会,直到再转几圈,它才能再次正确地完成。循环或激活方法是否有问题?还是我传递值太快或错误?因为球需要一段时间才能停止移动。我试着睡了一段时间,但没有多大帮助。对如何解决这个问题有什么看法

import socket
import os,sys
import time
from threading import Thread

HOST = '59.191.193.67'
PORT = 5555

coordinates = []

def connect():   
    globals()['client_socket'] = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client_socket.connect((HOST,PORT))

def update_coordinates():
    screen_width = 0
    screen_height = 0
    global last_coordinates
    last_coordinates = [0 for _ in range(19)]
    while True:
        try:
            client_socket.send("loc\n")
            data = client_socket.recv(8192)
        except:
            connect();
            continue;

        globals()['coordinates'] = data.split()
        if(not(coordinates[-1] == "eom" and coordinates[0] == "start")):
            continue

        if (screen_width != int(coordinates[2])):
        screen_width = int(coordinates[2])
                screen_height = int(coordinates[3])
        return

def get_ballxy():
    update_coordinates()
    ballx = int(coordinates[8])
    bally = int(coordinates[9])
    return ballx,bally

def get_robotxya():
    update_coordinates()
    robotx = int(coordinates[16])
    roboty = int(coordinates[17])
    angle = int(coordinates[18])
    return robotx,roboty,angle

def activate():

    if(ultrasonic.get_sample() < 10):
        both.turn(power=-70, tacho_units=400, brake=False)
        time.sleep(1)
        bx,by = get_ballxy()
        rx,ry,a = get_robotxya()
        turn_to(brick,bx,by,rx,ry,a)
        time.sleep(0.5)
        move_to(brick,bx,by,rx,ry)
        kickBall(brick,by)

    else:
        time.sleep(1)
        bx,by = get_ballxy()
        rx,ry,a = get_robotxya()
        turn_to(brick,bx,by,rx,ry,a)
        time.sleep(0.5)
        move_to(brick,bx,by,rx,ry)
        kickBall(brick,by,ry)

Thread(target=update_coordinates).start()
connect()
update_coordinates()
while True:
    activate()
    time.sleep(2)
导入套接字
导入操作系统,系统
导入时间
从线程导入线程
主持人='59.191.193.67'
端口=5555
坐标=[]
def connect():
globals()['client\u socket']=socket.socket(socket.AF\u INET,socket.SOCK\u STREAM)
客户端_socket.connect((主机、端口))
def更新_坐标():
屏幕宽度=0
屏幕高度=0
全局末次坐标
最后一个坐标=[0表示范围(19)]
尽管如此:
尝试:
客户端\u套接字发送(“loc\n”)
data=client_socket.recv(8192)
除:
connect();
继续;
globals()['coordinates']=data.split()
如果(不是(坐标[-1]=“eom”和坐标[0]=“start”):
持续
如果(屏幕宽度!=int(坐标[2]):
屏幕宽度=int(坐标[2])
屏幕高度=int(坐标[3])
返回
def get_ballxy():
更新_坐标()
ballx=int(坐标[8])
bally=int(坐标[9])
返回ballx,bally
def get_robotxya():
更新_坐标()
机器人X=int(坐标[16])
机器人=int(坐标[17])
角度=整数(坐标[18])
返回机器人X,机器人Y,角度
def activate():
如果(超声波取样()<10):
两个。转动(功率=-70,转速单位=400,制动=假)
时间。睡眠(1)
bx,by=get_ballxy()
rx,ry,a=get_robotxya()
旋转到(砖、bx、by、rx、ry、a)
睡眠时间(0.5)
移动到(砖、bx、by、rx、ry)
踢球(砖块,由)
其他:
时间。睡眠(1)
bx,by=get_ballxy()
rx,ry,a=get_robotxya()
旋转到(砖、bx、by、rx、ry、a)
睡眠时间(0.5)
移动到(砖、bx、by、rx、ry)
踢球(砖、砖、砖)
线程(目标=更新坐标).start()
连接()
更新_坐标()
尽管如此:
激活()
时间。睡眠(2)

注意:由于代码的长度,move_to、turn_to和kickBall的编码部分已被删除

您是否尝试添加一些调试输出以查看每次更新后的坐标,或查看这些更新是否发生?@tobias_k是的,我尝试过打印值并在机器人和球上移动标记,那么,您能否将调试代码添加到代码段中,并将输出添加到问题中?例如,
坐标的当前内容以及上次更新的时间。否则很难重现你的问题。