Mavlink地面站编写之六---MP源码多线程读写框架分析

2023-05-16

转载请注明出处!阿木开源社区 玩也要玩的专业 http://www.amovauto.com/?p=743#more-743

对于MissionPlanner这种多任务的程序,我们知道要采用多线程的方式来实现,读数据,显示数据,写数据。这是就需要一些数据同步的问题。尤其是串口数据的读写的数据同步。数据读写模型,比如常见的生产者,消费者模型。这里不再多述。我们来分析下MP代码的读线程,写线程,来实现我们社区的开源地面站的显示数据和写入指令的功能。下面看看数据读取线程的代码,这个数据线程读取的代码在MainV2.CS中的1962行左右。


    while (port.BaseStream.IsOpen && port.BaseStream.BytesToRead > minbytes &&
                               port.giveComport == false)
                        {
                            try
                            {
                                port.readPacket();
                            }
                            catch (Exception ex)
                            {
                                log.Error(ex);
                            }
                        }
   // update currentstate of sysids on the port
                        foreach (var MAV in port.MAVlist.GetMAVStates())
                        {
                            try
                            {
                                MAV.cs.UpdateCurrentSettings(null, false, port, MAV);
                            }
                            catch (Exception ex)
                            {
                                log.Error(ex);
                            }
                        }
  

其中port.readPacket()这个语句是把数据读到一个数据缓冲区,显示线程就可以从这个数据缓冲区拿出来显示了,具体的代码参考mavlinkinterface的内容。这个函数里面有些数据的上锁,解锁的语句,是为了完成数据同步。这是读取数据,下面我们看看如果我们要实现发送指令或者航点给飞控,也就是写数据,我们应该怎么操作。写数据一定是在另外一个线程里面。在FlightPlanne.cs中的1863行,我们可以看到写入航点的操作


   private void BUT_write_Click(object sender, EventArgs e)
        {
            if ((altmode) CMB_altmode.SelectedValue == altmode.Absolute)
            {
                if (DialogResult.No ==
                    CustomMessageBox.Show("Absolute Alt is selected are you sure?", "Alt Mode", MessageBoxButtons.YesNo))
                {
                    CMB_altmode.SelectedValue = (int) altmode.Relative;
                }
            }

            // check for invalid grid data
            for (int a = 0; a < Commands.Rows.Count - 0; a++)
            {
                for (int b = 0; b < Commands.ColumnCount - 0; b++) { double answer; if (b >= 1 && b <= 7)
                    {
                        if (!double.TryParse(Commands[b, a].Value.ToString(), out answer))
                        {
                            CustomMessageBox.Show("There are errors in your mission");
                            return;
                        }
                    }

                    if (TXT_altwarn.Text == "")
                        TXT_altwarn.Text = (0).ToString();

                    if (Commands.Rows[a].Cells[Command.Index].Value.ToString().Contains("UNKNOWN"))
                        continue;

                    byte cmd =
                        (byte)
                            (int)
                                Enum.Parse(typeof (MAVLink.MAV_CMD),
                                    Commands.Rows[a].Cells[Command.Index].Value.ToString(), false);

                    if (cmd < (byte) MAVLink.MAV_CMD.LAST &&
                        double.Parse(Commands[Alt.Index, a].Value.ToString()) < double.Parse(TXT_altwarn.Text))
                    {
                        if (cmd != (byte) MAVLink.MAV_CMD.TAKEOFF &&
                            cmd != (byte) MAVLink.MAV_CMD.LAND &&
                            cmd != (byte) MAVLink.MAV_CMD.RETURN_TO_LAUNCH)
                        {
                            CustomMessageBox.Show("Low alt on WP#" + (a + 1) +
                                                  "\nPlease reduce the alt warning, or increase the altitude");
                            return;
                        }
                    }
                }
            }

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

            frmProgressReporter.DoWork += saveWPs;
            frmProgressReporter.UpdateProgressAndStatus(-1, "Sending WP's");

            ThemeManager.ApplyThemeTo(frmProgressReporter);

            frmProgressReporter.RunBackgroundOperationAsync();

            frmProgressReporter.Dispose();

            MainMap.Focus();
        }
  

