无人艇编队入门!深度剖析编队机理,步步推导编队模型。

无人艇编队入门!深度剖析编队机理,步步推导编队模型。领航跟随编队模式,无人艇编队数学模型推导,基于backstepping控制器设计,稳定性证明。理论+源码!
1.全轨迹引导下的欠驱动无人艇编队
编队误差模型推导,全轨迹引导下的编队控制器设计,matlab程序。有相应参考论文。
2.海洋环境干扰下的欠驱动无人艇编队
编队误差模型推导,非线性干扰观测器设计,协同编队控制器设计,matlab程序。有相应参考论文。

在这里插入图片描述


无人艇编队控制是一个复杂的领域,它涉及到多智能体系统、非线性控制理论以及海洋环境下的特殊挑战。这里,我将为你提供一个基础框架和示例代码来帮助你理解欠驱动无人艇(USV)的编队控制,包括全轨迹引导下的编队控制和考虑海洋环境干扰的情况。

1. 全轨迹引导下的欠驱动无人艇编队

编队误差模型推导

对于领航跟随模式,假设领航者的位置为 ( \mathbf{r}_L = [x_L, y_L]^T ),第 ( i ) 个跟随者的相对位置为 ( \mathbf{e}_i = \mathbf{r}_i - \mathbf{r}_L ),其中 ( \mathbf{r}_i ) 是跟随者的位置。则编队误差模型可以表示为:

[ \dot{\mathbf{e}}_i = \mathbf{v}_i - \mathbf{v}_L + \mathbf{J}(\theta_i)(\mathbf{u}_i - \mathbf{u}_L) ]

其中,( \mathbf{v} ) 和 ( \mathbf{u} ) 分别表示速度和控制输入,( \mathbf{J}(\theta) ) 是变换矩阵,取决于角度 ( \theta )。

Backstepping控制器设计

Backstepping是一种递归设计方法,用于处理非线性系统的稳定性问题。基本思想是通过逐步构造Lyapunov函数,确保每个子系统的稳定性。

function u = backstepping_controller(e, e_dot, desired_acc)
    % 参数设定
    k1 = 1; k2 = 0.5;
    
    % 定义虚拟控制律
    v = -k1*e;
    
    % 控制律
    u = desired_acc - k2*(e_dot + v);
end
MATLAB程序示例
% 参数设置
Tf = 30; % 仿真时间
dt = 0.1; % 时间步长

% 初始条件
x0 = [0; 0]; % 领航者初始位置
xi0 = [10; 0]; % 跟随者初始位置相对于领航者

% 期望轨迹
xd = @(t) sin(pi*t/15); yd = @(t) cos(pi*t/15);

% 初始化变量
t = 0:dt:Tf;
x = zeros(2,length(t)); xi = zeros(2,length(t));
x(:,1) = x0; xi(:,1) = xi0;

for k = 1:length(t)-1
    % 计算误差和误差率
    e = xi(:,k) - x(:,k);
    e_dot = diff([xi(:,k), xi(:,k+1)], [], 2)/dt - diff([x(:,k), x(:,k+1)], [], 2)/dt;
    
    % 计算期望加速度
    desired_acc = [xd(t(k+1))-2*xd(t(k))+xd(t(k-1)), yd(t(k+1))-2*yd(t(k))+yd(t(k-1))]/(dt^2);
    
    % 控制器计算
    ui = backstepping_controller(e, e_dot, desired_acc);
    u = [xd(t(k+1))-2*xd(t(k))+xd(t(k-1)), yd(t(k+1))-2*yd(t(k))+yd(t(k-1))]/(dt^2);
    
    % 更新状态
    xi(:,k+1) = xi(:,k) + dt*[cos(ui), sin(ui)]';
    x(:,k+1) = x(:,k) + dt*[cos(u), sin(u)]';
end

% 绘图
figure;
plot(x(1,:), x(2,:), 'b', xi(1,:), xi(2,:), 'r');
xlabel('X'); ylabel('Y');
title('Formation Control of USVs');
legend('Leader', 'Follower');

2. 海洋环境干扰下的欠驱动无人艇编队

在实际应用中,海洋环境会对无人艇产生干扰,如水流、风速等。这些干扰可以通过非线性干扰观测器进行估计,并用于补偿控制输入。

