本文记录一套已经跑通的 PX4 外部定位、MAVROS 和 Offboard 悬停流程。
目标:PX4 通过 MAVLink 串口连接伴随计算机,Livox MID360 提供点云和 IMU,FAST-LIO 输出局部里程计,ROS Noetic/MAVROS 将外部里程计转发给 PX4,最后完成"起飞 1.5 m---悬停 10 s---自动降落"。
首次联调必须拆桨。带桨测试必须具备急停、系留和随时切回手动模式的条件。
1. 最终效果
本工程的任务逻辑如下:
- 遥控器通道 7 高位后,程序以 20 Hz 发布当前位置目标。
- 通道 5 由 PX4 选择并切入
OFFBOARD,程序不主动切换模式。 - 通道 6 从低位拨到高位时,程序发送一次普通 MAVROS 解锁请求。
- PX4 确认已解锁且处于
OFFBOARD后,以当前位置作为起点。 - 目标位置为起点上方
1.5 m。 - 进入目标高度 ±
0.15 m后,连续悬停10 s。 - 计时完成后,程序请求
AUTO.LAND。
版本信息:
- 工程标签:
v10s-autonomous-hover - 记录日期:2026-10-24
- Gitee:https://gitee.com/yan-huapu/px4-mid360
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 时建议使用以下官方页面的截图作为插图来源:
- PX4:Loading Firmware:固件刷写页面。
- PX4:Initial Setup and Configuration:初始配置流程。
- QGroundControl:Setup View:固件、传感器、遥控器和安全配置界面。
- FAST-LIO 官方仓库:算法和运行示例。
- Livox Wiki:MID360 网络和安装说明。
建议截图时保留页面标题和官方站点标识。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 连接和刷写
- 拆下螺旋桨,断开电机动力。
- 使用 USB 将飞控连接到安装了 QGroundControl 的电脑。
- 打开 QGroundControl,确认能识别飞控和硬件型号。
- 进入
Vehicle Setup → Firmware。 - 选择与硬件匹配的 PX4 稳定版本;本文工程记录为 PX4
1.17。 - 等待擦除、写入、重启和重新连接全部完成。
刷写过程中不要通过不稳定的 USB Hub 操作,也不要在未确认安全的情况下连接动力电池。不同硬件支持的固件目标不同,不能只看版本号而忽略硬件目标。
5.2 固件刷写后的基础校准
在 QGroundControl 中完成:
- 机架类型和机型选择。
- 加速度计、陀螺仪和磁罗盘校准。
- 遥控器校准。
- 电源、电池和安全参数配置。
- 飞行模式开关映射。
首次不要直接进入 Offboard。先在 Stabilized 模式确认飞手能控制飞行器、能切回安全模式、油门最低行为正常。
5.3 备份参数
修改参数前,通过 QGroundControl 导出参数文件。本文只记录关键逻辑,不提供可直接覆盖所有飞控参数的参数文件,因为不同硬件、固件版本和机架配置的默认值不同。
6. PX4 串口和遥控器配置
6.1 MAVLink 串口
本次实机使用 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 拆桨验证
- 拆除螺旋桨或固定飞行器。
- 油门最低。
- 通道 5 选择手动模式。
- 通道 6 低位、通道 7 低位。
- 确认
/mavros/state为connected: True、armed: False。 - 通道 7 拨高,等待至少 5 秒。
- 通道 5 切入
OFFBOARD,确认状态确实为OFFBOARD。 - 通道 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 后无法解锁
按顺序检查:
- 通道 6 是否先低后高。
rc_arm_offboard是否为true。rc_arm_channel是否为5。- 通道 3 油门是否为 800--1100 PWM。
- 通道 7 是否已经高位并发送目标至少 5 秒。
/mavros/state是否显示OFFBOARD。/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 → 系留 → 自由飞"的顺序推进。任何一层的数据不可信,都应该停留在地面诊断,不要通过修改参数强行解锁。
官方资料:
