PX4 + Livox MID360 + FAST-LIO + MAVROS

本文记录一套已经跑通的 PX4 外部定位、MAVROS 和 Offboard 悬停流程。

目标:PX4 通过 MAVLink 串口连接伴随计算机,Livox MID360 提供点云和 IMU,FAST-LIO 输出局部里程计,ROS Noetic/MAVROS 将外部里程计转发给 PX4,最后完成"起飞 1.5 m---悬停 10 s---自动降落"。

首次联调必须拆桨。带桨测试必须具备急停、系留和随时切回手动模式的条件。

1. 最终效果

本工程的任务逻辑如下:

  1. 遥控器通道 7 高位后,程序以 20 Hz 发布当前位置目标。
  2. 通道 5 由 PX4 选择并切入 OFFBOARD,程序不主动切换模式。
  3. 通道 6 从低位拨到高位时,程序发送一次普通 MAVROS 解锁请求。
  4. PX4 确认已解锁且处于 OFFBOARD 后,以当前位置作为起点。
  5. 目标位置为起点上方 1.5 m。
  6. 进入目标高度 ±0.15 m 后,连续悬停 10 s。
  7. 计时完成后,程序请求 AUTO.LAND。

版本信息:

2. 系统架构

text 复制代码
Livox MID360
    ├── /livox/lidar
    └── /livox/imu
            │
            ▼
       FAST-LIO
            │
            ▼
       /Odometry
            │
            ▼
  FAST-LIO → MAVROS 桥接
            │
            ▼
  /mavros/odometry/out
            │ MAVLink ODOMETRY
            ▼
 USB-TTL → PX4 TELEM 口
            │
            ▼
  PX4 EKF2 + Offboard 控制器

工程目录:

目录 作用
01_px4_bridge MAVROS、外部里程计桥接、Offboard 控制器
02_livox_mid360 Livox ROS Driver 2 工作空间
03_fastlio_ws FAST-LIO 工作空间
04_scripts 构建、启动和串口桥接脚本
07_docs 文档、版本记录和排障资料

3. 官方资料与插图

发布到 CSDN 时建议使用以下官方页面的截图作为插图来源:

建议截图时保留页面标题和官方站点标识。QGroundControl 的"解锁/起飞"按钮截图只用于界面说明,不代表可以跳过安全检查。

4. 硬件和软件环境

4.1 硬件

  • 支持 MAVLink 的 PX4 飞控。
  • Livox MID360 激光雷达。
  • Ubuntu 20.04 主机或伴随计算机。
  • 3.3 V USB-TTL 转换器。
  • 遥控器和接收机。
  • 首次调试用的拆桨台架或可靠系留装置。

4.2 软件

  • Ubuntu 20.04、ROS Noetic、Python 3。
  • MAVROS、Livox ROS Driver 2、FAST-LIO。
  • QGroundControl。
  • PX4 固件:本文工程按 PX4 1.17 记录。

4.3 网络规划

设备 地址
主机 enp2s0 192.168.1.102/24
MID360 192.168.1.195

实际网络不同,可在启动前覆盖:

bash 复制代码
export MID360_INTERFACE=enp2s0
export MID360_HOST_IP=192.168.1.102
export MID360_LIDAR_IP=192.168.1.195

5. 从 PX4 固件开始

5.1 连接和刷写

  1. 拆下螺旋桨,断开电机动力。
  2. 使用 USB 将飞控连接到安装了 QGroundControl 的电脑。
  3. 打开 QGroundControl,确认能识别飞控和硬件型号。
  4. 进入 Vehicle Setup → Firmware。
  5. 选择与硬件匹配的 PX4 稳定版本;本文工程记录为 PX4 1.17。
  6. 等待擦除、写入、重启和重新连接全部完成。

刷写过程中不要通过不稳定的 USB Hub 操作,也不要在未确认安全的情况下连接动力电池。不同硬件支持的固件目标不同,不能只看版本号而忽略硬件目标。

5.2 固件刷写后的基础校准

