接触水下的工作快4年了,由于不是相关领域的背景,所以很多东西都很吃力。很多领域尤其是人工智能的研究开源的资料非常多,研究人员基于此能比较便利开展工作,并且能获得启发进步,从而极大促进领域的发展。这几年我一直以为按这种思维工作学习,但是水下研究条件限制很多,圈子却小而封闭,碰壁太多了,现在都不确定是否能摸到入门门槛。接下来由于离开水下这个方向了,整理了一下以前的一些东西,分享一下留个纪念吧。这段时间做的东西没能真正部署下水进行实验,只能算是个人的自娱自乐了。分享出来希望能给水下的爱好者一些新的思路。毕竟只是半路转到水下呆了一段时间,接触时间也不算长,可能介绍的内容会有错误和不足之处。
首先要特别说明的一点是这里说的定位是不完全的定位,只能得到目标距声呐的距离和水平开角,缺少竖直开角这一个维度的信息。
我们通常在声呐客户端看到的声呐图像如下图:
图中红点附近我们会说以声呐为原点,目标点的水平开角为20度,距离为24.0m。这两个值是无法确定目标的三维空间坐标的,缺少了竖直开角信息。接下来我会以我的理解进行介绍。
首先我们考虑声学是如何传播的,如果把声源看作一个点,那么其传播过程我粗略地视为由点以球形慢慢膨胀的过程,如下图。
我们将球体经原点水平切开,得到一个圆的水平截面,再取一个角度alpha,就得到一个水平扇形平面,声呐检测到的所有空间点都会投影到这个平面,这个角度就是声呐的水平开角。我们假设声呐能检测到的最远的距离为rmax,即截面的半径为rmax,那么这个半径就是声呐的量程。具体如下图。
通常我们将目标点的水平开角范围设定为[-alpha/2, alpha/2],量程设定为[rmin, rmax](rmin为声呐盲区)。声呐坐标系x轴以水平开角0度线重合。x轴代表目标点距离,而y轴代表目标点水平开角。
我们考虑图中的空间点[Xs,Ys,Zs],可以将其视为以该点和原点连线在竖直平面上切一刀,得到图中的竖直扇形,夹角为phi。该扇形的半径为r,即目标点据声呐的距离。其在水平面上的投影与0度线的夹角为theta,即目标点据声呐的水平开角。此时我们已经得到目标物在水平面上投影的坐标(xs,ys)=(r,theta)。但是我们是无法确定竖直开角phi的,所以我们无法解算目标点的三维空间坐标。显然竖直扇形的弧线上的所有点都会投影到水平面上的同一点,即声呐无法区分竖直开角这一个维度。所以定位是不完全的。
同时,当r越大时,竖直扇形的弧度越长,由于目标点可能在弧线上的任何一点,此时目标点的不确定性也越大。当然这个和后续讲的目标识别关系不太大。
实际上,声呐的原始数据流直接还原的图像是和普通图像一样而非扇形的,但是根据以上介绍,若按普通图像展示的话会目标图像会产生形变的现象。所以为了更好地向人眼呈现检测效果,通常处理为扇形图像。但这种形变不会影响计算机,反而扇形处理后引入了无用的信息可能会对计算机目标识别产生影响,同时难以实现定位的解算。
以下图为例:
声呐垂直打向一面墙,如果按扇形展示的话,墙是正常的,如果按普通图像展示的话,墙将以弯曲形象的呈现。
在进行目标识别和定位解算时,我使用的是上图右侧的形式,由声呐的数据流直接生成常规形式的图像。使用yolov5进行目标识别,得到目标物在图像中的bounding_box为[xmin,ymin,xmax,ymax],则中心点像素为x =(xmin + xmin)/ 2,y =(ymin + ymax)/ 2,我们以该像素点代表目标物进行位置解算。我们假定声呐当前帧图像的分辨率为width*height,声呐的水平开角为azimuth,量程为range(所有参数都能通过声呐数据流提取)。则目标物的水平开角theta和距离r为:
由此目标识别和不完全的定位解算完成。
所以,我们早前开源的UATD数据集提供的就是声呐的原始数据,不仅包含了普通图像形式的声呐图,还包含了声呐相应的水平开角和量程等信息,方便研究者做各种研究。
后来基于yolov5和ros据此写了个程序,效果简图如下:
图中表示识别到的目标物为rov,置信率为0.91,位置为水平开角30.64度,距离9.97m。
后续我会将代码上传至github。