我正在尝试编写一个包含两个输入和一个输出的类。该课程每秒被调用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个元素的输入列表。
答案 0 :(得分: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
时,waypoints[0]
语句将始终返回waypoints[0]
,因为self.next_to_visit
将始终为0,直到我们到达waypoints[0]
。因此,在任何函数调用中返回waypoints[self.next_to_visit]
正在执行所需的任务。 =)
之后,在我们增加self.next_to_visit
之后,您可以通过检查waypoints
的值是否等于self.next_to_visit
列表的长度来检查您是否已完成所有航点。如果它相等,那么我们已经到达了最终目的地,你可以相应地返回它。