1

2 つの入力と 1 つの出力を持つクラスを作成しようとしています。クラスは 1 秒間に 10 回呼び出されます。入力の 1 つは時間とともに変化しないリストですが、もう 1 つの入力は時間とともに変化します。

このクラスの出力は、入力リストのメンバーです。クラスは次のようになります。

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関数内にループがないことに注意してください。に到達するまでは常に 0であるため、に到達していない間はステートメントreturnは常に返されます。したがって、関数呼び出しで戻ることは、必要なタスクを正しく実行することです。=)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 に答える