当前位置: 首页 > news >正文

【MPC】无人机模型预测控制复现Data-Driven MPC for Quadrotors项目(Part 1)

无人机模型预测控制复现Data-Driven MPC for Quadrotors项目

    • 参考链接
    • 背景和问题
    • 方法与贡献
    • 实验结果
    • 安装ROS
    • 创建工作空间
    • 下载RotorS仿真器源码和依赖
    • 创建Python虚拟环境
    • 下载data_driven_mpc仓库代码
    • 下载并配置ACADO求解器
    • 下载并配置ACADO求解器的Python接口
    • 下载并配置rpg_quadrotor_control源码
    • 测试rpg_quadrotor_control源码
    • 测试data_driven_mpc仓库代码
      • 在Simplified Simulation中测试
        • 测试飞行

环境:

Ubuntu :20.04 LTS

Python: 3.8

在这里插入图片描述

参考链接

Github仓库地址

论文Data-Driven MPC for Quadrotors

Youtube视频

背景和问题

高速度和高加速度下的精确轨迹跟踪对于四旋翼飞行器仍然是一个挑战。由于空气动力学效应的复杂性,这些效应在高速度时会对飞行器的轨迹跟踪产生显著干扰,并引入较大的位置误差。这些效应难以建模,而现有的方法通常忽略了这些空气动力学效应,导致在执行快速和灵活的飞行任务时精度不足。

方法与贡献

本文提出了一种利用**高斯过程(Gaussian Processes, GP)**对四旋翼飞行器的动力学模型进行数据驱动增强的方法。具体而言,GP用于学习残差动力学,即在简化的四旋翼模型基础上,预测并修正空气动力学引起的误差,然后将这一增强的动力学模型集成到模型预测控制(Model Predictive Control, MPC)中,来实现高效且精确的实时反馈控制。

  • 结合了学习到的GP修正项与四旋翼飞行器的标称动力学,形成了一种高效的MPC控制管线。

  • 通过仿真和现实世界的实验,验证了这种方法在高速度和高加速度下的轨迹跟踪精度,能够显著优于传统的线性空气动力学模型。

实验结果

通过仿真和实际飞行实验,本文方法在多种轨迹(如随机、圈、双纽线轨迹等)中展示了其优越性。与未增强的MPC相比,本文提出的方法在速度达到14 m/s、加速度超过4g的条件下,能够将轨迹跟踪误差减少高达70 %。实验还表明,该方法在不同的轨迹之间具有良好的泛化能力,并在实验中持续表现优于基于线性阻力模型的MPC。

安装ROS

安装 ROS ,推荐用鱼香 ROS 的一键安装。

鱼香ROS网站上线|一行代码安装ROS/ROS2/解决rosdep问题|小鱼脚本

wget http://fishros.com/install -O fishros && bash fishros

创建工作空间

创建工作空间。

mkdir -p ~/mpc_ws/src
cd ~/mpc_ws/src
catkin_init_workspace  # initialize your catkin workspace
wstool init

下载RotorS仿真器源码和依赖

下载 RotorS 仿真器源码和依赖。

cd ~/mpc_ws/src
git clone https://github.com/catkin/catkin_simple.git
git clone https://github.com/ethz-asl/rotors_simulator.git
git clone https://github.com/ethz-asl/mav_comm.git
git clone https://github.com/ethz-asl/eigen_catkin.git
sudo apt-get install libgoogle-glog-dev
sudo apt-get install liblapacke-dev

编译工作空间。

cd ~/mpc_ws
catkin build

创建Python虚拟环境

Python virtualenv 是一个用于创建和管理虚拟环境的工具。它可以帮助开发者在不同的项目中使用不同的 Python 版本和包,而不会相互干扰。使用 virtualenv,可以轻松地创建一个独立的 Python 环境,在其中安装所需的包和版本,而不会影响系统中已经安装的其他 Python 环境和包。

我这里使用的是 Ubuntu 20.04 、 Python 3.8 的环境配置。

sudo pip3 install virtualenv
cd ~
virtualenv mpc_venv --python=/usr/bin/python3.8
source ~/mpc_venv/bin/activate

下载data_driven_mpc仓库代码

