【QGroundControl二次开发】五.python生成自定义MAVLink消息及使用

一 . 环境配置

参考: MAVLink代码生成-C#

二. 生成MAVLINK协议

在MAVlink源码下找到message_definitions/common.xml,修改其中的内容。
例如:

<message id="12" name="DISTANCE_SENSOR"><description>Dedicated Raspberry PI Detects distance of the obstacle in front of the sensor</description><field type="uint64_t" name="time_usec" units="us">Timestamp (UNIX Epoch time or time since system boot). The receiving end can infer timestamp format (since 1.1.1970 or since system boot) by checking for the magnitude of the number.</field><field type="uint8_t" name="sensor_type" enum="MAV_DISTANCE_SENSOR">Class id of the distance sensor type.</field><field type="uint16_t[72]" name="distances" units="cm" invalid="[UINT16_MAX]">Distance of obstacles around the vehicle with index 0 corresponding to north + angle_offset, unless otherwise specified in the frame. A value of 0 is valid and means that the obstacle is practically touching the sensor. A value of max_distance +1 means no obstacle is present. A value of UINT16_MAX for unknown/not used. In a array element, one unit corresponds to 1cm.</field><field type="uint8_t" name="increment" units="deg">Angular width in degrees of each array element. Increment direction is clockwise. This field is ignored if increment_f is non-zero.</field><field type="uint16_t" name="min_distance" units="cm">Minimum distance the sensor can measure.</field><field type="uint16_t" name="max_distance" units="cm">Maximum distance the sensor can measure.</field><extensions/><field type="float" name="increment_f" units="deg">Angular width in degrees of each array element as a float. If non-zero then this value is used instead of the uint8_t increment field. Positive is clockwise direction, negative is counter-clockwise.</field><field type="float" name="angle_offset" units="deg">Relative angle offset of the 0-index element in the distances array. Value of 0 corresponds to forward. Positive is clockwise direction, negative is counter-clockwise.</field><field type="uint8_t" name="frame" enum="MAV_FRAME">Coordinate frame of reference for the yaw rotation and offset of the sensor data. Defaults to MAV_FRAME_GLOBAL, which is north aligned. For body-mounted sensors use MAV_FRAME_BODY_FRD, which is vehicle front aligned.</field></message>

使用mavgenerate编译成所需语言。
在MAVLink源码根目录下打开CMD,输入命令:

python -m mavgenerate

在这里插入图片描述

XMl: 选择刚才修改后的common.xml。
Out: 输出路径
点击Generate, 将弹出成功窗口。
在这里插入图片描述

生成的内容如下所示
在这里插入图片描述

三. 编译pyMAVLink

将刚才生成的文件放入MAVLink源码\pymavlink\dialects\v20 中,
如果是MAVLink v1则选择 放入v10中。
在这里插入图片描述
在pymavlink目录下打开终端

  1. 卸载之前安装的默认版本(若有)
pip uninstall pymavlink
  1. 安装依赖项:
python -m pip install -r requirements.txt
  1. 编译pymavlink:
python setup.py install --user

最后,编译后的包在 pymavlink\build\lib,复制放到python环境下的site-package中。
在这里插入图片描述
测试:
在这里插入图片描述

四. pyMAVLink的使用

4.1 建立连接

mavutil 模块提供了通过串行端口、tcp 或 udp 通道建立与 MAVLink 系统的通信链路的方法。它还可以连接到文件对象,这在处理遥测日志时非常有用。

示例:

from pymavlink import mavutilmaster = mavutil.mavlink_connection('udp:0.0.0.0:{}'.format(port))# port 是端口号
master.wait_heartbeat()
print("Heartbeat from system (system %u component %u)" % (master.target_system, master.target_system))param = 'PSC_POSXY_P'
master.param_fetch_one(param) # need connect the uav at first!message = master.recv_match(type='PARAM_VALUE', blocking=True).to_dict()
print('name: %s\t value: %f' % (message['param_id'], message['param_value']))

4.2 设置飞行模式

mavutil同样可以直接改变UAV的飞行模式

设置为loiter

master.set_mode_loiter()

解锁 uav

master.arducopter_arm()

设置为auto模式

master.set_mode_auto()

4.3 读写参数

mavutil读取无人机的参数.

master.param_fetch_all() # read all param| need connect the uav at first!
master.param_fetch_one(name) # read one param | need connect the uav at first!

