我正在编写的代码接受电机转动的程度,并使用该数据计算车轮所覆盖的距离(使用距离=旋转数*每次旋转覆盖的距离)。
然后进行误差调整(考虑到摩擦等环境因素)。
最后,使用三角学,它计算沿x轴和y轴移动的距离。
以上所有操作均由类straight
中包含的函数CoordinateManager
完成。此函数由另一个类的实例调用。
class CoordinateManager:
goalcord = [20, 0]
def __init__(self):
self.curcord = [0, 0]
self.theta = 0
def get_compass_angle(self):
compass = Sensor(address='in2')
return compass.value(0)
def turn(self, iangle, fangle):
self.theta = self.theta + (fangle-iangle)
def straight(self, turnangle):
d = turnangle*2*3.14*2/360
d = 1.8120132*(d**0.8938054)
thetarad = radians(self.theta)
dx = d*sin(thetarad)
dy = d*cos(thetarad)
self.curcord[0] += dx
self.curcord[1] += dy
同时打印d
和self.theta
表示它们包含正确的值。
这必须意味着数组self.curcord
也具有有效值。但是,情况并非如此。打印self.curcord
的两个元素输出复数(一些大浮点数+另一个大浮点数 j )。
除了三角函数必须返回复数之外,我认为没有合理的解释。但是,我认为python内置的lib函数返回错误值的可能性非常小。
我可能会忽略任何逻辑错误吗?
编辑:我刚刚尝试将最后两行更改为:
self.curcord[0] += dx
self.curcord[1] += dy
我在显示值时尝试使用.real
。即使价值现在是真实的,它们仍然是错误的。我将进一步研究这是否是由某些计算错误引起的。
答案 0 :(得分:3)
由于您在上面的评论中说turnangle
可以是任何整数,因此问题可以直接追溯到这一行:
d = 1.8120132*(d**0.8938054)
由于turnangle
可能为负数,因此执行此行之前d
的值也可能为负值;提升为任意十进制幂的负值通常为 complex 。
因此问题根本不在于trig功能。以上也让我相信你说的时候
同时打印
d
和self.theta
表示它们包含正确的值
......你只能在这一行之后这样做:
d = turnangle*2*3.14*2/360
这可以解释为什么你错误地认为问题必须在其他地方。
更新:
将变量设置为自身的某些功能是一种非常糟糕的习惯。尝试使用不同的变量名称以避免混淆 - 如上所述,我必须参考"此行"而不是他们的变量名。
也许这样的事情会起作用,假设不管turnangle
的符号,电机的行为是否相同?
d = sign(d) * 1.8120132 * (abs(d) ** 0.8938054)