基于Matlab雷达视窗的来船运动矢量绘制


背景

船舶航行时,已知来船与本船的相对方位和距离,也知来船的相对运动方向和航速,如何在雷达窗口下绘制出来?


过程

原想法:在极坐标中用scatter绘制船舶相对位置,通过quiver函数画出来船运动相对矢量
实践过程:在直角坐标系里有原点、Δx和Δy就能画出箭头,但极坐标系下quiver函数画不出来,能画出来也是通过plot函数将xy转为θr画出来的,且线条粗细和方向矢量都不好把握(读者可以试试)
在这里插入图片描述
最终方法:自己设置自定义函数,在极坐标下用最基础的画线段方法显示来船的位置和运动矢量线段


思路

在这里插入图片描述

  1. 来船相对位置(θ1 , r1)转换成(x1 , y1) ,来船相对运动矢量转换成Δx 和 Δy , 求(x2 , y2)
  2. (x2 , y2) 转换成 (θ2 , r2)
  3. 根据 (θ1 , r1) 和 (θ2 , r2)用polarplot画出矢量运动线
  4. 同理根据直角坐标和极坐标转换求三角形的三点,点与点之间用θr关系画出

结果

在这里插入图片描述

代码

clc 
clear
close all
%% 数据读取
bearing=[300 90 45];    % 来船相对本船圆周方位(°)
distance=[0.5 0.5 0.8];   % 与来船的相对距离
target_course = [45 300 250]   % 来船相对运动方向(°)
target_speed = [0.5 0.2 0.4]   % 来船航速

%% 基础设置
% 参数设置
ts_size = 0.07  % 设置显示来船的大小
os_size = 0.1  % 设置显示本船的大小

% 视窗设置
ax = polaraxes;
ax.ThetaZeroLocation = 'top';
ax.ThetaDir = 'clockwise';
rlim(ax, [0, max(distance)+0.5]);
hold on;  % 启用保持图形窗口打开,以便添加多个线段
%% 数据处理 & 画图
for i = 1:numel(bearing)
% 数据处理
bearing_=bearing(i);    % 来船相对方位(°)
distance_=distance(i);   % 相对距离
ts_c = target_course(i)-180   % 来船航向(°)
ts_s = target_speed(i)   % 来船速度

r_zhong = sqrt(x_zhong.^2 + y_zhong.^2);
theta_zhong = atan2(y_zhong, x_zhong);

% 画来船位置点 & 求船形状三点坐标
polarscatter(deg2rad(bearing_),distance_,10,'k','filled');hold on
[x,y] = plot_ship(x_ts, y_ts , ts_c, ts_size)

% 画本船
[x_,y_] = plot_ship(0, 0 , 180, os_size)
ship_r_ = sqrt(x_.^2 + y_.^2);
ship_theta_ = atan2(y_, x_);
polarplot(ax, [ship_theta_, ship_theta_(1)], [ship_r_, ship_r_(1)], 'r', 'LineWidth', 2);  % 'b' 表示蓝色

% 画来船
ship_r = sqrt(x.^2 + y.^2);
ship_theta = atan2(y, x);
polarplot(ax, [ship_theta, ship_theta(1)], [ship_r, ship_r(1)], 'r', 'LineWidth', 2);  % 'b' 表示蓝色

% 画来船运动矢量
polarplot(ax, [ship_theta(1), theta_zhong], [ship_r(1), r_zhong], 'b', 'LineWidth', 2);hold on
hold on;  % 启用保持图形窗口打开,以便填充颜色

end


%% 子函数
function [x,y]=plot_ship(x_cen,y_cen,course,size)
% 输入:来船中心横坐标 & 来船中心纵坐标 & 来船真航向 & 船舶大小(在基础参数设置中)
% 输出:船舶三角形的三点坐标
    course = course + 180
    x(1) = x_cen + size * cosd(course);   
    y(1) = y_cen + size * sind(course);
  
    course_fan=course+90;
    x(2) = ( x_cen - size * cosd(course) ) + ( size/2 * cosd(course_fan) );  
    y(2) = ( y_cen - size * sind(course) ) + ( size/2 * sind(course_fan) );
    
    x(3) = ( x_cen - size * cosd(course) ) - ( size/2 * cosd(course_fan) );  
    y(3) = ( y_cen - size * sind(course) ) - ( size/2 * sind(course_fan) );
end

分享代码若有错漏之处,请大家留言批评指正!!
如果本篇文章对您有用的话,欢迎点赞收藏噢,谢谢谢谢,哈哈哈哈哈哈!!
如需帮助,可加扣联系:1097522625

主页还有更加丰富的内容噢 O(∩_∩)O :
Matlab 地理(经纬度)坐标 转 笛卡尔(直角)坐标
Matlab 土法求航海DCPA和TCPA,并根据DCPA正负判断目标船过本船船首or船尾
基于Matlab雷达视窗的来船运动矢量绘制
Matlab 沿着曲线的动态图制作
Matlab改进埃尔米特(Hermite)分段三次插值——(可在pchip函数中自定义导数值)
Matlab 四元素船舶领域代码复现
Matlab图片曲线数据提取

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值