【无人机】基于Koopman算子合成的CBF进行碰撞避免研究(Matlab代码实现)

本文探讨了利用Koopman算子合成控制边界函数(CBF)在无人机碰撞避免中的应用,通过结合动力学模型和安全性约束,设计出能同时保证任务执行和避免碰撞的控制策略。文章详细介绍了实验过程和Matlab代码实现,展示了Koopman方法在实际机器人运动控制中的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 💥💥💞💞欢迎来到本博客❤️❤️💥💥

🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。

⛳️座右铭:行百里者,半于九十。

📋📋📋本文目录如下:🎁🎁🎁

目录

💥1 概述

📚2 运行结果

🎉3 参考文献

🌈4 Matlab代码实现


💥1 概述

基于Koopman算子合成的CBF进行碰撞避免研究是指利用学习的Koopman算子和控制边界函数(CBF)来实现无人机的碰撞避免。这种方法结合了动力学系统的模型和安全性约束,通过学习系统的动态特性和边界函数来设计出一个控制策略,使得无人机在避免碰撞的同时,能够实现其特定任务目标,比如着陆等。这项研究旨在提高无人机的飞行安全性和任务执行效率,为实际应用场景中无人机的自主飞行提供更多可靠的解决方案。

碰撞避免是机器人运动控制中的重要问题,通过合成控制边界函数(CBF)来实现碰撞避免是一种常见的方法。最近的研究表明,使用Koopman算子来合成CBF可以提高系统的性能和鲁棒性。

Koopman算子是一种线性动力学系统的无限维度表示方法,可以将非线性系统映射到高维空间中的线性系统。通过使用Koopman算子合成CBF,可以将非线性系统的动力学特性转化为线性系统的特性,从而更容易设计和分析控制器。

在碰撞避免问题中,Koopman算子可以用来建模系统的动力学,并通过合成CBF来设计碰撞避免控制器。通过将系统状态空间划分为安全和危险区域,并使用CBF来确保系统状态不会进入危险区域,可以实现有效的碰撞避免控制。

未来的研究可以进一步探索使用Koopman算子合成CBF进行碰撞避免的方法,以提高机器人系统的性能和鲁棒性。同时,还可以研究如何将Koopman算子与其他控制方法结合,以实现更复杂的碰撞避免任务。

本文包含7个主要脚本,运行不同部分的实验,展示了Koopman + CBF框架。前4个脚本涉及学习Dubin小车模型的近似Koopman算子,然后使用学习模型在乔治亚理工学院Robotarium进行实验。这些文件为(都可以通过利用存储在代码库中的学习模型分别运行):

- 'dubin_learning.m' 生成训练数据并学习模型
- 'robotarium_obstacle_avoidance.m' 在Robotarium上执行一个模拟实验,其中单个代理避开固定障碍物
- 'robotarium_collision_avoidance.m' 在Robotarium上执行一个模拟实验,其中5个代理避免彼此碰撞
- 'robotarium_collision_obstacle_avoidance.m' 在Robotarium上执行一个模拟实验,其中5个代理避免彼此碰撞和固定障碍物

剩下的3个脚本涉及学习无人机的近似Koopman算子,并利用学习模型模拟2个不同的实验。这些文件为(都可以通过利用存储在代码库中的学习模型分别运行):

- 'uav_learning.m' 生成训练数据并学习模型
- 'uav_collision_avoidance.m' 执行一个简单的实验,其中2个无人机避免相互碰撞
- 'uav_collision_ge_exp.m' 执行一个实验,在这个实验中,3个无人机试图降落在相同的着陆垫上,同时避免相互碰撞和与地面的强烈撞击。

📚2 运行结果

部分代码:

%% Define experiment parameters:

%State constraints and backup controller parameters:
global Ts T_max x_bdry
Ts = 0.01;                                               % Sampling interval
T_max = 1;
N_max = ceil(T_max/Ts);
ts = 1e-3;                                              % Simulator time interval
x_bdry = [-1 1; -1 1; 0.2 2;                              % Position limits (m)
    -pi/6 pi/6; -pi/6 pi/6; -pi/12 pi/12;                     % Attitude limits (in euler angles XYZ) (rad)
    -1 1; -1 1; -1 1;                                   % Linear velocity limits (m/s)
    -pi/12 pi/12; -pi/12 pi/12; -pi/12 pi/12;                 % Angular velocity limits (rad/s)
    450 550; 450 550; 450 550; 450 550];                % Propeller angular velocity limits (rad/s)

