L11.机器人对话.doc

上传人:M****1 文档编号:549340965 上传时间:2024-02-02 格式:DOC 页数:12 大小:45.01KB
返回 下载 相关 举报
L11.机器人对话.doc_第1页
第1页 / 共12页
L11.机器人对话.doc_第2页
第2页 / 共12页
L11.机器人对话.doc_第3页
第3页 / 共12页
L11.机器人对话.doc_第4页
第4页 / 共12页
L11.机器人对话.doc_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《L11.机器人对话.doc》由会员分享,可在线阅读,更多相关《L11.机器人对话.doc(12页珍藏版)》请在金锄头文库上搜索。

1、LESSON 10 机器人对话两台以上的机器人如要一起合作(或是对打)是要透过红外线相互通讯的.我们可以利用这项技术组装一台有两台RCX, 最多可以装六个马达, 六个感应器的大型机器人. (或用第九章的技术来加装更多的东西). 机器人之间的相互通讯的关键就是红外线埠, 机器人可用SendMessage()这个指令将0-255的一个数字透过红外线端口送出, 机器人会收到这个数值定储存起来. 而程序可用Message()这个指令检查最近收到的讯息是什么, 然后根据这个数值机器人进行一些特定的动作. 下命令在一群机器人中, 带头的我们叫它master, 其它的都叫slave. master会不时的送

2、出命令, 由slave来执行. 有时候slave也须要回报讯息给master(例如感应器的数值). 这时候, 我们需要二个程序, 一个给master, 一个给slave. 我们先从简单的开始吧! 假设只有一个slave, 而slave能执行三个动作前进, 后退和停止. slave的程序包含一个的简单的循环. 这循环会用ClearMessage() 指令将最近的讯息重新设定为 0. 再来它会一直等待直到讯息值不为 0为止. slave 会根据讯息值来决定它到底要做什么. task main() / SLAVE while (true) ClearMessage(); until (Message

3、() != 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,

4、然后master. 如果有数个slave, 也要一个一个进行, 以确定他们的程序都一样. 能让机械人根据程序所定义的内容来对话就是所谓的” 通讯协议(protocol)” 这里我们规定1是前进, 2是后退, 3是停止. 当我们要处理一大堆讯息时, 通讯协议就更要好好定义, 省得混淆. 例如, 如果我们有很多slave的时候, 我们可以定义一个通讯协议来发出一组有间隔的两个数字 :master送出的第一个讯息是slave的编号, 第二个讯息是要它做什么动作的指令. 这时候, 每个slave 就要有一个它自己的号码啦! 这只要让每个 slave 有一点点(例如常数的不同)的小差异就行了.选出一个头

5、子master当我们要用到一个以上的机器人时, 每一个机器人都要有它自己的程序. 如果我们可以只下载一个程序到所有的机器人的话, 情况会比较好控制. 问题是, 谁来当master其实答案很简单: 让它们自已选出一个master来就好啦. 这里有个办法是用随机数产生等待时间, 这样第一个送出讯号的机械人就当master, 而其它的当slave. 两台机器人在同一时间送出讯号的可能性很小, 您可以拟定更复杂的计划来处理这个状况然后进行第二次选举.task main() ClearMessage(); Wait(200); / make sure all robots are on Wait(Ran

6、dom(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

7、(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, 这就需要更清楚的通讯协议了. 注意事项有两个问题须要小心处理首先是同时发出讯息的问题, 再来是从计算机下载程

8、序到多台机械人所造成的问题. 让我们先说明第二个问题. 当程序下载过程中,机械人会响应计算机它是否完整收到讯息,计算机则根据这个来决定是否重传或续传. 关键在于计算机分不出收到的讯息是从那台机械人送来的! 所以, 如果两台机械人同时开着, 计算机所下载的内容会乱掉. 所以说下载程序的时候, 一定要确定只有一台机械人是开着的, 下载完就移开并关机. 另一问题是, 同一时间只能有一台机械人传送讯息, 否则讯息会漏接. 同一台机器人也没办法同时接收又发出讯息. 如果只有一个master来传送命令, slave只收命令的情形下, 是不会有这个问题的. 但是在两边有传有送的情形下, 这个问题就一定要好好

9、考虑. 例如, 我们写一个程序让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 发出很强的讯号, 可以让很远的机器人接收到. 总结本章我们探讨了一些机械人之间的通讯问题. 通讯须要用一些特殊指令来传送, 接收, 和清除. 在此我们也学到定义通信协议是处理通讯问题中一项很重要的工作, 通讯协议在任何形式的通讯都扮演了很关键的角色. 也因为机器人通讯上的一些限制, 我们必须更小心来定义通讯协议唷!

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号