下载 data_driven_mpc 仓库代码。

cd ~/mpc_ws/src
git clone https://github.com/uzh-rpg/data_driven_mpc.git

该代码已在 Ubuntu 18.04 、 Python 3.6 和 ROS Melodic 上进行了测试运行。

切换到分支python3.8_support,可以在 Ubuntu 20.04 、 Python 3.8 和 ROS Noetic 上运行。

切换分支,激活 Python 环境并安装其余必需的 Python 库。

cd data_driven_mpc
git checkout python3.8_support
source ~/mpc_venv/bin/activate
python3 setup.py install

需要安装以下库。

install_requires=['numpy==1.19.0','scipy==1.5.0','tqdm==4.46.1','matplotlib==3.2.2','scikit-learn==0.23.2','casadi==3.5.1','pyquaternion==0.9.5','joblib==0.15.1','pandas==1.0.5','PyYAML==5.3.1','pycryptodomex==3.9.8','gnupg==2.3.1','rospkg==1.2.8','tikzplotlib==0.9.4'],

可以使用以下命令查看 Python 下所有包和包的版本。

pip list -o

多尝试几次,这个可能受网络环境影响,直到显示Finished processing dependencies ...为止。

再次编译工作空间。

cd ~/mpc_ws
catkin build

下载并配置ACADO求解器

参考链接

首先,安装必要的软件包。

sudo apt-get install gcc g++ cmake git gnuplot doxygen graphviz

下载 ACADO 求解器源码。

git clone https://github.com/acado/acado.git
cd acados
git submodule update --recursive --init

在 acados 目录下建立 build 文件夹,用于存放编译文件。

cd ~/acados
mkdir -p build
cd build
cmake -DACADOS_WITH_QPOASES=ON ..

进行编译。

make install -j4

执行一个例程以检查配置是否成功。

cd ..
cd examples/getting_started
./simple_ocp

运行结果如下。

在这里插入图片描述

如果运行结果如下图所示,出现显示异常。

在这里插入图片描述

打开 Ubuntu 系统配置,将缩放这一栏调回100%即可。

在这里插入图片描述

如果你想在debug模式下编译 acado ,可以运行如下命令:

cmake -DCMAKE_BUILD_TYPE=Debug ..

下载并配置ACADO求解器的Python接口

参考链接

在 acados 目录下下载接口文件。

cd ~/acados
pip install -e ~/acados/interfaces/acados_template

在 ~/.bashrc 文件中添加路径,这里需要写绝对路径, hccwb 是我的计算机名。

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:"/home/hccwb/acados/lib"
export ACADOS_SOURCE_DIR="/home/hccwb/acados"

在激活的虚拟环境中,测试 Python 案例。

source ~/mpc_venv/bin/activate
cd ~/acados/examples/acados_python/getting_started/
python minimal_example_ocp.py

如果运行成功,结果如下。

在这里插入图片描述

如果提示安装 Tera 模板渲染器,这里需要手动下载一下。

t_renderer-v0.0.34-linux下载地址

将下载的文件移动到 acados 的 bin 目录,重命名为 t_renderer,并赋予可执行权限。

mv ~/Downloads/t_renderer-v0.0.34-linux ~/acados/bin/t_renderer
chmod +x ~/acados/bin/t_renderer

下载并配置rpg_quadrotor_control源码

安装 ROS 依赖。

sudo apt-get install libgoogle-glog-dev protobuf-compiler ros-$ROS_DISTRO-octomap-msgs ros-$ROS_DISTRO-octomap-ros ros-$ROS_DISTRO-joy ros-$ROS_DISTRO-rqt*

安装 vcstool 包。

sudo apt-get install python3-vcstool 

如果提示找不到包,可以使用以下方法。

方法一:已经安装了 ROS 。

sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
sudo apt install curl # if you haven't already installed curl
curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -
sudo apt-get update
sudo apt-get install python3-vcstool

方法二:没有安装 ROS 。

curl -s https://packagecloud.io/install/repositories/dirk-thomas/vcstool/script.deb.sh | sudo bash
sudo apt-get update
sudo apt-get install python3-vcstool

下载 rpg_quadrotor_control 源码

