Mian的笔记
  • 首页
  • 文档 ▾
    • 无人机实验
    • 无人机工程
  • 关于
输入关键词开始搜索

9_ViTFly实验复现

Mian 发布于 2026-05-06

  • 📒 无人机实验
  • 🏷️ ROS1
  • 🏷️ 仿真
  • 🏷️ FlightMare
  • 🏷️ Unity
  • 🏷️ vitfly

前言

复现vitfly实验,包含基础的下载、测试、训练。预计在测试部分需要分析代码的结构,后续该如何修改。在训练部分,首先需要知道整个训练的流程,怎么将整个流程部署到服务器上,得到一个大概的训练框架;然后是学会怎么采集数据集,标准化。预计在运行之后可以对具体的内容进行分析,得到更好的idea->而在此之前,可能需要去调研vitfly的后续工作,快要两年的论文,到现在的进展如何,有什么引用

本文部分内容由AI生成,仅供参考

测试

测试过程

按照readme的内容进行复现,但是其中没有提到关于虚拟环境的构建,需要手动操作

1
2
3
4
cd ./src/vitfly/flightmare
conda env create -f environment.yml
conda activate pubflight
pip install torchvision uniplot

测试问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
问题 1: 缺少 Python 依赖包                                                                                                                                                      
- 现象: ModuleNotFoundError: No module named 'torchvision' 和 No module named 'uniplot'
- 原因: pubflight conda 环境缺少 torchvision 和 uniplot。setup_ros.bash 中的 sudo pip
install uniplot 安装到了系统 Python,而非 conda 环境
- 解决: 在 pubflight 环境中 pip install torchvision uniplot

---
问题 2: std::bad_alloc 导致 visionsim_node 崩溃
- 现象: ROS 节点 dodgeros_pilot 在加载 pilot 参数后立即崩溃,exit code -6
- 原因: EIGEN_STACK_ALLOCATION_LIMIT=1048576(约 1MB)设置过大。Linux 线程默认栈仅
8MB,多个 Eigen 固定大小矩阵的栈分配导致栈溢出。涉及 6 个 CMakeLists.txt
文件(envsim、dodgelib、flightlib、dodgeros、flightrender、flightros),首批只修复了
envsim,但其链接的 dodgelib 和 flightlib 共享库仍用旧值编译
- 解决: 将所有 6 个 CMakeLists.txt 中的值从 1048576 改为 131072(128KB),catkin clean -y
&& catkin build 完整重编译

---
问题 3: ParameterException — Quadrotor 配置文件冲突
- 现象: Quadrotor file is set manually an in YAML!
- 原因: ros_pilot.cpp 传入的 quad_file 参数是
.../quads/(目录路径,空文件名)。fs::path::has_filename() 对末尾带 /"" 的路径返回
true,导致 quad_file 未被 clear。同时 YAML 中 quadrotor
行被注释,两边都无法正确解析。第一轮尝试取消 YAML 注释反而触发了"同时设置"的冲突检测
- 解决: 保持 YAML 注释,修改 ros_pilot.cpp:41 将目录路径改为完整文件路径
.../quads/kingfisher.yaml

---
问题 4: PyTorch 设备不匹配 (1) — 输入张量在 CPU,模型在 CUDA
- 现象: RuntimeError: Input type (torch.FloatTensor) and weight type
(torch.cuda.FloatTensor) should be the same
- 原因: run_competition.py 将模型加载到 CUDA(model.to(device)),但 user_code.py 中
ToTensor() 和 torch.tensor() 默认创建 CPU 张量,直接传入 CUDA 模型导致不匹配
- 解决: 在 user_code.py 中添加 device = next(trained_model.parameters()).device,所有输入
张量(img、desiredVel、q、hidden_state)通过 .to(device) 移到模型所在设备

---
问题 5: PyTorch 设备不匹配 (2) — CUDA 张量无法转 numpy
- 现象: TypeError: can't convert cuda:0 device type tensor to numpy
- 原因: 模型输出 x 在 CUDA 上,直接调用 .numpy() 不允许。必须先移到 CPU
- 解决: x.squeeze().detach().numpy() → x.squeeze().detach().cpu().numpy()

测试结果

图像 仿真环境与rviz

