Python 我如何构造这个while循环,以便它检查两个条件,并在必要时维护它

Python 我如何构造这个while循环,以便它检查两个条件,并在必要时维护它,python,python-3.x,Python,Python 3.x,我这里有这个密码 def step(self, joint_values): """ Step function which publishes actions and evaluates state/reward. Args: action: takes an action (Int) as input. Value from 0-6 Returns: State after executed action, reward a

我这里有这个密码

def step(self, joint_values):
    """
    Step function which publishes actions and evaluates state/reward.

    Args:
        action: takes an action (Int) as input. Value from 0-6

    Returns:
        State after executed action, reward after executed action and done, 
        which is a bool, True or False depending on if episode is done.
    """
    self.iterator += 1

    self._coll = self.observation_callback_collision()
    coll_force = self._coll.wrench.force.x

    if coll_force >= 150 or coll_force <= -150:
        self.reset_robot2.call()
        self.reward_coll = -0.5
        self.collided += 1
        print("#############Collision##############")
        rospy.sleep(1)

    #print("ACTION", joint_values)
    else:
        i = 0
        while i<=1000:
            self.traj.header.stamp = rospy.Time.now()
            action = JointTrajectoryPoint()
            action.positions = joint_values
            #print("W", action.positions)
            action.time_from_start = rospy.Duration(0.7)
            self.traj.points = []
            self.traj.points.append(action)
            #rospy.sleep(4.5)
            self.action_pub.publish(self.traj)

            i +=0.1
def步长(自身、关节_值):
"""
Step函数,用于发布操作并评估状态/奖励。
Args:
操作:将操作(Int)作为输入。值从0到6
返回:
执行行动后的状态、执行行动后的奖励和完成,
哪个是布尔,对还是错取决于这一集是否完成。
"""
self.iterator+=1
self.\u coll=self.observation\u callback\u collision()
coll_力=自身。coll.扳手力。x

如果要检查循环中的多个条件时,coll_-force>=150或coll_-force,则可以使用累加标志指示循环是否应终止。还有其他选项,例如
break
或将
i
设置为超出范围的值,但为了可读性,最好使用标志:

is_running=True
当_正在运行时:
#在这里做一些事情,计算coll_力
i+=0.1
正在运行=正在运行且(coll_力>-150且coll_力<150)

我喜欢艾蒂安的答案。我会建议你按照他的建议来组织你的职能。或者,这里是对您的第一次尝试的一个修改,它应该完全按照您希望它做的来做

  • 我添加了一个
    reset\u one
    状态,作为
    if
    语句要满足的第二个条件。如果调用了一次
    If
    ,它将被设置为true,并且不允许调用
    If
    捕获,只允许调用
    else

  • 或者,如果允许一定量的重置,可以使用我注释掉的
    reset\u count
    变量

def步长(自身、关节_值):
self.iterator+=1
self.\u coll=self.observation\u callback\u collision()
coll_力=自身。coll.扳手力。x
#添加已重置布尔状态。
重置_一次=错误
#重置计数=0#可选。

当我打招呼的时候。你的解决方案有什么问题?问题是,当我运行它时,如果“if”条件为真,那么它会在if条件本身中不断循环,也就是说,机器人会重置几次,但我想要的只是在第二个代码中重置机器人一次,但在第一个if语句的结尾处
break
。否则,如果10000次的话,它就会变成那样。
def step(self, joint_values):

    self.iterator += 1

    self._coll = self.observation_callback_collision()
    coll_force = self._coll.wrench.force.x


    while i<=1000:
      if coll_force >= 150 or coll_force <= -150:
            self.reset_robot2.call()
            self.reward_coll = -0.5
            self.collided += 1
            print("#############Collision##############")
            rospy.sleep(1)

      else:
            self.traj.header.stamp = rospy.Time.now()
            action = JointTrajectoryPoint()
            action.positions = joint_values
            #print("W", action.positions)
            action.time_from_start = rospy.Duration(0.7)
            self.traj.points = []
            self.traj.points.append(action)
            self.action_pub.publish(self.traj)

      i +=0.1