Mavlink地面站编写之二–Mission PLanner地面站构架分析之MAVLINK航点读写

2023-05-16

转载请注明出处: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的控件类,其中

2030

 

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

419

飞行计划设置界面
电机读取航点按钮,进入实现函数;


 
  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的操作,结构图如下:

2

05

以上可以看到 MAVLinkInterface的一些接口,再看读取航点的函数:
int cmdcount = port.getWPCount();得到航点个数
cmds.Add(port.getWP(a));存入航点坐标到航点列表,可以在MAVLinkInterface类中看到详细的getWP(a)得到航点的实现,用while循环读取,并且做了超时时间设置,来保证软件健壮性。
MP里面还有个航点类来接收航点在locationwp.cs中可以看到详细的定义,主要是坐标,姿态,和这个航点的command id指令ID。

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

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

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

随机推荐

  • 路由器设置之后不能连网,动态ip显示为0

    刚从学习毕业 xff0c 那么独居的日子里 xff0c 网络自然是不可或缺的 xff0c 于是博主在等到安装人员上门之后 xff0c 他竟然提出无耻的要求 配置路由器要收费 xff0c 于是乎作为一名计算机从业者 xff0c 自然不能让他把
  • 链表的倒序

    1 用函数实现 xff1a 定义3个临时变量 xff0c p1储存当前节点 xff0c p2储存后一个节点 xff0c p3储存重新指向的那个节点 步骤 xff1a 1 p1指向当前节点 xff0c p2指向后一个节点 xff0c 将p2的
  • Python入门:使用PyCharm调试Python程序

    Python入门 xff1a 使用PyCharm调试Python程序 面向Python初学者 PyCharm集成运行环境 在了解Python编程之前 xff0c 我们需要先弄明白如何编写运行代码 所以非常有必要先讲解一下Python的集成开
  • Debian9.5安装g++

    看了网上很多文章 gcc安装很轻松 xff0c 但是g 43 43 的安装过程就曲折多了 写此博客记录一下Debian9 5操作系统下g 43 43 安装过程 首先替换apt源为阿里云的源 xff1a debian 配置 debian 7
  • CMakeLists.txt文件中添加OpenCV库依赖项

    CMakeLists txt文件中添加OpenCV库依赖项 cmake needs this line cmake minimum required VERSION 2 8 Define project name project openc
  • 物理地址和逻辑地址

    1 物理地址和逻辑地址 物理地址 xff1a 加载到内存地址寄存器中的地址 xff0c 内存单元的真正地址 在前端总线上传输的内存地址都是物理内存地址 xff0c 编号从0开始一直到可用物理内存的最高端 这些数字被北桥 Nortbridge
  • 树莓派无opencv时进行视频实时处理

    用树莓派 xff0c 想要进行图像处理 xff0c 但网上的很多教程都用opencv xff0c opencv在树莓派上安装很麻烦 xff0c 那怎样进行图像处理呢 xff1f 代码如下 xff1a from picamera array
  • make: warning: Clock skew detected. Your build may be incomplete.

    问题现象 xff1a make warning Clock skew detected Your build may be incomplete 问题分析 xff1a 根据报警提示 xff0c 应该问题出现时钟问题 问题原因 xff1a 当
  • 关于Java之IO流音乐拼接小项目

    需求 xff1a 做一个音乐串烧 分析 xff1a 1 有n个音乐 xff0c 找到高潮部分 xff0c 2 获取高潮部分的流对象 3 把这部分对象保存成一个mp3 4 把它们拼接起来 以下为源码供大家分享 xff1a 方法一 xff1a
  • pixhawk源码下载与编译

    今天和同学在一起讨论发现自己还在看的pixhawk源码的版本好低啊 xff0c 就下个最新的吧 想起有些人还不会下载源码 xff0c 以及用什么工具查看 源码的下载我用的是git shell工具下的 xff0c px4的github网址是h
  • pixhawk开发环境

    Windows 7 64bit 软件安装 首先 xff0c 需要安装一些软件 xff0c CMake 32位的Java jdk以及PX4 Toolchain Installer CMake的话笔者使用的是CMake 3 3 2 win32
  • Pixhawk-信息流浅解析

    根深方能叶茂 在等待的日子里 xff0c 刻苦读书 xff0c 谦卑做人 xff0c 养得深根 xff0c 日后才能枝叶茂盛 Better 根爷 之前我们已经谈到系统框架 xff0c 之前谈到了定制自己功能的两部 xff1a 添加模块和修改
  • Python跨进程共享数据/对象

    1 跨进程共享方式 在multiprocess库中 xff0c 跨进程对象共享有三种方式 xff1a xff08 1 xff09 第一种仅适用于原生机器类型 xff0c 即python ctypes当中的类型 xff0c 这种在mp库的文档
  • Pixhawk-姿态解算-互补滤波

    根深方能叶茂 在等待的日子里 xff0c 刻苦读书 xff0c 谦卑做人 xff0c 养得深根 xff0c 日后才能枝叶茂盛 Better 根爷 终于说到了正题 xff0c 姿态解算这一部分很重要 xff0c 主要的基础就是惯性导航和多传感
  • Pixhawk-姿态解算源码注释

    根深方能叶茂 在等待的日子里 xff0c 刻苦读书 xff0c 谦卑做人 xff0c 养得深根 xff0c 日后才能枝叶茂盛 Better 根爷 这一部分是我在看源码时 xff0c 自己注释的一点笔记 xff0c 现在直接贴上来 当然这其中
  • Pixhawk-串级pid介绍

    根深方能叶茂 在等待的日子里 xff0c 刻苦读书 xff0c 谦卑做人 xff0c 养得深根 xff0c 日后才能枝叶茂盛 Better 根爷 鉴于串级PID在pixhawk系统中的重要性 xff0c 无论是误差的补偿 xff0c 如姿态
  • pixhawk串口读取传感器数据

    1 Pixhawk板上串口说明 xff1a 测试 使用Pixhawk板上TELEM2接口的USART2 xff0c 对应的Nuttx UART设备文件尾 dev ttyS2 xff1a 2 读取数据测试 步骤 xff1a 在Firmware
  • Android调用系统自带的文件管理器进行文件选择

    这几天在做的项目网盘 上传时需要用到调用系统自带的文件管理器来选择文件 xff0c 后来就在考虑怎么调用 xff0c 网上也搜了很久 xff0c 没有很好的解决方法 xff0c 后来在一瞬间发现了一篇不错的文章 xff0c 借鉴了一下代码
  • Android下如何读取文件的内容

    唉 xff0c 尝试了好半天了 xff0c 才弄懂 xff0c 1 首先权限的问题 我们需要在根文件中添加权限 lt uses permission android name 61 34 android permission WRITE E
  • Mavlink地面站编写之二–Mission PLanner地面站构架分析之MAVLINK航点读写

    转载请注明出处 http www amovauto com 阿木社区 玩也要玩的专业 xff01 3DR这个地面站还是非常专业的 xff0c 最近研究MAVLINK通信协议 就来分析下Mission planner的构架 至于Msissio