Mission PLanner地面站构架分析之MAVLINK航点读写

转载请注明出处:http://www.amovauto.com 阿木社区 玩也要玩的专业!

3DR这个地面站还是非常专业的,最近研究MAVLINK通信协议,就来分析下Mission planner的构架。至于Msission planner的编译在前面几篇文章已经做了详细描述。

Msission planner有几十个工程项目组成

AviFile

BaseClasses

BSE.Windows.Forms

Core

GeoUtility

GMap.Net.Core

GMap.Net.WindowsForms

KMLib

MAVLink

MetaDataExtractor

MissionPlanner.Comms

MissionPlanner.Controls

MissionPlanner.Utils

px4uploader

SharpKml

ZedGraph

几十个工程的调用关系比较复杂,有些库的使用价值非常高的比如MAVLink,用这个库就可以搞定所有的MAVLINK协议方面的事情,我也是从这个库着手写的地面站,可以重点看看这个库。

Mission Planner的构架比较复杂,他的功能太全了,所以显得冗余。但是非常专业的地面站,我喜欢........

一 入口函数分析,入口函数在Program.cs中在入口函数中初始化了一堆东西 GMAP等等.......

一直到这里

 try
            {
                //System.Diagnostics.Process.GetCurrentProcess().PriorityClass = System.Diagnostics.ProcessPriorityClass.RealTime;
                Thread.CurrentThread.Name = "Base Thread";
                Application.Run(new MainV2());
            }
            catch (Exception ex)
            {
                log.Fatal("Fatal app exception", ex);
                Console.WriteLine(ex.ToString());

                Console.WriteLine("\nPress any key to exit!");
                Console.ReadLine();
            }

他启动了主窗体MainV2,这个主窗体就是要分析的重点了,因为我们的第一步目的是分析MAVLINK的这个协议的使用,其他的一些软件窗体方面的设置,我们先不考虑。

 log.Info("Create FD");
                FlightData = new GCSViews.FlightData();//
                log.Info("Create FP");
                FlightPlanner = new GCSViews.FlightPlanner();
                //Configuration = new GCSViews.ConfigurationView.Setup();
                log.Info("Create SIM");
                Simulation = new GCSViews.Simulation();

GCSViews是重要的一个类,这个就是MP的控件类,其中

可以看到FlightData.cs是飞行数据显示界面,就是MP中的姿态数据显示界面,FlightPlanner.cs是飞行计划设置界面,读取航点和写入航点都在这个界面里面,前面的消息解析中我们已经知道怎么怎么通过MAVLNK读取APM的飞控的数据了,下一步我们要实现航点的读取和写入,我们来重点分析下这个FlightPlanner.cs。

     
                                        飞行计划设置界面

电机读取航点按钮,进入实现函数;

  internal void BUT_read_Click(object sender, EventArgs e)
        {
            if (Commands.Rows.Count > 0)
            {
                if (sender is FlightData)
                {
                }
                else
                {
                    if (
                        CustomMessageBox.Show("This will clear your existing planned mission, Continue?", "Confirm",
                            MessageBoxButtons.OKCancel) != DialogResult.OK)
                    {
                        return;
                    }
                }
            }

            ProgressReporterDialogue frmProgressReporter = new ProgressReporterDialogue
            {
                StartPosition = FormStartPosition.CenterScreen,
                Text = "Receiving WP‘s"
            };

            frmProgressReporter.DoWork += getWPs;//获取航点的委托
            frmProgressReporter.UpdateProgressAndStatus(-1, "Receiving WP‘s");

            ThemeManager.ApplyThemeTo(frmProgressReporter);

            frmProgressReporter.RunBackgroundOperationAsync();

            frmProgressReporter.Dispose();
        }

        void getWPs(object sender, ProgressWorkerEventArgs e, object passdata = null)
        {
            List cmds = new List();

            try
            {
                MAVLinkInterface port = MainV2.comPort;

                if (!port.BaseStream.IsOpen)
                {
                    throw new Exception("Please Connect First!");
                }

                MainV2.comPort.giveComport = true;

                param = port.MAV.param;

                log.Info("Getting Home");

                ((ProgressReporterDialogue) sender).UpdateProgressAndStatus(0, "Getting WP count");

                if (port.MAV.apname == MAVLink.MAV_AUTOPILOT.PX4)
                {
                    try
                    {
                        cmds.Add(port.getHomePosition());
                    }
                    catch (TimeoutException ex)
                    {
                        // blank home
                        cmds.Add(new Locationwp() { id = (byte)MAVLink.MAV_CMD.WAYPOINT });
                    }
                }

                log.Info("Getting WP #");

                int cmdcount = port.getWPCount();

                for (ushort a = 0; a < cmdcount; a++)
                {
                    if (((ProgressReporterDialogue) sender).doWorkArgs.CancelRequested)
                    {
                        ((ProgressReporterDialogue) sender).doWorkArgs.CancelAcknowledged = true;
                        throw new Exception("Cancel Requested");
                    }

                    log.Info("Getting WP" + a);
                    ((ProgressReporterDialogue) sender).UpdateProgressAndStatus(a*100/cmdcount, "Getting WP " + a);
                    cmds.Add(port.getWP(a));
                }

                port.setWPACK();

                ((ProgressReporterDialogue) sender).UpdateProgressAndStatus(100, "Done");

                log.Info("Done");
            }
            catch
            {
                throw;
            }

            WPtoScreen(cmds);
        }

