付费提问:下列代码在matlab中运行时一直显示在运行中,无法跳出while循环,导致最后的画图部分无法显示,应如何修改这个代码呢?
并且如何在matlab中记录输出b的值。
%% 初始化车的参数
d = 3.5; % 道路标准宽度
W = 1.6; % 汽车宽度
L = 4.7; % 车长
m = 1560; % 车的质量
len_line = 150;
P0 = [0,-d/2,5,5]; % 车辆起点信息,1-2列位置,3-4列速度
Pg = [100,-d/2,0,0]; % 目标位置
Pobs = [80,-7/4,0,0]; % 障碍物位置
P = [Pobs;Pg]; % 将目标位置和障碍物位置合放在一起
Pt = 0.01; % 危险势能切换阈值
Pm = 0.5; % 道路中心危险势能
Fm = 3000; % 单车轮最大制动力
ca = 20; % 障碍物斥力场在道路长度方向上的变化系数
cb = 30; % 障碍物斥力场在道路宽度方向上的变化系数
Ds = 3; % 车辆向前路径搜索距离范围
Dt = 0.2;
d0 = 20;
n = size(P,1); % 障碍与目标总计个数
len_step = 0.5; % 步长
Num_iter = 200;
%% 开始主体循环
Pi = P0; %将车的起始坐标赋给Xi
i = 0;
j = 1;
while sqrt((Pi(1,1)-P(n,1))^2+(Pi(1,2)-P(n,2))^2) > 2
i = i + 1;
Path(i,:) = Pi; % 保存车走过的每个点的坐标
%计算车辆当前位置与障碍物的单位方向向量、速度向量
delta(j,:) = Pi(1,1:2) - P(j,1:2); % 用车辆点-障碍点表达斥力
dist(j,1) = norm(delta(j,:)); % 车辆当前位置与障碍物的距离
unitVector(j,:) = [delta(j,1)/dist(j,1), delta(j,2)/dist(j,1)]; % 斥力的单位方向向量
%计算车辆当前位置与目标的单位方向向量、速度向量
delta(n,:) = P(n,1:2)-Pi(1,1:2); %用目标点-车辆点表达引力
dist(n,1) = norm(delta(n,:));
unitVector(n,:)=[delta(n,1)/dist(n,1),delta(n,2)/dist(n,1)];
%% 计算斥力
%计算障碍物的斥力
Xx = norm(Pi(1,1)-P(j,1)); % 当前位置与障碍物之间的横向距离
Yy = norm(Pi(1,2)-P(j,2));
p = (abs(exp(-ca*(Xx^2)-cb*(Yy^2))-Pt))/(1-Pt);
Freo = [p*unitVector(j,1),p*unitVector(j,2)];
%计算道路势能
Db = m/8/Fm +L/2;
a =Pm+abs(sign(Pi(1,1)-d/2)+sign(Pi(1,1)+d/2))*(1-Pm)*0.5;
if Db <(abs(Pi(1,2)-P(j,2))) <= Dt
b = (abs(Pi(1,2)-P(j,2))-Db)/(Dt-Db);
elseif (abs(Pi(1,2)-P(j,2))) > Dt
b = 1;
end
A = a*b;
Pr = A*(cos(2*pi*Pi(1,1)/d)+1)*0.5;
Fedge = [Pr*unitVector(j,1),Pr*unitVector(j,2)];
%计算引力
Xr = norm(Pi(1,1)+d/2);
Yr = norm(Pi(1,2)-Ds);
Ps = (abs(Xr)+abs(Yr))/100;
Fatt = [Ps*unitVector(n,1),Ps*unitVector(n,2)];
%% 计算合力和方向
F_sum = [Freo(1,1)+Fedge(1,1)+Fatt(1,1),Freo(1,2)+Fedge(1,2)+Fatt(1,2)]; % 总合力矢量
unit_vecFsum(i,:) = 1/norm(F_sum) * F_sum; % 总合力的单位向量
%计算车的下一步位置
Pi(1,1:2)=Pi(1,1:2)+len_step*unit_vecFsum(i,:);
%判断是否到达终点
if sqrt((Pi(1)-P(n,1))^2+(Pi(2)-P(n,2))^2) < 0.2
break
end
end
Path(i,:)=P(n,:); %把路径向量的最后一个点赋值为目标
%% 画图
subplot(2,1,1);
set(gcf, 'Renderer','ZBuffer')
surf(xx,yy,zz);
xlabel('道路宽度 (m) ');
ylabel('道路长度 (m) ');
zlabel('道路势能场');
view(-20,50);
axis tight;
subplot(2,1,2);
% 画灰色路面图
GreyZone = [-5,-d-0.5; -5,d+0.5; len_line,d+0.5; len_line,-d-0.5];
fill(GreyZone(:,1),GreyZone(:,2),[0.5 0.5 0.5]);
hold on
% 画分界线
plot([-5, len_line],[0, 0], 'w--', 'linewidth',2); %分界线
plot([-5,len_line],[d,d],'w','linewidth',2); %左边界线
plot([-5,len_line],[-d,-d],'w','linewidth',2); %左边界线
% 设置坐标轴显示范围
axis equal
set(gca, 'XLim',[-5 len_line]);
set(gca, 'YLim',[-4 4]);
% 绘制路径
plot(P(n-1,1),P(n-1,2),'ro'); %障碍物位置
plot(P(n,1),P(n,2),'gv'); %目标位置
plot(P0(1,1),P0(1,2),'bs'); %起点位置
plot(Path(:,1),Path(:,2),'.b');%路径点