表格 终端统计输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
Here is a plot of your trajectory in the xy plane
┌────────────────────────────────────────────────────────────┐
││ ▐▜ │
││ ▛▝▖ │
││ ▌ ▌ │
││ ▗█ ▐▘ ▚ │
││ ▛▝▌ ▐ ▐ │ 0.5
││ ▐ ▚ ▐ ▐ │
││ ▛ ▐ ▛ ▌ │
││ ▟ ▐▖ ▘ ▌ │
││▗▄▖ ▄▘ ▌ ▗▌ ▚ │
│▗▛ ▀▜▄▄▄▄▀▀▀▀▘ ▌ ▐ ▐ │
│▟ ▐ ▟ ▐ │
│▘──────────────────▐───────────▌────▝▌──────────────────────│ 0.0
││ ▌ ▗▄▟ ▌ │
││ ▚ ▄▀▀▀ ▚ │
││ ▝▖ ▗▛▘ ▐▖ ▄▄▛▀▀▜▄▄▄▄▖ ▗▄▄▄│
││ ▀▛▘ ▙ ▗▛▘ ▀▀▀▀ │
││ ▝▙▟▀ │
└────────────────────────────────────────────────────────────┘
0 20 40 60
Here is a plot of your average velocity per 1m x-segment
┌────────────────────────────────────────────────────────────┐
│ ▘▘ │
│ ▖ ▖ ▖ │
│ │ 6
│ ▘ │
│ ▖ ▖ │
│ ▖ ▖▖ ▖ ▖ ▗ ▗ ▗ ▗ ▗ │
│ ▖ ▖ ▖▖▖▖▖ ▗ ▗ ▗ ▗▗ ▗ ▗ ▗▗▗▗ ▗▗▗▗ │ 5
│ ▖ ▖▖ ▗▗ ▗ ▗ ▗ ▗ ▗ ▗│
│ ▖ ▗ ▗ │
│ │
│ ▖ ▘▘ │ 4
│ ▘ │
│ │
│ │
│▘ │ 3
│ │
│ ▖ │
└────────────────────────────────────────────────────────────┘
10 20 30 40 50 60
Here is a plot of the distance to the closest obstacles
┌────────────────────────────────────────────────────────────┐
│▀▀▀▀▀▀▀▀▀▀▀▀▙▖ │
│ ▜▖ │
│ │▜▖ │ 6
│ │ ▙ │
│ │ ▐▖ ▟▖ │
│ │ ▙ ▙ ▗▌▌ │
│ │ ▐ ▐▀▙ ▟ ▐ │
│ │ ▌ ▟ ▝▄▟▘ ▐▖ │ 4
│ │ ▜ ▄ ▌ ▌ │
│ │ ▐▖ █ █ ▗▛▌ ▐▘ ▜ │
│ │ ▌ ▗▀▙▟▐▖ ▗▛ ▙ ▟ ▐▖ │
│ │ ▜ ▐ ▌ ▟▖▞ ▐ ▟ ▌ ▌ ▗│
│ │ ▝▖▛ ▐ ▌▀▘ ▝▌ ▛▌ ▗ ▐ ▜ ▞│ 2
│ │ ▀▘ ▝▌ ▐▘ ▌ ▐ ▙ ▛▙▛ ▐▖▗▌│
│ │ ▜ ▗▌▛ ▐ ▞ ▐▟▘ ▙▐ │
│ │ ▝▙▟▝▘ ▐▖▌ ▐▛ │
│ │ ▀ █ │
└────────────────────────────────────────────────────────────┘
0 5 10

训练

使用官方提供的数据

在单张4090显卡上进行100轮训练,耗时约30min,对模型进行测试,根据视觉图像可以发现模拟的动作幅度较大,易发生碰撞;且与官方论文中提到的不同,无人机只有在离障碍物很近的地方才会作出反应。在训练了300轮后再次进行测试,动作幅度减小了,但是依然存在碰撞和短视的问题。

实验讨论

项目构成

  1. 对于场景的使用出现了和flightbench一样的方式,即场景和unity_standalone是分开的,而不是场景直接绑定在二进制文件中。
  2. 最好对文件结构进行重构,例如将依赖项放到/dep中。flightbench的项目实现太过冗杂,不能自己选择下载->一个项目空间最好就做一件事情
  3. 本项目进行了拆分式的下载方式,减小了每一项的大小,如果可以自动化下载就更好了

实验结果

  1. 通过rviz中的图像可以发现,无人机经常在靠近障碍物时进行大姿态的调整,例如完全侧身。对于该点,既可以解释为危险动作,也可以解释为动作灵活。

参考内容

anish-bhattacharya/vitfly: Official repository for the paper “Vision Transformers for End-to-End Vision-Based Quadrotor Obstacle Avoidance” by Bhattacharya, et al. (2024) from GRASP, Penn.

Docker 入门知识

下一篇

catkin_simple的使用

上一篇
Mian

Mian

每天成长一点

25
2
30
目录
  1. 1. 前言
  2. 2. 测试
    1. 2.1. 测试过程
    2. 2.2. 测试问题
    3. 2.3. 测试结果
  3. 3. 训练
    1. 3.1. 使用官方提供的数据
  4. 4. 实验讨论
    1. 4.1. 项目构成
    2. 4.2. 实验结果
  5. 5. 参考内容
CATEGORIES
  • 无人机实验 (17)
  • 无人机工程 (8)
TAGS
AprilTag CPP FlightMare Gazebo IntelRealsenseD435 MAVROS NUC13 Python ROS1 Ubuntu20-04 Unity astar catkin cmake docker drone octomap px4 rosbag vins vitfly 仿真 动力学 参数服务器 实机 建图 模块化 视觉定位 路径规划 飞控

© 2026 Mian

Powered by Hexo Theme - flex-block

🌞 浅色 🌛 深色 🤖️ 自动