无人机与无人车系统调试手册
完整现场故障排查指南 · Windows · LQ3 · 树莓派 · Pixhawk · MAVLink
无人机
无人车
MAVLink
LQ3 网络
故障排查
1. 文档目的
本文档说明如何在现场调试无人机和无人车系统。它不涉及仪表板界面,而是聚焦于实际车辆系统:
- Windows 地面站
- LQ3 通信网络
- 无人车上的树莓派 4B
- Pixhawk 飞控
- ArduPilot / ArduCopter / ArduRover
- MAVProxy 或 MAVLink 桥接
- 无人车 UDP 电机代理
- STM32 电机控制器
- GPS 和 EKF 就绪状态
- 摄像头视频流
当无人机无法解锁、无人车无法移动、GPS 丢失、MAVLink 心跳丢失或视频/网络不稳定时,请使用本指南。
2. 系统架构
无人机路径
Windows PC 任务脚本
|
| MAVLink UDP
|
LQ3 / 网络
|
|
无人机 Pixhawk
|
|
ArduCopter
|
|
无人机电机
典型无人机任务流程:
心跳 → GPS OK → EKF OK → GUIDED 模式 → 解锁 → 起飞 → 前进速度指令 → 降落
心跳 → GPS OK → EKF OK → GUIDED 模式 → 解锁 → 起飞 → 前进速度指令 → 降落
无人车路径
Windows PC 任务脚本
|
| MAVLink UDP
|
无人车 Pixhawk
|
|
仅 GPS / EKF 状态
Windows PC 任务脚本
|
| UDP 命令,端口 15000
|
树莓派 4B rover_agent.py
|
| USB 串口
|
STM32 电机控制器
|
|
无人车电机
无人车 Pixhawk: 用于心跳、GPS 和 EKF 就绪状态。
无人车电机: 不由 Pixhawk 驱动。命令通过树莓派 UDP 发送到 STM32 电机控制器。
典型无人车任务流程:
Pixhawk 心跳 → GPS OK → EKF OK → 无人车代理 UDP Ping OK → 任务开始同步 → UDP 移动命令 → STM32 串口电机命令 → 停止命令
无人车电机: 不由 Pixhawk 驱动。命令通过树莓派 UDP 发送到 STM32 电机控制器。
典型无人车任务流程:
Pixhawk 心跳 → GPS OK → EKF OK → 无人车代理 UDP Ping OK → 任务开始同步 → UDP 移动命令 → STM32 串口电机命令 → 停止命令
3. 重要 IP 地址和端口
通用网络
Windows PC LQ3 侧 IP:192.168.1.234
Mac 调试 IP:192.168.1.10
典型子网:192.168.1.0/24
网关:192.168.1.1
Mac 调试 IP:192.168.1.10
典型子网:192.168.1.0/24
网关:192.168.1.1
无人车示例
ROVER_1 树莓派 IP:192.168.1.101
ROVER_2 树莓派 IP:192.168.1.102
ROVER_3 树莓派 IP:192.168.1.103
无人车 UDP 电机端口:15000
ROVER_2 树莓派 IP:192.168.1.102
ROVER_3 树莓派 IP:192.168.1.103
无人车 UDP 电机端口:15000
MAVLink 端口
DRONE_1:UDP 14501,sysid 1
DRONE_2:UDP 14502,sysid 2
DRONE_3:UDP 14503,sysid 3
ROVER_1:UDP 14511,sysid 11
ROVER_2:UDP 14512,sysid 12
ROVER_3:UDP 14513,sysid 13
DRONE_2:UDP 14502,sysid 2
DRONE_3:UDP 14503,sysid 3
ROVER_1:UDP 14511,sysid 11
ROVER_2:UDP 14512,sysid 12
ROVER_3:UDP 14513,sysid 13
UDP 端口和车辆 SYSID 必须与脚本配置匹配。
4. 现场调试顺序
电源
|
网络
|
SSH
|
MAVLink 心跳
|
GPS / EKF
|
无人车代理
|
电机运动
|
完整任务
警告 不要从完整任务脚本开始。先逐层测试。
5. 电源检查
无人机
- 飞行电池已连接
- Pixhawk 已供电
- GPS 模块 LED 亮起
- 遥测 / LQ3 链路已供电
- 电调已供电
- 室内测试时拆除螺旋桨
- 仅室外飞行测试时安装螺旋桨
无人车
- 树莓派已供电
- Pixhawk 已供电
- STM32 电机控制器已供电
- 电机电池已连接
- 树莓派到 STM32 的 USB 线已连接
- 如 MAVProxy 桥接在树莓派上运行,树莓派到 Pixhawk 的 USB 线已连接
- 首次电机测试时抬高无人车轮子
6. 网络调试
检查树莓派 IP 地址
ip addr
hostname -I
ip route
预期:eth0 有 192.168.1.xxx,如 LQ3 为主要链路,默认路由使用 eth0。
如果
hostname -I 为空,树莓派没有活动的 IP 地址。 检查 Netplan
cat /etc/netplan/01-uav.yaml
network:
version: 2
ethernets:
eth0:
optional: true
dhcp4: no
addresses:
- 192.168.1.102/24
gateway4: 192.168.1.1
nameservers:
addresses: [8.8.8.8, 1.1.1.1]
wifis:
wlan0:
optional: true
dhcp4: no
sudo netplan generate
sudo netplan apply
ip addr
ip route
警告 重要:
•
•
• 不要将
•
addresses 缩进必须正确•
gateway4 应与 addresses 对齐• 不要将
gateway4 放在地址列表内部
Ping 测试
# 从 Windows
ping 192.168.1.102
# 从树莓派
ping -c 3 192.168.1.234
如果 ping 失败:检查 LQ3 电源 · 网线 · IP 地址 · 子网 · Windows 防火墙 · IP 地址冲突
7. SSH 调试
# 从 Windows
ssh ubuntu@192.168.1.102
# 如果密码登录被禁用
ssh -o PreferredAuthentications=password -o PubkeyAuthentication=no ubuntu@192.168.1.102
# 在树莓派上
sudo vim /etc/ssh/sshd_config
有用的设置:
PasswordAuthentication yesPubkeyAuthentication yesKbdInteractiveAuthentication yes
sudo systemctl restart ssh
8. MAVLink 心跳调试
py -c "from pymavlink import mavutil; m=mavutil.mavlink_connection('udpin:0.0.0.0:14512'); print('等待心跳'); m.wait_heartbeat(); print('sysid', m.target_system, 'compid', m.target_component)"
预期:
等待心跳 → sysid 12 compid 0如果无心跳:确认 MAVProxy 服务 · UDP 输出 IP · Windows IP · 端口 · Pixhawk USB · Pixhawk 已供电 · ArduPilot 已启动
9. MAVProxy 桥接调试
sudo systemctl status mavlink-router.service
sudo systemctl status mavproxy.service
journalctl -u mavlink-router.service -n 50 --no-pager
mavproxy.py \
--master=/dev/serial/by-id/usb-ArduPilot_fmuv2_xxxxx-if00 \
--baudrate=115200 \
--out=udp:192.168.1.234:14512
ls -l /dev/serial/by-id/
使用稳定的 USB 路径。如果连接了多个 USB 设备,不要依赖
/dev/ttyACM0 或 /dev/ttyACM1。 10. GPS 调试
py -c "from pymavlink import mavutil; m=mavutil.mavlink_connection('udpin:0.0.0.0:14512'); m.wait_heartbeat(); print('heartbeat', m.target_system);
while True:
msg=m.recv_match(type='GPS_RAW_INT', blocking=True, timeout=2)
if msg:
print('fix', msg.fix_type, 'sats', msg.satellites_visible, 'eph', msg.eph)"
良好 GPS:
fix_type >= 3 · 卫星 >= 8 · HDOP 低,最好低于 2.0
如果 GPS 未被检测到:检查 GPS 线缆 · GPS 端口 · 波特率 · 串口协议 · GPS 模块电源 LED · 移到室外 · 等待几分钟首次锁定
Pixhawk 2.4.8 常见 GPS 串口设置:
SERIAL3_PROTOCOL = GPSSERIAL3_BAUD = 115200 或 38400GPS_TYPE = Auto
如果罗盘被检测到但 GPS 未被检测到,说明 I2C 罗盘工作而 UART GPS 不工作。检查 GPS UART 线缆、端口、波特率或 GPS 协议。
11. EKF 调试
任务通过检查
GLOBAL_POSITION_INT 等待 EKF 位置。
如果 GPS 有定位但 EKF 未就绪:在室外等待更长时间 · 检查罗盘校准 · 加速度计校准 · EKF 原点 · 车辆不在室内 · ArduPilot 预解锁警告
在 Mission Planner 中:消息选项卡 · 状态选项卡 · EKF 标志 · 预解锁消息
12. 无人机调试
无人机心跳测试
py -c "from pymavlink import mavutil; m=mavutil.mavlink_connection('udpin:0.0.0.0:14503'); m.wait_heartbeat(); print('connected sysid', m.target_system)"
无人机模式测试
master.set_mode_apm("GUIDED")
master.set_mode_apm("STABILIZE") # 室内无桨电机测试
无人机解锁测试
master.mav.command_long_send(
master.target_system,
master.target_component,
mavutil.mavlink.MAV_CMD_COMPONENT_ARM_DISARM,
0, 1, 0, 0, 0, 0, 0, 0
)
如果无人机无法解锁:预解锁消息 · GUIDED 任务的 GPS · 安全开关 · 遥控器校准 · 加速度计校准 · 罗盘校准 · 电池失效保护 · 有效模式
无人机前进运动
距离 = 速度 × 时间
示例:
0.2 m/s × 30 秒 ≈ 6 米
0.2 m/s × 50 秒 ≈ 10 米
0.5 m/s × 20 秒 ≈ 10 米
示例:
0.2 m/s × 30 秒 ≈ 6 米
0.2 m/s × 50 秒 ≈ 10 米
0.5 m/s × 20 秒 ≈ 10 米
send_velocity(master, 0.2, 0, 0)
这是机身坐标系速度指令,不是真正的 GPS 航点任务。
13. 无人车调试
无人车有两个独立系统:
Pixhawk: GPS / EKF / 心跳
树莓派 + STM32: 电机控制
两者都必须工作。
Pixhawk: GPS / EKF / 心跳
树莓派 + STM32: 电机控制
两者都必须工作。
无人车 Pixhawk 心跳
py -c "from pymavlink import mavutil; m=mavutil.mavlink_connection('udpin:0.0.0.0:14512'); m.wait_heartbeat(); print('rover sysid', m.target_system)"
无人车代理服务
sudo systemctl status acker-rover.service
journalctl -u acker-rover.service -n 50 --no-pager
无人车代理手动运行
sudo systemctl stop acker-rover.service
python3 ~/acker_rover/rover_agent.py
[ROVER] Connecting STM32...
[ROVER] STM32 OK
[ROVER] STOP
[ROVER] UDP listening on 0.0.0.0:15000
[ROVER] STM32 OK
[ROVER] STOP
[ROVER] UDP listening on 0.0.0.0:15000
无人车 UDP Ping
py -c "import socket,json; s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM); s.settimeout(2); s.sendto(json.dumps(dict(cmd='ping')).encode(),('192.168.1.102',15000)); print(s.recvfrom(4096))"
预期:
{"ok": true, "status": "alive"} 无人车移动测试
py -c "import socket,json; s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM); s.settimeout(2); s.sendto(json.dumps(dict(cmd='move',x=200,z=0,duration=2)).encode(),('192.168.1.102',15000)); print(s.recvfrom(4096))"
py -c "import socket,json; s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM); s.settimeout(2); s.sendto(json.dumps(dict(cmd='stop')).encode(),('192.168.1.102',15000)); print(s.recvfrom(4096))"
如果 UDP 回复说正在移动但轮子不转:STM32 USB 路径错误 · STM32 固件卡死 · 电机电池关闭 · 需要重启电机控制器 · 串行命令格式错误 · USB 串口设备错误
14. STM32 串口调试
ls -l /dev/serial/by-id/
预期电机控制器路径:
或
usb-1a86_USB_Single_Serial_xxxxx-if00或
usb-WCH.CN_USB_Single_Serial_xxxxx-if00
python3 -c 'import serial,time; ser=serial.Serial("/dev/serial/by-id/usb-1a86_USB_Single_Serial_5C2C061781-if00",115200,timeout=1); f=bytes.fromhex("7B 00 00 00 64 00 00 00 00 1F 7D"); s=bytes.fromhex("7B 00 00 00 00 00 00 00 00 7B 7D"); print("forward"); ser.write(f); ser.flush(); time.sleep(2); print("stop"); ser.write(s); ser.flush(); ser.close()'
如果无反应:重启 STM32 · 重新插拔 USB · 检查电源 · 检查正确的 /dev/serial/by-id · 检查是否有其他进程占用串口
sudo lsof /dev/ttyACM0
15. 摄像头流调试
lsusb
ls -l /dev/video*
python3 -c "import cv2; cap=cv2.VideoCapture('/dev/video0'); print('opened', cap.isOpened()); ret, frame=cap.read(); print('ret', ret, 'shape', None if frame is None else frame.shape); cap.release()"
预期:
opened True · ret True · shape (480, 640, 3)python3 -m pip install --user flask opencv-python-headless
python3 capture_video.py
打开:
http://PI_IP:8080/videoLQ3 低带宽设置:
WIDTH=128 · HEIGHT=96 · FPS=3 · JPEG_QUALITY=20 16. 紧急停止
# 停止无人车代理任务
py -c "import socket,json; s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM); s.settimeout(2); s.sendto(json.dumps(dict(cmd='stop')).encode(),('192.168.1.102',15000)); print(s.recvfrom(4096))"
# 停止无人车服务
sudo systemctl stop acker-rover.service
# 通过 MAVLink 解除无人机锁定
master.mav.command_long_send(... 0, 0, 0, 0, 0, 0, 0, 0)
# 杀死运行中的 Python 任务
pkill -f mission_script_name.py
# 杀死摄像头流
pkill -SIGTERM -f capture_video.py
17. 常见问题与解决方案
| 问题 | 解决方案 |
|---|---|
| MAVLink 心跳丢失 | 检查 UDP 端口、Windows IP、Pixhawk USB、MAVProxy 服务、LQ3 链路、防火墙 |
| SYSID 不匹配 | 修改脚本中的 expected_sysid 或 SYSID_THISMAV 参数
|
| GPS fix_type 1,卫星 0 | 移到室外,等待更长时间,检查天线方向、GPS 接线 |
| 罗盘检测到但 GPS 未检测到 | 检查 GPS UART 线缆、串口、波特率、SERIALx_PROTOCOL = GPS
|
| 无人车 UDP 说移动但轮子不转 | 检查 STM32 电源、电机电池、USB 串口路径、无人车代理日志、重启 STM32 |
| Ctrl+C 无法停止脚本 | 使用 STOP_EVENT、超时循环、信号处理器、解除所有 MAVLink 主机锁定 |
| 无人机无法解锁 | 检查预解锁消息:GPS、罗盘、加速度计、安全开关、遥控器校准、电池失效保护、模式 |
| LQ3 视频卡顿 | 降低分辨率、帧率、JPEG 质量;使用一个高分辨率流;使用低分辨率缩略图 |
通过 18. 任务前检查清单
[ ] 所有车辆电池已充电
[ ] 仅室外安装螺旋桨
[ ] 无人车轮子已清理
[ ] LQ3 已连接
[ ] Windows 具有正确的 LQ3 IP
[ ] 所有 Pixhawk 已供电
[ ] MAVProxy 服务正在运行
[ ] MAVLink 心跳已确认
[ ] GPS 定位已确认
[ ] EKF / 全局位置已确认
[ ] 无人车代理正在运行
[ ] 无人车 UDP Ping 工作
[ ] 无人车移动测试工作
[ ] 紧急停止已测试
19. 推荐调试命令速查
# 树莓派网络
ip addr; ip route; hostname -I; cat /etc/netplan/01-uav.yaml
# 树莓派 USB 设备
lsusb; ls -l /dev/serial/by-id/; ls -l /dev/video*
# 树莓派服务
sudo systemctl status acker-rover.service
sudo systemctl status mavlink-router.service
journalctl -u acker-rover.service -n 50 --no-pager
journalctl -u mavlink-router.service -n 50 --no-pager
# Windows Ping
ping 192.168.1.102
# Windows MAVLink 心跳
py -c "from pymavlink import mavutil; m=mavutil.mavlink_connection('udpin:0.0.0.0:14512'); print('waiting'); m.wait_heartbeat(); print(m.target_system, m.target_component)"
# Windows 无人车 UDP Ping
py -c "import socket,json; s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM); s.settimeout(2); s.sendto(json.dumps(dict(cmd='ping')).encode(),('192.168.1.102',15000)); print(s.recvfrom(4096))"
# Windows 无人车移动
py -c "import socket,json; s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM); s.settimeout(2); s.sendto(json.dumps(dict(cmd='move',x=200,z=0,duration=2)).encode(),('192.168.1.102',15000)); print(s.recvfrom(4096))"
20. 最终说明
最重要的原则是逐层调试。
对于无人机,MAVLink 直接控制车辆。
对于无人车,MAVLink 检查 GPS/EKF,但树莓派 UDP 控制电机。
因此,无人车可能有良好的 GPS 但仍然无法移动,如果无人车代理、STM32、电机电池或串口路径不工作。
同样,无人车可以手动移动但仍然无法完成 GPS 任务,如果 Pixhawk GPS 或 EKF 未就绪。
对于无人车,MAVLink 检查 GPS/EKF,但树莓派 UDP 控制电机。
因此,无人车可能有良好的 GPS 但仍然无法移动,如果无人车代理、STM32、电机电池或串口路径不工作。
同样,无人车可以手动移动但仍然无法完成 GPS 任务,如果 Pixhawk GPS 或 EKF 未就绪。
平台:Windows · LQ3 · 树莓派 4B · Pixhawk · ArduPilot · MAVLink
(c) 卓博泰科技 · 无人机与无人车系统调试手册
(c) 卓博泰科技 · 无人机与无人车系统调试手册