MissionPlanner-开发历程-1

2023-05-16

1 Mission Planner 简介

Mission Planner是使用C#开发的开源飞控地面站软件,使用MavLink通信协议,浏览官方网站。

Mission Planner是ArduPilot开源自动驾驶项目的全功能地面站应用程序。Mission Planner项目代码已在github上进行开源,前往github克隆项目代码。

2 Mission Planner开发

进行Mission Planner定制开发前的准备:

  • Git  代码版本控制软件,前往官方网站下载。Git的使用介绍可以参考之前的博客:GIT 的基本使用命令与介绍。
  • TortoiseGit  GUI版本的git操作工具,使用前需要先安装git,前往下载TortoiseGit。
  • Visual Studio  前往微软官方网站下载Visual Studio 2017,可以选择免费使用社区版本,使用其他版本请自行购买。
  • Microsoft .NET 4.0
  • .NET standard 2.0

3 Mission Planner 编译运行

注:笔者进行修改的Mission Planner 版本代码已经克隆到个人的github仓库,后续开源作者更新时,本项目不会进行更新,保持代码版本不变,前往下载MMission Plannr代码。

从github下载Mission Planner代码到本地,使用visual studio 2017打开目录下的MissionPlanner.sln项目文件,运行项目解决方案。在进行编译项目前需要还原nuget程序包,也可以直接进行生成解决方案,会进行自动还原nuget程序包。如图,直接进行生成解决方案时,项目进行报错:

为了可以进行编译,下面开始逐步进行修复错误。请耐心往下看。错误信息下拉到最底部,发现是nuget程序没有下载成功,因此当发现这么多错误的时候,先不要急修改前面的错误,有很多错误是因为缺少对应的程序包才会导致出错,Mission Planner项目包含了很多的项目依赖,各个项目之间依赖关系比较复杂,一般情况下不要随便去更改程序集依赖来修改错误,这有可能会导致更多的不可预知的错误。下载nuget程序包错误时,请先检查网络是否正常。还原nuget程序包时,发现项目需要的程序包版本比nuget服务器上的版本要更新,所以导致还原失败,可以使用文件搜索整个项目,把无法还原的nuget程序的版本号改成nuget服务器中的最新版本,再次还原即可(如果读者在还原时发现nuget服务器没有“4.5.0-preview2-26225-02”该版本时,可以全局搜索“4.5.0-preview2-26225-02”,将其替换为“4.5.0-preview1-26216-02”),如图,笔者更改无法还原的nuget程序包版本后,再次编译时出现了一下错误,没有了还原nuget程序失败的错误了:

距离成功编译生成项目又更近了一步( ̄▽ ̄)~*

然而,接着继续折腾,发现各种错误,各种捣鼓都不行,接近崩溃了。。。。。。。

冷静下来仔细想了下,考虑到开源作者的开发环境与笔者的不同,有很大可能是主干分支中的代码缺少了部分必须的文件还没进行提交,所以笔者编译主干代码时候就出现了各种无法理解的错误,嗯,暂时先这样认为吧。

下面开始使用稳定版本的代码进行开发测试,在克隆下来的项目代码根目录,使用tortoiseGit进行分支导出,选择标签为1.3.52的版本代码进行检出,如图:

检出成功后,再次进行编译,运行,终于可以执行成功了,来个图吧:

好了,终于成功了,可以开始下一步的个性定制了,后面会进行功能性的定制以及自定义MavLink消息。

4 Mission Planner 项目代码结构

如下图,Mission Planner的工程结构:

该项目包含了大量的外部库以及自定义插件等,我们可以先从主项目Mission Planner开始进行学习,Mission Planner是基于C#的Winform进行开发的,但需要注意的是,Mission Planner的界面是手工进行编码的,不是基于VS的可拖动界面进行所见即所得的界面开发,因此要改变MP(Mission Planner)的界面时最好不要进行拖放控件的形式进行改动,很容易出现问题,最好是进行手工代码编写。

