AI Car 第一次展示报告
实现的功能
基础功能
- AI Car拼接组装完成
- 超声波传感器功能启用
- 蓝牙模块启用
- 使用蓝牙模块用手机和电脑操控小车
- 基于超声波传感器测距的随机游走
附加功能
- 自动走迷宫
- 识别运动或静止物体并作出相应动作
功能介绍
基础功能
功能 | 实现效果 |
---|---|
拼接组装 | 小车配有左右两个带马达的前进轮与一个导向轮,供电采用四节5号电池,利用Arduino模块附有超声波模块与蓝牙模块 |
超声波传感器 | 利用声速与时间的关系,计算出与前方物体的距离 |
蓝牙模块 | 可以利用电脑或者Android手机对小车进行相应操控 |
随机游走 | 能在地上随机行走,碰到障碍物转弯或者掉头,保证全程不碰到障碍物 |
附加功能
功能 | 实现效果 |
---|---|
自动走迷宫 | 利用障碍物摆一个迷宫,有一个入口和一个出口,只要道路够宽敞,小车可以在较短的时间内从一个口进入,另一个口出来,期间不碰到迷宫的边缘障碍物 |
识别运动物体 | 随机游走时,判断前方物体是障碍物还是运动物体,如果是障碍物就绕开随机走,如果是运动物体就加速冲上去直到撞击为止,之后再继续随机游走 |
功能原理
随机游走
每次loop循环的时候都通过超声波计算与前面物体的距离。距离计算公式推导如下:
float calculate_distance() {
float VoiceSpeed = 0.034; // 因为声速是340m/s,换算成cm/μs即为0.034 cm/μs
float Distance = Time * VoiceSpeed; // 距离等于时间乘以速度
float ActualDistance = Distance / 2; // 由于是往返距离故为原距离的一半
return ActualDistance; // 即为最终用作判断的距离
}
那么在得到距离之后,我们再设定安全行驶的阈值,在距离小于对应阈值之后,就自动进行转弯:
// 由于小车的反应速度与马达速度切换效率均较低,故阈值应该设定得大一些
#define THRESHOLD 40 // 比如,设定阈值为40cm
if (ActualDistance < THRESHOLD) {
// 利用距离是否是2的倍数来达到随机转弯的效果
if (ActualDistance % 2) {
turnLeft(); // 是2的倍数则向左转弯
}
else {
turnRight(); // 不是2的倍数则向右转弯
}
}
自动走迷宫
由于迷宫对相应速度与转弯的灵活性相对较高,故需要在随机游走的基础之上对转弯速度进行适当得增大,碰到障碍物的阈值减少,对直行速度进行适当地减小来达到能行走迷宫的灵活性,因为硬件相应时间的限制,无法使小车在高速运行时快速变换方向。
其基本原理与随机游走相同,主要更改的是相关参数数值。
识别运动物体
在此功能中,小车分为两个状态,正常状态(即随机游走)与非正常状态(冲撞运动物体),利用一个全局变量来标识:
bool isNormal = true; // 标识是否为正常状态
对于正常状态与非正常的状态即依托前方物体是否处于运动状态。
每次loop调用超声波模块接口的时候就计算与前方物体的相对速度差,如果前方物体与小车的速度差乘以间隔时间约等于小车的每次前进距离的话,那么就视为静止物体;如果前方物体与小车的速度差乘以时间间隔与小车的每次前进距离大于一定阈值,那么就视为运动物体。
void chooseState(int difference) {
if (difference() > NORMAL_STATE) {
isNormal = false;
}
else {
isNormal = true;
}
}
在正常状态时,小车进行随机游走,在非正常状态时小车直接冲撞运动物体,直到撞上再掉头回复正常状态。
loop主函数逻辑如下:
void loop() {
int currentDistance = calculate_distance();
difference = calculate_difference(formerDistance, currentDistance);
formerDistance = currentDistance;
chooseState(difference);
run()
}
实现效果
详见文档视频
未来展望
- 实现图像识别功能
- 实现运动物体检测功能
网友评论