技术标签: matlab BP神经网络 障碍物避障 Matlab深度学习 路线规划
目录
BP(Back Propagation)神经网络,其本质是一种基于误差反馈传播的神经网络算法。从结构上讲,BP神经网络是由一个信息的正向传播网络和一个误差的反向传播网络两个模块构成。BP神经网络的结构如下图所示:
从图1的结构可知,BP神经网络主要由输入层,隐含层以及输出层三个部分构成。来自外界的信息通过输入层传输进入到隐含层进行处理,并由输出层输出处理结果。当BP神经网络的输出结果和其期望结果之间的误差较大的时候,则进入反向传播阶段,并进行进行审计网络权值的修正,直到输出结果和期望结果误差满足一定条件为止。
在BP神经网络中,隐含层数量对神经网络的性能有着至关重要的影响,如果隐含层数量过多,会大大增加BP神经网络的内部结构的复杂度,从而降低学习效率,增加训练时间;如果隐含层数量过少,则无法精确获得训练输入数据和输出结果之间的内在规律,增加预测误差。因此,选择合适的隐含层个数具有十分重要的意义。由于隐含层个数的设置没有明确的理论可以计算,通常情况下,采用逐次分析的方法获得,即通过对不同隐含层所对应的神经网络进行预测误差的仿真分析,选择误差最小情况下所对应的隐含层个数。
学习率,即网络权值得更新速度,当学习率较大的时候,网络权值的更新速度快,当网络稳定性会下降;当学习率较小的时候,网络权值的更新速度慢,网络较为稳定。这里选择BP神经网络的学习率方式参考上一章节隐含层的选择方式,即通过对比不同学习率的网络训练误差,选择性能较优的学习率。
BP神经网络的初始网络权值对网络训练的效率以及预测性能有着较大的影响,通常情况下,采用随机生成[-1,1]之间的随机数作为BP神经网络的初始权值。
本文,通过matlab的BP神经网络工具箱函数newff来构建BP神经网络,通过newff函数构建BP网络,其主要步骤如下:
第一,BP神经网络初始化后,其matlab程序如下:
net = newff(traindata, trainaim, HiddenNum);
其中traindata表示训练数据,trainaim表示训练目标,HiddenNum表示BP神经网络隐含层个数,net表示BP神经网络模型函数。
第二,BP神经网络参数设置,其matlab程序所示:
设置学习率,其matlab程序为 net.trainParam.lr = 0.25;
设置训练误差目标,其matlab程序为net.trainParam.goal = 1e-8;
设置神经网络训练次数,其matlab程序为net.trainParam.epochs = 200;
第三,BP神经网络的训练,其matlab程序所示:
net = train(net,train_data,train_aim);
这里通过train函数对神经网络net进行训练,得到训练后的BP神经网络模型。
其中,信号的前向传播过程的主要步骤如下:
算法流程:
matlab2022a仿真结果如下:
for time = 1:TIME
time
%计算四个输入
if time <= 3
x(:,time)= min(x(:,time),xmax);
x(:,time)= max(x(:,time),xmin);
Xs(time) = X_start;
Ys(time) = Y_start;
Theta = atan((Y_end-Y_start)/(X_end-X_start));
else
x(:,time)= min(x(:,time),xmax);
x(:,time)= max(x(:,time),xmin);
%计算alpha,机器人运动方向与目标方向之间的夹角
%计算alpha,机器人运动方向与目标方向之间的夹角
if X_end-Xs(time-1) == 0
tmps1 = inf;
else
tmps1 =(Y_end-Ys(time-1))/(X_end-Xs(time-1));
end
if Xs(time-1)-Xs(time-2) == 0
tmps2 = inf;
else
tmps2 =(Ys(time-1)-Ys(time-2))/(Xs(time-1)-Xs(time-2));
end
%目标方向 %运动方向
alpha = atan(tmps1) - atan(tmps2);
%先计算障碍物和机器人的距离,然后将这些距离划分为四类,dr,d,dl和反方向的,如果没有,那么认为距离为inf
dr = [];
dl = [];
d = [];
vdr = [];
vdl = [];
vd = [];
for kk = 1:N
%计算距离,障碍物和小车当前位置的间距
dist(kk) = sqrt((xobstacle(kk)-Xs(time-1))^2 + (yobstacle(kk)-Ys(time-1))^2)-R(kk);
if xobstacle(kk)-Xs(time-1) == 0
vdist(kk) = 1;
else
vdist(kk) = sign((yobstacle(kk)-Ys(time-1))/(xobstacle(kk)-Xs(time-1)));
end
if dist(kk)>0
%计算各个距离和机器人运动方向的夹角
if xobstacle(kk)-Xs(time-1) == 0
tmps3 = inf;
else
tmps3 =(yobstacle(kk)-Ys(time-1))/(xobstacle(kk)-Xs(time-1));
end
Beta(kk) = (atan(tmps3))*180/pi;
%根据角度差,分析哪些是dr,d,dl和反方向
%说明这个障碍物在运动方向的右边
if Beta(kk) > 15 & Beta(kk) <= 75
dr = [dr,dist(kk)];
dl = dl;
d = d;
vdr = [vdr,vdist(kk)];
vdl = vdl;
vd = vd;
end
%说明这个障碍物在运动方向的左边边
if Beta(kk) < -15 & Beta(kk) >= -75
dr = dr;
dl = [dl,dist(kk)];
d = d;
vdr = vdr;
vdl = [vdl,vdist(kk)];
vd = vd;
end
%说明这个障碍物在运动方向的前边
if Beta(kk) <= 15 & Beta(kk) >= -15
dr = dr;
dl = dl;
d = [d,dist(kk)];
vdr = vdr;
vdl = vdl;
vd = [vd,vdist(kk)];
end
end
end
for m=1:Ns
xs(:,m) = [x(1,time-1) + Sense_radius*cos(Jd(m,1));
x(2,time-1) + Sense_radius*sin(Jd(m,1))];
G1(m,1) = func_obstacle(xs(:,m),xobstacle,yobstacle);
G2(m,1) = func_goal(xs(:,m),Pend);
G3(m,1) = G1(m,1) + G2(m,1);
end
[val,bestone]=min(G3);
%如果某个方向有多个障碍物,那么选择最近的那个
%如果某个方向的距离集合为空集合,那么说明这个方向的障碍物为无穷远,直接赋值一个较大值
dr_in = min(dr);
if isempty(dr) == 1
dr_in = 1e20;
end
d_in = min(d);
if isempty(d) == 1
d_in = 1e20;
end
dl_in = min(dl);
if isempty(dl) == 1
dl_in = 1e20;
end
%代入到BP神经网络的四个变量
%调用BP神经网络的模型
YOUT = func_nn_test(dr_in,d_in,dl_in,alpha,net);
%计算速度和方向
DELTA_Theta = YOUT/10;
V = YOUT;
%更新小车坐标
x(:,time) =[x(1,time-1)+lambda*cos(Jd(bestone,1));
x(2,time-1)+lambda*sin(Jd(bestone,1))];
Deltalambda = V;
Deltatheta = DELTA_Theta;
%更新小车坐标
x(:,time) =[x(1,time)+Deltalambda*cos(Jd(bestone,1)+Deltatheta);
x(2,time)+Deltalambda*sin(Jd(bestone,1)+Deltatheta)];
%更新坐标
Xs(time) = x(1,time);
Ys(time) = x(2,time);
Tes = [Tes,Jd(bestone,1)+Deltatheta];
Vs = [Vs,Deltalambda];
end
%画图
plot(x(1,time),x(2,time),'.')
hold on
drawnow;
if sqrt((Xs(time)-X_end)^2+(Ys(time)-Y_end)^2)<0.2
break;
end
end
05_048_m
V
文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib
文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang
文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些
文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器
文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距
文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器
文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn
文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios
文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql
文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...
文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120
文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数