一、简介:为什么AI工程师必须学MAVLink?

  • 无人机=“空中机器人”,飞控(PX4)只做底层姿态环;AI视觉、SLAM、目标跟踪需在算力更强的Linux伴机电脑(Companion Computer)完成。

  • MAVLink是开源、轻量级、CRC校验的串行协议,支持Offboard模式:外部电脑通过1根UART/USB即可接管飞控,实现:

    • 视觉引导降落

    • 目标跟踪绕飞

    • 实时避障重规划

  • 掌握“Linux+MAVLink+Offboard”=AI算法到真机飞行的最短路径,也是RoboMaster、电网巡检、物流无人机等产品通用架构。


二、核心概念:5个关键词速览

关键词 一句话 本文出现场景
MAVLink 二进制消息协议,v1/v2,v2带签名 发送SET_POSITION_TARGET_LOCAL_NED
Offboard 飞控不参考遥控器,完全听Linux指令 需>10Hz心跳,否则切Failsafe
PX4 开源飞控固件,MCU运行,支持MAVLink 2 本文基于v1.14
mavsdk PX4官方C++/Python库,封装MAVLink 2 Python3示例,实时线程安全
UART/USB 物理链路,115200-921600bps 先用USB线验证,再切TTL

三、环境准备:10分钟搭好“AI伴机”工作台

1. 硬件清单

  • 无人机机体+PX4飞控(任意F4/F7/H7板) ×1

  • 树莓派4B/英伟达Jetson Nano/Linux板 ×1

  • USB-TypeC线 ×1(先验证)

  • JST-GH 6P TTL线 ×1(最终机载)

  • 5V/3A BEC供电模块 ×1(给树莓派)

2. 软件镜像与版本

组件 版本 安装命令
Ubuntu Server 22.04 官方刷机
Python 3.9+ 系统自带
MAVSDK-Python 2.1.0 pip3 install mavsdk
OpenCV 4.5.5 sudo apt install python3-opencv
PX4固件 1.14.0 QGroundControl一键烧录

3. 一键安装脚本(可复制)

#!/bin/bash
# env_setup.sh
set -e
sudo apt update
sudo apt install -y python3-pip python3-opencv python3-numpy
pip3 install mavsdk asyncio  # async=高并发MAVLink
echo "install done"

四、应用场景(≈300字)

电网巡检无人机需沿高压线自主飞行,发现绝缘子破损后:

  1. AI伴机电脑运行YOLOv5n,实时检测破损目标;

  2. 通过MAVLink向PX4发送SET_POSITION_TARGET_LOCAL_NED,命令无人机减速至0.5m/s绕飞一周拍照;

  3. 同时记录GPS时间戳,生成缺陷报告。
    整个闭环延迟<200ms,要求:

  • Offboard指令10Hz以上;

  • 视觉推理50ms内;

  • 链路断线>0.5s自动返航。
    本文示例即模拟“检测到目标→发送绕飞”核心逻辑,可无缝迁移到实际巡检项目。


五、实际案例与步骤:30min跑通“视觉绕飞”

5.1 连线与PX4配置

  1. USB-TypeC接树莓派,QGroundControl→Vehicle Setup→MAVLink:

    • 勾选MAVLink 2.0

    • 波特率921600(USB可跑满)

  2. 参数表搜索并设置:

    COM_RCL_EXCEPT=4        # 禁用遥控器Offboard检查
    NAV_RCL_ACT=0           # 链路断不进入Failsafe
    MAV_2_MODE=0            # Normal模式,非Onboard

5.2 检查Linux设备号