cd ~/mpc_ws/src
git clone https://github.com/uzh-rpg/rpg_quadrotor_control.git

下载相关依赖。

vcs-import < rpg_quadrotor_control/dependencies.yaml

如果下载失败,可以使用 HTTP 来克隆 GitHub 上的仓库。修改rpg_quadrotor_control/dependencies.yaml文件,将其中的所有 SSH 链接替换为 HTTP 链接。

repositories:catkin_simple:type: giturl: https://github.com/catkin/catkin_simple.gitversion: mastereigen_catkin:type: giturl: https://github.com/ethz-asl/eigen_catkin.gitversion: mastermav_comm:type: giturl: https://github.com/ethz-asl/mav_comm.gitversion: masterrotors_simulator:type: giturl: https://github.com/ethz-asl/rotors_simulator.gitversion: masterrpg_quadrotor_common:type: giturl: https://github.com/uzh-rpg/rpg_quadrotor_common.gitversion: masterrpg_single_board_io:type: giturl: https://github.com/uzh-rpg/rpg_single_board_io.gitversion: master

确保 rqt 缓存中的 GUI 已更新,如果报错找不到文件,忽略这个错误。

rm ~/.config/ros.org/rqt_gui.ini

编译工作空间。

cd ~/mpc_ws
catkin build

将工作空间地址添加到~/.bashrc文件。

echo "source ~/mpc_ws/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc

测试rpg_quadrotor_control源码

参考链接

测试运行集成开发环境。

cd ~/mpc_ws
catkin run_tests --no-deps rpg_quadrotor_integration_test

如果集成测试开发环境运行正常,应该看到这样的 Gazebo 模拟环境。

在这里插入图片描述

启动基础仿真环境使用以下命令。

source ~/mpc_ws/devel/setup.bash
roslaunch rpg_rotors_interface quadrotor_empty_world.launch

如果运行正常会看到如下的界面。

在这里插入图片描述

要使四旋翼飞行器飞行,首先点击Connect按钮,然后按下Arm Bridge按钮向无人机发送命令,然后按下Start按钮启动。

测试data_driven_mpc仓库代码

官方提供了如何在两个不同的模拟器中使用此软件包的说明。Simplified Simulation 和 Gazebo Simulation 。Simplified Simulation 是一个轻量级的 Python 模拟器,Gazebo Simulation 是建立在 RotorS 上的。

首先,确保将 data_driven_mpc 包的主目录添加到 Python 路径中。

export PYTHONPATH=$PYTHONPATH:~/mpc_ws/src/data_driven_mpc/ros_gp_mpc

在Simplified Simulation中测试

测试飞行

要验证软件包的正确安装,请首先在简化模拟上执行试飞。

source ~/mpc_ws/devel/setup.bash
source ~/mpc_venv/bin/activate
roscd ros_gp_mpc
python src/experiments/trajectory_test.py

模拟完成后,正确的安装应产生与以下结果非常相似的结果(平均优化时间可能会有所不同)。

:::::::::::::: SIMULATION SETUP ::::::::::::::Simulation: Applied disturbances: 
{"noisy": true, "drag": true, "payload": false, "motor_noise": true}Model: No regression model loadedReference: Executed trajectory `loop` with a peak axial velocity of 8 m/s, and a maximum speed of 8.273 m/s::::::::::::: SIMULATION RESULTS :::::::::::::Mean optimization time: 1.488 ms
Tracking RMSE: 0.2410 m

您可以在config/configuration_parameters.py文件中编辑 Simplified Simulation 的配置变量以获得更好的可视化效果。在SimpleSimConfig类中:

# Set to True to show a real-time Matplotlib animation of the experiments for the Simplified Simulator. Execution 
# will be slower if the GUI is turned on. Note: setting to True may require some further library installation work.
custom_sim_gui = True# Set to True to display a plot describing the trajectory tracking results after the execution.
result_plots = True# Set to True to show the trajectory that will be executed before the execution timepre_run_debug_plots = True# Choice of disturbances modeled in our Simplified Simulator. For more details about the parameters used refer to# the script: src/quad_mpc/quad_3d.py.simulation_disturbances = {"noisy": True,                       # Thrust and torque gaussian noises"drag": True,                        # 2nd order polynomial aerodynamic drag effect"payload": False,                    # Payload force in the Z axis"motor_noise": True                  # Asymmetric voltage noise in the motors}