在 QGroundControl 中完成:

  • 机架类型和机型选择。
  • 加速度计、陀螺仪和磁罗盘校准。
  • 遥控器校准。
  • 电源、电池和安全参数配置。
  • 飞行模式开关映射。

首次不要直接进入 Offboard。先在 Stabilized 模式确认飞手能控制飞行器、能切回安全模式、油门最低行为正常。

5.3 备份参数

修改参数前,通过 QGroundControl 导出参数文件。本文只记录关键逻辑,不提供可直接覆盖所有飞控参数的参数文件,因为不同硬件、固件版本和机架配置的默认值不同。

6. PX4 串口和遥控器配置

本次实机使用 USB-TTL 连接 PX4 TELEM 口:

text 复制代码
主机设备:/dev/ttyUSB0
波特率:115200

飞控侧需要将对应 TELEM 口配置为 MAVLink。参数名称随串口编号和 PX4 版本变化,建议在 QGroundControl 中搜索对应串口的 MAV_*_CONFIG、MAV_*_MODE 和 MAV_*_BAUD 参数并核对。

主机检查:

bash 复制代码
ls -l /dev/ttyUSB* /dev/ttyACM*
ls -l /dev/serial/by-id/

6.2 USB-TTL 接线

text 复制代码
USB-TTL TX  → PX4 TELEM RX
USB-TTL RX  → PX4 TELEM TX
USB-TTL GND → PX4 GND

只能使用 3.3 V TTL。RS-232 或 5 V TTL 不得直接连接 PX4 串口。TX/RX 接反时,系统可能能看到串口设备,但 MAVROS 通常无法连接飞控。

6.3 遥控器通道规划

先启动 MAVROS,再读取实际 PWM:

bash 复制代码
rostopic echo /mavros/rc/in
功能 物理通道 程序索引 说明
油门 3 2 解锁时要求 800--1100 PWM
PX4 模式选择 5 由 PX4 参数决定 选择 OFFBOARD
解锁触发 6 5 低→高上升沿
目标发送 7 6 高位开始发布目标

程序索引从 0 开始:物理通道 7 对应 rc_channel:=6,物理通道 6 对应 rc_arm_channel:=5。

6.4 模式映射

通道 5 的模式选择由 PX4 负责,程序不主动切换 OFFBOARD。在 QGroundControl 中核对实际模式映射。本文曾记录本机参数:

text 复制代码
RC_MAP_FLTMODE=5
RC_MAP_ARM_SW=6
COM_FLTMODE1=0
COM_FLTMODE4=2
COM_FLTMODE6=7

这些值不能直接照抄到所有飞控。最终以以下命令返回的状态为准:

bash 复制代码
rostopic echo /mavros/state

7. 获取并编译工程

bash 复制代码
cd ~/workspaces
git clone https://gitee.com/yan-huapu/px4-mid360.git
cd px4-mid360
git checkout v10s-autonomous-hover

安装依赖并自动构建:

bash 复制代码
chmod +x 04_scripts/setup_new_device.sh
04_scripts/setup_new_device.sh --install-deps

脚本会按 Livox SDK2、Livox ROS Driver 2、FAST-LIO、PX4 bridge 的顺序构建。

手动构建:

bash 复制代码
source /opt/ros/noetic/setup.bash

cd 02_livox_mid360
catkin_make -DROS_EDITION=ROS1 -DPYTHON_EXECUTABLE=/usr/bin/python3

source ../02_livox_mid360/devel/setup.bash
cd ../03_fastlio_ws
catkin_make -DPYTHON_EXECUTABLE=/usr/bin/python3

source ../03_fastlio_ws/devel/setup.bash
cd ../01_px4_bridge
catkin_make -DPYTHON_EXECUTABLE=/usr/bin/python3

工作空间 source 顺序:ROS Noetic → Livox → FAST-LIO → PX4 bridge。

8. 启动 MID360 和 FAST-LIO

打开终端 1:

bash 复制代码
cd ~/workspaces/px4-mid360
source /opt/ros/noetic/setup.bash