上面的函数是一些验证航点逻辑准确性的操作,frmProgressReporter.DoWork += saveWPs;这是实现了一个委托。而saveWPs这个函数是数据写入函数.port.setWPTotal(写入一共的航点数量),port.setWP(写入航点), port.setParam(设置参数), port.setWPACK(给飞控应答)。
mavlink

这里我们可以看到是遵循MAVLINK的读写协议的,首先地面站写入航点数量(port.setWPTotal),地面站收到航点请求指令,地面站向飞控写入航点(port.setWP),最后port.setWPACK完成应答.源码太长自行打开源码阅读参考。这是完整的写入数据的流程。其中我们还有注意一点就是 MainV2.comPort.giveComport = true;这句,在 saveWPs函数中,这是这个写入线程占用COM端口的标志,通过这句话,我发现MP的数据读写通信是半双工的。因为在数据的代码中我们会发现 while (port.BaseStream.IsOpen && port.BaseStream.BytesToRead > minbytes &&port.giveComport == false)这句话中的port.giveComport == false表示,没有数据写入,也就是COM没有占用,读数据才会有效,否则跳出数据读循环。也就是说MP的源码通port.giveComport 来判断是不可以读取数据。所以如果port.giveComport == true表示当前有数据在写入,就不会去读取数据。由此看出MP地面站的代码数据读写是半双工的。我也是在写社区地面站的时候发现这一点的,否则我采用mavlinkinterface的时候写入航点一直有问题,就出在写入数据的时候,不能读取数据。本人浅解欢迎批评指正!

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