非线性干扰观测器设计
function d_hat = nonlinear_observer(d_hat_prev, e, e_dot, L)
    % 观测增益
    L = [1, 1];
    
    % 观测器更新规则
    d_hat = d_hat_prev + L * (e_dot + e);
end
协同编队控制器设计

结合backstepping方法与干扰观测器的结果,调整控制器以抵消干扰的影响。

function u = cooperative_controller(e, e_dot, desired_acc, d_hat)
    % 参数设定
    k1 = 1; k2 = 0.5;
    
    % 定义虚拟控制律
    v = -k1*e;
    
    % 控制律
    u = desired_acc - k2*(e_dot + v) - d_hat;
end
MATLAB程序示例
% 参数设置
Tf = 30; % 仿真时间
dt = 0.1; % 时间步长

% 初始条件
x0 = [0; 0]; % 领航者初始位置
xi0 = [10; 0]; % 跟随者初始位置相对于领航者
d_hat = 0; % 干扰估计初值

% 期望轨迹
xd = @(t) sin(pi*t/15); yd = @(t) cos(pi*t/15);

% 初始化变量
t = 0:dt:Tf;
x = zeros(2,length(t)); xi = zeros(2,length(t));
x(:,1) = x0; xi(:,1) = xi0;

for k = 1:length(t)-1
    % 计算误差和误差率
    e = xi(:,k) - x(:,k);
    e_dot = diff([xi(:,k), xi(:,k+1)], [], 2)/dt - diff([x(:,k), x(:,k+1)], [], 2)/dt;
    
    % 计算期望加速度
    desired_acc = [xd(t(k+1))-2*xd(t(k))+xd(t(k-1)), yd(t(k+1))-2*yd(t(k))+yd(t(k-1))]/(dt^2);
    
    % 干扰估计
    d_hat = nonlinear_observer(d_hat, e, e_dot, [1, 1]);
    
    % 控制器计算
    ui = cooperative_controller(e, e_dot, desired_acc, d_hat);
    u = [xd(t(k+1))-2*xd(t(k))+xd(t(k-1)), yd(t(k+1))-2*yd(t(k))+yd(t(k-1))]/(dt^2);
    
    % 更新状态
    xi(:,k+1) = xi(:,k) + dt*[cos(ui), sin(ui)]';
    x(:,k+1) = x(:,k) + dt*[cos(u), sin(u)]';
end

% 绘图
figure;
plot(x(1,:), x(2,:), 'b', xi(1,:), xi(2,:), 'r');
xlabel('X'); ylabel('Y');
title('Formation Control of USVs under Environmental Disturbances');
legend('Leader', 'Follower');

在这里插入图片描述
为了实现直线三角编队航向轨迹以及纵向和横向距离跟踪误差的仿真,我们可以基于领航跟随模式设计一个简单的无人艇编队控制系统。以下是一个MATLAB代码示例,包括编队模型、控制器设计和仿真结果。

1. 编队模型

假设我们有三艘无人艇:一艘领航艇和两艘跟随艇。它们在二维平面上进行直线编队航行。

2. 控制器设计

我们将使用Backstepping方法设计控制器,并考虑海洋环境干扰的影响。

3. MATLAB代码示例

usv_dynamics.m - 无人艇动力学模型
function dxdt = usv_dynamics(t, x, u)
    % x = [x; y; theta; v; w]
    % u = [u_v; u_w] 控制输入: 线速度和角速度
    
    % 参数设置
    L = 1; % 船体长度
    
    % 动力学方程
    dxdt = [x(4)*cos(x(3));
            x(4)*sin(x(3));
            x(5);
            u(1);
            u(2)];
end
backstepping_controller.m - Backstepping控制器
function u = backstepping_controller(e, e_dot, desired_acc, Kp, Ki, Kd)
    % PID控制律
    u = Kp*e + Ki*integral(@(t) e(t), 0, t) + Kd*e_dot + desired_acc;
end
nonlinear_observer.m - 非线性干扰观测器
function d_hat = nonlinear_observer(d_hat_prev, e, e_dot, L)
    % 观测增益
    L = [1, 1];
    
    % 观测器更新规则
    d_hat = d_hat_prev + L * (e_dot + e);
end
quad_sim_pid.m - 主仿真脚本
clear; clc;

