YouDuck.ai

robotctl chorale

最后更新

robotctl chorale
robotctl chorale --off
robotctl chorale --piece 2

两台鸭子在同一个房间里会合唱一段四声部曲目,更多的鸭子加入已经开始的演唱。运行到 Ctrl-C 为止。

默认关闭,而且是隐形的关闭

robotd.toml 里的 [chorale] accept,需要在每一台参与的鸭子上分别开启。

关闭状态下它是不可见的:没有加入的鸭子不会在空中发出任何信号,而不是礼貌地拒绝。理由很实际——合唱会动嘴和头,一台因为别的鸭子走进房间就开始动的机器人,是在做没人要求的动作。

它是怎么协同的

四个设计决策,按问题出现的顺序:

没有主控。 两台鸭子看到相同的信标,id 较小的那台指挥。不存在选举失败,也没有必须送达的消息。

没有共享时钟。 板子没有 NTP 也没有 RTC 一致性,所以指挥的节拍计数器本身就是时基:它在 BLE 广播里每拍递增一个字节,新值的到达就是强拍。跟随者对约 25 拍的相位取平均,把无线电抖动压到合奏需要的 ±20 ms 以内。

声部是算出来的,不是分配的。 最低音的鸭子唱低音部。指挥广播座次表,所有人在其上复现同一套编排——这是防止两台鸭子唱同一声部的关键,因为它们各自看到的房间可能不同。

加入不改变任何人的声部。 新来的取走空闲声部;离开的保留自己的席位,它的声部就此空缺——就像有人中途走出合唱团。

曲目

--piece 固定这台机器人在它指挥时选的曲目。跟随者唱信标指定的,所以要保证曲目就得在每台上都设。id:1 wistful,2 duck-strut,3 outer-wilds(测试素材)。