ArduPilot:通过 Pymavlink 实现自主无人机控制 - Openclaw Skills
作者:互联网
2026-03-30
什么是 ArduPilot 无人机控制?
此技能为 AI 智能体提供了一个强大的接口,利用 MAVLink 协议与基于 ArduPilot 的无人机进行通信。通过 Openclaw Skills,开发人员可以弥合高级 AI 推理与低级飞行控制器指令之间的差距。它处理 ArduPilot 状态机的细节,确保解锁和起飞等关键操作在硬件要求的特定时间窗口内执行。
该技能专为真实硬件(如 CubeOrange)和 SITL(软件在环)模拟环境设计。它简化了 pymavlink 的复杂性,为智能体获取遥测数据、监控系统健康状况以及在三维空间中执行精确移动提供了清晰的路径。
下载入口:https://github.com/openclaw/skills/tree/main/skills/luweiliao/ardupilot
安装与下载
1. ClawHub CLI
从源直接安装技能的最快方式。
npx clawhub@latest install ardupilot
2. 手动安装
将技能文件夹复制到以下位置之一
全局模式~/.openclaw/skills/
工作区
/skills/
优先级:工作区 > 本地 > 内置
3. 提示词安装
将此提示词复制到 OpenClaw 即可自动安装。
请帮我使用 Clawhub 安装 ardupilot。如果尚未安装 Clawhub,请先安装(npm i -g clawhub)。
ArduPilot 无人机控制 应用场景
- 无人机 (UAV) 的自主起飞和降落序列。
- 任务期间电池安全和 GPS 健康状况的自动化遥测监控。
- 使用本地北-东-地 (NED) 坐标进行程序化 3D 导航。
- 在 Openclaw Skills 生态系统中开发复杂的无人机行为。
- 发起与 ArduPilot 飞行控制器的 TCP 连接并建立心跳同步。
- 在尝试任何飞行操作之前,验证系统状态是否为待机。
- 触发解锁、切换到 Guided 模式和起飞的快速序列,以确保飞行控制器不会超时或重新锁定。
- 轮询遥测数据,提供高度和位置的闭环反馈。
- 通过相对 NED 坐标进行导航,或发起降落序列并持续发送降落指令脉冲,直到确认着陆。
ArduPilot 无人机控制 配置指南
要使用此技能,请确保您的环境中安装了必要的库:
pip install pymavlink
设置您的无人机或模拟器以通过 TCP(通常为端口 5762)接受 MAVLink 连接。
ArduPilot 无人机控制 数据架构与分类体系
该技能处理各种 MAVLink 消息类型以提供结构化的遥测数据:
| 消息类型 | 关键属性 | 用途 |
|---|---|---|
| GLOBAL_POSITION_INT | relative_alt | 追踪相对高度,用于起飞和降落验证。 |
| GPS_RAW_INT | fix_type, satellites_visible | 监控 GNSS 健康状况,确保自主飞行安全。 |
| SYS_STATUS | voltage_battery | 对电池感知的任务规划至关重要。 |
| LOCAL_POSITION_NED | x, y, z | 用于 3D 空间中的精确相对平移。 |
| HEARTBEAT | system_status | 指示无人机处于启动、待机还是解锁状态。 |
name: ardupilot
description: 通过 pymavlink 连接并控制 ArduPilot 无人机。使用此 skill 来操作无人机起飞、降落、移动等。
ArduPilot 无人机控制 Skill
通过 pymavlink 连接并控制 ArduPilot 无人机 (如 CubeOrange 等)。
?? 重要:起飞核心流程
起飞必须连续发送命令,不要等待!
# 1. 等待飞控稳定 (status=3)
while True:
msg = master.wait_heartbeat(timeout=3)
if msg and msg.system_status == 3:
break
# 2. 连续发送:ARM → GUIDED → TAKEOFF (不要等待!)
master.mav.command_long_send(1, 1, 400, 0, 1, 21196, 0, 0, 0, 0, 0) # ARM (force=21196)
mode_map = master.mode_mapping()
master.set_mode(mode_map['GUIDED']) # GUIDED
master.mav.command_long_send(1, 1, 22, 0, 0, 0, 0, 0, 0, 0, 5) # TAKEOFF 5m
# 3. 监控高度
for i in range(40):
msg = master.recv_match(type='GLOBAL_POSITION_INT', timeout=0.5)
if msg:
alt = msg.relative_alt / 1000
if alt >= 4.5:
print('? 到达目标高度!')
break
关键点:
- 发送 ARM 后立即发送 GUIDED 和 TAKEOFF,不要等待
- 如果等待,飞控会重新上锁
- force=21196 是 ArduPilot 的 magic value
连接
from pymavlink import mavutil
master = mavutil.mavlink_connection('tcp:localhost:5762')
master.wait_heartbeat(timeout=10)
system_id = master.target_system # 通常是 1
component_id = master.target_component
1. 检查状态
# 获取飞控状态
msg = master.wait_heartbeat(timeout=5)
print(f'status: {msg.system_status}') # 0=boot, 3=standby, 4=armed
# 获取高度
msg = master.recv_match(type='GLOBAL_POSITION_INT', timeout=1)
print(f'高度: {msg.relative_alt / 1000}m')
# 获取 GPS
msg = master.recv_match(type='GPS_RAW_INT', timeout=1)
print(f'GPS: {msg.satellites_visible}颗, fix={msg.fix_type}')
# 获取电池
msg = master.recv_match(type='SYS_STATUS', timeout=1)
print(f'电池: {msg.voltage_battery / 1000}V')
2. 起飞 (关键流程)
# ?? 必须等待飞控稳定 (status=3)
while True:
msg = master.wait_heartbeat(timeout=3)
if msg and msg.system_status == 3:
break
# ?? 连续发送命令,不要等待!
master.mav.command_long_send(1, 1, 400, 0, 1, 21196, 0, 0, 0, 0, 0) # ARM
mode_map = master.mode_mapping()
master.set_mode(mode_map['GUIDED']) # GUIDED
master.mav.command_long_send(1, 1, 22, 0, 0, 0, 0, 0, 0, 0, 8) # TAKEOFF 8m
# 闭环监控
for i in range(40):
msg = master.recv_match(type='GLOBAL_POSITION_INT', timeout=0.5)
if msg:
alt = msg.relative_alt / 1000
print(f'{i*0.5:.1f}s → {alt:.2f}m')
if alt >= 7.2: # 90% 目标
print('? 到达!')
break
3. 降落
# 切换到 LAND 模式
mode_map = master.mode_mapping()
master.set_mode(mode_map['LAND'])
# ?? 必须持续发送 LAND 命令
for i in range(60):
master.mav.command_long_send(1, 1, 21, 0, 0, 0, 0, 0, 0, 0, 0)
import time
time.sleep(0.5)
msg = master.recv_match(type='GLOBAL_POSITION_INT', timeout=0.3)
if msg:
alt = msg.relative_alt / 1000
if alt < 0.3:
print('? 降落完成!')
break
4. 相对移动 (LOCAL_POSITION_NED)
# 获取当前位置
local = master.recv_match(type='LOCAL_POSITION_NED', timeout=1)
# X轴前进2米 (NED: X=北)
master.mav.set_position_target_local_ned_send(
0, system_id, component_id,
mavutil.mavlink.MAV_FRAME_LOCAL_NED,
0b0000111111111000,
local.x + 2, local.y, local.z,
0, 0, 0, 0, 0, 0, 0, 0
)
坐标系 (NED)
- X轴: 北 (正=北)
- Y轴: 东 (正=东)
- Z轴: 向下 (负值=向上=高度)
完整示例
from pymavlink import mavutil
import time
master = mavutil.mavlink_connection('tcp:localhost:5762')
master.wait_heartbeat(timeout=10)
print('=== 起飞到 5m ===')
# 1. 等待飞控稳定
while True:
msg = master.wait_heartbeat(timeout=3)
if msg and msg.system_status == 3:
break
print('飞控就绪')
# 2. 连续发送: ARM → GUIDED → TAKEOFF
master.mav.command_long_send(1, 1, 400, 0, 1, 21196, 0, 0, 0, 0, 0)
mode_map = master.mode_mapping()
master.set_mode(mode_map['GUIDED'])
master.mav.command_long_send(1, 1, 22, 0, 0, 0, 0, 0, 0, 0, 5)
print('ARM + GUIDED + TAKEOFF')
# 3. 闭环监控
for i in range(40):
msg = master.recv_match(type='GLOBAL_POSITION_INT', timeout=0.5)
if msg:
alt = msg.relative_alt / 1000
print(f'{i*0.5:.1f}s → {alt:.2f}m')
if alt >= 4.5:
print('? 5m!')
break
# === 降落 ===
mode_map = master.mode_mapping()
master.set_mode(mode_map['LAND'])
for i in range(60):
master.mav.command_long_send(1, 1, 21, 0, 0, 0, 0, 0, 0, 0, 0)
time.sleep(0.5)
msg = master.recv_match(type='GLOBAL_POSITION_INT', timeout=0.3)
if msg:
alt = msg.relative_alt / 1000
if alt < 0.3:
print('? 降落完成!')
break
注意事项
- 起飞:连续发送命令,不要等待
- 降落:持续发送 LAND 命令
- 闭环检查:每次操作前后获取状态
- GUIDED 模式:自主飞行必须用 GUIDED
- GPS:确保 fix_type >= 3
- 端口:常用 TCP 5762
依赖
pip install pymavlink
相关推荐
专题
+ 收藏
+ 收藏
+ 收藏
+ 收藏
+ 收藏
最新数据
相关文章
信号管道:自动化营销情报工具 - Openclaw Skills
技能收益追踪器:监控 Openclaw 技能并实现变现
AI 合规准备就绪度:评估与治理工具 - Openclaw Skills
FOSMVVM ServerRequest 测试生成器:自动化 API 测试 - Openclaw Skills
酒店搜索器:AI 赋能的住宿与位置情报 - Openclaw Skills
Dub 链接 API:程序化链接管理 - Openclaw Skills
IntercomSwap:P2P BTC 与 USDT 跨链兑换 - Openclaw Skills
spotplay:macOS 原生 Spotify 播放控制 - Openclaw Skills
DeepSeek OCR:AI驱动的图像文本识别 - Openclaw Skills
Web Navigator:自动化网页研究与浏览 - Openclaw Skills
AI精选