Mavlink地面站编写之六---MP源码多线程读写框架分析 的相关文章

  • 零基础同学的福利,带你走进Airsim 的大门

    初识AirSim仿真开发 正式上线 大纲如下 xff1a 第一课时 在ubuntu中编译AirSim UE4 ROS 简单介绍AirSimUE4 ROS AirSim编译的流程介绍环境编译中会出现哪些问题 xff0c 以及如何寻找解决方法
  • 技术分享 | 三种无人机精准降落方案

    1 概述 无人机自诞生以来 xff0c 主要应用于军事方面 xff0c 作为智能化和信息化的武器 xff0c 无人机在侦察 监视 通信 远距离攻击等方面发挥了重要的作用 近年来 xff0c 无人机在民用方面的应用也越来越多 xff0c 各国
  • 技术分享 | 玩转Jetson NX内核(四)

    上期我们讲解了玩转Jetson NX内核 xff08 三 xff09 xff0c 本期我们开始将mipi相机移植到NX xff0c 我们已经搭建好各种编译环境 xff0c 如有问题可参考之前的系列文章 1 4 mipi相机在NX上应用 mi
  • 远程连接TX2的ubuntu系统(没有显示器):网线+路由器解决

    我的到手TX2是没有显示器的 xff0c 要么用HDMI线接上显示器 xff0c 要么在一个wifi网络下使用nomachine远程桌面 我没有显示器也没有HDMI线 xff0c 只能远程桌面连接 问题是想要远程连接就必须让TX2和我的电脑
  • 技术分享 | GPS无人机集群位置自主纠偏功能升级

    新的一年 xff0c 又是新的开始 xff0c 在这里 xff0c 祝大家在新的一年有更多的收获 xff0c 有更好的发展 过新年 xff0c 大家都会买新衣服穿 xff0c 我们的GPS无人机集群套件同样也要上新功能 近期 xff0c 我
  • 技术分享 | 遥控器控制(Joystick)

    一 遥控器控制 在真实飞行过程中 xff0c 我们使用真实的遥控器作为控制无人机的主要操作来源 xff0c 遥控器始终拥有最高的权限 xff0c 精湛的遥控器操作手法可以保证无人机安稳着陆 xff0c 但对于很多非专业人士来说 xff0c
  • 技术分享 | Airsim初探-用游戏引擎做仿真

    谈到无人机 无人车仿真 xff0c 首先想到的大概就是gazebo xff0c 但现在都快进入元宇宙时代了 xff08 手动狗头 xff09 xff0c 还再继续使用gazebo这种上个时代的产品就显得不够hack xff0c 是时候了解和
  • 技术分享 | Airsim和PX4远程配置连接教程

    前言 xff1a 远程配置是指一台计算机上安装windows版airsim xff0c 作为服务器 xff0c 另一台计算机上安装ubuntu的px4 xff0c 作为客户端 没有采用ubuntu的airsim是因为windows版的air
  • 调试达人 | 史上最全PX4固件无人机无法解锁问题合集

    很多同学在到手一台或者根据网上教程组装了一台PX4固件的无人机后 xff0c 最迫切的一件事是否是让无人机解锁飞上蓝天 xff1f 但就是在这一步却遇到各种各样的问题导致无法解锁而四处查找资料 xff1f 本文由阿木实验室有多年无人机调试经
  • 常见激光雷达分类

    一 激光雷达的原理 激光雷达的原理类似于声呐 xff0c 只不过这里我们用光代替声音 xff0c 来衡量激光雷达与障碍物之间的距离 主要工作原理是向目标发射激光束 xff08 单线 多线 xff09 xff0c 然后将反射信号与发射信号比较
  • Mini Homer——几百块钱也能搞到一台远距离图数传链路?

    在一些远程操控的场景中 xff0c 图数传链路的选择一直是比较重要的问题 传统的WIFI方式 xff0c 传输距离近50到100米 xff0c 不能满足测试要求 xff0c 更不能在工业现场使用 即便是一些专用的图数传方案 xff0c 传输
  • F200——搭载基于模型设计的国产开源飞控系统无人机

    一 F200简介 F200是目前基于FMT开源自驾仪项目开发的第一款无人机产品 xff0c 旨在为广大无人机爱好者和科研工作者提供一个理想的无人机研发与测试平台 支持室外定高 定点 xff0c 一键起飞 xff0c 一键降落 xff0c 一
  • Prometheus-v2新增地面站,助力高效研发!

    Prometheus地面站是基于Prometheus系统的人机交互界面 xff0c 地面站采用TCP UDP通信进行发送和接收数据 xff0c 而在机载端中则采用ROS MSG消息进行通信 xff0c 该地面站可以更快地让用户复现Prome
  • 赛前指导:第二届未来飞行器挑战赛实践赛道之技术详解

    2022 xff08 第二届 xff09 四川省大学生未来飞行器挑战赛正在火热进行中 xff0c 本次挑战赛中的实践类赛道将面向全省高校大学生个人或团队征集未来先进侦察打一体化无人机的实地竞赛 xff0c 主要考察路劲规划 视觉目标搜索 舵
  • 四元数乘法计算

    关于两个四元数的乘法 xff0c 网上查了一大堆 xff0c 没一个说明白的 我就想知道给我两个四元数 xff0c 我该怎么算出来它们的乘积 这么简单的需求都没法找到答案 xff0c 实在对不起四元数的江湖地位 要想计算四元数的乘法 xff
  • Prometheus-v2控制子模块教学例程demo演示

    在Prometheus v2中 xff0c 我们将代码模块化 xff0c 将功能拆分为子模块 xff0c 具体包含控制子模块 目标检测子模块 路径规划子模块 集群子模块以及matlab子模块等 其中 xff0c 控制子模块作为最基础的子模块
  • 机器人开发新思路——强化学习

    众所周知 xff0c 机器人 xff08 Robot xff09 是一种能够半自主或全自主工作的智能机器 机器人能够通过编程和自动控制来执行诸如作业或移动等任务 xff0c 而在执行过程中 xff0c 最常用的就是判断命令或逻辑 换句话来说
  • Swarm-Formation无人机分布式集群算法浅析与仿真测试

    无人机集群一直是当今研究的热点与难点 然而 xff0c 目前相关的集群规划策略通常缺乏在杂乱环境中避开障碍的能力 为了解决无人机在密集复杂环境下的编队避障飞行这一难题 xff0c 浙江大学 Fast Lab 实验室提出了一种分布式无人机集群
  • 无人机集群编队解决方案,适应多种飞行场景

    针对集群研究人员的痛点 xff0c 阿木实验室设计了无人机集群编队的开发平台 xff0c 让开发者们无需再为了验证自己的集群算法或代码而发愁 xff0c 只需关心集群相关的研究 无人机集群编队开发平台基于开源无人机项目Prometheus
  • 做机器人开发,你一定绕不开的模块!

    Allspark 机载电脑 Allspark 是阿木实验室为广大AI智能硬件开发者打造的一款微型边缘计算机 在设计之初就定义了尺寸小巧 重量轻 算力强 可靠 扩展性高的特点 Allspark机身采用铝合金新材料外壳设计 xff0c 内置静音

