前言
复现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轮后再次进行测试,动作幅度减小了,但是依然存在碰撞和短视的问题。
实验讨论
项目构成
- 对于场景的使用出现了和flightbench一样的方式,即场景和
unity_standalone是分开的,而不是场景直接绑定在二进制文件中。
- 最好对文件结构进行重构,例如将依赖项放到
/dep中。flightbench的项目实现太过冗杂,不能自己选择下载->一个项目空间最好就做一件事情
- 本项目进行了拆分式的下载方式,减小了每一项的大小,如果可以自动化下载就更好了
实验结果
- 通过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.