视频演示

这里有意对比了两种熄灯的方法,看看副效应有何不同。

在线视频演示

前一种是本文针对的熄灭方法,后一种是之前将云台灯设置为”效果熄灭“。可以看到,第一种方法熄灯后,对指定序号的LED进行点亮无效;而第二种方法熄灯后,同样的对指定序号的LED进行点亮成功。

控制台中的输出对应两次点亮的时机。

例程主体

可以看到上下两部分的主要区别是,LED灯.熄灭(常量.云台左)和 云台灯(常量.云台左, 绿色, 常量.效果熄灭)两种熄灯方法。 完整代码在此

def start():
    云台灯(常量.云台左, 红色, 常量.效果常亮)
    时间.睡眠(1)
    LED灯.熄灭(常量.云台左)
    时间.睡眠(1)
    # 不能点亮
    云台单灯(常量.云台左, 奇数, 常量.效果常亮)
    print("no light")
    时间.睡眠(1)

    云台灯(常量.云台左, 红色, 常量.效果常亮)
    时间.睡眠(1)
    云台灯(常量.云台左, 绿色, 常量.效果熄灭)
    时间.睡眠(1)
    # 可以点亮
    云台单灯(常量.云台左, 奇数, 常量.效果常亮)
    print("light on")
    时间.睡眠(2)

关于API设计

刚看到这个熄灭API的时候,就在想它和”效果熄灭“的区别。通过上面测试看出,”熄灭“貌似会重置之前的颜色设置,导致之后对指定LED灯效无法获得之前设置过的颜色。也许它的实现类似云台灯(常量.云台左, 黑色, 常量.效果熄灭) ?像这样的区别,没有在文档中体现,

这就牵涉到另一个问题:如何获取当前LED的状态?比如,为了检验上面的猜想,最好能在调用”熄灭“后,获取到当前左侧云台的颜色设置值(鉴于点亮指定灯不需要颜色参数,相信是存在这个颜色设置值的),看看是空、黑色还是其他什么值。这样的获取状态API也是编写简单的自动测试所必须的。可惜的是,暂时没在官方教程中看到LED灯部分有类似API,也许是因为灯效部分并非是机甲的重点功能。相比之下,底盘运动和云台部分就看到类似API(取坐标、姿态角等等),因为这些值对于控制代码来说不可或缺。

开发中,发觉一个算是痛点,由于API调用时基本不对参数作检查,因此开发者容易忽略一些低级错误,比如,设置闪烁时,位置参数接受“装甲所有”(包括底盘和云台),但不接受“云台所有”;而设置云台灯效时,位置参数则是相反。在API功能上可以理解,但实际开发时,一旦复制黏贴没有注意,运行就会无效,而没有任何错误信息报告。这是开发环境中的报错信息一个值得改进的方面。

到此为止,API中LED灯的部分测试完毕。下面回过头看“系统”部分,也许结合灯效,把演示搞的炫一点。