下面是运行结果。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

您还可以改变参考轨迹的峰值速度和加速度,或者使用双纽线轨迹而不是圆轨迹。所有这些选项都可以在脚本参数中指定。键入以下内容可以显示更多信息:

python src/experiments/trajectory_test.py --help

参考资料:

Github仓库地址

论文Data-Driven MPC for Quadrotors

安装 python3-vcstool

相关文章:

【MPC】无人机模型预测控制复现Data-Driven MPC for Quadrotors项目(Part 1)

无人机模型预测控制复现Data-Driven MPC for Quadrotors项目 参考链接背景和问题方法与贡献实验结果安装ROS创建工作空间下载RotorS仿真器源码和依赖创建Python虚拟环境下载data_driven_mpc仓库代码下载并配置ACADO求解器下载并配置ACADO求解器的Python接口下载并配置rpg_quadr…...

微信小程序开发——比较两个数字大小

在这里我们使用的工具是 需要自行安装和配置。 在微信小程序中比较两个数字大小有以下几种方式&#xff1a; 一、普通条件判断 在小程序的.js 文件中&#xff0c;先定义两个数字&#xff0c;如let num1 5; let num2 3;。通过if - else if - else语句&#xff0c;根据num1与…...

Java多线程3

1.有序性在并发编程中的含义。 有序性在并发编程中指的是在多线程环境下&#xff0c;程序的执行顺序应与单线程情况下保持一致&#xff0c;以避免出现不确定或错误的执行结果。 2.为何需要使用多线程进行程序设计&#xff1f; 使用多线程可以提高程序的效率&#xff0c;利用…...

node+Vue项目环境创建

nodeVue项目环境创建 使用淘宝镜像源使用官方镜像源()清除缓存取消取消ssl验证安装vue 使用淘宝镜像源 npm config set registry https://registry.npm.taobao.org/使用官方镜像源() 由于国内网络问题&#xff0c;安装报错 npm install -g cnpm --registryhttps://registry.…...

云智AI人工智能平台——与众不同之处

人工智能领域、深度学习、强化学习、大小模型盛行的时代&#xff0c;人工智能技术正以前所未有的速度改变着我们的世界。然而&#xff0c;在众多AI平台中&#xff0c;如何选择一个既高效又灵活的工具&#xff0c;成为了每个开发者心中的难题。今天&#xff0c;我们特别介绍一款…...

国庆节有什么好物值得入手?精选国庆节必选好物合集

一年一度的国庆节马上来临了&#xff0c;平时舍不得买的好物可以在国庆节这段时间大采购了&#xff0c;毕竟这可是年度购物的好时机&#xff0c;千万不要错过这个享受优惠的机会。还不知道买什么国庆节好物的朋友可以看看本篇文章&#xff0c;提前做好功课噢&#xff01; 好物…...

并发安全与锁

总述 这篇文章&#xff0c;我想谈一谈自己对于并发变成的理解与学习。主要涉及以下三个部分&#xff1a;goroutine&#xff0c;channel以及lock 临界区 首先&#xff0c;要明确下面两组概念 并发和并行 并行&#xff1a;指几个程序每时每刻都同时进行 并发&#xff1a;指…...

细胞分裂检测系统源码分享

细胞分裂检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…...

openssl 生成多域名 多IP 的数字证书

openssl.cnf 文件内容&#xff1a; [req] default_bits 2048 distinguished_name req_distinguished_name copy_extensions copy req_extensions req_ext x509_extensions v3_req prompt no [req_distinguished_name] countryName CN stateOrProvinceName GuangDong l…...

电影评论|基于springBoot的电影评论网站设计与实现(附项目源码+论文+数据库)

私信或留言即免费送开题报告和任务书&#xff08;可指定任意题目&#xff09; 目录 一、摘要 二、相关技术 三、系统设计 四、数据库设计 五、核心代码 六、论文参考 七、源码获取&#xff1a; 一、摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c…...

【C++】虚函数

