基于MATLAB GUI的AIS自动船舶系统显示实现

一、系统架构设计

  1. 功能模块划分 数据接收模块:支持串口或网络接收AIS数据(NMEA格式)。 数据解析模块:解析MMSI、经纬度、航向、速度等关键字段。 地图显示模块:基于地理坐标动态展示船舶位置与航迹。 状态监控模块:显示通信状态、数据解析错误日志等。
  2. 技术选型 GUI开发:使用MATLAB GUIDE工具设计界面。 数据通信serialport对象(串口)或webread函数(网络API)。 地图绘制geoplotquiverm函数结合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

三、关键功能扩展

  1. 航迹追踪

    • 存储历史位置数据,绘制船舶轨迹线:

      plotm(trackLat, trackLon, 'g--', 'LineWidth', 1.5);
      
  2. 碰撞预警

    • 计算船舶间距离与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
      
  3. 数据存储与回放

    • 将解析数据保存为CSV文件,支持时间轴回放:

      writetable(struct2table(parsedData), 'ais_data.csv');
      

四、界面优化与调试

  1. 性能优化 使用drawnow limitrate限制刷新频率。 避免在回调函数中频繁更新图形对象,改用set函数修改属性。

  2. 错误处理

    • 添加串口断开重连机制:

      function checkConnection()
          if ~isOpen(s)
              fopen(s);
          end
      end
      
  3. 用户交互 添加“暂停/继续”按钮控制数据流。 支持点击船舶图标显示详细信息(MMSI、航速等)。


五、测试与验证

  1. 仿真数据测试

    • 生成虚拟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));
      
  2. 实际数据对接

    • 通过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协议处理)。
posted @ 2025-11-26 10:23  yijg9998  阅读(0)  评论(0)    收藏  举报