首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >运动度运动函数

运动度运动函数
EN

Code Review用户
提问于 2014-11-19 05:33:17
回答 1查看 97关注 0票数 4

我想控制一台马达,它能把装置转到齿轮上。

设备的输入值为0到360度。电机应始终以较短的旋转方式旋转装置。例如,如果位置为30°,目标位置为340°,则应逆时针旋转0°以上。

电机控制器内部有所谓的qc单元系统。例如,设备的一个转折点构成为2938500,因此需要转换所需的值。内部位置(在qc中)可能变成负值或正值,如整数。

最后,我得到了这段代码和一些测试,以确保它能够正常工作。我抓到所有案子了吗?我还能简化move函数吗?

代码语言:javascript
复制
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()
EN

回答 1

Code Review用户

回答已采纳

发布于 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的情况完全一样。这个

代码语言:javascript
复制
    target_qc = is_qc + deg2qc(-diff)

(没有if's和else's)就足够了。else (也就是abs(diff) > 180.0)也可以重写为

代码语言:javascript
复制
    if diff < 0:
        target_qc = is_qc + deg2qc(-diff - 360)
    else:
        target_qc = is_qc + deg2qc(-diff + 360)

这里的情况仅在360的符号上有所不同,这意味着您正在寻找剩余的-diff % 360;注意,python支持浮点数的其余部分。

为了摆脱丑陋的领先-,您可能需要将diff计算为

代码语言:javascript
复制
    diff = target_deg - is_deg
票数 3
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/70269

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档