ProgressReporterDialogue这个对话框类中DoWork是个委托,ProgressReporterDialogue的后台运行线程会执行 getWPs(object sender, ProgressWorkerEventArgs e, object passdata = null)这个委托,来看看这个委托

委托里面定义了 List cmds = new List();航点列表。

MAVLinkInterface port = MainV2.comPort;这个MAVLinkInterface类比较重要,是主界面MainV2的一个成员变量。里面记录了关于MAVLINK协议的所有内容,从MAVLINK协议获取的参数会存入这个成员变量,比如飞控是什么固件,飞控的状态,还有对LIB库里面的MAVLINK库的进一步封装比如得到心跳包函数getHeartBeat(),得到参数列表getParaList(),得到当前航点getRallyPoints();

看来这个成员可以实现所有 MAVLINK的操作,结构图如下:

 以上可以看到 MAVLinkInterface的一些接口,再看读取航点的函数:

int cmdcount = port.getWPCount();得到航点个数

cmds.Add(port.getWP(a));存入航点坐标到航点列表,可以在MAVLinkInterface类中看到详细的getWP(a)得到航点的实现,用while循环读取,并且做了超时时间设置,来保证软件健壮性。

MP里面还有个航点类来接收航点在locationwp.cs中可以看到详细的定义,主要是坐标,姿态,和这个航点的command id指令ID。

我们知道了怎么利用mavlink读取航点,那么如果我们要写入航点,也是一样的道理。

更多内容请访问:http://www.amovauto.com  阿木社区 玩也要玩的专业!

QQ群:526221258

时间: 2024-08-08 01:07:22

Mission PLanner地面站构架分析之MAVLINK航点读写的相关文章

Mission Planner编译

软件下载: 本文使用VS2013进行编译和修改Mission Planner,其他版本没有尝试过.首先下载Mission Planner源码. https://github.com/diydrones/MissionPlanner 同时声明本文是翻译APM官方论坛的文章,和尝试的结果.还有因为是开源的项目本身比较活跃,版本很多,这里不保证可以一定编译成功.英文原文地址: http://dev.ardupilot.com/wiki/buildin-mission-planner/ 在编译之前请务必

自顶而下系统构架分析