ls /dev/serial/by-id/*PX4*   # 出现usb-FTDI_PX4_xxx即可

5.3 Python Offboard脚本(带注释)

#!/usr/bin/env python3
# offboard_circle.py
import asyncio
from mavsdk import System
import cv2, time, math

USB_URI = "serial:///dev/serial/by-id/usb-FTDI_PX4_XXX:921600"

async def run():
    drone = System()
    print("等待连接飞控...")
    await drone.connect(system_address=USB_URI)
    async for state in drone.core.connection_state():
        if state.is_connected:
            print("✅ 已连接")
            break

    # 1. 切换到OFFBOARD模式
    print("进入OFFBOARD...")
    await drone.offboard.start()
    
    # 2. 模拟视觉检测到目标→绕飞一周
    radius = 5.0        # 绕飞半径5m
    speed  = 1.0        # 切线速度1m/s
    steps  = 36         # 每10°一步
    for i in range(steps):
        angle = 2 * math.pi * i / steps
        x = radius * math.cos(angle)
        y = radius * math.sin(angle)
        await drone.offboard.set_position_ned(
            x, y, -5.0, 0.0)   # 保持5m高度
        print(f"step={i} x={x:.2f} y={y:.2f}")
        await asyncio.sleep(0.1)  # 10Hz心跳

    # 3. 返回原点并退出OFFBOARD
    await drone.offboard.set_position_ned(0, 0, -5, 0)
    await asyncio.sleep(2)
    await drone.offboard.stop()
    print("⭕ 绕飞完成,已切回Hold模式")

if __name__ == "__main__":
    asyncio.run(run())

运行(root,实时线程):

sudo python3 offboard_circle.py

终端每 100ms 打印一步,QGroundControl 实时显示飞机画圆。


5.4 实时性能验证

# 同时跑cyclictest,验证Offboard期间内核延迟
sudo cyclictest -p95 -i200 -d60s -m

期望:Max < 200μs(树莓派4B + PREEMPT_RT 5.15 实测 85μs)。


六、常见问题与解答(FAQ)

问题 现象 解决
QGC显示“Offboard rejected” 未设置COM_RCL_EXCEPT=4 按5.1修改后重启飞控
连接成功但无数据 USB波特率太低 改成921600;确认URI拼写
绕飞途中突然返航 心跳<1Hz 确保sleep≤0.1s;用独立线程发心跳
视觉推理卡顿导致圆不连贯 OpenCV阻塞主线程 用asyncio.create_task把推理放协程
链路断开0.5s即返航 NAV_RCL_ACT≠0 设置为0,并打开GPS返航保护

七、实践建议与最佳实践

  1. 心跳线程独立化
    单独协程以 20Hz 发送 set_position_ned,主线程只管推理,避免阻塞。

  2. MAVLink签名
    外场部署时启用 MAVLink 2 签名,防止注入控制:

    Python

    复制

    await drone.core.set_parameter("MAV_LINK_SIGNING", 1)
  3. 视觉帧时间戳对齐
    使用 vehicle_timestamp_us 与 GPS 时间融合,方便事后生成带坐标的缺陷照片。

  4. RT内核 + CPU隔离
    将 core3 隔离给 MAVLink 与推理:

    isolcpus=3 nohz_full=3 rcu_nocbs=3

    绑定进程:taskset -c 3 python3 offboard_circle.py

  5. 日志落盘
    使用 mavsdk.log_files 下载飞控 .ulg,配合 .tlog 实现“黑匣子”回放。

  6. 仿真先行
    无真机时,用 PX4 SITL + gazebo:

    make px4_sitl_rtps gazebo_iris

    连接串口改为 UDP:14550,代码零改动即可仿真。


八、总结:从“能飞”到“飞得稳、飞得准”

一张脑图带走全文:

无人机AI伴机
├─ 链路:USB/UART + MAVLink 2
├─ 协议:Offboard模式 + set_position_ned
├─ 实时:PREEMPT_RT + cyclictest <200μs
├─ 视觉:OpenCV-YOLO → 协程推理
└─ 合规:心跳20Hz + 签名 + 日志追溯

MAVLink 是 AI 通往物理世界的“串口魔法”

  • 无需写嵌入式 C,50 行 Python 就能让 CNN 的输出直接驱动舵机;

  • 兼容 PX4、ArduPilot,一套代码即可从 250g 小四轴穿越机到 20kg 工业多旋翼重用;

  • 配合 RT 内核与隔离 CPU,视觉→指令闭环延迟 < 150 ms,满足电网巡检、物流投递、应急救援等严苛场景。

立刻打开你的树莓派,复制本文脚本,插上 USB,下一条控制指令就是你 AI 算法的“真机首秀”! 祝你调试顺利,飞行安全,早日把“Demo”落地成“产品”。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