# 相扑机器人1--基本功能

巡线规定了路线。相扑机器人则只指定范围,运动路线很自由。只要不出界就可以。正因为如此,可以有很大的想象空间,我们可以考虑和实现许多策略。但首先,我们先来让机器人实现最基本的要求,进攻目标,并保证自己不出界。

# 情景分析

  1. 同巡线不一样,相扑机器人大部分时间都不靠近胶带,也就不用根据偏离胶带来计算速度。只需要检测是否碰到胶带就可以了。同巡线机器人系列一样,开机时放置在纸张上,用变量记录一个参考值。后面读取传感器后,只要跟参考值相差不大,就判定没有碰到胶带。
  2. 策略是这样的:任何时候,如果两个传感器都碰到胶带,机器人后退,左边碰到胶带就右转,右边碰到胶带左转。没有碰到胶带机器人原地转弯搜索目标,发现目标后前进将它进推出边界。

# 流程解析

  1. 程序开始需要定义变量:
    • int P = 0,纸张参考值。
    • boolean SR,右边传感器是否在胶带上。
    • boolean SL,左边传感器是否在胶带上。
    • boolean SU,是否发现目标。
  2. 开机后记录纸张参考值到P,我们只需要用P来判断是否碰到胶带。
  3. 程序进入loop,读取分别读取两个传感器并判断是否碰到胶带SR = abs(analogRead(A0) - P) > 300;SL = abs(analogRead(A1) - P) > 300;。对于胶带的判断比较随意,只要和纸张的参考值差距300以上,就判定为在胶带上。注意保持纸张干净。
  4. 读取超声波传感器,并判断有没有发现目标SU = U.ping() < 600,600毫米内有东西就判定为发现目标。
  5. 如果两个传感器都碰到胶带,机器人就后退,如果是单边碰到,就向另一边转弯。
  6. 如果没有碰到胶带,目标存在,机器人前进,将目标推出边界。
  7. 如果也不存在目标,机器开始右转,搜索目标。
  8. 重复步骤3到步骤7。
uml diagram

# 参考程序

#include <oseppRobot.h>

OseppTBMotor L(12, 11);
OseppTBMotor R(8, 3, LOW);
OseppRangeFinder U(2);

int P = 0;   //开机时记录的纸张感应值作为参考
boolean SR;  //右边传感器是否在胶带上
boolean SL;  //左边传感器是否在胶带上
boolean SU;  //是否发现目标

void readSensor() {
    //只要和纸张的参考值差距300以上,就判定为在胶带上。
    SR = abs(analogRead(A0) - P) > 300;
    SL = abs(analogRead(A1) - P) > 300;
    SU = U.ping() < 600;  // 600毫米内有东西就判定为发现目标
}

void setup() {
    // 开机时,A0,A1都是纸张的感应值。
    P = analogRead(A0);  //随便记录一个作为纸张参考值
}

void loop() {
    readSensor();         //调用传感器检测函数
    if (SL && SR) {       //两个传感器都碰到了胶带
        L.backward(150);  //后退
        R.backward(150);
    } else if (SL) {     //左边传感器碰到胶带
        L.forward(150);  //右转
        R.backward(150);
    } else if (SR) {      //右边传感器碰到胶带
        L.backward(150);  //左转
        R.forward(150);
    } else {                 //没有碰到胶带
        if (SU) {             //发现目标
            L.forward(150);  //前进
            R.forward(150);
        } else {             //右转弯来继续搜索
            L.forward(100);  //搜索速度要慢一些
            R.backward(100);
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44

# 运行结果

机器人放置在胶带围成的区域中心,打开电源,尝试放个纸盒在中间,机器人对纸盒发起进攻。

# 程序解读

不错,基本都跟我们预料的差不多。只是机器人靠近胶带时,就有问题了。没有碰到胶带,没有目标时默认右转,然后右边红外反射传感器会碰到胶带。按照碰到胶带后的逻辑,机器人会开始左转。片刻之后离开胶带,机器人没有发现目标,会马上进入了默认的右转搜索然后又碰到胶带。就这样一直在胶带边沿徘徊。程序的逻辑不完整。

# ArduinoIDE操作视频