1.   前言 自己在工作当中经常会遇到需要快速并且完整地了解一个软件系统的事情.本来想写一写如何快速了解一个系统,但想着想着就想到了软件的架构.本文以一个软件业务分析师的视角阐述本人理解的软件架构.目的是提供一个适用的,易用的方法,帮助业务分析师或软件架构师系统地,快速的分析和了解软件系统.如有技术性错误,还请各位大牛指正. 2.   软件架构理解 首先来了解一下什么是架构,架构就是为了组织部件和资源,让部件及资源发挥单体所无法发挥的作用,从而实现架构所要达到的战略目标.(有点类似于一个组织存

Mavlink - 无人机通讯协议

http://qgroundcontrol.org/mavlink/start mavlink协议介绍https://pixhawk.ethz.ch/mavlink/ 消息简介 MAVLink简介 Mavlink协议最早由 苏黎世联邦理工学院 计算机视觉与几何实验组 的 Lorenz Meier于2009年发布,并遵循LGPL开源协议.Mavlink协议是在串口通讯基础上的一种更高层的开源通讯协议,主要应用在微型飞行器(micro aerial vehicle)的通讯上.Mavlink是为小型飞

PX4地面站QGroundControl在ubuntu下的安装

1.引言 相信很多玩开源无人机的朋友手上都有一架无人机,而不是仅仅停留在理论的学习和程序的学习.放飞自己组装的无人机才是乐趣所在,那么这本文就介绍玩无人机必不可少的地面站软件qgroundcontrol的安装,当然还可以用mission planner地面站.qgc和都可以在windows下安装.本文介绍的是在linux下的ubuntu环境下安装qgc. 2.安装 下载和安装可以参考官方指导教程Ddownload  and Install. (1)在下载和安装qgroundcontrol之前需要

小论文-软件构架师

要知道软件架构师的工作过程,首先就要知道什么是软件架构师,以及为什么一个项目需要架构师. 软件架构师,是在一个软件项目开发过程中,将客户的需求转换为规范的开发计划及文本,并制定这个项目的总体架构,指导整个开发团队完成这个计划.主导系统全局分析设计和实施.负责软件构架和关键技术决策的人员.简单来说,就是将客户的需求转换为开发计划的角色. 软件架构师的任务是领导与协调整个项目中的技术活动(分析.设计和实施等).推动主要的技术决策,并最终表达为软件构架.确定和文档化系统的相对构架而言意义重大的方面,包

01《软件构架实践》阅读笔记之一

这一学期的学习重点是软件架构的学习.软件架构是软件业的一个重要研究领域,也正在受到越来越多的关注,软件架构的地位也日益明显地体现了出来.但是其实据我们所知,无论是从技术角度还是从管理角度,目前针对实际软件开发组织的.有关如何管理软件构架的实用指导文献还十分地缺乏.所以,这本书的主旨就是基于如何把软件构架和行业或组织的实际情况结合起来的探讨. 在设计和分析大型并且复杂的软件密集型系统过程中,我们已经认识到了软件行业和开发组织对这些系统的设计及其最终成败所起的作用.而我们构建系统的目的是为了满足组织

Impala 源码分析-FE

By yhluo 2015年7月29日 Impala 3 Comments Impala 源代码目录结构 SQL 解析 Impala 的 SQL 解析与执行计划生成部分是由 impala-frontend(Java)实现的,监听端口是 21000.用户通过Beeswax 接口 BeeswaxService.query() 提交一个请求,在 impalad 端的处理逻辑是由void ImpalaServer::query(QueryHandle& query_handle, const Query

游戏服务器框架概括分析

这篇blog题目涉及的范围真大!以至于在这里需要先写一篇前言把范围缩小.选择写这样一个系列的文章,主要是想给工作了两年的自己一个交代,或者说是一个阶段性的总结.两年时间里,房价依然再涨,工资依然跑不赢CPI,某人依然在仰望星空.期间很多梦碎了,很多还在坚持着,生活过得波澜不惊.而我也从刚毕业是的青涩逐步蜕变为"老油条".不知道是一种悲哀.还是一种悲哀.还是一种悲哀....... 庆幸的是梦还在继续,一颗倔强的心还在坚持.希望明天的明天被束缚的心能回到梦开始的地方! ==========

x86 构架的 Arduino 开发板Intel Galileo

RobotPeak是上海的一家硬件创业团队,团队致力于民用机器人平台系统.机器人操作系统(ROS)以及相关设备的设计研发,并尝试将日新月异的机器人技术融入人们的日常生活与娱乐当中.同时,RobotPeak 将尽力为机器人技术在开源硬件.开源软件社区的普及做出贡献.陈士凯是 RobotPeak 联合创始人,他给我们带来了最新的  x86 构架的 Arduino 开发板 Intel Galileo 的深度使用报告. 1.前言 在今年(2013)罗马举办的首届欧洲 Make Faire 上,Intel