如何在循环的非第一次迭代中将值更改为零

3

我正在尝试在PyBox2D中实现前轮转向,目前,我能够使其向左/右转动,但当角度达到零时(使汽车直行)时,无法停止它。

我的目标是在轮子的角度达到零或接近零的值时停止转向,而不是在开始时(有时当角度为零时,它们根本不会移动,并且如果可能,我希望它独立于按键盘上的键(将这两个嵌套的if语句从if keyboard_is_pressed(hotkey)部分移出并没有帮助)。

我希望我已经表达清楚了,非常感谢任何帮助

编辑 我尝试了答案中给出的解决方案,它有点起作用,但我试图改进它,现在我又卡住了,车轮转动,但当它们返回初始位置时就停止移动了。 问题之一可能是当我按“a”或“d”键时,我的变量self.ticking的变化量超过了1,因为我无法按键这么短的时间。

变量self.on_the_beginning等同于下面答案中的on_starting_race:

    def control(self): # This makes control independent from visualisation
        #Front left suspension: index 2
        #Front right suspension: index 3
        print(self.ticking)
        if keyboard.is_pressed("a"):
            self.suspensions[2].motorSpeed = -5
            self.suspensions[3].motorSpeed = -5
            self.ticking -= 1 


        if keyboard.is_pressed("d"):                
            self.suspensions[2].motorSpeed = 5
            self.suspensions[3].motorSpeed = 5
            self.ticking += 1


        if self.ticking <= -3:
            self.ticking = -3
            self.on_the_beginning = True

        elif self.ticking >= 3:
            self.ticking = 3
            self.on_the_beginning = True

        if np.radians(-5) <= self.tires[2].wheel.angle  <= np.radians(5) and self.on_the_beginning == True and self.ticking !=0:
            self.suspensions[2].motorSpeed = 0
            self.suspensions[3].motorSpeed = 0
            self.tires[2].SetAngularVelocity = 0
            self.tires[3].SetAngularVelocity = 0
            self.ticking = 0
            on_the_beginning = False


你能包含所有相关的代码吗?如果我们甚至无法运行你的程序,那么找到答案将会很困难。请参考:[mcve]。 - AMC
2个回答

4

如果我理解正确,您可以定义一个变量,比如on_starting_race,并将其设置为false,然后检查它是否超过一个设定的数字(比如当它超过10时,您就知道比赛已经开始并且汽车已经运动了几秒钟),然后将该值更改为True,现在添加一个if语句来确定该值是否接近于0(比如val<5)AND on_starting_race为True。可能有更简洁的方法,但这是相当直接的方法(假设您每帧或每隔一段时间检查汽车的状态)。


非常感谢,我知道一个月后这可能听起来有些奇怪,但我尝试实现了您的解决方案,它能够令人满意地工作。但是当我试图修改它以使其更好时,我发现了一个问题,请参见编辑部分了解详情,如果您能帮助我,我将不胜感激。 - Mechatrnk

2

抱歉,如果没有完整的代码,我无法100%确定您的问题。

我认为解决方案可能是在函数中使用一个输入参数,比如说first_run,您可以从内部和外部控制它。

def control(self, first_run=True):

这样,您可以从主程序开始比赛,将first_run设置为True,因此您不需要关心角度。并在其余时间内使用相同的函数将first_run设置为False。

您还可以使用self.first_run变量,您可以在init中将其设置为True,然后如果它为True(这实际上是您第一次使用control()函数),则将其设置为False。


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