锡青铜的英文翻译英语怎么说-留声机原理


2023年4月7日发(作者:实力)

jeremy的路径规划学习-1.三维地图定义,散点拟合插值与粒⼦群算法(matlab

实现)

jeremy的路径规划学习-1.三维地图定义,散点拟合插值与粒⼦群算法(matlab实现)

本⽂基于⼩黎的ally学习资料实现,感谢该博主的⽆私奉献

三维地图与⼆维地图的差别

1.⼆维⽆⾼度信息,多⽤于地⾯机器⼈,⾃动驾驶

2.⼆维地图路径规划有:全覆盖路径规划(室内),利⽤地图软件的全局路径规划,在道路的局部路径规划

3.三维地图涵盖⾼度深度信息,多⽤于⽆⼈机、⽔下机器⼈等。

三维地图的⼭峰数学模型

三维空间曲线性质(⽤来计算适应度等)

◆⼆维平⾯曲线可以⽤“曲率”描述曲线的弯曲程度,⼀般来说平⾯路径规划要求曲率连续⽆突变;

◆在三维空间中,曲线⽤两个指标进⾏描述,即曲率(curvature)和挠率(torsion),同样也要求

曲率和挠率都连续⽆突变。

◆Matlab的polyfit函数可以对⼆维散点进⾏多项式曲线的拟合,但是与散点的坐标⼤⼩顺序有关,且

不⽅便拓展到三维空间。

◆参照B样条曲线/贝塞尔曲线的⽣成原理,将散点的x/y/z坐标分别看成参数t的函数值,并令参数t的

范围为[0,1],分别代表第⼀个散点和最后⼀个散点,再利⽤spline函数可以实现三维散点的光滑连

下⾯是三维地图⽣成代码(带注释)

%%初始化地形信息

mapRange=[100,100,100];%地图长、宽、⾼范围

N=10;%⼭峰个数

%struct结构体(字段下数据类型不限)

%struct结构体(字段下数据类型不限)

peaksInfo=struct;%初始化⼭峰特征信息结构体

=[];%⼭峰中⼼

=[];%⼭峰区域

=[];%⼭峰⾼度

%repmat⽤来矩阵堆叠,将peaksInfo矩阵块当作⼀个元素按照N*1的矩阵排布

peaksInfo=repmat(peaksInfo,N,1);

%%随机⽣成N个⼭峰的特征参数

fori=1:N

peaksInfo(i).center=[mapRange(1)*(rand*0.8+0.2),mapRange(2)*(rand*0.8+0.2)];

peaksInfo(i).height=mapRange(3)*(rand*0.7+0.3);

%⽣成⼭峰范围,范围越⼤,⼭峰的坡度越缓。

peaksInfo(i).range=mapRange*0.1*(rand*0.7+0.3);

end

%%计算⼭峰曲⾯值

peaksData=[];

forx=1:mapRange(1)

fory=1:mapRange(2)

sum=0;

fork=1:N

h_i=peaksInfo(k).height;

x_i=peaksInfo(k).center(1);

y_i=peaksInfo(k).center(2);

x_si=peaksInfo(k).range(1);

y_si=peaksInfo(k).range(2);

%三维地图数学模型

sum=sum+h_i*exp(-((x-x_i)/x_si)^2-((y-y_i)/y_si)^2);

end

%将x,y分别带⼊计算整个地图的⾼度信息

peaksData(x,y)=sum;

end

end

%%构造曲⾯⽹格,⽤于后期MAP图插值判断三维路径是否与⼭峰交涉

%x列向量,不断纵向扩充,每隔⼀百个就增⼤1

x=[];

fori=1:mapRange(1)

x=[x;ones(mapRange(2),1)*i];

end

%y列向量

%加’意思是y纵向列向量排布,如果不加,就是⾏向量排布。

y=(1:mapRange(2))\';

%peaksData(:)是将整个矩阵展开成⼀列且纵向展开,按列展开后连接

