# 避障机器人4--转弯到位

小伙伴喊道:“暂停,你在墙角那里转了半天了,还玩不玩的!”
你听到了他们的声音知道他们的位置,一个转身,朝着他们“冲”过去……

# 情景分析

  1. 在上节的程序里,有一点容易忽略的逻辑。机器人只需要转身一点点,距离就会大于350毫米,下一次循环将会进入到减速环节。在减速环节稍微前进,之后又回到转弯环节,如此循环。仔细分析代码,机器人在转弯环节每次可能只停留了25毫秒(我们眨一下眼睛需要300毫秒哦),这对于避开障碍物足够吗?
  2. 我们将见到另外一个编程语言中经常出现的语句while,格式是while(条件){符合条件的指令}。是不是跟if语句很像?它跟if的区别是它将一直执行{}内的指令,直到条件不成立。对应积木
  3. 机器人转弯到什么程度合适呢?我们分析过,略多于350毫米是不合理的,要超出350毫米稍多一些。

# 流程解析

  1. 在上一节的程序中,if(距离小于350毫米){转弯}……,来让机器人在距离小于350毫米时转弯。
  2. 我们在转弯之后加入while(距离比350只多了一点点),来等待机器人转弯到合适的位置。
  3. while(){}的花括号中,我们没有事情可做,可以让它空着。
uml diagram

# 参考程序

  • oseppBlock IDE程序

  • Arduino IDE程序
#include <oseppRobot.h>

OseppRangeFinder U(2);
OseppTBMotor L(12, 11, HIGH);  //左边轮子,如果方向不对,要把HIGH换成LOW
OseppTBMotor R(8, 3, LOW);     //右边轮子,如果方向不对,要把LOW换成HIGH

void setup() {}

void loop() {
    if (U.ping() < 350) {
        L.forward(200);
        R.backward(200);
        while (U.ping() < 400) {
            //一直检测直到距离不小于400mm
        }
    } else if (U.ping() <= 700) {
        L.forward(map(U.ping(), 350, 700, 80, 200));
        R.forward(map(U.ping(), 350, 700, 80, 200));
    } else {
        L.forward(200);
        R.forward(200);
    }
    delay(25);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

# 运行结果

接通电源,上传程序后,拔掉USB线。打开电池开关,将机器人放到地上,机器人向前移动,接近障碍物时开始减速,“碰到”障碍物自动转弯。转弯的过程比上一节更干脆了。

# 课程解读

  1. while语句格式同if语句的第一个形式相同,不同的是while执行完成后会再次回到while判断条件。
  2. 机器人已经可以欢快地在房间里玩耍了,你也已经学会了程序的顺序执行,分支(选择)执行,循环执行。几乎所有的程序都可以由这三种控制结构实现。

# 拓展知识

  1. while还有另一个形式do{指令}while(条件),这个形式是先执行指令,再判断条件看是否需要再执行指令。{}中也可以是空的没有指令。

  2. 另一个比while更常用的循环语句是for语句,for语句比while要复杂,但是更强大。形式是for(表达式1;表达式2;表达式3){指令},执行过程:

    1. 求解表达式1
    2. 求解表达式2,如果表达式结果成立(或者结果不是0),则执行指令.如果不成立(或者结果是0)则循环结束,转到步骤5。
    3. 求解表达式3
    4. 转到步骤2继续执行
    5. 循环结束,执行for结构后面的程序
      例如,把1到100的数加起来:
int sum=0;
for(int n=1;n<=100;n=n+1){
  sum=sum+n;
}
1
2
3
4

代码使用了变量,会在后面的章节中有详细的描述。本系列教程中没有使用到for循环。

# oseppBlock操作视频

# ArduinoIDE操作视频