项目GCSViews下面的是程序界面,FlightData.cs是飞行数据界面,可以在vs里面右键使用“查看设计器”来查看界面,通过界面上的控件名来进行搜索对应的代码,初学者可以这样进行一点点的查看,Program.cs是程序入口,在这里可以看到程序是如何一点一点的运行起来的,另外MP中的地图控件是使用开源的GMap.net,有兴趣的读者需要开发地图程序时可以考虑使用该插件。

5 Mission Planner 的MavLink消息生成器

在Mission Planner工程项目目录:ExtLibs\Mavlink下,可以直接使用脚本:regenerate.bat生成MavLink消息,执行脚本后,会生成C#文件:Mavlink.cs,该代码内是各种MavLink消息的结构体定义以及消息类型。(运行消息生成器脚本,需要安装python2.7)

自定义消息可以在消息定义xml文件中自行添加,文件目录为:ExtLibs\Mavlink\message_definitions,把自定义消息写在common.xml文件中,具体参照原有的消息格式进行自行添加,添加完毕后,重新运行消息生成脚本即可。

MavLink消息通信协议开源项目地址为:https://github.com/mavlink/mavlink

6 Mission Planner MavLink消息解析

在工程目录MavLink目录下,有MavLink消息解码方式,如图:

类MAVLinkInterface包含了MavLink消息的解包和封包,可以在这个类中详细了解MavLink的消息通信包的解析原理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
public MAVLinkMessage getHeartBeat()
{
giveComport = true;
DateTime start = DateTime.Now;
int readcount = 0;
while (true)
{
MAVLinkMessage buffer = readPacket();
readcount++;
if (buffer.Length > 5)
{
//log.Info("getHB packet received: " + buffer.Length + " btr " + BaseStream.BytesToRead + " type " + buffer.msgid );
if (buffer.msgid == (byte) MAVLINK_MSG_ID.HEARTBEAT)
{
mavlink_heartbeat_t hb = buffer.ToStructure<mavlink_heartbeat_t>();
 
if (hb.type != (byte) MAV_TYPE.GCS)
{
SetupMavConnect(buffer, hb);
 
giveComport = false;
return buffer;
}
}
}
if (DateTime.Now > start.AddMilliseconds(2200) || readcount > 200) // was 1200 , now 2.2 sec
{
giveComport = false;
return MAVLinkMessage.Invalid;
}
}
}
 
public void sendPacket(object indata, int sysid, int compid)
{
bool validPacket = false;
foreach (var ty in MAVLINK_MESSAGE_INFOS)
{
if (ty.type == indata.GetType())
{
validPacket = true;
generatePacket((int)ty.msgid, indata, sysid, compid);
return;
}
}
if (!validPacket)
{
log.Info("Mavlink : NOT VALID PACKET sendPacket() " + indata.GetType().ToString());
}
}
 
private void generatePacket(MAVLINK_MSG_ID messageType, object indata)
{
generatePacket((int)messageType, indata);
}
 
void generatePacket(int messageType, object indata)
{
//uses currently targeted mavs sysid and compid
generatePacket(messageType, indata, MAV.sysid, MAV.compid);
}

getHeartBeat()是获取消息心跳包的操作,sendPacket和generatePacket分别是发包和打包的操作函数,其中generatePacket做个多个函数重载。

