Drive and Sing 边走边唱——对于一个机器人而言,能够边走边唱是令人兴奋的,这个行为就可以帮你做到。这段程序,让一个 2 个马达的机器人在前进的过程中,播放乐曲 Frere Jacques!

  机器人编程-robolab2.9

  边走边唱的行为用到了任务分支图标,这个图标意味着 Robolab 可以同时执行多个任务,就像 Windows 可以同时打开多个任务窗口一样,对于每一个任务分支需要有各自的红灯作为结束。在边走边唱的行为中,因为演奏乐曲可以看作是一个等待的过程,在一个任务分支中,程序执行到乐曲图标时,将等待乐曲结束,在此过程中无法完成其他任务,而利用任务分支可以在演奏乐曲的同时完成对马达 A 的控制,可谓一举两得。

  使用任务分支图标可以运行两个独立的程序分支,这使得我们可以同时监控两个传感器,在还没有涉及到类似于事件等高级编程图标的时候,这的确是一个简单有效的办法,例如:对于一个自助银行的门,可以通过在门外刷卡和门内按动触碰传感器两种方式打开,当然识别银行卡的过程比较复杂,在此我们简单的通过一张白卡和光线传感器来实现。这段程序需要我们同时监控两个传感器的状态,可以使用任务分支简单解决:

  机器人编程-robolab2.9

  然而,因为程序共享同样的硬件资源,在以上的程序中,如果在门被触碰传感器控制打开的过程中,有人刷卡,那么结果会是怎样的呢?大家可以试一试!此外, 如果一个任务分支让一个马达正转, 而另一个任务分支在同一时刻让它反转,例如:

  机器人编程-robolab2.9

  在上面的程序中,两个马达争抢控制一个马达,结果看似更难以预料,在用任务分支控制同一个输出源时要格外小心。当然,对于任务分支的冲突也不是没有办法解决,Robolab 提供了任务优先级的图标机器人编程-robolab2.9可以通过图标右下角的数值参数为任务设置 0—255 的优先级,数值越大优先级越高,在产生冲突的时候程序执行优先级较高的任务分支。

  程序范例:

  对于 Robolab 帮助中关于任务优先级的范例程序:

  机器人编程-robolab2.9

  上面的任务分支设定的优先级为最高(255) ;下面的任务分支的优先级最低(0) ,程序开始之后马达顺时针转动,如果在 8 秒之内触碰传感器被按下则马达逆时针转动 2秒,然后停止,当总时间到达 8 分钟时 RCX 发出鸣叫。然而,在这段程序中如果将上面的任务优先级改为 0,而下面改为 255,其运行结果是完全一致的,也就是说在程序执行过程中并没有发生真正的冲突,在程序等待的过程中,无论出于什么优先级的任务

  分支都可以改变输出端口的状态, 但是为任务分支添加优先级的设定一定是一个良好的编程习惯,那么真正的冲突又是如何发生的呢?我们来看下面的程序:

  机器人编程-robolab2.9

  对于这段程序, 首先马达顺时针转动 2 秒, 然后两个任务分支争抢控制马达 A 的转向,上面的任务分支在争抢中因为优先级较高而获胜,先于下面的任务分支让马达逆时针转动,随即下面的任务分支让马达顺时针转动 2 秒后停止,因此,其结果是马达顺时转动 4 秒停止,是不是有些出乎意料呢?任务优先的分支竟然看似被忽略了,马达的最终状态取决于任务优先级低的任务分支。最后,Robolab 对于任务分支的控制和管理还有如下图标:

  机器人编程-robolab2.9

  机器人编程-robolab2.9停止任务,所停止的任务序号通过右下角的数值参数设定,Robolab 在任务分支的时候为每一个分支制定了一个序号,依次为 1—10 号,对于任务停止图标,如果不设定参数,或是参数不在 1 到 10 的范围之内,则停止所有的任务。

  机器人编程-robolab2.9启动任务, 所启动的任务序号通过右下角的数值参数设定, 通常用于任务停止之后的重启动,默认为启动任务 1。

  机器人编程-robolab2.9删除任务, 这个图标只能在直接模式中才能使用, 在后续的直接模式章节中我们再做介绍。

本站内容未经许可,禁止任何网站及个人进行转载。