# 避障机器人3--转个弯

犹豫过后,你转个身,继续向前面摸索……

# 情景分析

  1. 上一节机器人减速前进到离障碍物350毫米的地方停下来了,需要我们帮助它才会继续走,现在它要学会自己处理。
  2. 还要修复一个bug,将见到if语句的第三种形式:if(条件1){条件1的指令}else if(条件2){条件2的指令}else{都不符合条件时的指令}。我们增加第二个条件,只有在350到700毫米时,才进行减速。对应的积木 ,通过连续点击 可以把if积木变成它。

# 流程解析

  1. 在上一节的程序里,将if语句改成if(){}else if(){} else{}格式。每次程序从头到尾执行,都有3种情况。
  2. 在if(障碍物距离小于350毫米)语句的条件成立时,将执行if(){}花括号内的指令,上一节机器人停止移动。我们现在将它改为转弯。其中一个马达前进,另外一个后退,机器人就会转弯。
  3. 为了修复关于map函数bug,我们需要给减速代码添加条件,else if(障碍物距离小于等于700毫米),将会执行else if(){}花括号中的指令。将map函数放置在这里,来让机器人减速。
  4. 否则距离就是大于700,执行else{}花括号中的指令。以合适的速度前进。
  5. 暂停一小会,重复步骤2到步骤4。
uml diagram

# 参考程序

  • osepp Block 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);   //左边轮子用200速度前进
        R.backward(200);  //右边轮子用200速度后退,机器人会向哪边转身?
    } else if (U.ping() <= 700) {
        //不小于350,并且小于700
        L.forward(map(U.ping(), 350, 700, 80, 200));
        R.forward(map(U.ping(), 350, 700, 80, 200));
    } else {
        //距离大于700时,用200速度前进
        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

# 运行结果

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

# 课程解读

  1. 每次使用函数时,都要考虑给它的要求,如果不注意,可能会得到意外结果。
  2. if-else_if结构中,如果前面的条件成立了,就不会再检查后面的条件了。else ifelse都不会执行,也不会计算条件。比如距离小于350时,else if中的U.ping()是不会执行的。
  3. if-else_if结构中,要注意顺序,例如程序if(距离小于700){}else if(距离小于350){这里的指令永远都不会得到执行},小于350的数字,必然小于700,else if成立,if也肯定成立,所以只会执行if中的代码。
  4. 你能不能加入一些代码,在转弯时把控制器自带的LED点亮,其他时候让LED熄灭?

# oseppBlock操作视频

# ArduinoIDE操作视频