基于MATLAB GUI的AIS自动船舶系统显示实现
一、系统架构设计
- 功能模块划分 数据接收模块:支持串口或网络接收AIS数据(NMEA格式)。 数据解析模块:解析MMSI、经纬度、航向、速度等关键字段。 地图显示模块:基于地理坐标动态展示船舶位置与航迹。 状态监控模块:显示通信状态、数据解析错误日志等。
- 技术选型 GUI开发:使用MATLAB GUIDE工具设计界面。 数据通信:
serialport对象(串口)或webread函数(网络API)。 地图绘制:geoplot、quiverm函数结合UTM坐标转换。
二、核心代码实现
1. GUI界面设计(GUIDE布局)
- 控件布局:
axes控件:用于地图显示。edit控件:输入串口号(如COM3)或API地址。pushbutton:启动/停止数据接收。listbox:显示实时船舶信息(MMSI、船名)。axes控件:航迹图与统计图表。
2. 数据接收与解析
% 串口初始化(示例)
s = serialport("COM3", 9600, "DataBits", 8, "StopBits", 1);
dataBuffer = read(s, 1000, "char"); % 读取初始数据
% NMEA数据解析函数
function parsedData = parseAIS(data)
% 按换行分割数据包
packets = split(data, '\n');
for i = 1:numel(packets)
if contains(packets{i}, '$GPGGA') % 假设使用GPGGA格式
% 提取字段(示例:MMSI、经纬度)
[~, idx] = regexp(packets{i}, ',');
mmsi = packets{i}(idx(2)+1:idx(3)-1);
lat = str2double(packets{i}(idx(4)+1:idx(5)-1));
lon = str2double(packets{i}(idx(6)+1:idx(7)-1));
parsedData = struct('MMSI', mmsi, 'Lat', lat, 'Lon', lon);
end
end
end
3. 地图动态显示
% 初始化地图
axes(handles.mapAxes);
worldmap('World');
geoshow('landareas.shp', 'FaceColor', [0.8 0.9 1]); % 绘制陆地
% 实时更新船舶位置
function updateDisplay(data)
% 坐标转换(WGS84转UTM)
[x, y] = projfwd(proj, data.Lat, data.Lon);
% 绘制船舶图标与航向箭头
geoplot(handles.mapAxes, data.Lat, data.Lon, 'r*', 'MarkerSize', 10);
quiverm(data.Lat, data.Lon, sind(data.Course), cosd(data.Course), 'b', 'LineWidth', 1.5);
% 添加船名标签
textm(data.Lat, data.Lon, data.MMSI, 'Color', 'white', 'FontSize', 8);
end
4. 定时器驱动数据更新
% 创建定时器对象
t = timer('ExecutionMode', 'fixedRate', 'Period', 1, 'TimerFcn', @(~,~) readAIS());
% 启动定时器
start(t);
% 读取数据回调函数
function readAIS()
global s parsedData;
try
data = read(s, 1000, "char");
parsedData = parseAIS(data);
% 更新GUI显示
guidata(handles.figure1, parsedData);
catch
errordlg('通信错误!');
end
end
三、关键功能扩展
-
航迹追踪
-
存储历史位置数据,绘制船舶轨迹线:
plotm(trackLat, trackLon, 'g--', 'LineWidth', 1.5);
-
-
碰撞预警
-
计算船舶间距离与CPA(最近会遇点):
function risk = collisionRisk(ship1, ship2) d = distance(ship1.Lat, ship1.Lon, ship2.Lat, ship2.Lon); t = d / (ship1.Speed + ship2.Speed) * 3600; % 时间(小时) risk = (d < 2) && (t < 1); % 距离<2海里且1小时内相遇 end
-
-
数据存储与回放
-
将解析数据保存为CSV文件,支持时间轴回放:
writetable(struct2table(parsedData), 'ais_data.csv');
-
四、界面优化与调试
-
性能优化 使用
drawnow limitrate限制刷新频率。 避免在回调函数中频繁更新图形对象,改用set函数修改属性。 -
错误处理
-
添加串口断开重连机制:
function checkConnection() if ~isOpen(s) fopen(s); end end
-
-
用户交互 添加“暂停/继续”按钮控制数据流。 支持点击船舶图标显示详细信息(MMSI、航速等)。
五、测试与验证
-
仿真数据测试
-
生成虚拟AIS数据验证显示逻辑:
numShips = 5; fakeData = struct('MMSI', num2str(100000+randi(900000,numShips,1)), ... 'Lat', 30 + 5*rand(numShips,1), ... 'Lon', 120 + 5*rand(numShips,1), ... 'Course', 0 + 360*rand(numShips,1), ... 'Speed', 5 + 10*rand(numShips,1));
-
-
实际数据对接
-
通过MarineTraffic API获取实时数据(需API密钥):
url = 'https://api.marinetraffic.com/api/ais-live/?protocol=json&port=1'; apiKey = 'YOUR_API_KEY'; data = webread(url, 'apiKey', apiKey);
-
参考代码 AIS自动船舶显示系统 www.youwenfan.com/contentcnm/82510.html
六、总结与改进方向
- 优势: 实时性强,支持动态航迹更新。 界面友好,便于监控多船状态。
- 改进方向: 集成多传感器数据融合(如雷达与AIS数据匹配)。 添加机器学习模型预测船舶航迹。 优化通信协议解析效率(如SOTDMA协议处理)。
浙公网安备 33010602011771号