You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何自动将Python生成的.waypoints文件导入Mission Planner?

实现方法:两种可行方案

方案一:用pymavlink通过MAVLink协议上传(适合实时通信场景)

这个方案完全可行,Mission Planner本身基于MAVLink协议交互,你可以直接通过pymavlink连接其监听端口,解析航点文件后完成上传。

操作步骤:

  1. 配置Mission Planner的MAVLink端口

    • 打开Mission Planner,在右上角连接端口选择框中选UDP 14550(地面站默认常用MAVLink端口),点击连接即可——即使没有真实飞行器,保持连接状态就能让Mission Planner监听该端口。
  2. 解析.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

火山引擎 最新活动