% Define system and dynamics:
config = quad1_constants;
KpVxy = 0.7; %0.7
KpVz = 1; %1
KpAtt = 10; %10
KdAtt = 1; %1
KpOmegaz = 2; %2
V_max = 14.8;
V_min = 0.5;
hoverT = 0.5126*V_max; %0.52
Omega_hover = 497.61*ones(4,1);
M = [KpVxy; KpVz; KpAtt; KdAtt; KpOmegaz; hoverT];      % Backup controller parameters
z_land = 0.05;

affine_dynamics = @(x) UAVDynamics_eul(x);                  % System dynamics, returns [f,g] with x_dot = f(x) + g(x)u
backup_controller = @(x) backupU_eul(x,M);                  % Backup controller (go to hover)
controller_process = @(u) min(max(real(u),V_min*ones(4,1)),V_max*ones(4,1));
stop_crit1 = @(t,x)(norm(x(7:12))<=5e-2 || x(3) <= z_land);               % Stop if velocity is zero
sim_dynamics = @(x,u) sim_uav_dynamics(x,u,config,false,false);     % Closed loop dynamics under backup controller
sim_process = @(x,ts) x;                                % Processing of state data while simulating
initial_condition = @() generate_initial_state_uav(false);
fname = 'uav';

%Koopman learning parameters:
n = 16;
func_dict = @(x) uav_D_eul_ge(x(1),x(2),x(3),x(4),x(5),x(6),x(7),x(8),x(9),x(10),...
         x(11),x(12),x(13),x(14),x(15),x(16));         % Function dictionary, returns [D,J] = [dictionary, jacobian of dictionary]

n_samples = 250;                                         % Number of initial conditions to sample for training
gather_data = false;
tune_fit = true;

%% Learn approximated discrete-time Koopman operator:

if gather_data == true
    [T_train, X_train] = collect_data(sim_dynamics, sim_process, backup_controller, controller_process, stop_crit1, initial_condition, n_samples, ts); 
    plot_training_data(X_train,n_samples)
    
    % Process data so it only contains the states chosen for training:
    for i = 1 : length(X_train)
        X_train{i} = X_train{i}(:,1:n);
    end
    save(['data/' fname '_train_data.mat'], 'T_train','X_train');
else
    load(['data/' fname '_train_data.mat']);
end

[Z, Z_p] = lift_data(X_train,func_dict,false);
Z_p = Z_p - Z;
Z_p = Z_p(5:end,:);
if tune_fit == true
    [K, obj_vals, lambda_tuned] = edmd(Z, Z_p, 'lasso', true, [], [],true, tune_fit, 3);
    save(['data/' fname '_lambda_tuned.mat'], 'lambda_tuned');
else
    load(['data/' fname '_lambda_tuned.mat']);
    [K, obj_vals, ~] = edmd(Z, Z_p, 'lasso', true, lambda_tuned, [],true, false, 0);
    %[K, obj_vals, ~] = edmd(Z, Z_p, 'gurobi', true, lambda_tuned, false, 0);
end

🎉3 参考文献

文章中一些内容引自网络,会注明出处或引用为参考文献,难免有未尽之处,如有不妥,请随时联系删除。

[1]彭柯瑞,陈天翼,唐梓轩,等.基于Koopman算子的软体机器人数据驱动建模方法研究[J].武汉理工大学学报, 2022.

[2]彭柯瑞,陈天翼,唐梓轩,等.基于Koopman算子的软体机器人数据驱动建模方法研究[J].武汉理工大学学报, 2022.

[3]陈提.基于Koopman算子理论的航天器姿态协同控制[J].[2024-02-27].

[4]丁承君,吴礼荣,朱雪宏,等.基于Koopman算子的差速驱动AGV数据驱动控制[J].组合机床与自动化加工技术, 2023(3):109-112.

🌈4 Matlab代码实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荔枝科研社

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值