1

我正在尝试编写一个具有两个输入和一个输出的类。该类每秒调用 10 次。其中一个输入是不随时间变化的列表,但另一个输入随时间变化。

此类的输出是输入列表的成员。类应该看起来像这样。

import lib601.sm as sm

counter = 0
class FollowFigure(sm.SM):
    def __init__(self, waypointsList):
        self.waypoints = waypointsList
    def getNextValues(self, state, inp):
        global counter
        sensors = inp
        current_point = sensors.odometry.point() 

        if counter == 0:
            while not(self.waypoints[0].isNear(current_point, 0.01)):
                return (state, self.waypoints[0])
            counter += 1
        if counter == 1:
            while not(self.waypoints[1].isNear(current_point, 0.01)):
                return (state, self.waypoints[1])
            counter += 1
        if counter == 2:
            while not(self.waypoints[2].isNear(current_point, 0.01)):
                return (state, self.waypoints[2])
            counter += 1                
        if counter == 3:
            while not(self.waypoints[3].isNear(current_point, 0.01)):
                return (state, self.waypoints[3])

因此,该类必须检查随时间变化的条件,如果不满足该条件,则返回 inp[0] 并等待它满足并且不检查其他条件。如果满足 inp1[0] 的条件,则转到下一个 while,并且在此类的下一次调用中,不要检查前一个 while。在过去的 5 个小时里,我一直在思考这个问题,但不知道如何解决它。它不应该那么难。也许我不能集中注意力。

我试图为此编写一个 for 循环,但由于在某些情况下此类每秒被调用 10 次,因此它没有应有的输出,因为每次调用时都会重置迭代。顺便说一句,这个类应该适用于任何有限长度的 inp1。

编辑:上面的代码适用于具有 4 个元素的输入列表。

4

1 回答 1

1

您似乎正在编写一个应用程序,通过每 0.1 秒检查一次他们的位置来检测某人是否按顺序穿过规定的航路点。

在下面的代码中,我假设每次调用该函数时,它都会返回要访问的下一个检查点。所以一开始它会返回waypoint[0],稍后当我们到达时waypoint[0],函数会返回waypoint[1],直到我们到达waypoint[2]

您的代码可以大大简化为:

import lib601.sm as sm

class FollowFigure(sm.SM):
    def __init__(self, waypointsList):
        self.waypoints = waypointsList
        self.next_to_visit = 0  # The next waypoint to be visited

    def getNextValues(self, state, inp):
        sensors = inp
        current_point = sensors.odometry.point()
        if self.waypoints[self.next_to_visit].isNear(current_point, 0.01):
            # We reached the next waypoint, go for next waypoint
            self.next_to_visit += 1
        # Return the next waypoint to be visited
        return (state, self.waypoints[self.next_to_visit])

请注意,函数内部没有while循环。当我们没有到达时,该return语句将始终返回,因为在我们到达之前将始终为 0 。因此,在任何函数调用处返回都正确地执行了所需的任务。=)waypoints[0]waypoints[0]self.next_to_visitwaypoints[0]waypoints[self.next_to_visit]

然后你可以在我们增加 后通过检查 的值是否self.next_to_visit等于列表的长度来检查你是否已经完成了所有的路点。如果相等,那么我们已经到了最终目的地,您可以相应地退回东西。waypointsself.next_to_visit

于 2013-11-14T07:43:48.933 回答