一、开发背景
2011年初,当时我的毕设”基于嵌入式系统的无线环境监测机器人”需要一套用于自主避障的传感方案。当时候选的传感器有:GP2D12、红外收发管、超声波传感器、激光传感器。红外收发管测量距离较近,受环境光影响严重;激光传感器受反射面材质影响较大,而且不易处理;GP2D12虽也是基于红外原理设计的,但经过了调制与滤波,所以性能相比红外收发管要好很多,可其输出是模拟量需要额外的信号调理,且其输出电压与距离呈非线性,不易处理,另外价格也较高(90元左右)。所以最终确定了使用超声波传感器模块,原因有以下几个:
1)精度较高,可达3mm;
2)测量结果与其输出呈线性关系;
3)测量距离范围大,可达5m;
4)价格相对便宜,30元左右;
5)输出为数字电平,易于处理。
二、硬件设计
我所设计的机器人需要有前方180度范围的障碍物探测能力,而超声波模块的检测角大约有30度左右,故可以在180度范围内部署6个互成30度排列的超声波传感器。但是这种方式得到的分辨率极低,每次采集只能得到6个采样点。如果要提高采样点的数量,就必须增加超声波传感器的数量,这样空间上就会十分拥挤。
为了解决分辨率与超声波数量之间的矛盾,我参照雷达的工作原理,设计了该超声波雷达模块。该模块由舵机、支架、激光管、超声波模块组成,其组成如下图所示:
Figure 1. 超声波雷达顶视图
Figure 2. 超声波雷达左视图
其中舵机为MG995模拟舵机,其旋转角在180度,速度为0.13秒/60度。支架部分为一块PCB电路板,完成超声波模块的物理、电气连接,同时也实现了与舵机的物理连接,使得支架板可与舵机同步旋转;两个平行放置的激光管在效果图中未画出,是为今后升级至视觉测距预留的;三个超声波模块均匀排列,采用三个可以加快扫描速度,而间隔60度使每个传感器负责60度的测量范围,并且不会相互干扰。
支架板的PCB图如下所示,P11、P22、P33安装超声波模块,J1为外部接口:
Figure 3. 支架PCB图
最终实物图如下图所示:
Figure 4. 超声波雷达实物图
三、工作原理
超声波雷达有两种工作模式:一种为静态模式,一种为扫描模式。
工作在静态模式时,支架平台不移动,这种情况下可以快速采集周边障碍物状态,但分辨率较差,只能得到左、中、右3个采样点。
而工作在扫描模式时,舵机带动支架平台作扫描运动,每隔1度进行一次采样。这种模式下分辨率较高,但是一次扫描周期较长,无法在运动中测量。这种模式下,支架平台的运动情况如下:
Figure 5. 工作在扫描模式
由上可知,静态模式和扫描模式各有利弊。在实际使用中,工作在静态模式即可进行简单的避障,而在遇到周边环境较为复杂的情况时,则切换到扫描模式进行全面扫描,从而实现避障行为。
支架平台的旋转是通过舵机来实现的,舵机是一种角度控制元件,常用于航模中。舵机的输出角度与其信号输入有关,该信号周期一般为50Hz,其脉宽就决定了舵机的旋转角度。对于MG955,当Ton=1500us时,舵机旋转至中心位置;Ton=1000us左右时旋转至左45度位置;Ton=2000us时旋转至右45度位置。其他角度依次类推,呈线性关系。
Figure 6. MG955舵机
超声波模块采用市场上常见的US100超声波模块,使用时首先给Trig脚一个10us以上的高电平,之后等待Echo为高,并测量Echo高电平的时间t,所测距离可由以下公式得到:\(s = (t * V_{sound}) / 2\)
Figure 7. 超声波模块US100
四、软件设计
该超声波雷达平台的软件使用AVR-GCC开发,基于Germs SDK。Germs是本站一个基于ATmega系列单片机的SDK,旨在提高AVR项目的开发速度。
软件设计的整体思路是:在内存中开辟一个180单元的缓冲数组,每个数组单元与角度一一对应。当扫描开始后,控制舵机由-30度方向向+30度方向旋转,每次步进一度,每步进一次,依次采样三个超声波模块的距离值,并保存在对应的缓冲数组中。0~59度范围由左方超声波传感器进行采集,60~119度由中间传感器负责采集, 120~179度由右方传感器采集,总计180度。该部分程序代码如下:
int i = 0, j = 0; int distance[180]; for ( i = -30; i <= 30; i++ ) { server_setdegree(i); distance[j] = ultrasonic_getdistance(0); distance[j+60] = ultrasonic_getdistance(1); distance[j+120] = ultrasonic_getdistance(2); j++; }
程序中包含两个子函数:server_setdegree()与ultrasonic_getdistance()。其中server_setdegree()通过修改PWM的占空比,控制舵机的旋转角度;而ultrasonic_getdistance()用于对指定超声波通道进行一次触发-采样。
超声波传感器的量程为:5-5000mm,以声速为340m/s计算,对应的高电平时间应为29.4us~29411.8us,使用tick为1us的16位定时器即可准确测量该时间。实际因资源受限只能使用1个tick为1us的8位定时器模拟16位定时器,对应精度为340m/s*1us=0.34mm,可以满足系统要求。
将一次实验采集到的数据通过串口发送至上位机,并通过Excel展示,得到以下距离分布图:
Figure 8. 超声波雷达距离测量图
将以上测量图与实际环境比较,大体符合实际情况。
五、误差分析
该系统的误差有以下两个方面:
1、距离误差,即测量的距离与实际距离之间的误差;
2、角度误差,即障碍物的角度与实际角度之间的误差。
导致以上两个误差的原因,我认为有以下几个方面:
1、定时器误差
在读取超声波模块返回时间时,是以查询方式进行的,故存在延时;另外定时器为离散计数,在时间上非连续,也存在±1 LSB的量化误差。
2、余波干扰
因为超声波会在空间中不断反射、震荡并逐步衰减,所以有可能导致本次的采集结果为上一次的余波,造成误差。
3、互扰
多个超声波模块如果同时工作,也会相互干扰,这已经通过分时复用的方式进行了避免。
4、声速误差
声速是受温度影响的,温度越高,声速越快,在运算时应根据当前的环境温度进行一定的补偿。声速与温度的近似关系是:V = 331.5 + 0.607*T,在室温25度的情况下为346.675m/s。所选用的超声波模块内部已经进行了温度补偿,故程序中不需要重复进行该工作。
5、计算误差
程序在计算时以浮点数方式运算,也存在一定的计算误差。经实际测量,雷达的精度在距离较近时比较准确,在3mm以内;而在距离比较远时则误差较大,会发生跳动。这可能是因为超声波指向性不好,使其被沿途的其他物体干扰,造成了误测量。
六、问题与不足
1、舵机控制为开环控制,在运行时无法得知当前角度,若舵机变化速度较快,有可能导致所测距离与角度不同步;
2、如何有效在原始数据的基础上建立避障算法,实现自主避障导航;
3、目前扫描一次的时间较长,需要进一步提高扫描速度。可以采用适当降低扫描精度的方法,如间隔3度采样一次,实现扫描速度的提高;
4、因超声波模块的指向性不强,故很容易有干扰,另外超声波的余波也会成为干扰源,干扰超声波信息的正常采集。
5、机器人在运动过程中需要加入补偿。
>> 本文章版权归作者所有,如需转载请联系作者授权许可。
>> 原文来自: 云飞机器人实验室
>> 原文地址: 全向超声波雷达的设计与实现
>> 关于我们: 关于云飞实验室
>> 支持我们: 帮助我们可持续发展