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(测试素材)。