资源预览内容
第1页 / 共12页
第2页 / 共12页
第3页 / 共12页
第4页 / 共12页
第5页 / 共12页
第6页 / 共12页
第7页 / 共12页
第8页 / 共12页
第9页 / 共12页
第10页 / 共12页
亲,该文档总共12页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
LESSON 10 机器人对话两台以上的机器人如要一起合作(或是对打)是要透过红外线相互通讯的.我们可以利用这项技术组装一台有两台RCX, 最多可以装六个马达, 六个感应器的大型机器人. (或用第九章的技术来加装更多的东西). 机器人之间的相互通讯的关键就是红外线埠, 机器人可用SendMessage()这个指令将0-255的一个数字透过红外线端口送出, 机器人会收到这个数值定储存起来. 而程序可用Message()这个指令检查最近收到的讯息是什么, 然后根据这个数值机器人进行一些特定的动作. 下命令在一群机器人中, 带头的我们叫它master, 其它的都叫slave. master会不时的送出命令, 由slave来执行. 有时候slave也须要回报讯息给master(例如感应器的数值). 这时候, 我们需要二个程序, 一个给master, 一个给slave. 我们先从简单的开始吧! 假设只有一个slave, 而slave能执行三个动作前进, 后退和停止. slave的程序包含一个的简单的循环. 这循环会用ClearMessage() 指令将最近的讯息重新设定为 0. 再来它会一直等待直到讯息值不为 0为止. slave 会根据讯息值来决定它到底要做什么. task main() / SLAVE while (true) ClearMessage(); until (Message() != 0); if (Message() = 1) OnFwd(OUT_A+OUT_C); if (Message() = 2) OnRev(OUT_A+OUT_C); if (Message() = 3) Off(OUT_A+OUT_C); 现在我们写一个master程序用来对slave下命令前进2秒, 后退2秒, 最后停止task main() / MASTER SendMessage(1); Wait(200); SendMessage(2); Wait(200); SendMessage(3);程序写好之后, 下载程序要一个一个进行以免混淆, 完成后开机的顺序是先开slave, 然后master. 如果有数个slave, 也要一个一个进行, 以确定他们的程序都一样. 能让机械人根据程序所定义的内容来对话就是所谓的” 通讯协议(protocol)” 这里我们规定1是前进, 2是后退, 3是停止. 当我们要处理一大堆讯息时, 通讯协议就更要好好定义, 省得混淆. 例如, 如果我们有很多slave的时候, 我们可以定义一个通讯协议来发出一组有间隔的两个数字 :master送出的第一个讯息是slave的编号, 第二个讯息是要它做什么动作的指令. 这时候, 每个slave 就要有一个它自己的号码啦! 这只要让每个 slave 有一点点(例如常数的不同)的小差异就行了.选出一个头子master当我们要用到一个以上的机器人时, 每一个机器人都要有它自己的程序. 如果我们可以只下载一个程序到所有的机器人的话, 情况会比较好控制. 问题是, 谁来当master其实答案很简单: 让它们自已选出一个master来就好啦. 这里有个办法是用随机数产生等待时间, 这样第一个送出讯号的机械人就当master, 而其它的当slave. 两台机器人在同一时间送出讯号的可能性很小, 您可以拟定更复杂的计划来处理这个状况然后进行第二次选举.task main() ClearMessage(); Wait(200); / make sure all robots are on Wait(Random(400); / wait between 0 and 4 seconds if (Message() 0) / somebody else was first start slave; else SendMessage(1); / I am the master now Wait(400); / make sure everybody else knows start master; task master() SendMessage(1); Wait(200); SendMessage(2); Wait(200); SendMessage(3);task slave() while (true) ClearMessage(); until (Message() != 0); if (Message() = 1) OnFwd(OUT_A+OUT_C); if (Message() = 2) OnRev(OUT_A+OUT_C); if (Message() = 3) Off(OUT_A+OUT_C); 写好之后,我们就可以把这个程序一次一个的下载到每个机械人那边。然后同时开机,4秒后看看谁当了master,谁当slave唷! 不过也是有极小的可能会没有leader, 这就需要更清楚的通讯协议了. 注意事项有两个问题须要小心处理首先是同时发出讯息的问题, 再来是从计算机下载程序到多台机械人所造成的问题. 让我们先说明第二个问题. 当程序下载过程中,机械人会响应计算机它是否完整收到讯息,计算机则根据这个来决定是否重传或续传. 关键在于计算机分不出收到的讯息是从那台机械人送来的! 所以, 如果两台机械人同时开着, 计算机所下载的内容会乱掉. 所以说下载程序的时候, 一定要确定只有一台机械人是开着的, 下载完就移开并关机. 另一问题是, 同一时间只能有一台机械人传送讯息, 否则讯息会漏接. 同一台机器人也没办法同时接收又发出讯息. 如果只有一个master来传送命令, slave只收命令的情形下, 是不会有这个问题的. 但是在两边有传有送的情形下, 这个问题就一定要好好考虑. 例如, 我们写一个程序让slave碰到障碍时, 会通知master, 再由master决定执行下一动作. 不过我们需要定义一个通讯协议来解决master和slave同时发出讯息的问题. 例如在master送出讯息后, 如果无法在规定时间内收到slave的响应, master会重传同一讯息. 以下就是程序的写法do SendMessage(1); ClearMessage(); Wait(10);while (Message() != 255);这里代码255是代表 ”确认” .当我们用到两台以上的 RCX 时, 我们希望只有我们想要的那一台去从 IR 接收讯号. 这时候用SetTxPower(TX_POWER_LO)就可以了, 它可以让 IR 发出的讯号变得很弱, 所以只有最靠近的那一台可以接收到讯号, 这在含有两台以上 RCX 的大机器人身上特别好用. 至于SetTxPower(TX_POWER_HI)则是让 IR 发出很强的讯号, 可以让很远的机器人接收到. 总结本章我们探讨了一些机械人之间的通讯问题. 通讯须要用一些特殊指令来传送, 接收, 和清除. 在此我们也学到定义通信协议是处理通讯问题中一项很重要的工作, 通讯协议在任何形式的通讯都扮演了很关键的角色. 也因为机器人通讯上的一些限制, 我们必须更小心来定义通讯协议唷!
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号