前视声呐目标识别定位(一)-基础知识

前视声呐目标识别定位(一)-基础知识

前视声呐目标识别定位(二)-目标识别定位模块   

前视声呐目标识别定位(三)-部署至机器人

前视声呐目标识别定位(四)-代码解析之启动识别模块

前视声呐目标识别定位(五)-代码解析之修改声呐参数

前视声呐目标识别定位(六)-代码解析之目标截图并传输

前视声呐目标识别定位(七)-代码解析之录制数据包

前视声呐目标识别定位(八)-代码解析之各模块通信

前视声呐目标识别定位(九)-声呐驱动    

        接触水下的工作快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为:

theta = (x / (width/2.0)-1.0) *(azimuth/2.0)

r = (1.0-y/height)*range

        由此目标识别和不完全的定位解算完成。

        所以,我们早前开源的UATD数据集提供的就是声呐的原始数据,不仅包含了普通图像形式的声呐图,还包含了声呐相应的水平开角和量程等信息,方便研究者做各种研究。

        后来基于yolov5和ros据此写了个程序,效果简图如下:

        图中表示识别到的目标物为rov,置信率为0.91,位置为水平开角30.64度,距离9.97m。

        后续我会将代码上传至github。

  • 26
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当使用纯方位法声呐进行目标定位时,可以使用MATLAB编写代码来实现。以下是一个简单的示例代码,用于说明基本的实现方法: ```matlab % 声呐参数 fs = 1000; % 采样率 c = 1500; % 声速 N = 64; % 接收阵元个数 d = 0.5; % 接收阵元间距 % 目标参数 theta = 30; % 目标方位角(单位:度) R = 100; % 目标距离(单位:米) % 生成接收信号 t = (0:N-1) / fs; s = exp(1i * 2 * pi * R / c * sin(theta/180*pi) * t); % 声呐接收信号矩阵 X = zeros(N, N); % 声呐接收信号模拟 for n = 1:N % 计算接收阵元位置 x = (n-1) * d; % 计算接收信号延迟 tau = 2 * x / c * sin(theta/180*pi); % 接收信号加入延迟 s_t = s .* exp(1i * 2 * pi * fs * tau); % 添加噪声(可选) noise = randn(size(s_t)) * 0.1; s_t = s_t + noise; % 存储接收信号 X(:, n) = s_t.'; end % 基于接收信号进行目标定位 angle_range = -90:0.5:90; % 方位角范围 correlation = zeros(size(angle_range)); for i = 1:length(angle_range) % 计算目标方位角 target_theta = angle_range(i); % 计算目标延迟 target_tau = 2 * d / c * sin(target_theta/180*pi); % 生成目标信号 target_signal = exp(1i * 2 * pi * fs * target_tau * (0:N-1).'); % 计算相关性 correlation(i) = abs(target_signal' * X(:, 1)); end % 绘制相关性曲线 figure; plot(angle_range, correlation); xlabel('方位角(度)'); ylabel('相关性'); title('目标定位结果'); ``` 这段代码实现了一个简单的单目标定位过程,基于纯方位法声呐的原理。需要注意的是,这只是一个示例代码,实际应用中可能需要根据具体的需求进行修改和优化。 希望这个示例可以帮助到您!如有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值