不列 2022-05-27 16:39 采纳率: 0%
浏览 317
已结题

matlab面对程序一直在运行应如何解决

付费提问:下列代码在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');%路径点
  • 写回答

1条回答 默认 最新

  • 歇歇 2022-06-03 22:11
    关注

    改成For

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 6月5日
  • 修改了问题 5月29日
  • 赞助了问题酬金10元 5月29日
  • 创建了问题 5月27日

悬赏问题

  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥15 stable diffusion
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误