随机推荐

  • 常用的路径规划算法浅析

    路径规划 所谓路径规划 xff0c 也就是在起点和终点之间找到一条连续的运动轨迹 xff0c 在尽可能优化路径的同时避开环境中的障碍物 常用的路径规划算法有传统的基于图搜索算法 基于采样的路径规划算法 xff0c 以及考虑动力学的路径规划算
  • TGK-Planner无人机运动规划算法解读

    高速移动无人机的在线路径规划一直是学界当前研究的难点 xff0c 引起了大量机器人行业的研究人员与工程师的关注 然而无人机的计算资源有限 xff0c 要在短时间内规划出一条安全可执行的路径 xff0c 这就要求无人机的运动规划算法必须轻型而
  • 超实用的日志分析工具——Flightplot,你不会还没用过吧

    在上一篇文章中已经为大家介绍过Flight Review分析日志工具的具体使用 xff0c 但是该工具在使用过程中难免存在一些问题 xff0c 例如 xff1a Flight Review工具需要在线浏览 xff0c 很多时候受制于电脑网络
  • 行业级开源无人机目标追踪,高空助力抓贼!

    活久见 xff01 成都一高楼惊险无人机抓小偷 视频中危险动作 xff0c 请勿模仿 xff01 本次实验中我们使用的是Prometheus 600 xff08 P600 xff09 行业级无人机研发平台 xff08 此平台适用于无人机行业
  • 万众瞩目!ICF5国产开源飞控推出,为国内无人系统发力

    ICF5是AMOVLAB和FMT团队匠心打造的一款专业级 高性能开源自驾仪硬件 搭载了最新的FMT稳定版固件 xff0c 可用于无人机 无人车 无人船和机器人等应用领域 作为FMT的首个自研飞控硬件 xff0c 其飞控系统和芯片均实现了纯国
  • ROS usb-cam无法打开USB摄像头

    usb cam是一个用来打开摄像头并输出图像话题的ros package xff0c 可以自己建立工作空间git clone项目自己编译 xff0c 也可以直接用sudo apt install ros melodic usb cam安装
  • Prometheus V2仿真开发套件全新上市,实现一键启动仿真

    产品介绍 xff1a Prometheus仿真开发套件是阿木实验室为Prometheus仿真以及matlab仿真专门打造的一款小型X86计算主机 xff0c 预装仿真所需环境及全部资源 xff0c 搭载Prometheus地 站和Prome
  • 阿木动态 | 阿木实验室亮相第58·59届中国高等教育展(重庆)

    4月10日 xff0c 第58 59届中国高等教育博览会在重庆国际博览中心圆满结束 本届展会中 xff0c 各大科技企业 研发机构和教育组织都集中展示了最新的教育科技成果和应用 阿木实验室作为一家注重提高客户研发效率的企业 xff0c 此次
  • MFP450 基础飞行平台问世,支持室内室外无GPS环境飞行

    无人机开发入门 xff0c 我们需要一个怎样的基础飞行平台 xff1f 开源无人机的发展日新月异 xff0c 但遗憾的是 xff0c 在PX4和FMT生态中 xff0c 还很少看到一个稳定可靠的基础飞行平台 目前国内市场的选择不多 xff0
  • 赛场直击 | 阿木实验室鼎力支持“智领群蜂”国际无人蜂群技术大赛

    无人蜂群技术是当前国际科研的前沿领域 xff0c 通过多架无人机形成编队自主协同执行任务 xff0c 具有广阔的应用前景 2023年5月7日至5月10日 xff0c 由中国航空协会北京航空航天大学 南京航空航天大学联合主办的 智领群蜂202
  • 三位一体,铸就无敌铁军!海陆空协同,开启集群新篇章!

    在机器人领域 xff0c 多机器人系统的研究一直是一大热点 xff0c 众多高校与研究所逐步投入到机器人集群系统的研究当中 xff0c 其中无人机编队表演 无人车群园区运输 无人船集群水域监测等集群应用更是进入了大众的视野 但对多机器人集群
  • APM2.8自驾仪入门手册(AMOV AUTO)

    APM V2 8 0 自驾仪入门手册 说明这篇文章应该原创与风迅电子 xff0c 我按照这篇文章做了APM的调试 xff0c 感觉比较有价值的文章 xff0c 特在这里做了整理 xff0c 谢谢如此详细的文章 xff01 阿木开源社区 xf
  • Mavlink地面站编写之一--协议分析

    阿木社区 转载注意出处 http www amovauto com Pixhawk APM都是采用MAVLINK协议实现的飞控的数据链路传输 先简单介绍下mavlink协议 Mavlink协议最早由 苏黎世联邦理工学院 计算机视觉与几何实验
  • 航模基础知识之电机,电调,电池的选择

    在设计一款小型无人车 xff0c 无人船 xff0c 多旋翼 xff0c 固定翼的时候 一定会面对的一个问题是怎么选择合适的电机 xff0c 电池 xff0c 电调 这三者配合的好 xff0c 机器才可以发挥优秀的性能 xff0c 否则会有
  • APM2.8 Rover 自动巡航车设计(硬件连接)

    APM PIX4系类飞控是美国3DR公司的开源项目 xff0c 是目前在开源无人机领域使用最多人数最多的开源控制板 整个项目开源 xff0c 从硬件到软件 有非常优秀的地面站系统和适应多旋翼 xff0c 无人车 xff0c 无人船 xff0
  • APM2.8 Rover 自动巡航车设计(固件安装和设置)

    1 2 APM2 8软件安装与固件下载 下载Mission Planner这个地面基站软件 xff0c 这里介绍的是windoews平台下的 xff0c 在MAC或者linux下可以使用QGroundCont基于QT编写的地面站软件 xff
  • 树莓派4b安装ubuntu18.04并安装ros

    ubuntu官方已经支持树莓派了 xff0c 官方镜像如下 https ubuntu com download raspberry pi 这是一个为树莓派准备的arm架构的ubuntu xff0c 不是ubuntu mate xff0c 功
  • 利用Session完成用户的登录和注销

    用户的登录和注销是最常见的Web应用案例 xff0c 当一个应用的客户登录了以后 xff0c 其他所有的会话都得知道这个用户已经登录还很有可能得提取用户的昵称予以显示等等 xff0c 所以 xff0c 只有把登录成功的用户的信息放入到Ses
  • Mavlink地面站编写之五-Mission Planner中ProgressReporterDialogue和读串口线程serialreaderthread的分析

    转载请注明出处 http www amovauto com p 61 660 阿木社区 xff0c 玩也要玩的专业 QQ群 526221258 ProgressReporterDialogue 这个对话框很有意思 xff0c 在MP中连接阶
  • Mavlink地面站编写之六---MP源码多线程读写框架分析

    转载请注明出处 xff01 阿木开源社区 玩也要玩的专业 http www amovauto com p 61 743 more 743 对于MissionPlanner这种多任务的程序 xff0c 我们知道要采用多线程的方式来实现 xff