export MID360_INTERFACE=enp2s0
export MID360_HOST_IP=192.168.1.102
export MID360_LIDAR_IP=192.168.1.195
export FASTLIO_RVIZ=false

04_scripts/start_mid360_fastlio.sh

检查话题和频率:

bash 复制代码
rostopic list | grep -E 'livox|Odometry'
rostopic hz /livox/lidar
rostopic hz /livox/imu
rostopic hz /Odometry

本次验收目标:点云约 10 Hz、IMU 约 200 Hz、/Odometry 约 10 Hz。没有 /Odometry 时不要继续启动 Offboard 控制器。

9. 启动 MAVROS 和外部里程计

打开终端 2:

bash 复制代码
cd ~/workspaces/px4-mid360
source /opt/ros/noetic/setup.bash
source 01_px4_bridge/devel/setup.bash

roslaunch px4_mid360_bridge manual_flight_bringup.launch \
  serial_device:=/dev/ttyUSB0 \
  baudrate:=115200 \
  odometry_topic:=/Odometry \
  publish_external_odom:=true

检查:

bash 复制代码
rostopic echo -n 1 /mavros/state
rostopic hz /mavros/odometry/out
rostopic echo -n 1 /mavros/odometry/out

必须看到 connected: True,外部里程计目标约 10 Hz。

9.1 坐标系和外参

桥接器输出帧名为:

text 复制代码
parent: odom
child:  base_link

带桨前必须完成静止、X/Y/Z 单轴移动、原地偏航和断开雷达测试。不要只通过交换 x/y 或修改符号猜坐标变换。外参和时间戳错误会导致漂移、姿态异常或保护动作。

10. 启动 10 秒自主悬停控制器

打开终端 3:

bash 复制代码
cd ~/workspaces/px4-mid360
source /opt/ros/noetic/setup.bash
source 01_px4_bridge/devel/setup.bash

roslaunch px4_mid360_bridge offboard_controller.launch \
  use_rc_switch:=true \
  rc_channel:=6 \
  rc_on_pwm:=1700 \
  rc_off_pwm:=1300 \
  rc_arm_offboard:=true \
  rc_arm_channel:=5 \
  auto_arm:=false \
  takeoff_height_m:=1.5 \
  hover_duration_s:=10.0

参数含义:

参数 值 作用
use_rc_switch true 通道 7 控制目标流
rc_channel 6 物理通道 7 的程序索引
rc_on_pwm 1700 通道 7 高位阈值
rc_off_pwm 1300 通道 7 低位阈值
rc_arm_offboard true 开启通道 6 解锁转发
rc_arm_channel 5 物理通道 6 的程序索引
auto_arm false 禁止程序自动解锁
takeoff_height_m 1.5 起点上方目标高度
hover_duration_s 10.0 达高后的悬停时长

控制器不会自动切入 Offboard,也不会循环强制解锁。通道 6 解锁请求还要求目标流、定位、飞控状态新鲜,且油门通道低位。

11. 安全操作顺序

11.1 拆桨验证

  1. 拆除螺旋桨或固定飞行器。
  2. 油门最低。
  3. 通道 5 选择手动模式。
  4. 通道 6 低位、通道 7 低位。
  5. 确认 /mavros/state 为 connected: True、armed: False。
  6. 通道 7 拨高,等待至少 5 秒。
  7. 通道 5 切入 OFFBOARD,确认状态确实为 OFFBOARD。
  8. 通道 6 低→高,观察一次解锁请求。

拆桨时不会真的达到 1.5 m,因此不会仅凭解锁时间结束悬停计时。

11.2 带桨或系留测试

只有在坐标方向、外部里程计、电池、电机、急停和手动接管都通过验证后,才进入带桨测试。空中需要先用通道 5 切出 OFFBOARD 并确认飞控接管,再关闭目标发送。

通道 7 低位只是停止 setpoint,不是降落按钮。

12. 常用检查命令

