# 避障机器人4--转弯到位
小伙伴喊道:“暂停,你在墙角那里转了半天了,还玩不玩的!”
你听到了他们的声音知道他们的位置,一个转身,朝着他们“冲”过去……
# 情景分析
- 在上节的程序里,有一点容易忽略的逻辑。机器人只需要转身一点点,距离就会大于350毫米,下一次循环将会进入到减速环节。在减速环节稍微前进,之后又回到转弯环节,如此循环。仔细分析代码,机器人在转弯环节每次可能只停留了25毫秒(我们眨一下眼睛需要300毫秒哦),这对于避开障碍物足够吗?
- 我们将见到另外一个编程语言中经常出现的语句
while
,格式是while(条件){符合条件的指令}
。是不是跟if语句很像?它跟if的区别是它将一直执行{}内的指令,直到条件不成立。对应积木 - 机器人转弯到什么程度合适呢?我们分析过,略多于350毫米是不合理的,要超出350毫米稍多一些。
# 流程解析
- 在上一节的程序中,
if(距离小于350毫米){转弯}……
,来让机器人在距离小于350毫米时转弯。 - 我们在转弯之后加入
while(距离比350只多了一点点)
,来等待机器人转弯到合适的位置。 - 在
while(){}
的花括号中,我们没有事情可做,可以让它空着。
# 参考程序
- 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 运行结果
接通电源,上传程序后,拔掉USB线。打开电池开关,将机器人放到地上,机器人向前移动,接近障碍物时开始减速,“碰到”障碍物自动转弯。转弯的过程比上一节更干脆了。
# 课程解读
- while语句格式同if语句的第一个形式相同,不同的是while执行完成后会再次回到while判断条件。
- 机器人已经可以欢快地在房间里玩耍了,你也已经学会了程序的顺序执行,分支(选择)执行,循环执行。几乎所有的程序都可以由这三种控制结构实现。
# 拓展知识
while还有另一个形式
do{指令}while(条件)
,这个形式是先执行指令,再判断条件看是否需要再执行指令。{}中也可以是空的没有指令。另一个比while更常用的循环语句是for语句,for语句比while要复杂,但是更强大。形式是
for(表达式1;表达式2;表达式3){指令}
,执行过程:- 求解表达式1
- 求解表达式2,如果表达式结果成立(或者结果不是0),则执行指令.如果不成立(或者结果是0)则循环结束,转到步骤5。
- 求解表达式3
- 转到步骤2继续执行
- 循环结束,执行for结构后面的程序
例如,把1到100的数加起来:
int sum=0;
for(int n=1;n<=100;n=n+1){
sum=sum+n;
}
1
2
3
4
2
3
4
代码使用了变量,会在后面的章节中有详细的描述。本系列教程中没有使用到for循环。