如何自动将Python生成的.waypoints文件导入Mission Planner?
实现方法:两种可行方案
方案一:用pymavlink通过MAVLink协议上传(适合实时通信场景)
这个方案完全可行,Mission Planner本身基于MAVLink协议交互,你可以直接通过pymavlink连接其监听端口,解析航点文件后完成上传。
操作步骤:
配置Mission Planner的MAVLink端口
- 打开Mission Planner,在右上角连接端口选择框中选
UDP 14550(地面站默认常用MAVLink端口),点击连接即可——即使没有真实飞行器,保持连接状态就能让Mission Planner监听该端口。
- 打开Mission Planner,在右上角连接端口选择框中选
解析.waypoints文件并上传代码
.waypoints是APM格式,首行通常为QGC WPL 110(版本标识),后续每行格式为:序号 帧类型 命令 参数1 参数2 参数3 参数4 纬度 经度 高度 自动继续 航点类型。代码示例如下:from pymavlink import mavutil # 连接Mission Planner的UDP端口 master = mavutil.mavlink_connection('udpout:127.0.0.1:14550') # 等待心跳包确认连接 master.wait_heartbeat() print("已连接到Mission Planner") # 读取并解析航点文件 waypoints = [] with open('your_route.waypoints', 'r') as f: lines = f.readlines() # 跳过首行版本信息 for line in lines[1:]: parts = line.strip().split('\t') if len(parts) < 11: continue wp = { 'seq': int(parts[0]), 'frame': int(parts[1]), 'command': int(parts[2]), 'param1': float(parts[3]), 'param2': float(parts[4]), 'param3': float(parts[5]), 'param4': float(parts[6]), 'lat': int(float(parts[7]) * 1e7), # 转换为MAVLink要求的度*1e7格式 'lon': int(float(parts[8]) * 1e7), 'alt': float(parts[9]), 'autocontinue': int(parts[10]), 'current': 0 } waypoints.append(wp) # 发送航点总数 master.mav.mission_count_send( master.target_system, master.target_component, len(waypoints) ) # 逐个发送航点(遵循MAVLink协议,等待地面站请求后发送) for wp in waypoints: msg = master.recv_match(type='MISSION_REQUEST', blocking=True) if msg.seq != wp['seq']: continue master.mav.mission_item_send( master.target_system, master.target_component, wp['seq'], wp['frame'], wp['command'], wp['current'], wp['autocontinue'], wp['param1'], wp['param2'], wp['param3'], wp['param4'], wp['lat'], wp['lon'], wp['alt'] ) print(f"已发送航点 {wp['seq']}") # 发送上传完成确认 master.mav.mission_ack_send( master.target_system, master.target_component, mavutil.mavlink.MAV_MISSION_ACCEPTED ) print("航点上传完成")
注意事项:
- 确保.waypoints文件格式合规,坐标、命令码需符合APM规范;
- 若使用串口连接Mission Planner,将连接字符串改为
serial:/dev/ttyUSB0:57600(替换为你的串口设备和波特率); - 运行代码前,Mission Planner必须处于连接状态。
方案二:调用Mission Planner命令行(更简单,适合批量导入)
如果无需实时通信,直接用Mission Planner的命令行参数更高效,无需依赖pymavlink:
import subprocess # 替换为你的Mission Planner安装路径和航点文件路径 mp_exec_path = r"C:\Program Files (x86)\Mission Planner\MissionPlanner.exe" waypoint_file_path = r"C:\your_folder\your_route.waypoints" # 执行命令导入航点 subprocess.run([mp_exec_path, f"/loadwaypoints:{waypoint_file_path}"])
执行后,Mission Planner会自动打开并加载指定航点文件;若已打开Mission Planner,会直接在当前窗口加载。
内容的提问来源于stack exchange,提问作者Bedirhan Eren