bash 复制代码
rosnode list
rostopic hz /livox/lidar
rostopic hz /livox/imu
rostopic hz /Odometry
rostopic hz /mavros/odometry/out
rostopic echo /mavros/state
rostopic echo /mavros/rc/in
rostopic echo /mavros/estimator_status
rostopic echo /mavros/statustext/recv
rostopic echo -n 1 /mavros/battery

13. 常见问题

13.1 MAVROS connected: False

检查串口设备、波特率、TX/RX 交叉、GND 共地、TELEM 口 MAVLink 配置,以及是否有其他程序占用串口。

13.2 通道 7 高位但没有目标流

bash 复制代码
rostopic echo /mavros/rc/in
rosparam get /offboard_controller
rostopic hz /mavros/setpoint_position/local

确认物理通道 7 对应 rc_channel:=6,并确认定位和 MAVROS 状态没有超时。

13.3 Offboard 后无法解锁

按顺序检查:

  1. 通道 6 是否先低后高。
  2. rc_arm_offboard 是否为 true。
  3. rc_arm_channel 是否为 5。
  4. 通道 3 油门是否为 800--1100 PWM。
  5. 通道 7 是否已经高位并发送目标至少 5 秒。
  6. /mavros/state 是否显示 OFFBOARD。
  7. /mavros/statustext/recv 是否有 PX4 拒绝原因。

解锁失败后先将通道 6 拨回低位,再处理拒绝原因;程序不会自动重试。

13.4 /Odometry 没有数据

检查 MID360 网络、Livox 驱动、FAST-LIO、主机网卡、点云/IMU 话题和时间戳。

13.5 电池遥测异常

如果 /mavros/battery 显示不合理电压或剩余比例,不要继续实飞。本文一次验收曾看到 65.535 V 和 -0.01,必须在实飞前重新核对 QGroundControl 电池串数、电压分压和阈值。

14. 停止和版本复现

飞行器落地、解除动力并确认安全后,再停止 ROS 节点。不要在空中直接关闭 ROS 或拔掉 MAVLink 串口。

查看版本:

bash 复制代码
git rev-parse HEAD
git describe --tags --always
rosversion -d
uname -a

本文版本关键值:

text 复制代码
Git tag:              v10s-autonomous-hover
PX4 firmware record: 1.17
MAVROS serial:        /dev/ttyUSB0:115200
MID360 host IP:       192.168.1.102
MID360 IP:            192.168.1.195
takeoff height:       1.5 m
hover duration:       10 s
mission switch:       RC channel 7
mode selection:       RC channel 5 / PX4
arming edge:          RC channel 6 low -> high

15. 总结

推荐严格按"固件和手动飞行 → 遥控器 → MID360 网络 → FAST-LIO → MAVROS → 外部里程计 → 拆桨 Offboard → 系留 → 自由飞"的顺序推进。任何一层的数据不可信,都应该停留在地面诊断,不要通过修改参数强行解锁。

官方资料:

相关推荐
小大宇1 小时前
Vue知识点-setup语法糖
1024程序员节
Zevalin爱灰灰1 小时前
Linux入门第一部分(Ubuntu入门篇) 第二章 浅尝Ubuntu(一)
linux·嵌入式·1024程序员节
qq_408606861 小时前
C_Primer_Plus_Chapter17_exercise4
1024程序员节
java_logo1 小时前
Docker 部署 Bililive-go:轻松搭建多平台直播录制
docker·1024程序员节·直播录制·轩辕镜像·bililive-go·chigusa/bililive-go
番茄味城市甜菜1 小时前
数据结构:单链表(C语言)
数据结构·链表·1024程序员节
java_nnnn1 小时前
Linux 学习第二篇:从零认识 Linux 文件系统、目录结构与基本命令
linux·运维·学习·1024程序员节
重生之我是Java开发战士1 小时前
【Redis】Redis五大数据类型
1024程序员节
一尺之棰1 小时前
DSP-定时器原理
1024程序员节
全栈小51 小时前
【C#】体验和使用墨衍MoGrow平台写一篇技术总结文章,提供C#,Quart.Net,统一捕获异常,定时任务关键词,看看出来效果如何
1024程序员节