开源飞控初探:地面站和SDK

Posted hursing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了开源飞控初探:地面站和SDK相关的知识,希望对你有一定的参考价值。

按照原意,不会带上天,在地面上能控制飞机的系统,都叫地面站,包括PC软件、手机App等。地面站可通过多种连接,以MAVLink数据协议向飞控发命令。

载人飞机上的触控屏也会集成SDK具有控制功能,这是特例,在飞控端来看触控屏仍是一种“地面站”。

MissionPlanner

仅支持Windows。

官网地址:https://ardupilot.org/planner/

源码地址:https://github.com/ArduPilot/MissionPlanner/

编译

安装Visual Studio 2022 社区版。安装过程中,选择组件时,点击更多,导入配置"vs2022.vsconfig" (从https://raw.githubusercontent.com/ArduPilot/MissionPlanner/master/vs2022.vsconfig下载)。

clone仓库后,

git submodule update --init --recursive

用VS打开项目工程,直接编译即可。

如果报错某个类在net461找不到,可以修改对应工程的目标target。ExtLibs/BSE.Windows.Forms/BSE.Windows.Forms.csproj和ExtLibs/BaseClasses/BaseClasses.csproj,net461;netstandard2.0改为netstandard2.0

编译release版,debug版不通过。

使用说明

请参考百度出来的中文文章。MissionPlanner使用说明(持续更新) - 怒飞垂云 | 无人机知识库

源码分析

没有官方的说明文档。而且我们也不用,故不继续研究了。

QGroundControl

跨所有平台。

官网地址:http://qgroundcontrol.com/

源码仓库地址:https://github.com/mavlink/qgroundcontrol。一个仓库可编译出所有平台的包。

开发者帮助文档(中文):https://dev.qgroundcontrol.com/master/zh/

安装包下载地址:https://github.com/mavlink/qgroundcontrol/releases

用户帮助文档:https://docs.qgroundcontrol.com/master/en/

文档非常完善,没必要搬运,请直接看官方信息。基于Qt开发,工程架构非常清晰。所以X2地面站基于它做二次开发。

Pixhawk

官网:https://pixhawk.org/

产品列表:https://pixhawk.org/products/

硬件标准开源地址:https://github.com/pixhawk/Pixhawk-Standards

硬件介绍请参考:Pixhawk系统架构介绍_dayL_W的博客-CSDN博客_pixhawk

PX4

官网地址:https://px4.io/

源码仓库地址:https://github.com/PX4/PX4-Autopilot

开发者指南(中文):https://docs.px4.io/master/zh/development/development.html

用户指南(中文):https://docs.px4.io/master/zh/

完档很完善,没必要搬运了。

pymavlink

MAVLink基础库的python生成脚本项目,本身也是一个工具库,可以用pip install pymavlink安装,支持python3.7或以下。提供了一些工具类,可以在python环境收发解析MAVLink消息。请参考 https://mavlink.io/en/mavgen_python/

Telemetry Log(.tlog)

地面站和SDK都会记录从连接上飞控起收发MAVLink消息的日志,文件后缀名为.tlog。每次连接上就有一个文件,文件名是时间。

用Mission Planner可以把tlog转成txt或csv。下面是一段txt的示例,每行就是一条MAVLink消息,跟帧格式是对应的。请参考Serialization · MAVLink Developer Guide

2022/6/6 9:44:44 FD  5  0  0  0  0  0      0 mavlink_heartbeat_t custom_mode 0 type 6 autopilot 0 base_mode 0 system_status 0 mavlink_version 0  sig  Len 17 crc16 58784
2022/6/6 9:44:44 FD 1C  0  0 FE 22  1     1E mavlink_attitude_t time_boot_ms 3759481 roll 0.002049405 pitch 0.00155601 yaw -1.098183 rollspeed 0.0002265193 pitchspeed 0.0003532104 yawspeed 0.0008397771  sig  Len 40 crc16 52130

也可以用下面自己写的脚本,基于pymavlink开发。

#!/usr/bin/env python
from pymavlink import mavutil
import time
import sys

raw_path=sys.argv[1]
logfile = mavutil.mavlogfile(raw_path)
content = "time,vesion,len,seq,sid,cid,msg,field1,field2,field3,field4,field5,field6,field7,field8,field9,field10\\n"
count = 0
while True:
    msg = logfile.recv_msg()
    count += 1
    if count == 70:
        pass
    if msg == None:
        break
    if hasattr(msg, "reason") and msg.reason == "Bad prefix":
        continue
    num_time = msg._timestamp
    frame_time = time.strftime("%Y-%m-%dT%H:%M:%S", time.localtime(num_time))
    frame_time += ".0:03d".format(int(num_time * 1000 % 1000))
    version = msg.get_msgbuf()[0]
    if version == 254:
        mavver = "v1"
    elif version == 253:
        mavver = "v2"
    else:
        continue
    header = msg.get_header()
    # print(frame_time, mavver, "," + str(header.mlen), "seq=" + str(msg.get_seq()),"sid=" + str(msg.get_srcSystem()), "cid=" + str(msg.get_srcComponent()))
    if msg.get_srcSystem() == 0 or msg.get_srcComponent() == 0:
        continue
    content += frame_time + "," + mavver + "," + str(header.mlen) + "," + str(msg.get_seq()) + "," + str(msg.get_srcSystem()) + "," + str(msg.get_srcComponent())
    for (k,v) in msg.to_dict().items():
        if k == "mavpackettype":
            content += "," + str(msg.get_msgId()) + "/" + v
        else:
            content += "," + k + "="
            if k == "command":
                try:
                    content += str(v) + "/" + mavutil.mavlink.enums['MAV_CMD'][v].name
                except:
                    content += str(v)
            else:
                content += str(v)
    content += "\\n"
logfile.close()
filepath = raw_path[:-4] + "csv"
csv = open(filepath, "w")
csv.write(content)
csv.close()

需要安装python3.7以及pip install pymavlink。给脚本传入tlog的路径即会在tlog所在目录生成csv文件。

android DroneKit

DroneKit-Android是3DR公司为Android应用程序开发的地面站开源SDK,支持控制ArduPilot的所有车机类型。因为基于MAVLink,所以也兼容应用了MAVLink的所有飞行器。

源码仓库地址:https://github.com/dronekit/dronekit-android

2017年已停止更新。官网android.dronekit.io/也打不开,DNS错误。

DroneKit在MAVLink Java库的基础上,实现了连接功能,且用android background service来解耦出连接端和控制端。在service中运行的连接端自动实现了心跳、查询类型/能力/参数列表等地面站的必要操作,连接方式可支持TCP、UDP、USB、蓝牙、点对点WiFi。控制端封装了service的通信和底层MAVLink消息的收发,可通过函数进行mission航线规划、实时查看摄像头画面、校准磁力计等高级操作。

其它Android SDK

  1. 赞助PX4的DroneCode基金会的旗下项目:https://github.com/mavlink/MAVSDK-Java。提供了高层API,仍在更新。

  1. 爱好者的MAVLink实现:https://github.com/dronefleet/mavlink。已停止更新。

以上是关于开源飞控初探:地面站和SDK的主要内容,如果未能解决你的问题,请参考以下文章

开源飞控介绍

开源飞控初探两大开源飞控的历史

开源飞控初探两大开源飞控的历史

开源飞控初探两大开源飞控的历史

开源飞控初探ArduPilot::Copter固件源码分析

开源飞控初探ArduPilot::Copter固件源码分析