项目根目录下的CurrentState.cs是进行接收到的MavLink消息的解码,可以在里面获取到需要的MavLink消息,以及可以自行添加自定义消息的解码和发送。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MissionPlanner-开发历程-1 的相关文章

  • node.js连接Sql Server数据库

    最近对node js比较感兴趣 xff0c 网上的例子大多都是node js集成MongoDB 我对MongoDB实在不是太感冒 xff0c 并不是因为它有什么不好听 xff0c 只是在工作上的确是很难遇到 在工作上还是和Sql Serve
  • StringEscapeUtils 工具特殊字符转码,防止xss攻击

    一 xss攻击简介 XSS 即 xff08 Cross Site Scripting xff09 中文名称为 xff1a 跨站脚本攻击 XSS的重点不在于跨站点 xff0c 而在于脚本的执行 那么XSS的原理是 xff1a 恶意攻击者在we
  • CMake file命令参数GLOB和GLOB_RECURSE

    命令 file GLOB variable RELATIVE path globbing expressions file GLOB RECURSE variable RELATIVE path FOLLOW SYMLINKS globbi
  • Sphinx使用说明

    link https blog csdn net sinat 29957455 article details 83657029 1 安装插件 xff1a pip3 install sphinx pip3 install sphinx rt
  • ubuntu16.04下vim的安装与配置(出错的解决方案)

    一般来说 xff0c 在终端中输入 sudo apt span class token operator span get upgrade sudo apt span class token operator span get instal
  • K8S部署Prometheus

    前言 xff1a zabbix与prometheus的区别 和Zabbix类似 xff0c Prometheus也是一个近年比较火的开源监控框架 xff0c 和Zabbix不同之处在于Prometheus相对更灵活点 xff0c 模块间比较
  • LINUX 下进行UDP收发的C代码

    include lt stdio h gt include lt sys types h gt include lt sys socket h gt include lt string h gt include lt sys socket
  • VINS-Mono详解(一)

    文章目录 VINS Mono前端概述入口函数main 回调函数img callback 发布频率控制特征点提取与光流跟踪单目处理逻辑双目处理逻辑 FeatureTracker readImage 函数更新特征点id VINS Mono前端概
  • 在windows下使用putty连接虚拟中的linux出现主机拒绝的问题(已解决)

    一 首先windows的ip地址段必须和linux的ip地址段相同 xff0c 具体方法百度 xff0c Google下 二 linux的ssh服务必须安装 xff0c 打开 xff0c 具体指令如下 安装指令应该是 代码 sudo apt
  • 程序员读书的五重天

    第八天 xff0c 上帝说要有书 xff0c 于是人类文明摆脱了靠遗传来传承的窘境 所以对于读书好处 xff0c 基本上从古至今都是被人所认同的 其中最为精妙的莫过于宋真宗所言 xff1a 富家不用买良田 xff0c 书中自有千钟粟 xff
  • HTML5初体验——蛮神奇的

    记得去年在一个公司实习的时候 xff0c 听当时的领导说起过HTML5 xff0c 当时就大体了解了一下 知道了是新的下一代HTML的新标准 xff0c 去掉了HTML4中的一些标签 xff0c 扩展了一些标签内容 其他的就没有继续深入的去
  • Aruco码估计相机位姿初步

    Abstract xff1a 利用aruco库中的相关函数实现在摄像头下aruco码的识别和在指定地方插入视频 Criticize xff1a 一 xff1a OpenCV实现USB摄像头的打开 并且实现USB摄像头参数调节 我们调用ope
  • 【笔记】Protues仿真STM32的实现过程

    测试环境 xff1a protues8 6 问题 xff1a 搭建好基本电路 xff0c 在仿真时候出错 xff0c 提示没VSS和VDD未连接 xff0c 如下如图 提示错误 解决办法 xff1a 选择 Design gt Configu
  • 年度回忆录(2013.01----2013.12)

    看了一下上次的年度总结是从 2013 年 2 月份开始的 xff0c 按照以往的习惯 xff0c 年度回忆录是半年一写的 xff0c 这次居然破例了 xff01 由于工作的原因吧 xff08 这是找借口的节奏么 xff09 xff0c 没有
  • 使用JMF实现音乐播放(java多媒体编程)

    JMF实际上是Java的一个类包 JMF 2 1 1技术提供了先进的媒体处理能力 xff0c 从而扩展了 Java平台 的功能 这些功能包括 xff1a 媒体捕获 压缩 流转 回放 xff0c 以及对各种主要媒体形式和编码的支 持 xff0
  • Pygame下载和安装

    Pygame 的下载非常简单 xff0c 可分为两种方式 xff1a 一是通过 Python 的包管理器 pip 来安装 xff1b 二是下载二进制安装包进行安装 其中使用 pip 包管理器安装是最简单 最轻量级的方法 xff0c 下面以
  • 物联网毕业设计 stm32四轴飞行器设计与实现

    1 简介 Hi xff0c 大家好 xff0c 今天向大家介绍一个学长做的单片机项目 基于stm32的四轴飞行器设计 大家可用于 课程设计 或 毕业设计 这次尝试制作一个四旋翼飞控的过程 这个飞控是基于STM32 xff0c 整合了MPU6
  • 机器学习(周志华)学习笔记八:集成学习(上)

    一 AdaBoost思想 三个臭皮匠 xff0c 顶个诸葛亮 xff0c 这也正是集成学习的目的 为了达到上述目的 xff0c AdaBoost算法有两个核心思想 1 更加关注之前基学习器做错的样本 xff1b 2 降低错误率较高的基学习器
  • opencv在编译报错的汇总

    Q1 xuy 64 xuy 桌面 opencv test make usr bin cmake home xuy anaconda2 lib libcurl so 4 no version information available req
  • 至简设计系列_闹钟

    作者 xff1a 小黑同学 本文为明德扬原创及录用文章 xff0c 转载请注明出处 xff01 1 1 1 概述 数字时钟是采用数字电路技术实现时 分 秒计时显示的装置 xff0c 可以用数字同时显示时 xff0c 分 xff0c 秒的精确