mavutil直接设置参数的函数.

master.param_set_send(param, value) 

4.4 示例

接收无人机的ATTITUDE姿态消息

from pymavlink import mavutilmaster = mavutil.mavlink_connection('udp:0.0.0.0:{}'.format(port))# port 是端口号
master.wait_heartbeat()
print("Heartbeat from system (system %u component %u)" % (master.target_system, master.target_system))while True:try:msg = master.recv_match(type='ATTITUDE', blocking=True)if not msg:raise ValueError()print(msg.to_dict())except KeyboardInterrupt:print('Key bordInterrupt! exit')break

4.5 文档

https://mavlink.io/en/mavgen_python/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/50365.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Code Complete2】Note-1 [启发式编程、管理复杂度、隐藏设计]

【Code Complete2】_Note-1 [启发式编程、管理复杂度、隐藏设计] 文章目录 【Code Complete2】_Note-1 [启发式编程、管理复杂度、隐藏设计]启发式编程管理复杂度隐藏设计--减少“改动所影响的代码量” 启发式编程 ​ **设计是一个启发的过程&#xff0c;充满了不确定性&#…

记录|cmd方式恢复U盘中的数据

目录 前言一、CMD恢复Step1.Step2. 更新时间 前言 参考文章&#xff1a; u盘数据误删怎么恢复&#xff1f;安利8款数据恢复软件免费版&#xff08;2024 NEW&#xff09; 回家后&#xff0c;家人说U盘里的歌突然没有了。我就用电脑看了看&#xff0c;发现电脑中能看到U盘中是满的…

nodejs和vue做web版的MySQL数据库设计

要使用 Node.js 和 Vue.js 创建一个 Web 版本的 MySQL 数据库设计工具,需要构建一个前后端分离的应用程序。下面开始从易到难构建应用程序。 1. 环境准备 确保你的开发环境中安装了以下软件: Node.jsnpm (Node.js 包管理器)MySQL 数据库Vue.js CLI (可选)2. 创建项目结构 …

修改启动方案

AMP设置为1Linux&#xff08;CPU0&#xff09; 3HAL&#xff08;CPU1、 2、 3&#xff09; 配置。 用vscode打开its 配置文件rk3568_amp_linux.its文件修改 /* SPDX-License-Identifier: BSD-3-Clause */ /** Copyright (c) 2022 Rockchip Electronics Co., Ltd.*//dts-v1/; /…

【优秀python算法毕设】基于python时间序列模型分析气温变化趋势的设计与实现

1 绪论 1.1 研究背景与意义 在气候变化日益受到全球关注的背景下&#xff0c;天气气温的变化已经对人们的生活各方面都产生了影响&#xff0c;人们在外出时大多都会在手机上看看天气如何&#xff0c;根据天气的变化来决定衣物的穿着和出行的安排。[1]如今手机能提供的信息已经…

寄生组合式继承

寄生组合式继承&#xff08;Parasitic Combination Inheritance&#xff09;是 JavaScript 中实现继承的一种方式&#xff0c;它结合了组合继承和寄生继承的优点&#xff0c;同时避免了组合继承中的性能问题。组合继承会导致父类构造函数被调用两次&#xff0c;而寄生组合式继承…

【ARM AMBA AXI 入门 20 -- AXI AxDOMAIN 信号详细介绍】

