我想控制一台马达,它能把装置转到齿轮上。
设备的输入值为0到360度。电机应始终以较短的旋转方式旋转装置。例如,如果位置为30°,目标位置为340°,则应逆时针旋转0°以上。
电机控制器内部有所谓的qc单元系统。例如,设备的一个转折点构成为2938500,因此需要转换所需的值。内部位置(在qc中)可能变成负值或正值,如整数。
最后,我得到了这段代码和一些测试,以确保它能够正常工作。我抓到所有案子了吗?我还能简化move函数吗?
import unittest
qc360 = 2938500
def qc2deg(qc):
return (qc / float(qc360)) * 360.0
def deg2qc(deg):
return int(round((deg/360.0) * qc360 ))
def move(is_qc, target_deg):
is_deg = qc2deg(is_qc)
diff = is_deg - target_deg
if abs(diff) <= 180.0:
if diff < 0:
target_qc = is_qc + deg2qc(abs(diff))
else:
target_qc = is_qc + deg2qc(-diff)
else:
if diff < 0:
target_qc = is_qc + deg2qc(abs(diff)-360)
else:
target_qc = is_qc + deg2qc(360-diff)
return target_qc
class TestMovement(unittest.TestCase):
def test_1qc2deg(self):
self.assertEqual(qc2deg(qc360/2), 180)
self.assertEqual(qc2deg(qc360+qc360/2), 360+180)
self.assertEqual(qc2deg(-qc360/2), -180)
self.assertEqual(qc2deg(-qc360-qc360/2), -360-180)
def test_2deg2qc(self):
self.assertEqual(deg2qc(180), qc360/2)
self.assertEqual(deg2qc(360+180), qc360+qc360/2)
self.assertEqual(deg2qc(-180), -qc360/2)
self.assertEqual(deg2qc(-360-180), -qc360-qc360/2)
def test_3simpleMovePositive(self):
# Move within 180 degrees, without zero crossing
self.assertEqual(move(0, 170), deg2qc(170))
self.assertEqual(move(20, 90), deg2qc(90))
def test_4simpleMoveNegative(self):
self.assertEqual(move(20, 5), deg2qc(5))
self.assertEqual(move(210, 170), deg2qc(170))
def test_5wideMovePositive(self):
# positive direction
self.assertEqual(move(0, 190), deg2qc(-170))
self.assertEqual(move(deg2qc(60), 350), deg2qc(-10))
def test_6wideMoveNegative(self):
# negative direction
self.assertEqual(move(deg2qc(190), 0), deg2qc(360))
self.assertEqual(move(deg2qc(350), 60), deg2qc(360+60))
def test_7variousMoves(self):
self.assertEqual(move(deg2qc(260), 50), deg2qc(360+50))
self.assertEqual(move(deg2qc(260), 60), deg2qc(360+60))
self.assertEqual(move(deg2qc(260), 70), deg2qc(360+70))
self.assertEqual(move(deg2qc(260), 80), deg2qc(80))
self.assertEqual(move(deg2qc(260), 90), deg2qc(90))
self.assertEqual(move(deg2qc(260), 80), deg2qc(80))
self.assertEqual(move(deg2qc(260), 120), deg2qc(120))
if __name__ == '__main__':
unittest.main()发布于 2014-11-19 07:16:47
if diff < 0: target\_qc = is\_qc + deg2qc(abs(diff)) else: target\_qc = is\_qc + deg2qc(-diff)
如果是diff < 0,那么abs(diff) == -diff,与else的情况完全一样。这个
target_qc = is_qc + deg2qc(-diff)(没有if's和else's)就足够了。else (也就是abs(diff) > 180.0)也可以重写为
if diff < 0:
target_qc = is_qc + deg2qc(-diff - 360)
else:
target_qc = is_qc + deg2qc(-diff + 360)这里的情况仅在360的符号上有所不同,这意味着您正在寻找剩余的-diff % 360;注意,python支持浮点数的其余部分。
为了摆脱丑陋的领先-,您可能需要将diff计算为
diff = target_deg - is_deghttps://codereview.stackexchange.com/questions/70269
复制相似问题