随机推荐

  • 遥控器对码与飞控解锁

    今天开始DIY 四旋翼 xff0c 购买了 mwc 飞控和天地飞六代遥控器 xff0c 装好电机电调后 xff0c 想试一下遥控控制电机 首先是遥控发射器与接收器的对码 将电调连上电机后 xff0c 单独把电调的杜邦线插口查到接收器油门插槽
  • Git保存论文

    多图预警 多图预警 多图预警 多图预警 操作步骤 下载git for windows客户端安装TortoiseGit使用Git删除文件夹再试一遍 下载git for windows客户端 下载地址 http msysgit github i
  • Git小乌龟分支操作

    分支的创建 选择创建分支 这里填上分支名字 切换到新分支可点可不点 选中的话直接就切换到新分支 不点的话进行下一步选择切换 检出 选择要切换的分支 分支就创建完成 接下来是分支的合并 分支的合并 首先 确认当前的分支为发起合并方 个人理解
  • 零星PCB打板|开源广场|每月2张|等你来撸|保姆级教程:嘉立创免费PCB打样获取攻略

    目录 缘由 软件 xff1a 嘉立创EDA专业版 xff08 视情况下载 xff0c 非必需 xff09 软件 xff1a 嘉立创PC端下单助手 xff08 领优惠券 xff09 优惠券在这里 xff1a 嘉立创PCB免费打样新规则解读 6
  • Linux下利用GDB调试快速找到Bug

    调试程序最让人头疼的就是层出不断的Bug xff0c 而且有些Bug不容易定位 xff0c 下面介绍一种很强大的调试工具 xff1a GDB 虽然之前听过GDB调试 xff0c 但是自己调试时一直没使用过 今天在调试highmac程序时 x
  • 无状态会话bean(1)---定义

    无状态会话bean 用于完成在单个方法的生命周期内的操作 无状态bean 可以实现许多业务操作 xff0c 但是每个方法都不能假定任何其他的方法会在它之前调用 后半句的意思是现在的你可能不是刚才的你 xff0c 明天的你可也能不是今天的你
  • 树莓派(Raspberry Pi),如何在命令行下配置查看WIFI无线网络

    通常 xff0c 我们的wifi路由器都是开启了DHCP自动分配 ip地址的功能的 xff0c 本文是以这个为前提 xff0c 如果你的WIFI路由器没有开启DHCP xff0c 则在本文的基础上 xff0c 还需要给WLAN0口配置静态I
  • ubuntu虚拟机网络配置同时连接WIFI上外网和连接以太网与ARM开发板通信

    在学习ARM嵌入式开发过程中 xff0c 需要在ubuntu虚拟机下进行程序开发和编译 xff0c 一般需要使用网线直连ARM开发板 xff0c 或挂载NFS网络文件系统 xff0c 或 通过SSH TFTP等网络协议传输在PC端编译完的二
  • Systemd 服务管理教程

    Systemd 概述 Systemd 简介 Systemd 是一系列工具的集合 xff0c 其作用也远远不仅是启动操作系统 xff0c 它还接管了后台服务 结束 状态查询 xff0c 以及日志归档 设备管理 电源管理 定时任务等许多职责 x
  • 高版本Matlab运行时//在当前文件夹或MATLAB路径中未找到文件//函数或变量 ‘xx‘ 无法识别//解决方法

    当你用2019以上版本Matlab时 xff0c 可能会发现这样一个问题 xff1a 当你默默选择 更改文件夹 或者 添加到路径 后 xff0c Matlab又会输出 函数或变量 xx 无法识别 类似这样 xff1a 总之不会乖乖出现运行结
  • 美团技术十年:让我们感动的那些人那些事

    时光荏苒 xff0c 美团十岁了 xff0c 美团技术团队也走过了十个春秋 2010年3月4日美团网上线的时候 xff0c 整个公司总共十来人 xff0c 在一套三居室的民房里起步 其中技术团队只有5个人 xff0c 现在有4位还在美团 今
  • 如何在Windows上轻松安全的将数据从HDD迁移到SSD?

    当你打算升级硬盘时 xff0c 如何将数据从HDD迁移到SSD xff1f 你可以使用一款免费的软件将所有数据从一个硬盘克隆到另一个硬盘 为什么要将数据从HDD迁移到SSD xff1f HDD xff08 机械硬盘 xff09 和SSD x
  • Ubuntu 16.04安装Python3.8

    bin sh install software properties common sudo apt install software properties common install PPA sudo add apt repositor
  • error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“0”不匹配值“2” 解决方法

    错误原因 xff0c Debug工程引用了Release版本的库文件 解决方法
  • 关于wince OS开发面试问题的总结系列之Bootloader

    参考资料 xff1a 1 Windows CE 工程事件完全解析 by xff1a 李大为 2 Windos CE 实用开发技术 by xff1a 张冬泉 等 3 Windows Embedded CE 6 0 Fundamentals 4
  • Jacobian矩阵和Hessian矩阵

    1 Jacobian 转载自 xff1a http jacoxu com p 61 146 在向量分析中 雅可比矩阵是一阶偏导数以一定方式排列成的矩阵 其行列式称为雅可比行列式 还有 在代数几何中 代数曲线的雅可比量表示雅可比簇 xff1a
  • 打工与乘公交

    去一个公司打工就如同上了一辆公交车 在上车之前 xff0c 你应该清楚自己打算去哪里 xff0c 打算在哪里下车 有的公交车很豪华 xff0c 有的很破烂 xff0c 但是这并不是重点 xff0c 所有能开到目的地的车都是好车 上了车之后
  • 卡尔曼滤波器(从vchelp的算法论坛上看到的)

    卡尔曼滤波器 Kalman Filter 1 xff0e 什么是卡尔曼滤波器 xff08 What is the Kalman Filter xff09 在学习卡尔曼滤波器之前 xff0c 首先看看为什么叫 卡尔曼 跟其他著名的理论 xff
  • 第4篇 FreeRTOS是如何工作的---基本原理3(上下文切换)

    上下文切换Context Switching 任务执行时 xff0c 它使用处理器 微控制器的寄存器并访问RAM和ROM xff0c 就像任何其他程序一样 这些资源 处理器寄存器 堆栈等 组成了任务执行上下文 任务是一段连续的代码 xff0
  • MissionPlanner-开发历程-1

    1 Mission Planner 简介 Mission Planner是使用C 开发的开源飞控地面站软件 xff0c 使用MavLink通信协议 xff0c 浏览官方网站 Mission Planner是ArduPilot开源自动驾驶项目