请阅读【ARM AMBA AXI 总线 文章专栏导读】 文章目录 AXI 协议简介AXI AxDOMAIN 信号详解AxDOMAIN 信号的必要性AxDOMAIN 信号的定义AxDOMAIN 信号值的定义Verilog 实例介绍Verilog 设置 AWDOMAIN 和 ARDOMAIN 代码实现Verilog 解释代码SummaryAXI 协议简介 AXI 协议是 AMBA(…

【.NET 6 实战--孢子记账--从单体到微服务】--需求分析

一、简述 在本节&#xff0c;我会带领大家对计划开发的应用 孢子记账 进行需求分析。 需求分析是软件开发过程中的关键步骤&#xff0c;旨在明确和记录用户及系统的需求。其目的是将用户的期望转化为具体的、可实现的软件需求&#xff0c;以确保最终产品能够满足用户的需求和期…

【大模型】基于LoRA微调Gemma大模型(1)

文章目录 一、LoRA工作原理1.1 基本原理1.2 实现步骤 二、LoRA 实现2.1 PEFT库&#xff1a;高效参数微调LoraConfig类&#xff1a;配置参数 2.2 TRL库SFTTrainer 类 三、代码实现3.1 核心代码3.2 完整代码 参考资料 大模型微调技术有很多&#xff0c;如P-Tuning、LoRA 等&#…

操作系统杂项(八)

目录 一、简述互斥锁的机制&#xff0c;互斥锁与读写的区别 1、互斥锁机制 2、互斥锁和读写锁 二、简述信号量及其作用 1、概念 2、原理 3、作用 三、简述进程、线程的中断切换过程 1、进程上下文切换 2、线程上下文切换 四、简述自旋锁和互斥锁的使用场景 1、互斥…

宝塔单ip,新建多站点

报错如上&#xff1a; 那么如何新建多站点呢 先随便写个名字上去&#xff0c;然后再重新绑定别的端口… 这个时候访问99端口即可 。 如果是有域名&#xff0c;则不需要这样做 、直接80端口也可以多站点

数据缺失补全方法综述

数据缺失补全方法综述 摘要1. 引言2. 数据缺失的类型3. 数据缺失补全方法3.1 简单插补方法3.1.1 均值插补3.1.2 中位数插补3.1.3 众数插补3.1.4 前向填充和后向填充3.1.5 线性插值3.1.6 多重插补 3.2 基于模型的插补方法3.2.1 线性回归插补3.2.2 加权回归插补3.2.3 主成分分析&…

STM32智能工业监控系统教程

目录 引言环境准备智能工业监控系统基础代码实现&#xff1a;实现智能工业监控系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;工业监控与优化问题解决方案与优化收尾与总结 1. 引言 智能工业监控系统通…

数据同步工具DataX介绍

DataX是阿里巴巴集团开源的一款高效、易用的数据同步工具&#xff0c;主要用于不同数据源之间的数据同步和数据迁移。 一、基本概述 定义&#xff1a;DataX是一个异构数据源离线同步工具&#xff0c;致力于实现包括关系型数据库&#xff08;如MySQL、Oracle等&#xff09;、H…

Navicat premium最新【16/17 版本】安装下载教程,图文步骤详解(超简单,一步到位,免费下载领取)

文章目录 软件介绍软件下载安装步骤激活步骤 软件介绍 Navicat是一款快速、可靠且功能全面的数据库管理工具&#xff0c;专为简化数据库的管理及降低系统管理成本而设计。以下是对Navicat的详细介绍&#xff1a; 一、产品概述 开发目的&#xff1a;Navicat旨在通过其直观和设计…

HTML前端面试题之<iframe>标签

面试题&#xff1a;iframe 标签的作用是什么?有哪些优缺点 ? 讲真&#xff0c;刷这道面试题之前我根本没有接触过iframe&#xff0c;网课没讲过&#xff0c;项目实战没用过&#xff0c;但却在面试题里出现了&#xff01;好吧&#xff0c;我只能说&#xff1a;前端路漫漫&…

构建基于Spring Boot的SaaS应用

引言 在设计和实现SaaS系统时&#xff0c;安全性是至关重要的考虑因素。一个全面的安全策略不仅能保护系统免受恶意攻击&#xff0c;还能确保用户数据的机密性、完整性和可用性。本文将探讨在SaaS架构中实现数据加密、敏感信息保护以及应用安全的最佳实践和技术方案&#xff0…

如何恢复最近删除的文件?5种简单方法!

数据丢失在我们的工作生活中经常发生。当你决定清理硬盘或U盘时&#xff0c;你会删除一些文件夹或文件。如果你通过右键单击删除文件&#xff0c;则可以很容易从回收站恢复已删除的文件。但是&#xff0c;如果你按Shift Delete键、清空回收站或删除大于8998MB的大文件夹&#…

C++ | Leetcode C++题解之第278题第一个错误的版本

题目&#xff1a; 题解&#xff1a; class Solution { public:int firstBadVersion(int n) {int left 1, right n;while (left < right) { // 循环直至区间左右端点相同int mid left (right - left) / 2; // 防止计算时溢出if (isBadVersion(mid)) {right mid; // 答案…

element 结合 {} 实现自适应布局

通过el-row el-col 实现 例如 :xl“{ 1: 24, 2: 12, 3: 8, 4: 6 }[tableData.length] || 6” length 1 2 3 4 、代码数量为 1 2 3 4 >4 时不同卡片数量时尺寸的配置