我编写了一个函数,仅当车辆报告它正在移动并且车辆在两点之间移动了 20 厘米时才计算两点之间的航向。
该函数使用静态变量 - 或者至少如果它有效的话 - 来跟踪以前的位置和航向值。
代码如下:
def withCan(pos):
eastdist = pos[0]-previous_pos[0]
northdist = pos[1]-previous_pos[1]
canflag = pos[2]
if (canflag == 1 or canflag==2):
if (previous_canflag == 1 and canflag == 2):
previous_heading += 180.0
previous_canflag = canflag
elif (previous_canflag == 2 and canflag == 1):
previous_heading += 180.0
previous_canflag = canflag
else:
previous_canflag = canflag
if ( (canflag == 1 or canflag == 2) and math.sqrt(northdist*northdist+eastdist*eastdist) > canstep ):
previous_heading = math.degrees(math.atan2(eastdist, northdist))
previous_pos[0] = pos[0]
previous_pos[1] = pos[1]
return previous_heading
withCan.previous_pos = [0.0,0.0]
withCan.previous_heading = 0.0
withCan.previous_canflag = 0
withCan.canstep = 0.2
positions = backandforth([100,100]) #populates an array of form [x,y,canflag]
for p in positions:
print withCan(p)
我收到一条错误消息,显示 eastdist = pos[0]-previous_pos[0] NameError:未定义全局名称“previous_pos”。请问有人可以解释这个错误的原因吗?
请您参考如下方法:
当你这样做时:
def foo():
pass
foo.name = 1
您没有创建全局名称 name。相反,您正在向 foo 函数添加一个属性!您可以通过以下方式访问它:
def foo():
return foo.name
foo.name = 1
但这很奇怪。如果您需要一个全局名称,只需这样做:
def foo():
global name
name += 1
return name
name = 1
请记住,如果您想从函数中修改全局名称,则必须将其声明为global。如果你不这样做,你可以使用它,但你不能分配给它。
您对静态名称的混淆可能来自使用类。但请注意,在您的代码中 withCan 不是一个类,它是一个普通函数!
