✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。

🍎个人主页:Matlab科研工作室

🍊个人信条:格物致知。

更多Matlab仿真内容点击👇

智能优化算法       神经网络预测       雷达通信      无线传感器        电力系统

信号处理              图像处理               路径规划       元胞自动机        无人机

⛄ 内容介绍

对未知环境下移动机器人的路径规划进行了研究,提出了一种基于模糊控制的路径规划算法.运用模糊推理,构造出一张实践效果较好的控制响应表.针对局部路径规划算法存在的死锁问题,该算法通过建立预防死锁机制,能够使机器人探测到危险区域即沿障碍物的边缘行走绕出障碍物,从而有效避免了死锁现象的发生,为解决死锁问题提供了一种新的思路.在多种环境中进行了仿真实验,仿真结果表明了该算法的有效性和可行性.

⛄ 部分代码

function [Distance,Flag]=GetMinDistance(DectLineK, DectLineB, DectLineF,PgoalXnew,PgoalYnew)

%Distance 为最短距离,Flag表征其有效性 0 无  1有 2异常

%依据测量线斜率情况及走向 选择出交涉区域的障碍,及夹角取向

global CirX;

global CirY; 

global CirR; 

global ProbotX; 

global ProbotY;

    if DectLineF ==1 

        if ProbotY < PgoalYnew  %竖直向上运动

            Ydown=PgoalYnew;

            Yup  =PgoalY;

        else

            Ydown=PgoalYnew;

            Yup  =ProbotY;  

        end      

        IndexX= ((ProbotX-CirR) < CirX) & (CirX < (ProbotX+CirR));

        IndexY= (Ydown < CirY) & (CirY < Yup);

        IndexALL=IndexX & IndexY;

    elseif DectLineF == 2

        if ProbotX < PgoalXnew  %水平向右运动

            Xleft = ProbotX;

            Xright= PgoalXnew;

        else

            Xleft = PgoalXnew;

            Xright= ProbotX;  

        end

        IndexX= (Xleft < CirX) & (CirX < Xright);

        IndexY= ((ProbotY-CirR) < CirX) & (CirX < (ProbotY+CirR));

        IndexALL=IndexX & IndexY;    

    else

        AngelDectLine=atan(DectLineK);

        if DectLineK > 0            

            if ProbotX < PgoalXnew  %正斜率向上运动

                Xleft = ProbotX;

                Yleft = ProbotY;

                Xright= PgoalXnew;                

                Yright= PgoalYnew; 

            else                 %正斜率向下运动

                Xleft = PgoalXnew;

                Yleft = PgoalYnew;

                Xright= ProbotX;                

                Yright= ProbotY;    

            end   

            LineBleft = Yleft + Xleft/DectLineK;

            LineBright= Yright + Xright/DectLineK;

            Btemp=CirR/cos(AngelDectLine);

            Xtemp=CirR*sin(AngelDectLine);             

            LineBup  = DectLineB +Btemp;

            LineBdown= DectLineB -Btemp;

            X1=Xleft-Xtemp;

            X2=Xleft+Xtemp;

            X3=Xright-Xtemp;

            X4=Xright+Xtemp;

            IndexX1= (X1 < CirX) & (CirX < X2);

            IndexX2= (X2 < CirX) & (CirX < X3); 

            IndexX3= (X3 < CirX) & (CirX < X4);

            Ytemp=CirX/DectLineK;

            Y1=LineBleft-Ytemp;  %与斜率垂直的左右两条直线

            Y2=LineBright-Ytemp;

            Ytemp=CirX*DectLineK;

            Y3=LineBup  +Ytemp; %与斜率平行的上下两条直线

            Y4=LineBdown+Ytemp;

            IndexY1= (Y1 < CirY) & (CirY < Y3);

            IndexY2= (Y4 < CirY) & (CirY < Y3);

            IndexY3= (Y4 < CirY) & (CirY < Y2);

            IndexALL=(IndexX1 & IndexY1)|(IndexX2 & IndexY2)|(IndexX3 & IndexY3);  

        else 

            if ProbotX < PgoalXnew  %负斜率向 下运动

                Xleft = ProbotX;

                Yleft = ProbotY;

                Xright= PgoalXnew;                

                Yright= PgoalYnew;  

            else                 %负斜率向 上运动

                Xleft = PgoalXnew;

                Yleft = PgoalYnew;

                Xright= ProbotX;                 

                Yright= ProbotY;  

            end    

            LineBleft = Yleft + Xleft/DectLineK;

            LineBright= Yright + Xright/DectLineK;

            Btemp=CirR/cos(AngelDectLine);   %平行线的截矩

            Xtemp=CirR*sin(-AngelDectLine);  %注意加负号           

            LineBup  = DectLineB +Btemp;

            LineBdown= DectLineB -Btemp;

            X1=Xleft-Xtemp;

            X2=Xleft+Xtemp;

            X3=Xright-Xtemp;

            X4=Xright+Xtemp;

            IndexX1= (X1 < CirX) & (CirX < X2);

            IndexX2= (X2 < CirX) & (CirX < X3); 

            IndexX3= (X3 < CirX) & (CirX < X4);

            Ytemp=CirX/DectLineK;

            Y1=LineBleft-Ytemp;  %与斜率垂直的左右两条直线

            Y2=LineBright-Ytemp;

            Ytemp=CirX*DectLineK;

            Y3=LineBup  +Ytemp; %与斜率平行的上下两条直线

            Y4=LineBdown+Ytemp;

            IndexY1= (Y4 < CirY) & (CirY < Y1);

            IndexY2= (Y4 < CirY) & (CirY < Y3);

            IndexY3= (Y2 < CirY) & (CirY < Y3);

            IndexALL=(IndexX1 & IndexY1)|(IndexX2 & IndexY2)|(IndexX3 & IndexY3);              

        end        

    end

    %如果没有找出,机器可直达目标,穿越障碍成功,结束探测

    CheckX=CirX(IndexALL);   

    if isempty(CheckX) 

        Distance =0;

        Flag=0;

        return;

    end    

    CirXt=CirX(IndexALL);   %此时可能有多个

    CirYt=CirY(IndexALL); 

    CirRt=CirR(IndexALL);     

        %计算测量线与障碍物的远近情况

        DCirToLine=DotLineDist(CirXt,CirYt,DectLineK,DectLineB,DectLineF);

        %圆至机器人之间的距离

        DCirToRobot=TwoDotDist(ProbotX,ProbotY,CirXt,CirYt);

        %找出与测量线相交的处到 机器人的距离

        Dtemp=DCirToLine.^2;

        DCrossToRobot=sqrt(DCirToRobot.^2 -Dtemp)-sqrt(CirRt.^2 - Dtemp);

        DProbotToBar=min(DCrossToRobot);  

    if DProbotToBar < 0 %出现严重异常

        Distance =0;

        Flag=2;

    else

        Distance =DProbotToBar;

        Flag=1;              

    end

⛄ 运行结果

【路径规划】基于模糊控制的路径规划算法附Matlab代码_斜率

⛄ 参考文献

[1] 任伟建王飞吕微. 分层模糊控制的移动机器人路径规划[J]. 科学技术与工程, 2010, 010(010):2317-2321.

[2] 王菁华, 张翠敏. 智能机器人综合路径规划算法在Matlab中的实现[J]. 天津工程师范学院学报, 2006, 16(3):4.

[3] 宋海燕. 基于MATLAB的机器人协助系统中路径规划的蚁群算法研究[J]. 金山, 2010, 02(6).

[4] 李鹏, 温素芳. 基于模糊控制的路径规划算法的实现[J]. 杭州电子科技大学学报:自然科学版, 2007(6):5.

⛳️ 代码获取关注我

❤️部分理论引用网络文献,若有侵权联系博主删除
❤️ 关注我领取海量matlab电子书和数学建模资料