基于人工势场法的车辆编队轨迹规划matlab仿真验证

给出了完整的MATLAB代码仿真;基于人工势场法编队的基本原理:通过构建车辆相对目标点的引力势场和斥力势场构建车辆所处地图下的整体势场,设置如图所示的势场图,

 图中圆心为我们参考的目标点,其可以提供引力方向;圆圈外引力为正,圆圈内引力为负。构建势场函数如式:

势场力选着势场函数的负梯度方向。

 上图为人工势场编队结果。



clear ;
close all;
clc;

%%初始化车辆与目标点
target=[0,0]';
car1(:,1)=[10 0];
car2(:,1)=[-10 10];
car3(:,1)=[-7 5];
car4(:,1)=[7 9];
Car1_a=0;
Car2_a=0;
Car3_a=0;
Car4_a=0;
Car1_v=0;
Car2_v=0;
Car3_v=0;
Car4_v=0;

a=0.01;
v=0.2;
R=5;
xite=0.2;
alfa=0.2;

Car1=car1;
Car2=car2;
Car3=car3;
Car4=car4;
i=0;
%%构建人工势场
while(1000-i)
    i=i+1;
 %距离   
Car1_l=norm(Car1-target);
Car2_l=norm(Car2-target);
Car3_l=norm(Car3-target);
Car4_l=norm(Car4-target);
%方位
Car1_o=Car1-target;
Car2_o=Car2-target;
Car3_o=Car3-target;
Car4_o=Car4-target;
%单位化方向向量
Car1_uo=Car1_o/Car1_l;
Car2_uo=Car2_o/Car2_l;
Car3_uo=Car3_o/Car3_l;
Car4_uo=Car4_o/Car4_l;
%引力
Car1_f=-xite*(Car1_l-R);
Car2_f=-xite*(Car2_l-R);
Car3_f=-xite*(Car3_l-R);
Car4_f=-xite*(Car4_l-R);
%合力
Car1_f=-xite*(Car1_l-R)-alfa*Car1_v;
Car2_f=-xite*(Car2_l-R)-alfa*Car2_v;
Car3_f=-xite*(Car3_l-R)-alfa*Car3_v;
Car4_f=-xite*(Car4_l-R)-alfa*Car4_v;
%车辆加速度更新
if Car1_f>a
    Car1_f=a;
elseif Car1_f<-a
    Car1_f=-a;
end
if Car2_f>a
    Car2_f=a;
elseif Car2_f<-a
    Car2_f=-a;
end
if Car3_f>a
    Car3_f=a;
elseif Car3_f<-a
    Car3_f=-a;
end
if Car4_f>a
    Car4_f=a;
elseif Car4_f<-a
    Car4_f=-a;
end
Car1_v=Car1_v+Car1_f;
Car2_v=Car2_v+Car2_f;
Car3_v=Car3_v+Car3_f;
Car4_v=Car4_v+Car4_f;
if Car1_v>v
    Car1_v=v;
elseif Car1_v<-v
    Car1_v=-v;
end
if Car2_v>v
    Car2_v=v;
elseif Car2_v<-v
    Car2_v=-v;
end
if Car3_v>v
    Car3_v=v;
elseif Car3_v<-v
    Car3_v=-v;
end
if Car4_v>v
    Car4_v=v;
elseif Car4_v<-v
    Car4_v=-v;
end
%车辆位置更新
Car1=Car1+Car1_v*Car1_uo;
Car2=Car2+Car2_v*Car2_uo;
Car3=Car3+Car3_v*Car3_uo;
Car4=Car4+Car4_v*Car4_uo;
%车辆轨迹保存
car1=[car1 Car1];
car2=[car2 Car2];
car3=[car3 Car3];
car4=[car4 Car4];


end
r = 5;
xc = 0;
yc = 0;

theta = linspace(0,2*pi);
x = r*cos(theta) + xc;
y = r*sin(theta) + yc;
%
for k=length(car1)
plot(x,y);
axis equal
    hold on
