程序大致分为5个部分。
01
初始化
程序初始化部分,需要对人工智能算法和模型进行初始化,然后设置程序中使用到的变量,以及对电机和舵机管脚进行定义。
舵机初始化:前桥舵机(变量qian)定义到A2管脚,后桥舵机(变量hou)定义为A3管脚。
初始化多层神经网络模组,启用多层神经网络函数库,作用是感知图像,处理信息,最终做出决策。
初始化边缘检测模组,启用边缘检测函数库,作用是剔除无效信息,提取边缘特征。
初始化霍夫转换模组,启用霍夫转换函数库,作用是提取图像中的直线。
启动无人驾驶,启动无人驾驶功能。
电机初始化:
写入数字管脚2、4、7、8分别控制四个麦轮电机的初始转动方向;
写入脉冲宽度调制管脚(PWM)~10、~5、~6、~9分别控制四个麦轮电机的初始速度。
(注意:驱动板电机接口连接须与程序内保持一致,以保证电机转向正确)
02
舵机函数
Arduino控制舵机的方法有两种:
一种是通过Arduino的普通数字传感器接口,产生占空比不同的方波,模拟产生PWM信号进行舵机定位;
第二种是直接利用Arduino自带的Servo函数,进行舵机的控制。
由于无人车同时使用了4路电机和2路舵机,因此PWM接口无法满足同时驱动的要求,此时我们就无法通过直接利用Arduino自带的Servo函数,对舵机进行控制了,因此需要通过使用普通数字传感器接口,产生占空比不同的方波,模拟产生PWM信号进行舵机定位。
设定一个函数,并让此函数可编辑两个函数分别是 “servopin(管脚名称)”、“myangle(设定角度)”;
声明一个变量“pulsewidth(脉冲宽度或延时时间)”;
将角度转化为500-2480的脉冲宽度值(例如:如果想让角度转弯30度则函数可以理解为30X11+500=830脉冲宽度);
目标管脚设定为高;
脉冲宽度即延时时间为830微妙;
设定目标管脚为低;
脉冲宽度延时剩余时间为20000-830=19170;
经过上述操作后,我们就可以在后续的函数中,分别设置前桥和后桥舵机的角度了。
这里解释下后面为什么是50次循环?
函数的逻辑相当于通过波段控制电压,如果写20或者30的话波段比较短,50波段相对长一点电压更稳定,更大的数值延迟又会有点长,故50是一个相对合适的值。
03
巡线函数
这一部分程序,主要用于无人车在没有路标时的自动巡航场景。
摄像头侦测车辆距离道路两侧边线的距离:
当左侧距离>右侧距离时,车辆位置偏向于道路右侧,程序里调用左转函数进行矫正;
当左侧距离<右侧距离时,车辆位置偏向于道路左侧,程序里调用右转函数进行矫正;
非上述两种情况时,车辆位置在道路中部区域,程序里调用直行函数,保持直行。
a为车道左侧边线距离,b为车道右侧边线距离,以40%阈值为例,二者距离关系如下表所示(示例程序为43%)。
阈值对应关系:
阈值越小,无人车调整时机距对应一侧边线越早,距离相关边线越远;
阈值越大,无人车调整时机距对应一侧边线越晚,距离相关边线越近。
04
路标识别
这一部分程序,主要用于当无人车侦测到路标时的情况:
当无人车发现车道,未发现交通标志时,则执行第三部分巡线函数;
当无人车发现车道,同时侦测到交通标志,且当交通标志图标大小达到临界比例时(依据近大远小的规律,路标占到摄像头侦测画面一定比例时),则执行下方switch case语句,即发现何种路标,执行何种动作(调用不同的控制函数),根据实际需求进行编程即可。
05
控制函数
这部分程序主要用于控制前桥、后桥舵机和4路麦轮电机,通过多种组合运动,使无人车朝预定轨迹行驶,以示例程序为例,我们分别对常规运动轨迹进行讲解。
舵机函数变量qian,可以控制前桥舵机角度;
舵机函数变量hou,可以控制后桥舵机角度;
管脚7,~6,左前轮(L1)
管脚8,~9,左后轮(L2)
管脚4,~5,右前轮(R1)
管脚2,~10,右后轮(R2)
2,4,7,8,四个数字管脚,控制电机转动方向(电平高低根据电机安装方向而定);
~5,~6,~9,~10,四个PWM管脚,控制电机转速。
1.前进
前桥舵机和后桥舵机保持90°,4个麦轮同时向前转,速度100。
2.后退
前桥舵机和后桥舵机保持90°,4个麦轮同时向后转,速度100(通过改变数字管脚高低电平使电机反转)。
3.停止
前桥舵机和后桥舵机保持90°,4个麦轮同时向前转(此时电机转动方向不影响效果),速度0(通过改变PWM管脚数值控制电机转速)。
4.左转
前桥舵机向左转15°(90°-15°=75°)(90°为舵机居中位置);
后桥舵机向右转10°(90°+10°=100°)(后轮转向与前轮相反);
4个麦轮同时向前转,为了方便无人车更顺畅的向左转弯,此时设置电机差速,靠近弯道内侧轮子转速低于外侧轮子转速,速度外侧设置为100,内侧设置为70(差速大小参照弯道曲率,内侧轮转速越低,无人车转弯半径越小,反之同理)。
5.右转
前桥舵机向右转15°(90°+15°=105°)(90°为舵机居中位置);
后桥舵机向左转10°(90°-10°=80°)(后轮转向与前轮相反);
4个麦轮同时向前转,为了方便无人车更顺畅的向右转弯,此时设置电机差速,靠近弯道内侧轮子转速低于外侧轮子转速,速度外侧设置为100,内侧设置为70(差速大小参照弯道曲率,内侧轮转速越低,无人车转弯半径越小,反之同理)。
6.左平移