基于Arduino的智能小车自动并行泊车系统
2021-06-07荆鑫
荆 鑫
(1.黑龙江科技大学研究生学院,黑龙江 哈尔滨 150028 ;2.布达佩斯科技和经济大学电气工程与信息学院,匈牙利 布达佩斯 1114)
0 引言
自动汽车驾驶系统对提高驾驶员的安全和进一步减少交通事故中的伤亡产生了积极影响[1]。近年来,各种各样的传感器和控制器凭借成本低和精度高的优点,可以很容易解决现实生活中自动驾驶汽车的许多问题。目前,已经安装了半自动或全自动泊车辅助系统的汽车有福特福克斯、丰田普锐斯和梅赛德斯。特斯拉、奥迪和谷歌等公司也在向市场推出安全可靠的自动驾驶系统[1]。Arduino是一个操作方便、易于使用的开源编程平台[2],它可以在Windows、Macintosh OS X和Linux三大主流操作系统上运行。对于初学者来说,极易掌握,同时它在编程方面也有足够的灵活性。简单的开发方式使学习者能更快地完成项目的研究开发工作,大大节约了学习的成本,缩短了开发的周期。它具有C语言的开发环境,主要包括Arduino电路板和 Arduino IDE开发环境。选择Arduino作为智能小车控制器的原因是它能通过控制各种各样的传感器来感知周围环境,具有大量的可用库和丰富的接口,例如数字I/O口、模拟I/O口,同时它还支持SPI、IIC和UART串口通信。自动并行泊车技术需要小车精确控制移动轨迹以及仔细观察周围的环境,因此,通过Arduino实现自动并行泊车是一个可行的计划。
1 系统介绍
根据合理假设来编写泊车算法和放置超声波传感器。模拟小车在真实环境的道路右侧以恒定的转速向前行驶,准备寻找可用泊车位进行泊车。在这种情况下,假设小车的右侧由已经停放的车辆和泊车位组成,小车上共设置2个超声波传感器,分别设置在小车的正前方和右侧后方。在向前直行的过程中,右侧超声波传感器检测车辆与右侧障碍物的距离,判断该距离是否大于预设的泊车位宽度。如果车辆与右侧障碍物的距离达不到预设值,那么小车将继续行驶。如果宽度满足要求,那么小车继续行驶,从而测量泊车位的长度;如果长度也达到程序中设计的数值,那么小车停止前进,并执行并行泊车的动作。否则,小车会继续前进寻找合适的停车位。自主泊车过程如图1所示。
图1 自动泊车过程
2 系统硬件
2.1 ArduinoMega2560
Arduino是一个功能强大的控制器,它可以用来构建数字设备和交互对象,从而感知和控制周围的物理环境。ATmega2560是一款基于AVR增强RISC架构的低功耗CMOS 8位微控制器,它有54路数字输入/输出端口(其中15个可以作为PWM输出)和16路模拟输入,电路板如图2所示。通过pinMode()、digitalWrite()和digitalRead()等功能,Mega上的54个数字引脚都可以用作输入或输出。Arduino Mega 2560在5 V的电压下工作,可以通过3种方式供电,而且能自动选择供电方式。在自动泊车实验中,选择USB接口直接供电。Mega 2560作为小车的控制中枢,驱动小车的直流减速电机使小车按照设计者的意愿进行运动,超声波传感器也连接到Arduino板并集成到自动泊车系统中。因此,可以将程序上传至Arduino Mega 2560电路板,从而实现智能小车的自动泊车[3]。
图2 ArduinoMega2560
2.2 超声波传感器
在智能小车上搭载2个HC-SR04超声波传感器,分别放置在小车的正前方和右后侧,测量小车与前方障碍物和右侧障碍物的距离,该传感器可以在2 cm~400 cm的距离内提供测距功能,测距精度可以达到0.3 cm。HC-SR04有4个引脚,其中“Trig”引脚和“Echo”引脚与Arduino Mega 2560的数字口相连,并以高低电平的方式传输距离信息[4]。另外2个引脚为传感器供电。超声波传感器可以使智能小车在行进过程中及时发现障碍物,并及时引导智能小车转向,从而避开障碍物。
2.3 A、B相位编码器直流减速电机
采用尾部带A、B相位编码器的直流减速电机,该电机可以直接输出方波,不需要添加电路。在编写程序时,把前一个A、B相位的输出值保存起来,将其与下一个A、B相位的输出值做比较,循环往复,就可以得出码盘转动的方向和转速,再用码盘转动的方向和转速判断小车的行进方向和行进速度[5]。可以据此设计一个PID算法来保持小车左右电机的转速相同,使其稳定地向前行驶。
3 系统软件
3.1 超声波传感器测距程序设计
超声波测距装置的主要原理是根据发射超声波和接收超声波产生的时差测算小车与障碍物的距离[6]。超声波传感器向一定方向发射超声波,同时开始计时,超声波在空气中传播,遇到障碍物后超声波立即返回,超声波传感器收到反射波就会立即停止计时。已知超声波经过的总路程L=[(T×344)/2],则T=(2L)/344=0.0058L(T为时间)。具体原理如下:1)先在Trig端输入1个长为2 μs的低电平方波,再在Trig端输入1个长为10 us的高电平方波。2)输入方波后,传感器会自动发射8个40 kHz的超声波,检查是否有信号返回。如果有信号返回,那么发射超声波测距,Echo端的电平由0变为1,定时器开始计时。3)当返回的超声波被传感器接收时,Echo端的电平由1变为0,定时器停止计时,定时器记录的时间差即为超声波由发射到返回的时长。
3.2 电机转速PID控制程序设计
在小车行驶的过程中,保证小车笔直前进的前提是要保持小车左右电机的转速相同。PID调节器是一种算法简单、鲁棒性好和可靠性高的控制策略,适用于可建立精确数学模型的控制系统。在自动并行泊车系统中选择使用增量式PID控制算法。如图3所示,给定参考值r(t)和实际输出值c(t)构成控制偏差e(t),PID调节器通过线性组合将偏差的比例、积分以及微分构成控制量u(t),用控制量对被控对象进行控制。r(t)为预先设定小车电机的转速,c(t)为小车实际电机的转速,e(t)=c(t)-r(t)为转速误差,将e(t)作为PID控制器的输入、u(t)为PID控制器的输出,并作用到小车电机上。比例系数的作用是对速度偏差作出反应。电机转速偏差一旦产生就会使小车速度向偏差减少的方向变化。积分环节会消除静态误差,只要存在转速偏差,积分作用就会不断增大。微分环节的作用是阻止偏差的变化,偏差变化越快,微分环节的输出就越大[7]。
PID调节器通过改变输出PWM的值(范围为0~255)来改变电机的转速。r为设定转速,n为实际转速,u为PWM的输入。通过A、B相位测出电机的转速,与设定值比较得到转速误差,将转速误差送进PID调节器进行处理,最终消除小车的转速误差,使左右电机的转速相等。
3.3 自动并行泊车程序设计
小车以恒定的转速直线行驶,与右侧路沿保持固定距离d,此时变量park_status的值为0。当小车经过一个泊车位时,侧面超声波传感器将判断该泊车位的宽度是否大于设定的宽度B。如果宽度不够,小车将继续行驶;如果宽度足够,小车将继续行驶以测量泊车位长度L(如图4所示),此时变量park_status的值为1。右侧传感器首次测量到距离大于设定的停车宽度为t1时刻,变量park_status的值变为2。右侧传感器测量到距离小于设定的停车宽度为t2时刻,变量park_status的值变为3。再根据已知的电机转速就可以得出泊车位的长度。由此可以完成对泊车位的选择。泊车位的判断程序如下。
图3 PID调节器
在找到合适的泊车位后,小车开始倒车。首先,当变量park_status=4时,小车先向后倒退一段距离,这是为了留出缓冲区,避免在倒车时与其他障碍物碰撞。其次,让小车右侧电机停止转动,左侧电机向后转动,调整姿态后,向后倒退。再次,保持小车左侧电机停止转动,右侧电机向后转动。此时小车车体几乎全部进入泊车位。最后,只需要对小车姿态进行微调,就可以完成泊车,该操作完成后给变量park_status赋值为5。当变量park_status=5时,2个传感器测量小车与右侧障碍物和前方障碍物的距离。如果距离大于设定值,就再次微调小车的姿态,直到两侧距离都小于设定值。完成之后给变量park_status赋值为6,小车停止运动,完成整个自动泊车过程。自动泊车的程序如下。
图4 测量泊车位长度
4 测试
测试时将小车放置在模拟道路的起点,在小车的前方右侧预留1个足够小车泊车的泊车位。如果小车在不碰撞的情况下完全进入泊车位,就说明自动并行泊车系统设计成功。由于每次测试时小车的运动轨迹并不完全一致,例如电机编码器的精度限制和小车的车轮滑移都会导致小车的运动轨迹发生改变。因此多次测试泊车过程并手动调试代码后,消除了实际误差,证明自动泊车实验成功。
5 结论
该设计开发的自动并行泊车系统具有良好的性能。根据测试的成果,该设计实现了基本目标。但是仍有许多方法可以提高自动泊车系统的质量和性能,例如添加其他传感器(激光雷达传感器)或者使用更高级的算法(SLAM算法)等。综上所述,在现代社会中,自动泊车系统是非常有前景的,但是由于真实交通的不可预测性,因此还需要对该系统进行更多的研究。