%y是1-100,1-100循环100次

y=repmat(y,length(peaksData(:))/length(y),1);

%peaksData列向量,reshape是矩阵竖着展开后重新竖着排布

peaksData=reshape(peaksData,length(peaksData(:)),1);

%构造X/Y/Z⽹格数据

%griddate:gri沐的拼音和组词 ddata(x,y,z,XI,YI)⽤⼆元函数z=f(x,y孝经第七章原文及译文 )的曲⾯拟合有不规则的数据向量x,y,z。

%griddata将返回曲⾯z在点(XI,YI)处的插值

%linspace线性等间距插值,后⾯数字控制⽹格精度

%x,y已经限制在100以内了

[X,Y,Z]=griddata(x,y,peaksData,...

linspace(min(x),max(x),100)\',...

linspace(min(y),max(y),100));

%%画⼭峰曲⾯

surf(X,Y,Z)%画曲⾯图

shadingflat%各⼩曲⾯之间不要⽹格

那已知三维点,如何进⾏拟合散点呢?

脚本如下:

%%根据散点获得拟合曲线三维路径

x_seq=[0,1,2,3,4];

y_seq=[5,2,3,4,1];

z_seq=[3,4,5,2,0];

%利⽤spline函数进⾏拟合插值

k=length(x_seq);

t_seq=linspace(0,1,k);

%分成100份是进⼀步离散化

T_seq=linspace(0,1,100);

%spline:三次⽅样条数据插值

X_seq=spline(t_seq,x_seq,T_seq);

Y_seq=spline(t_seq,y_seq,T_seq);

Z_seq=spline(t_seq,z_seq,T_seq);

%画拟合曲线图

figure

%最开始方向的拼音 的点顺序不⼀样应该拟合曲线也不同

%scatter3:三维散点图