一、什么是虚函数 在类的成员函数前加上virtual关键字&#xff0c;这个函数就是虚函数。 虚函数的所用就是完成多态。多态示例如下&#xff1a; class A {public:virtual void func()//虚函数{cout << "A" << endl;}void ftwo()//普通函数{cout <&…...

esxi虚拟机启用cbt备份(增量备份)

在虚拟机中启用CBT 1.关闭虚拟机。 右键点按虚拟机&#xff0c;Edit Settings-VM Options-Advanced-Configuration Parameters-Edit Configuration- Add parameters&#xff0c;添加ctkEnabled参数&#xff0c;并将其值设置为true。 Add parameters&#xff0c;添加scsi0:0…...

mysql 8.0 时间维度表生成(可运行)

文章目录 mysql 8.0 时间维度表生成实例时间维度表的作用时间维度表生成技术细节使用时间维度表的好处 mysql 8.0 时间维度表生成实例 时间维度表的作用 dim_times&#xff08;时间维度表&#xff09;在数据仓库&#xff08;Data Warehouse&#xff09;中的作用至关重要。作为…...

打造高效实时数仓,从Hive到OceanBase的经验分享

本文作者&#xff1a;Coolmoon1202&#xff0c;大数据高级工程师&#xff0c;专注于高性能软件架构设计 我们的业务主要围绕出行领域&#xff0c;鉴于初期采用的数据仓库方案面临高延迟、低效率等挑战&#xff0c;我们踏上了探索新数仓解决方案的征途。本文分享了我们在方案筛选…...

15.3 JDBC数据库编程

15.3 JDBC数据库编程 15.3.1 创建数据库和表 创建一个名为webstore的数据库&#xff0c;并向其中添加数据&#xff0c;代码如下: 1.创建数据库 CREATE TABLE products( id int PRIMARY KEY, pname VARCHAR(20) brand VARCHAR(20), price FLOAT(7,2), stock SMALLINT, ) …...

SSH公私钥后门从入门到应急响应

目录 1. SSH公私钥与SSH公私钥后门介绍 1.1 SSH公私钥介绍 1.1.1 公钥和私钥的基本概念 1.1.2 SSH公私钥认证的工作原理(很重要) 1.2 SSH公私钥后门介绍 2. 如何在已拿下控制权限的主机创建后门 2.1 使用 Xshell 生成公钥与私钥 2.2 将公钥上传到被需要被植入后门的服务…...

服务器数据恢复—Linux操作系统环境下网站数据的恢复案例

服务器数据恢复环境&#xff1a; 一台linux操作系统服务器上跑了几十个网站&#xff0c;服务器上只有一块SATA硬盘。 服务器故障&#xff1a; 服务器突然宕机&#xff0c;尝试再次启动失败。将硬盘拆下检测&#xff0c;发现存在坏扇区。找当地一家数据恢复公司处理后&#xff…...

开放式耳机是怎么样的?开放式耳机的优缺点分析?

开放式耳机作为一种独特的耳机类型&#xff0c;因其独特设计和使用体验受到了许多用户的喜爱。了解开放式耳机的优缺点有助于大家更好地选择适合自己需求的耳机。以下是开放式耳机的一些主要优点和缺点分析&#xff1a; 优点 l 舒适度高 开放式耳机的设计通常更加轻盈&#…...

HDMI色块移动——FPGA学习笔记13

一、方块移动原理 二、实验任务 使用FPGA开发板上的HDMI接口在显示器上显示一个不停移动的方块&#xff0c;要求方块移动到边界处时能够改变移动方向。显示分辨率为800*480&#xff0c;刷新速率为90hz。&#xff08;480p分辨率为800*480&#xff0c;像素时钟频率Vga_clk 800x4…...

MySQL中去除重复

除去相同的行 SELECT DISTINCT 列名 FROM 表名; 示例&#xff1a;查询employees表&#xff0c;显示唯一的部门ID select distinct department_id from employees;...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...

基于 TAPD 进行项目管理

起因 自己写了个小工具&#xff0c;仓库用的Github。之前在用markdown进行需求管理&#xff0c;现在随着功能的增加&#xff0c;感觉有点难以管理了&#xff0c;所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD&#xff0c;需要提供一个企业名新建一个项目&#…...