直接把电机接到单片机的Gnd和 PWM Pin 9接口,然后在程序中直接向 Pin 9输出就可以让电机运转了。
int value = 0;
int ledpin = 9;
void setup() {
// nothing for setup }
void loop() {
for(value = 0 ; value <= 255; value+=5) {
analogWrite(ledpin, value);
delay(30); }
for(value = 255; value >=0; value-=5) {
analogWrite(ledpin, value);
delay(30); } }
上面的程序用不同的输出值驱动电机,可以看到电机的旋转效果。单片机和主要部件的验证基本就完成了,下一步要开始程序设计了。
软件设计
思路: 在进行代码编写之前,想找到一种简介的实现低级智能机器人的方式。目前的工业机器人采用的是精确控制的方法,在程序中固化
每种处理逻辑。用程序员的思维来完成对机器人的操作。
对于程序员来说,机器人无非就是外接了物理传感输入和运动控制输出的一台电脑,不管是64位多核CPU或者8位单片机,只是性能
的不同而已。理论上,都能通过程序设计来达到预定的目标。如果按照计算机上的普通程序来设计,那么大量的功能代码会相互耦合,每次为了增加一个新的运动功能或者任务,都需要编制新的代码,而新的代码给原来的环路反馈系统带来新的逻辑分支,所有的步骤都得经过程序员的验证和设计。这样的设计对于精确计算的PC程序或者擅长固定场景精确动作的工业机器人来说,都没有问题。但是对于这里要实现的“小强一号”机器人,是处在一个动态的变化环境当中,如果按照传统的软件设计逻辑,会存在大量耦合的逻辑分支,导致程序扩展性很差。举例来说,为了完成一个沿墙壁行走的功能,必须对各种传感器输入情况进行判断,然后做出预置的动作序列。
如果要执行的动作和需要判断的情况很多,那么程序逻辑分支就比较复杂,扩展性也比较差,有没有更好的适合机器人软件设计的方法呢?换一种思维来思考的话,我们要做的不是电脑程序,只是一个实验机器人。这个实验机器人能做到自然界昆虫级的“智能”就很不错了。 试想,一只蚂蚁,一只蟑螂会去思考这么复杂的逻辑分支吗?去考虑各种情况下应该采取的动作? 不太可能。我们用了复杂的想法去解决简单的事情。机器人和计算机的主要区别在于,计算机是按照预先规划的指令运行,而机器人需要根据变化的环境选择合适动作。我们首先可以简化动作模型,我把机器人的执行任务分成3个层次:任务-》行为-》动作
任务——机器人完成的一个期望目标,比如“在一个范围内收集地面上的垃圾”可以界定为一个机器人的任务。行为——行为是对任务的分解,行为是机器人根据环境变化选择要做什么。比如碰到墙壁需要进行躲避。电源不足需要充电,就可以划分为一个行为。动作——机器人最终控制电机等输出设备做出的动作,比如前进,后退,转弯。转动摄像头都可以划分成一个动作单元。说明:任务由一系列的行为构成;行为有一个或者多个动作组成,动作是立即执行的最小单元。在任意一个时刻,只有一个动作可以得到执行。软件实现的对象就是分解出简单的行为,针对每个行为单独实现,互相之间无干涉、无耦合。当多个行为要输出互相矛盾的动作时,通过一个行为优先级表来决定优先级高的行为来做出动作。在这个思路中,参考了基于行为编程的理论,关于详细的基于行为编程的描述,可以在网上搜索“Behavior-based robotics”。
通过这种设计思路,可以实现对动物反射特性的模拟,不需要把精力放在复杂的逻辑处理上,只需要根据分解出的基本行为实
现一个一个小的行为单元。每个行为单元只关心自己的传感输入和需要输出的控制动作就行了。确定了设计思路,下一部分开始针对小强一号来设计软件了。
参考资料,有兴趣的可以阅读:
? http://www-robotics.usc.edu/~maja/publications/mitcs.ps.gz (这篇文章描述了如何分解行为,需要安装 GSView)
? ?
http://www.research.ibm.com/people/j/jhc/pubs/jhc-design.pdf http://www-robotics.usc.edu/~maja/bbs.html
? 《基于行为的机器人实战指南》 中译版
小强一号结构非常简单,传感器只采用了个红外距离传感器作为机器人的“眼睛”,使用两个电机进行运动,距离传感器连接在一个舵机上,作为“头部”可以左右范围的转动。机器人的行为最简单的就是巡航行为,巡航行为就是给电机电流,电机转动而已。那么发生碰撞怎么办?在巡航行为中,不用考虑碰撞,否则又会变成复杂的判断逻辑。为了避免碰撞,设计一个独立的避免碰撞的“逃离”行为。逃离行为从距离传感器获取障碍物距离信息,简单的判断前方是否有障碍,进行避让。由于多个行为都可能控制电机,所以需要一个仲裁器根据优先级来判断到底执行那个逻辑部分输出的控制指令。
下面用图来说明这种情况:
如果需要增加其他更加复杂的智能,那么只需要增加对应的行为单元就行了,不用修改已有的逻辑结构。每个行为单元只需要处理自己关心的传感器和需要控制的动作执行部分。这种方式的好处就是程序逻辑变得非常简单,功能单元之间不会存在互相影响的弊端。
下面的代码是“巡航”行为: