一、开发背景

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、机器人在运动过程中需要加入补偿。


>> 本文章版权归作者所有,如需转载请联系作者授权许可。
>> 原文来自: 云飞机器人实验室
>> 原文地址: 全向超声波雷达的设计与实现
>> 关于我们: 关于云飞实验室
>> 支持我们: 帮助我们可持续发展


作者

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据