plot(car1(1,k),car1(2,k),'o',car2(1,k),car2(2,k),'o',car3(1,k),car3(2,k),'o',car4(1,k),car4(2,k),'o');
pause(1);

end
%}



上述程序中,设计思路

1:设置车辆初始状态信息;位置,速度,加速度。最大加速度、最大速度信息。

2:设置人工势场法中要用到的参数信息。

3:计算车辆所处的势场图;

4:根据势场力的大小与方向作为车辆的加速度信息。

5:车辆位置的更新。

思考:

人工势场法可以证明系统的稳定;在设置车辆加速度和速度时有一个上下界线,加入速度和加速度的限制不会影响系统的稳定性;因为,由系统的控制输出是向着系统稳定点去的,由于执行器的限制效果,使得下一系统的位置并不能到希望点;但是到达的这个点相当于系统处于的初始误差位置,继续根据算法进行控制依然是可以保证系统的稳定性的。

人工势场法(Artificial Potential Field, APF)是一种常用于机器人路径规划及避障的方法,也可以用于编队控制。MATLAB可以很好地实现基于APF的编队及避障。 首先,需要定义每个机器人的位置信息和目标点信息。利用APF算法,可以计算出机器人在当前位置下受到的斥力和引力,从而得到机器人的运动方向和速度。具体实现过程如下: 1. 定义机器人的位置信息和目标点信息 ``` pos = [x1 y1; x2 y2; ...; xn yn]; % 机器人位置信息,每行代表一个机器人的x和y坐标 goal = [xg yg]; % 目标点坐标 ``` 2. 计算机器人受到的斥力和引力 ``` function [f_att, f_rep] = calc_force(pos, goal, obs_pos, obs_r, k_att, k_rep, rep_range) % 计算机器人受到的斥力和引力 f_att = -k_att*(pos - goal); % 引力 d = pdist2(pos, obs_pos); % 计算机器人和障碍物的距离 f_rep = zeros(size(pos)); for i = 1:size(pos, 1) if min(d(i,:)) < rep_range % 如果机器人在障碍物的影响范围内 f_rep(i,:) = k_rep*(1./d(i,:) - 1/obs_r)*(pos(i,:) - obs_pos(find(d(i,:) == min(d(i,:)), 1),:)); % 斥力 end end end ``` 3. 计算机器人的速度和运动方向 ``` function vel = calc_velocity(pos, goal, obs_pos, obs_r, k_att, k_rep, rep_range, max_vel) % 计算机器人的速度和运动方向 [f_att, f_rep] = calc_force(pos, goal, obs_pos, obs_r, k_att, k_rep, rep_range); % 计算斥力和引力 f_total = f_att + f_rep; % 总力 vel = max_vel*f_total./sqrt(sum(f_total.^2, 2)); % 计算速度,保证不超过最大速度 end ``` 4. 实现编队和避障 ``` pos = [x1 y1; x2 y2; ...; xn yn]; % 机器人位置信息,每行代表一个机器人的x和y坐标 goal = [xg yg]; % 目标点坐标 obs_pos = [xo1 yo1; xo2 yo2; ...; xom yom]; % 障碍物位置信息,每行代表一个障碍物的x和y坐标 obs_r = [r1; r2; ...; rm]; % 障碍物半径信息 k_att = 1; % 引力系数 k_rep = 100; % 斥力系数 rep_range = 10; % 斥力作用范围 max_vel = 1; % 最大速度 while true vel = calc_velocity(pos, goal, obs_pos, obs_r, k_att, k_rep, rep_range, max_vel); % 计算速度 pos = pos + vel; % 更新机器人位置 % 绘制机器人和障碍物 end ``` 需要注意的是,APF算法存在局部最优解的问题,因此需要合理设置参数和初始位置,以避免出现不理想的运动轨迹。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值