% 参数设置
Kp = [1; 1]; Ki = [0.1; 0.1]; Kd = [0.05; 0.05]; % PID参数
Tf = 60; % 仿真时间
dt = 0.1; % 时间步长

% 初始条件
x0_leader = [0; 0; 0; 0; 0]; % 领航艇初始状态
x0_follower1 = [0; 10; 0; 0; 0]; % 跟随艇1初始状态
x0_follower2 = [0; -10; 0; 0; 0]; % 跟随艇2初始状态

% 期望轨迹
xd = @(t) t; 
yd = @(t) 0;

% 初始化变量
t = 0:dt:Tf;
x_leader = zeros(5,length(t)); xi_follower1 = zeros(5,length(t)); xi_follower2 = zeros(5,length(t));
x_leader(:,1) = x0_leader; xi_follower1(:,1) = x0_follower1; xi_follower2(:,1) = x0_follower2;

for k = 1:length(t)-1
    % 计算误差和误差率
    e_leader = xd(t(k)) - x_leader(1,k); e_follower1 = xd(t(k)) - xi_follower1(1,k); e_follower2 = xd(t(k)) - xi_follower2(1,k);
    e_dot_leader = diff([xd(t(k)), xd(t(k+1))], [], 2)/dt; e_dot_follower1 = diff([xd(t(k)), xd(t(k+1))], [], 2)/dt; e_dot_follower2 = diff([xd(t(k)), xd(t(k+1))], [], 2)/dt;
    
    % 计算期望加速度
    desired_acc_leader = [1, 0]; desired_acc_follower1 = [1, 0]; desired_acc_follower2 = [1, 0];
    
    % 干扰估计
    d_hat_leader = nonlinear_observer(0, e_leader, e_dot_leader, [1, 1]);
    d_hat_follower1 = nonlinear_observer(0, e_follower1, e_dot_follower1, [1, 1]);
    d_hat_follower2 = nonlinear_observer(0, e_follower2, e_dot_follower2, [1, 1]);
    
    % 控制器计算
    u_leader = backstepping_controller(e_leader, e_dot_leader, desired_acc_leader, Kp, Ki, Kd);
    u_follower1 = backstepping_controller(e_follower1, e_dot_follower1, desired_acc_follower1, Kp, Ki, Kd);
    u_follower2 = backstepping_controller(e_follower2, e_dot_follower2, desired_acc_follower2, Kp, Ki, Kd);
    
    % 更新状态
    [~, x_leader(:,k+1)] = ode45(@(t,x) usv_dynamics(t, x, u_leader), [t(k), t(k+1)], x_leader(:,k));
    [~, xi_follower1(:,k+1)] = ode45(@(t,x) usv_dynamics(t, x, u_follower1), [t(k), t(k+1)], xi_follower1(:,k));
    [~, xi_follower2(:,k+1)] = ode45(@(t,x) usv_dynamics(t, x, u_follower2), [t(k), t(k+1)], xi_follower2(:,k));
end

% 绘图
figure;
plot(x_leader(1,:), x_leader(2,:), 'b', xi_follower1(1,:), xi_follower1(2,:), 'g', xi_follower2(1,:), xi_follower2(2,:), 'r');
xlabel('X'); ylabel('Y');
title('Formation Control of USVs');
legend('Leader', 'Follower 1', 'Follower 2');

figure;
subplot(1,2,1);
plot(t, x_leader(1,:) - xi_follower1(1,:), 'r-', t, x_leader(1,:) - xi_follower2(1,:), 'b--');
xlabel('Time'); ylabel('Longitudinal Distance Error');
legend('L_{lf1} - L_{lfu1}', 'L_{lf2} - L_{lfu2}');

subplot(1,2,2);
plot(t, x_leader(2,:) - xi_follower1(2,:), 'r-', t, x_leader(2,:) - xi_follower2(2,:), 'b--');
xlabel('Time'); ylabel('Lateral Distance Error');
legend('L_{lb1} - L_{lfu1}', 'L_{lb2} - L_{lfu2}');

注意事项:

  1. 积分项:在实际应用中,积分项的计算可能需要更复杂的处理,以避免数值积分带来的累积误差。
  2. 微分项:直接计算微分可能会引入噪声,可以考虑使用滤波器来平滑信号。
  3. PID参数调优:上述PID参数是示例值,实际应用中需要根据具体情况进行调优。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值