Dora 无人机实战教程:如何用 MAVLink 2 桥接跑通 ArduPilot SITL 闭环飞行
【免费下载链接】doraDORA (Dataflow-Oriented Robotic Architecture 面向数据流的机器人架构) 是为 AI 与具身智能机器人打造的高性能开发框架,以数据流范式重构开发逻辑,原生支持分布式部署与端边云协同 —— 无需复杂适配,即可实现一体端到端具身大小脑、VLA等模型部署,无缝衔接感知、推理、控制全链路,让 AI 能力与机器人动作深度融合。 依托 Rust 内核与零拷贝通信技术,它将具身大小脑、VLA等模型推理、多模态数据融合延迟压缩至微秒级,同时兼容 ROS2 生态与国产 AI 芯片,彻底降低具身智能机器人的开发门槛,让分布式部署下的 AI 赋能创新更高效、更灵活。项目地址: https://gitcode.com/dora-rs/dora
Dora 是一款为 AI 与具身智能打造的高性能数据流开发框架,本教程带你用它内置的 MAVLink 2 桥接节点驱动 ArduPilot SITL 模拟器,完成一次完整的"起飞 → 悬停 → 降落 → 解锁"闭环飞行演示——全程只需两个终端命令,无需真机、无需 MAVProxy。
🚁 这次演示能做什么?
整个任务由一条 Dora 数据流驱动,包含两个节点:
- bridge(MAVLink 2 桥接节点):负责与 ArduPilot SITL 之间的 MAVLink 报文收发。SITL 广播的心跳、位置、命令回执等报文,会被桥接节点转成 Dora 数据流里的 Arrow 消息;反之,数据流里的控制指令会被序列化为标准 MAVLink 2 帧发给飞控。
- mission(Python 任务节点):一个状态机,负责按顺序下发"切换 GUIDED 模式 → 上锁 → 起飞 → 等待到达目标高度 → 悬停 5 秒 → 降落 → 解锁",并逐条等待
COMMAND_ACK确认。
数据流拓扑很简单,可直接查看 examples/mavlink2-bridge-sitl-mission/dataflow.yml:
ArduCopter SITL (独立进程, udp:127.0.0.1:14550) │ MAVLink 2 ▼ bridge ──Arrow──▶ mission.py(状态机) ▲ │ └──────────────────┘ (command_long_cmd 下行指令)桥接扩展的完整说明见 libraries/extensions/mavlink2-bridge/src/lib.rs,可执行的桥接节点在 binaries/mavlink2-bridge-node/。
🛠️ 环境准备:一次性安装步骤
1. 安装 Dora
git clone https://gitcode.com/dora-rs/dora cd dora # 按仓库 README 完成构建,得到 dora CLI2. 安装 ArduPilot SITL(首次约需 5–10 分钟编译)
# 克隆 ArduPilot 源码(含子模块),放到 ~/src/ardupilot cd ~/src/ardupilot Tools/environment_install/install-prereqs-ubuntu.sh -y ./waf configure --board sitl ./waf copter平台支持:Ubuntu 22.04/24.04 为一级支持平台,macOS 亦支持(SITL 速度约慢 10–15%);Windows 需要 WSL。详见 examples/mavlink2-bridge-sitl-mission/README.md。
🚀 启动 SITL 模拟器
打开终端 1,运行仓库自带的启动脚本 examples/mavlink2-bridge-sitl-mission/scripts/start_sitl.sh:
ARDUPILOT_SRC=~/src/ardupilot \ ./examples/mavlink2-bridge-sitl-mission/scripts/start_sitl.sh脚本会以固定首页坐标(旧金山,保证每次演示可复现)启动 ArduCopter 四旋翼,并将 MAVLink 转发到udp:127.0.0.1:14550。等到终端打印出APM: EKF3 IMU0 is using GPS(约 10 秒),说明模拟器已就绪。
🎯 运行 Dora 数据流:闭环飞行全流程
打开终端 2,一条命令启动数据流:
dora run examples/mavlink2-bridge-sitl-mission/dataflow.yml --uv --stop-after 90s--uv会自动为 Python 任务节点准备含pyarrow和dora-rs的虚拟环境。
任务状态机实现在 examples/mavlink2-bridge-sitl-mission/mission.py,每个状态都会等待飞控的COMMAND_ACK或位置阈值,并带超时保护——卡住会明确报错而不是无限等待。
✅ 成功长什么样?
mission: vehicle heartbeat received mission: -> SET_MODE GUIDED (cmd=176) mission: <- ACK SET_MODE GUIDED [ACCEPTED, 0.1s] mission: -> ARM (cmd=400) mission: <- ACK ARM [ACCEPTED, 0.1s] mission: -> TAKEOFF (cmd=22) mission: reached 8.51 m (target 8.50) mission: hovering for 5.0s mission: -> LAND (cmd=21) mission: landed at 0.04 m mission: -> DISARM (cmd=400) mission: SUCCESS - takeoff + hover + land + disarm complete最后的mission: SUCCESS行是标准通过标志,可用grep做自动化判定。
⚙️ 调参指南:用环境变量控制飞行参数
| 环境变量 | 默认值 | 作用 |
|---|---|---|
MAVLINK_SITL_TAKEOFF_ALT_M | 10.0 | 起飞目标高度(米) |
MAVLINK_SITL_HOVER_SECS | 5.0 | 悬停时长(秒) |
MAVLINK_SITL_COMMAND_TIMEOUT | 15.0 | 单条命令 ACK 超时(秒) |
MAVLINK_SITL_ALT_TIMEOUT | 30.0 | 高度推进超时(秒) |
MAVLINK_SITL_HOME | 37.7749,-122.4194,0,0 | SITL 首页lat,lon,alt,yaw |
例如想把起飞高度改到 5 米:MAVLINK_SITL_TAKEOFF_ALT_M=5.0 dora run ...。
🩺 常见问题快速排查
| 现象 | 可能原因 |
|---|---|
no HEARTBEAT within 15s | SITL 没运行,或没转发到 14550 端口 |
ARM: ACK = TEMPORARILY_REJECTED | EKF 尚未就绪,SITL 启动后多等一会儿再跑数据流 |
altitude did not reach … within 30s | 仿真物理被暂停,或飞控静默拒绝了 GUIDED 模式 |
ACK = DENIEDonSET_MODE | 车辆类型不是 ArduCopter(固件版本过旧) |
完整故障表见 examples/mavlink2-bridge-sitl-mission/README.md 的 "Failure modes" 一节。
📡 从仿真到真机:把桥接指向真实飞控
SITL 验证通过后,接入真实飞控只需改数据流里 bridge 节点的MAVLINK_BRIDGE_CONFIG,支持 TCP、UDP、串口三种链路(实现见 libraries/extensions/mavlink2-bridge/src/transport.rs):
- id: bridge env: MAVLINK_BRIDGE_CONFIG: | endpoint: tcp://192.168.1.10:5760 # Pixhawk 数传电台 # or: udp://0.0.0.0:14550 # 监听任意地面站 # or: serial:///dev/ttyACM0?baud=115200🧭 下一步探索
- 免 ArduPilot 的快速上手:examples/mavlink2-bridge/README.md 提供了内置 MAVLink 模拟器的 Rust / Python / C++ 三语言版演示,
dora run examples/mavlink2-bridge/dataflow-rust.yml --stop-after 5s一条命令即可体验心跳闭环。 - 扩展任务:
mission.py是标准状态机,在 TAKEOFF 与 LAND 之间插入航点、载荷触发等新状态即可扩展;新增 MAVLink 命令只需对应MAV_CMD_*整数和参数语义。 - 多机部署:Dora 原生支持分布式数据流,桥接节点可放入独立 daemon,配合
dora up / build / start / stop / down生命周期管理远程调度。
用 Dora 的数据流范式 + MAVLink 2 桥接,你只需用 Python 写一个状态机,就能把 ArduPilot 的整个飞行控制链路纳管——仿真到真机,只改一行 endpoint。
【免费下载链接】doraDORA (Dataflow-Oriented Robotic Architecture 面向数据流的机器人架构) 是为 AI 与具身智能机器人打造的高性能开发框架,以数据流范式重构开发逻辑,原生支持分布式部署与端边云协同 —— 无需复杂适配,即可实现一体端到端具身大小脑、VLA等模型部署,无缝衔接感知、推理、控制全链路,让 AI 能力与机器人动作深度融合。 依托 Rust 内核与零拷贝通信技术,它将具身大小脑、VLA等模型推理、多模态数据融合延迟压缩至微秒级,同时兼容 ROS2 生态与国产 AI 芯片,彻底降低具身智能机器人的开发门槛,让分布式部署下的 AI 赋能创新更高效、更灵活。项目地址: https://gitcode.com/dora-rs/dora
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考