Your entire exploration stack, in a single pane.
ExploraDeck is a single-window PyQt5 mission control GUI for ROS-based autonomous drone exploration. It replaces the traditional multi-window workflow — ground station, SSH terminals, and standalone RViz — with a 5-step wizard that takes you from power-on to autonomous exploration in five clicks.
Built and tested on the SU17 drone + FUEL planner stack, but designed to be extensible to any exploration pipeline.
| Traditional workflow | ExploraDeck |
|---|---|
| 3+ windows: ground station, SSH terminals, RViz | One window |
| Manually source ROS workspaces, type roslaunch commands | Click a button |
| No guardrails — easy to launch out of order | 5-step wizard enforces correct sequencing |
| Hop between terminals to check status | Real-time telemetry in the same pane |
| No built-in log streaming | Live exploration log tailed from the drone |
git clone https://github.com/WinstonJQ/exploradeck.git
cd exploradeck
./run.sh # full version with embedded RViz
./run.sh --no-rviz # control panel only
./run.sh --test # test mode: skip takeoff hardware checkPrerequisites (laptop):
- Ubuntu 20.04, system Python 3.8+
- ROS Noetic (
ros-noetic-desktop-full) - PyQt5 (
python3-pyqt5— system deb package, zero pip installs) - SSH key-based auth to the drone
| Step | Action | Runs on |
|---|---|---|
| 1. Start Control | Launch MAVROS + Prometheus flight control | Drone (SSH) |
| 2. Start Localization | Launch MID360 LiDAR + FAST-LIO odometry | Drone (SSH) |
| 3. Takeoff Check | Verify position, arm state, odometry stability | Remote + local |
| 4. Start Exploration | Launch bridge nodes + FUEL planner | Drone (SSH) |
| 5. Trigger | Switch to COMMAND_CONTROL → publish goal | Drone (SSH) |
Safety design: each step verifies success before unlocking the next. Real-time position and battery telemetry stream via local ROS subscriptions — zero additional CPU load on the drone.
| 组件 | 版本/来源 | 说明 |
|---|---|---|
| Ubuntu | 20.04 | |
| Python | 3.8.10(系统 /usr/bin/python3) |
必须用系统 Python,ROS Noetic 绑定编译在 Python 3.8 上 |
| ROS | Noetic (ros-noetic-desktop-full) |
提供 rospy、rviz、nav_msgs、sensor_msgs |
| PyQt5 | python3-pyqt5(apt deb 包) |
sudo apt install python3-pyqt5 |
| SSH | 系统自带 | 需配置免密密钥到无人机 |
| 网络 | 以太网连接,IP 192.168.1.x 网段 |
笔记本 IP 固定为 192.168.1.123 |
关键:不能用 conda Python。 ROS Noetic 的 rospy、rviz 等 Python 绑定是给系统 Python 3.8 编译的,conda Python 3.9 无法加载 .so 文件。run.sh 中硬编码了 PYTHON=/usr/bin/python3。
无人机上需要预装以下组件和脚本:
| 组件 | 说明 |
|---|---|
| ROS Noetic | 机载 ROS 环境 |
| Prometheus v2 | amov 控制栈,含 uav_control、MAVROS 通信 |
| FAST-LIO | MID360 LiDAR 里程计 |
| FUEL planner | 自主探索规划器(本仓库仅作示例,可替换为其他规划器) |
mid360_output_headless.sh |
定位启动脚本,位于 ~/su17_experiment/src/su17_experiment/scripts/ |
start_fuel_su17.sh |
探索启动脚本,位于 ~/ |
su17_onboard.launch |
控制启动 launch 文件,位于 ROS 包 su17_experiment |
GUI 通过 SSH 远程调用无人机端的这些脚本,不在 Python 代码里拼等价命令——确保 GUI 流程与手动命令行流程完全一致。
exploradeck/
├── main.py # 入口:QApplication + 主窗口 + ROS 节点初始化
├── launch_panel.py # 左侧控制面板 UI:5 步向导 + 实时位置/电量 + 操作提示
├── step_worker.py # 后台 QThread:每步启动命令 + 验证轮询 + 本地遥测订阅
├── rviz_widget.py # 内嵌 RViz 3D 视图
├── log_panel.py # 探索日志实时显示面板
├── ssh_utils.py # SSH 远程执行(subprocess 调 ssh 命令)
├── ros_utils.py # ROS 话题订阅/发布
├── config.py # 所有配置常量
└── images/ # 截图
├── exploration_in_progress.png
└── exploration_complete.png
run.sh # 一键启动脚本
用户点击按钮
→ launch_panel 设黄灯
→ step_worker QThread.start():
1. SSH 远程执行启动命令 (setsid bash -c 'roslaunch ...')
2. 轮询验证(检查 ROS 节点/话题)
3. emit signal → launch_panel 设绿灯/红灯
→ 绿灯后自动解锁下一步
遥测(位置 + 电量):
笔记本本地 rospy 订阅 /Odometry + /uav1/mavros/battery
→ LocalPositionWorker (QThread, 5Hz)
→ position_ready / battery_ready 信号
→ launch_panel 实时更新
零 SSH,零无人机额外 CPU 开销
┌──────────────────────────────┬─────────────────────────────────┐
│ 控制面板 │ RViz 3D 视图 │
│ ┌─────────────────────────┐ │ │
│ │ 当前操作提示 │ │ │
│ ├─────────────────────────┤ │ │
│ │ ● 1. 启动控制 [启动] │ │ │
│ │ ● 2. 启动定位 [启动] │ │ │
│ │ ● 3. 起飞悬停检查[确认] │ │ │
│ │ ● 4. 启动探索 [启动] │ │ │
│ │ ● 5. 触发探索 [触发] │ │ │
│ ├─────────────────────────┤ │ │
│ │ 实时位置 │ │ │
│ │ x 0.00 y 0.00 z 1.02 │ │ │
│ │ yaw 15.3° │ │ │
│ │ 电池 16.8V 92% │ │ │
│ ├─────────────────────────┤ │ │
│ │ [全部停止] │ │ │
│ └─────────────────────────┘ │ │
│ ├─────────────────────────────────┤
│ │ 探索日志 │
│ │ [INFO] Waiting for trigger... │
│ │ [INFO] Frontier detection... │
│ └─────────────────────────────────┘
└──────────────────────────────┴─────────────────────────────────┘
编辑 config.py 即可适配不同环境:
# SSH 连接
SSH_HOST = "su17" # SSH config alias 或 IP
SSH_USER = "amov"
# ROS 网络
ROS_MASTER_URI = "http://192.168.1.88:11311" # 无人机 ROS Master
ROS_IP_LOCAL = "192.168.1.123" # 笔记本 IP
# 超时设置
TIMEOUT_CONTROL = 30 # 步骤 1:控制节点启动超时
TIMEOUT_LOCALIZATION = 30 # 步骤 2:定位启动超时
TIMEOUT_EXPLORATION = 30 # 步骤 4:探索启动超时
# Rviz 配置
RVIZ_CONFIG_PATH = "/path/to/your/traj_su17.rviz"虽然 ExploraDeck 当前以 FUEL 规划器为示例,但设计上是规划器无关的:
- 替换探索算法:修改
CMD_START_EXPLORATION和NODES_EXPLORATION指向你自己的 launch 文件和 ROS 节点名即可 - 适配其他无人机:修改
SSH_HOST、ROS_MASTER_URI、控制/定位启动命令 - 增加步骤:在
launch_panel.py的steps列表中插入新行
ExploraDeck 本质上是一个 ROS 任务编排面板 + SSH 远程执行 + 本地遥测订阅 的通用框架。
MIT — 详见 LICENSE。

