天天看點

基于模型預測人工勢場的船舶運動規劃方法,考慮複雜遭遇場景下的COLREG(Matlab代碼實作)

💥💥💞💞歡迎來到本部落格❤️❤️💥💥

🏆部落客優勢:🌞🌞🌞部落格内容盡量做到思維缜密,邏輯清晰,為了友善讀者。

⛳️座右銘:行百裡者,半于九十。

目錄

​​💥1 概述​​

​​📚2 運作結果​​

​​🎉3 參考文獻​​

​​🌈4 Matlab代碼實作​​

💥1 概述

船舶運動規劃是海上自主水面艦艇(MASS)自主導航的核心問題。該文提出一種考慮避碰規則的複雜遭遇場景模型預測人工勢場(MPAPF)運動規劃方法。建立了一個新的船舶域,其中設計了一個閉區間勢場函數來表示船舶域的不可侵犯屬性。在運動規劃過程中,采用具有預定義速度的Nomoto模型來生成符合船舶運動學的可遵循路徑。為解決傳統人工勢場(APF)方法的局部最優問題,保證複雜遭遇場景下的防撞安全,提出一種基于模型預測政策和人工勢場的運動規劃方法MPAPF。該方法将船舶運動規劃問題轉化為具有機動性、導航規則、通航航道等多重限制的非線性優化問題。4個算例的仿真結果表明,與APF、A星和快速探索随機樹(RRT)的變體相比,所提出的MPAPF算法能夠解決上述問題,并生成可行的運動路徑,避免複雜遭遇場景下的船舶碰撞。

文獻來源:

基于模型預測人工勢場的船舶運動規劃方法,考慮複雜遭遇場景下的COLREG(Matlab代碼實作)

📚2 運作結果

輸入預測步長(我們建議應該是1~10,在這個程式中,1步可能花費你120秒,而10步可能比1步高100倍。

基于模型預測人工勢場的船舶運動規劃方法,考慮複雜遭遇場景下的COLREG(Matlab代碼實作)
基于模型預測人工勢場的船舶運動規劃方法,考慮複雜遭遇場景下的COLREG(Matlab代碼實作)
基于模型預測人工勢場的船舶運動規劃方法,考慮複雜遭遇場景下的COLREG(Matlab代碼實作)
基于模型預測人工勢場的船舶運動規劃方法,考慮複雜遭遇場景下的COLREG(Matlab代碼實作)
%% initialization
 static_obs_num               = [12;6];
 mailme                       = 0;
 % static_obs_area            = [0.8, 2, 7, 8;
 %                         2, 0.2, 10, 2];
 static_obs_area              = [0.5, 0, 4.5, 4;
                                 4.5, 2, 6.5 3.5];
 dynamic_ships                = [1;1;1;1];
 parameter.waterspeed         = 0/1852;
 parameter.waterangle         = 45;
 parameter.water              = [sind(parameter.waterangle) cosd(parameter.waterangle)]*parameter.waterspeed;
 parameter.minpotential       = 0.001;
 parameter.minpotential4ship = 0.01;
 parameter.minobstacle        = 0.03;
 parameter.maxobstacle        = 0.2;
 parameter.safeobstacle       = 5;
 parameter.amplification      = 5;
 parameter.safecv             = 2.5;%n mile safety collision aviodance distance
 parameter.dangercv           = 0.5;% danger collision aviodance distance
 parameter.shipdomain         = 5;
 parameter.tsNum              = 1;
 %% simulation environment
 map_size                     = [8,4.5];
 start_point                  = [1 1];
 end_point                    = [7,4];
 tmp_end_point                = end_point;
 parameter.endbeta            = -log(parameter.minpotential)/(norm(end_point-start_point)*2)^2;
 mat_point                    = init_obstacles(static_obs_num,static_obs_area);  % Generate static obstacles randomly
 ship.speed                   = 8.23; % meters per second equal to 16 knots 
 ship.v                       = 0;
 ship.data                    = [...                        data = [ U K T n3]
 6     0.08    20    0.4   
 9     0.18    27    0.6
 12    0.23    21    0.3 ];
 % interpolate to find K and T as a function of U from MSS toolbox 'frigate'
 prompt                       = 'Prediction Step\n'; % input the prediction step, 1~10
 parameter.prediction_step    = input(prompt);
 ship.k                       = interp1(ship.data(:,1),ship.data(:,2),ship.speed,'linear','extrap'); %ship dynamic model you can change the dynamic model in shipdynamic.m
 ship.T                       = interp1(ship.data(:,1),ship.data(:,3),ship.speed,'linear','extrap');
 ship.n3                      = interp1(ship.data(:,1),ship.data(:,4),ship.speed,'linear','extrap');
 ship.Ddelta                  = 10*pi/180;  % max rudder rate (rad/s)
 ship.delta                   = 30*pi/180;  % max rudder angle (rad)
 ship.length                  = 100;
 ship.p_leader                = -8;
 ship.alpha_leader            = 3;
 ship.yaw                     = 45;
 ship.yaw_rate                = 0;
 ship.rudder                  = 0;
 ship.rudder_rate             = 0;
 ship.position                = [1 1];
 ship.gamma                   = 1;
 ship.lamda                   = log(1/parameter.minpotential4ship-1)/((parameter.shipdomain)^2-1);
 ship.prediction_postion      = [];
 tsPath{parameter.tsNum}      = [];
 ship1                        = ship;
 parameter.scale              = 1852;                     % 1852m in real world ,1 in simulation;
 parameter.time               = 5;                        % time per step
 parameter.searching_step     = 3000;                     % max searching step
 parameter.map_size           = map_size;                 % map size for display
 parameter.map_min            = 0.05;                     % minmum map details
 parameter.end1               = 0.05; 
 % parameter.situs1           = [6.1 1.75 3.25 1.75];    
 parameter.situs1             = [6.1 3.9 3.25 1.75]; % a quaternion ship domain proposed in Wang 2010,situs1 means in head-on situation
 parameter.situs2             = [6.1 3.9 3.25 1.75];      % a quaternion ship domain proposed in Wang 2010,situs2 means in crossing and give-way situation
 parameter.situs3             = [0.0 0.0 0.00 0.00];      % a quaternion ship domain proposed in Wang 2010,situs3 means in crossing and stand-on situation
 parameter.situs0             = [6.0 6.0 1.75 1.75];      % a quaternion ship domain proposed in Wang 2010,situs0 means in norm naviation situation
 ship_scale                   = 1;
 leader_stop                  = 0;
 tic
 draw2();
 set(gcf,'position',[200 200 1361/1.5 750/2]);
 hold on
 LB_follower = [];
 UB_follower = [];
 for i = 1 : parameter.prediction_step
     LB_follower = [LB_follower 0 -ship.delta];% lower limiting value
     UB_follower = [UB_follower 0 ship.delta];% upper limiting value
 end
 parameter.navars    = 2*parameter.prediction_step;% number of navars
 targetship=init_ship(ship,'others',1000);      

🎉3 參考文獻

​​🌈​​4 Matlab代碼實作

繼續閱讀