scatter3(x_seq,y_seq,z_seq,100,\'bs\',\'MarkerFaceColor\',\'g\')

holdon

%plot3:三维曲线

plot3(X_seq,Y_seq,Z_seq,\'r\',\'LineWidth\',2)

gridon

title(\'散点拟合曲线\')

%%计算曲线的曲率、挠率

%计算三阶导数

f=[X_seq;Y_seq;Z_seq];%表⽰函数

delta=1/length(X_seq);

%grandient:求梯度,若x为多维矩阵,例如[Fx,Fy]=gradient(x)

%左边界梯度:Fx(:,j)=Fx(:,j+1)-Fx(:,j);

%右边界梯度:Fx(:,j)=Fx(:,j)-Fx(:,j-1);

%中间区域梯度:Fx(:,j)=(Fx(:,j+1)-Fx(:,j-1))/2.

f1=gradient(f)./delta;%⼀阶导

f2=gradient(f1)./delta;%⼆阶导

f3=gradient(f2)./delta;%三阶导

f1=f1\';

f2=f2\';

f3=f3\';

%曲率、挠率

v=cross(f1,f2,2);%⼀阶导与⼆阶导做外积即叉乘

e=dot(f3,v,2);%(r\',r\'\',r\'\'\')混合积

c=zeros(length(T_seq),1);%定义矩阵c储存⼀阶导⼆阶导叉乘模长,d储存⼀阶导模长

d=c;

fori=1:length(f)

c(i)=norm(v(i,:));%⼀阶导⼆阶导外积的模长

d(i)=norm(f1(i,:));%⼀阶导模长

end

k=c./(d.^3);%曲率

torsion=e./c.^2;%挠率

%%画图

%曲率图

figure

plot(k,\'r\',\'LineWidth\',2)

title(\'曲率图\')

%挠率图

figure

plot(torsion,\'r\',\'LineWidth\',2)

title(\'挠率图\')

粒⼦群算法

该模型有三条规则:

避免碰撞:飞离最近的个体,以避免碰撞

速度⼀致:向⽬标前进,和邻近个体的平均速度保持⼀致

中⼼群集:向邻近个体的平均位置移动,向群体的中⼼运动

粒⼦群算法

每个寻优的问题解都被想像成⼀只鸟,称为“粒⼦”。

所有的粒⼦都由⼀个适应度函数(FitnessFunction)确定适应

值以判断⽬前的位置好坏。

每⼀个粒⼦必须赋予记忆功能,能记住所搜寻到的最佳位置。

每⼀个粒⼦还有⼀个速度以决定飞⾏的距离和⽅向。这个速度

根据它本⾝的飞⾏经验以及同伴的飞⾏经验进⾏动态调整。

算法与三维路径规划的结合思想

◆根据第⼀讲的三维路径规划的基础知识,可以在起点和终点

之间任意设置若⼲个散点(即控制点),然后依据先后顺序

可以拟合得到光滑曲线,即三维路径。

◆为简单起见,可以在起点和终点之间设置三个散点。因此,

三维空间内的任意三个散点,再加上起点和终点就可以规划

三维路径。

◆总结⽽⾔,有:

将三个散点看成⼀个整体,即⼀个粒⼦;

将⾃由空间看成是每个粒⼦的可⾏域,即解空间;

将⼭峰等视为障碍物,即约束条件;

将三维路径的长度、平均曲率(挠率)等视为适应度函数;

◆故三维路径规划过程,就可以看成是众多粒⼦(三个散点)

在解空间内寻找最优位置的过程。

◆粒⼦位置更新表达式

主函数

下⾯展⽰⼀些内联代码⽚。

%第2讲:粒⼦群算法

%作者:Ally

%⽇期:2021/07/10

clc

clear

clear

closeall

%%三维路径规划模型定义

startPos=[1,1,1];

goalPos=[100,100,80];

%随机定义⼭峰地图

mapRange=[100,100,100];%地图长、宽、⾼范围

[X,Y,Z]=defMap(mapRange);

%%初始参数设置

N=100;%迭代次数

M=50;%粒⼦数量

pointNum=3;%每⼀个粒⼦包含三个位置点

w=1.2;%惯性权重

c1=2;%社会权重

c2=2;%认知权重

%粒⼦位置界限

posBound=[[0,0,0]\',mapRange\'];

%粒⼦速度界限

alpha=0.1;%粒⼦变化系数

%velbound是-10到+10

velBound(:,2)=alpha*(posBound(:,2)-posBound(:,1));

velBound(:,1)=-velBound(:,2);

%%种群初始化

%初始化⼀个空的粒⼦结构体

=[];

particles.v=[];

s=[];

=[];

%个体最优

=[];

s=[];

=[];

%定义M个粒⼦的结构体

particles=repmat(particles,M,1);

%初始化每⼀代的最优粒⼦,把它放成最⼤值

s=inf;

%第⼀代的个体粒⼦初始化

fori=1:M

%粒⼦按照unifrnd正态分布随机⽣成1*pointNum的随机数

particles(i).pos.x=unifrnd(posBound(1,1),posBound(1,2),1,pointNum);

particles(i).pos.y=unifrnd(posBound(2,1),posBound(2,2),1,pointNum);

particles(i).pos.z=unifrnd(posBound(3,1),posBound(3,2),1,pointNum);

%初始化速度定义为0

particles(i).v.x=zeros(1,pointNum);

particles(i).v.y=zeros(1,pointNum);

particles(i).v.z=zeros(1,pointNum);

%适应度返回是否碰撞,适应度与路径

[flag,fitness,path]=calFitness(startPos,goalPos,X,Y,Z,particles(i).pos);

%碰撞检测判断

ifflag==1

%若flag=1,表明此路径将与障碍物相交,则增⼤适应度值

particles(i).fitness=1000*fitness;

particles(i).path=path;

else

else

%否则,表明可以选择此路径

particles(i).fitness=fitness;

particles(i).path=path;

end

%更新个体粒⼦的最优

particles(i).=particles(i).pos;

particles(i).s=particles(i).fitness;早晨的近义词

particles(i).=particles(i).path;

%更新全局最优

ifparticles(i).s

GlobalBest=particles(i).Best;

end

end

%初始化每⼀代的最优适应度,⽤于画适应度迭代图

fitness_beat_iters=zeros(N,1);

%%循环

foriter=1:N

fori=1:M

%更新速度

particles(i).v.x=w*particles(i).

+c1*rand([1,pointNum]).*(particles(i)..x-particles(i).pos.x)...

+c2*rand([1,pointNum]).*(.x-particles(i).pos.x);

particles(i).v.y=w*particles(i).

+c1*rand([1,pointNum]).*(particles(i)..y-particles(i日出(打一字) ).pos.y)...

+c2*rand([1,pointNum]).*(.y-particles(i).pos.y);

particles(i).v.z=w*particles(i).

+c1*rand([1,pointNum]).*(particles(i)..z-particles(i).pos.z)...

+c2*rand([1,pointNum]).*(.z-particles(i).pos.z);

%判断是否位于速度界限以内

particles(i).v.x=min(particles(i).v.x,velBound(1,2));

particles(i).v.x=max(particles(i).v.x,velBound(1,1));

particles(i).v.y=min(particles(i).v.y,velBound(2,2));

particles(i).v.y=max(particles(i).v.y,velBound(2,1));

particles(i).v.z=min(particles(i).v.z,velBound(3,2));

particles(i).v.z=max(particles(i).v.z,velBound(3,1));

%更新粒⼦位置

particles(i).pos.x=particles(i).pos.x+particles(i).v.x;

particles(i).pos.y=particles(i).pos.y+particles(i).v.y;

particles(i).pos.z=particles(i).pos.z+particles(i).v.z;

%判断是否位于粒⼦位置界限以内

particles(i).pos.x=max(particles(i).pos.x,posBound(1,1));

particles(i).pos.x=min(particles(i).pos.x,posBound(1,2));

particles(i).pos.y=max(particles(i).pos.y,posBound(2,1));

particles(i).pos.y=min(particles(i).pos.y,posBound(2,2));

particles(i).pos.z=max(particles(i).pos.z,posBound(3,1));

particles(i).pos.z=min(particles(i).pos.z,posBound(3,2));

%适应度计算

[flag,fitness,path]=calFitness(startPos,goalPos,X,Y,Z,particles(i).pos);

%碰撞检潦草的反义词 测判断

ifflag==1

%若flag=1,表明此路径将与障碍物相交,则增⼤适应度值

particles(i).fitness=1000*fitness;

particles(i).path=path;

else

%否则,表明可以选择此路径

particles(i).fitness=fitness;

particles(i).fitness=fitness;

particles(i).path=path;

end

%更新个体粒⼦最优

ifparticles(i).fitness

particles(i).=particles(i).pos;

particles(i).s=particles(i).fitness;

particles(i).=particles(i).path;

%更新全局最优粒⼦

ifparticles(i).s

GlobalBest=particles(i).Best;

end

end

end

%把每⼀代的最优粒⼦赋值给fitness_beat_iters

fitness_beat_iters(iter)=s;

%在命令⾏窗⼝显⽰每⼀代的信息num2str-->numtostring

disp([\'第\'num2str(iter)\'代:\'\'最优适应度=\'num2str(fitness_beat_iters(iter))]);

%画图

plotFigure(startPos,goalPos,X,Y,Z,GlobalBest);

pause(0.001);

end

%%结果展⽰

%理论最⼩适应度:直线距离

fitness_best=norm(startPos-goalPos);

disp([\'理论最优适应度=\'num2str(fitness_best)]);

%画适应度迭代图

figure

plot(fitness_beat_iters,\'LineWidth\',2);

xlabe清明节要干什么 l(\'迭代次数\');

ylabel(\'最优适应度\');

创建地图函数

function[X,Y,Z]=defMap(mapRange)

%初始化地形信息

N=10;%⼭峰个数

peaksInfo=struct花开花落又一年 ;%初始化⼭峰特征信息结构体

=[];%⼭峰中⼼

=[];%⼭峰区域

=[];%⼭峰⾼度

peaksInfo=repmat(peaksInfo,N,1);

%随机⽣成N个⼭峰的特征参数

fori=1:N

peaksInfo(i).center=[mapRange(1)*(rand*0.8+0.2),mapRange(2)*(rand*0.8+0.2)];

peaksInfo(i).height=mapRange(3)*(rand*0.7+0.3);

peaksInfo(i).range=mapRange*0.1*(rand*0.7+0.3);

end

%计算⼭峰曲⾯值

peakData=[];

forx=1:mapRange(1)

fory=1:mapRange(2)

sum=0;

fork=1:N

h_i=peaksInfo(k).height;

x_i=peaksInfo(k).center(1);

y_i=peaksInfo(k).center(2);

x_si=peaksInfo(k).range(1);

y_si=peaksInfo(k).range(2);

sum=sum+h_i*exp(-((x-x_i)/x_si)^2-((y-y_i)/y_s暖春电视剧 i)^2);

end

peakData(x,y)=sum;

end

end

%构造曲⾯⽹格,⽤于插值判断路径是否与⼭峰交涉

x=[];

fori=1:mapRange(1)

x=[x;ones(mapRange岁寒三友的象征意义 (2),1)*i];

end

y=(1:mapRange(2))\';

y=repmat(y,length(peakData(:))/length(y),1);

peakData=reshape(peakData,length(peakData(:)),1);

[X,Y,Z]=griddata(x,y,peakData,...

linspace(min(x),max(x),100)\',...

linspace(min(y),max(y),100));

end

计算适应度,插值路线

function[flag,fitness,path]=calFitness(startPos,goalPos,X,Y,Z,pos)

%计算适应度,插值路线

%利⽤三次样条拟合散点

x_seq=[startPos(1),pos.x,goalPos(1)];

y_seq=[startPos(2),pos.y,goalPos(2)];

z_seq=[startPos(3),pos.z,goalPos(3)];

k=length(x_seq);

i_seq=linspace(0,1,k);

I_seq=linspace(0,1,100);

%spline(x,y,插值个数)

X_seq=spline(i_seq,x_seq,I_seq);

Y_seq=spline(i_seq,y_seq,I_seq);

Z_seq=spline(i_seq,z_seq,I_seq);

path=[X_seq\',Y_seq\',Z_seq\'];

%判断⽣成的曲线是否与与障碍物相交

flag=0;

fori=2:size(path,1)

x=path(i,1);

y=path(i,2);

%interp2:meshgrid格式的⼆维⽹格数据的插值

z_interp=interp2(X,Y,Z,x,y);

ifpath(i,3)

flag=1;

break

end

end

%%计算三次样条得到的离散点的路径长度(适应度)

dx=diff(X_seq);

dy=diff(Y_seq);

dz=diff(Z_seq);

fitness=sum(sqrt(dx.^2+dy.^2+dz.^2));

画图函数

functionplotFigure(startPos,goalPos,X,Y,Z,GlobalBest)

%画起点和终点

scatter3(startPos(1),startPos(2),startPos(3),100,\'bs\',\'MarkerFaceColor\',\'y\')

holdon

scatter3(goalPos(1),goalPos(2),goalPos(3),100,\'kp\',\'MarkerFaceColor\',\'y\')

%画⼭峰曲⾯

surf(X,Y,Z)%画曲⾯图

shadingflat%各⼩曲⾯之间不要⽹格

%画路径

path=;

pos=;

scatter3(pos.x,pos.y,pos.z,\'go\');

plot3(path(:,1),path(:,2),path(:,3),\'r\',\'LineWidth\',2);

holdoff

gridon

更多推荐

Jeremy是什么意思emy在线翻译读音例句