当前位置: 首页 > news >正文

无人机 PX4 飞控 | PX4源码添加自定义参数方法并用QGC显示与调整

无人机 PX4 飞控 | PX4源码添加自定义参数方法并用QGC显示与调整

0 前言

之前文章添加了一个自定义的模块,本篇文章在之前的自定义模块中,添加两个自定义参数

使用QGC显示出来,并通过QGC调整参数值,代码实现参数更新

新增的参数放在 jone_demo_params.c文件里面
在这里插入图片描述

之前定义的模块中,一直在终端打印一个消息,本节中设置一个bool型参数,为1 打印一个消息,为0 打印另一个消息

并且设置一个float型参数,将该参数值打印出来

1 PX4 添加自定义参数方法

PX4定义参数 在具体模块的 **_params.c文件中进行

通过函数 PARAM_DEFINE**(),例如:

  • PARAM_DEFINE_INT32 定义整型参数
  • PARAM_DEFINE_FLOAT 定义浮点型参数

目前只有这两种类型

PARAM_DEFINE**() 函数的上面有注释

[!NOTE]

注意:注释是有格式要求的,不能随意写,为了在QGC中进行显示,与参数的自动化处理

注释的格式如下:

/** 第一行

*短注释

*长注释

*标签

PARAM_DEFINE**()

标签以@为开头,标签的内根据参数的类型来定,具体有:

  • @unit 单位16

  • @min 最小值16

  • @max 最大值

  • @value 各值代表的不同含义

在这里插入图片描述

  • @boolean 布尔型参数
  • @decimal 指定参数值的小数位数
  • @increment 参数的调整步长。
  • @group 分组

PARAM_DEFINE**() 函数的 参数,第一个为定义的参数名称,第二个为默认值:

  • 参数名称

[!NOTE]

注意参数的名字不能超过16个字符

  • 默认值

下面是原有PX4定义好的参数的例子

浮点型参数

/*** VTOL Takeoff relative loiter altitude.** Altitude relative to home at which vehicle will loiter after front transition.** @unit m* @min 20* @max 300* @decimal 1* @increment 1* @group VTOL Takeoff*/
PARAM_DEFINE_FLOAT(VTO_LOITER_ALT, 80);

整型参数

/*** Maximum number of search attempts** Maximum number of times to search for the landing target if it is lost during the precision landing.** @min 0* @max 100* @group Precision Land*/
PARAM_DEFINE_INT32(PLD_MAX_SRCH, 3);

具体的参数自动处理代码在Tools/module_config 下面的几个python文件中,例如 generate_params.py 中的核心代码:

                # get the type and extract all tagstags = '@group {:}'.format(param_group)if param['type'] == 'enum':param_type = 'INT32'for key in param['values']:tags += '\n * @value {:} {:}'.format(key, param['values'][key])elif param['type'] == 'bitmask':param_type = 'INT32'for key in param['bit']:tags += '\n * @bit {:} {:}'.format(key, param['bit'][key])max_val = max(key for key in param['bit'])tags += '\n * @min 0'tags += '\n * @max {:}'.format((1<<(max_val+1)) - 1)elif param['type'] == 'boolean':param_type = 'INT32'tags += '\n * @boolean'elif param['type'] == 'int32':param_type = 'INT32'elif param['type'] == 'float':param_type = 'FLOAT'else:raise Exception("unknown param type {:}".format(param['type']))

2 代码实践

2.1 定义参数

定义一个bool型变量,来控制打印消息a还是b

分组为 demo

/*** print msg a or b** Control print msg a or b** @boolean* @group demo*/
PARAM_DEFINE_INT32(PRINT_MSG_A_EN, 1);

定义一个float型变量,在打印时,打印该值

单位 随便定义为s

最小值为0.2 ,最大值为1.0

小数精度为2

增量步长为0.01

分组为demo

/*** print number** Print number value** @unit s* @min 0.2* @max 1.0* @decimal 2* @increment 0.01* @group demo*/
PARAM_DEFINE_FLOAT(PRINT_NUM_VALUE, 0.4f);

2.2 使用参数

下面是如何使用上面定义的两个参数

在 JoneDemo.hpp 文件中的类声明中的私有变量区加入如下内容

	DEFINE_PARAMETERS((ParamFloat<px4::params::PRINT_NUM_VALUE>)         _param_print_num_value,(ParamBool<px4::params::PRINT_MSG_A_EN>)           _param_print_msg_a_enable,);

DEFINE_PARAMETERS 就是固定使用之前参数文件定义的参数的函数方法,按照这个格式写

px4::params::+定义参数名称 后面跟 代码中对应的变量

[!NOTE]

注意:参数对应的变量不能直接使用,在使用该值的时候需要使用.get()函数,更改值的时候使用.set()函数.

否则编译报错

在 JoneDemo.cpp 的Run()函数中加入 使用该两个变量的代码

	if(_param_print_msg_a_enable.get()){printf("MSG a print  value : %f \r\n",(double)_param_print_num_value.get());}else{printf("hello jone\r\n");}

2.3 参数更新

参数更新

如果不进行下面的参数更新的操作,那么在使用的时候QGC里改了参数,代码里不会改

涉及到的函数:parameters_update(bool force)

在里面加入内容:

	// check for parameter updatesif (_parameter_update_sub.updated() || force) {// clear updateparameter_update_s pupdate;_parameter_update_sub.copy(&pupdate);// update parameters from storageModuleParams::updateParams();SuperBlock::updateParams();printMsgAEnable = _param_print_msg_a_enable.get();printNumValue = _param_print_num_value.get();}

前面四行是固定的,检测的参数更新时进行更新

最后两行则是新定义了两个变量,对应更新到的参数,这样更新后就被赋值了,不用在后面执行是一直执行get()函数

_parameter_update_sub 变量需要在JoneDemo.hpp文件声明

uORB::SubscriptionInterval _parameter_update_sub{ORB_ID(parameter_update), 1_s};

在构造函数中,加入强制执行参数更新一次,这样上电,变量就会获得参数

parameters_update(true);

然后再后面的Run函数中,之前本身就有parameters_update(false); 也就是检测到参数变化了才会更新一次

在JoneDemo.hpp文件中的私有区,定义这两个变量就行

	float printNumValue;bool printMsgAEnable;

对应的JoneDemo.cpp 文件中的cpp函数,则改为使用这两个变量

	if(printMsgAEnable){printf("MSG a print  value : %f \r\n",(double)printNumValue);}else{printf("hello jone\r\n");}

3 测试

删除掉原来的build文件夹下的px4_sitl_default

然后再编译

make px4_sitl_default 

再执行

make px4_sitl_default gazebo

终端打印出了应该输出的内容

在这里插入图片描述

打开QGC,打开参数列表,先点击刷新

然后搜索定义的那两个变量名

第1个bool变量PRINT_MSG_A_EN

在这里插入图片描述

可以看到再选择值里面可以选择 Enabled和Disabled,就是因为参数定义时,声明了标签:@boolean

同样可以看到长注释:Control print msg a or b

此时将 该变量改为Disabled
在这里插入图片描述
在这里插入图片描述

终端按照代码逻辑输出了:hello jone

第二个看那个float型参数:PRINT_NUM_VALUE
在这里插入图片描述

数字后面有个s,就是单位的标签

有最小值和最大值的标签,小数点后面有两位,就是@decimal 2的标签

此时将 该变量改为0.26,则终端对应打印的数据也进行改变
在这里插入图片描述
在这里插入图片描述
这样就完成了在PX4中,添加自定义bool型、float型的参数与测试。

相关文章:

无人机 PX4 飞控 | PX4源码添加自定义参数方法并用QGC显示与调整

无人机 PX4 飞控 | PX4源码添加自定义参数方法并用QGC显示与调整 0 前言 之前文章添加了一个自定义的模块&#xff0c;本篇文章在之前的自定义模块中&#xff0c;添加两个自定义参数 使用QGC显示出来&#xff0c;并通过QGC调整参数值&#xff0c;代码实现参数更新 新增的参…...

《CPython Internals》阅读笔记:p356-p359

《CPython Internals》学习第 19天&#xff0c;p356-p359 总结&#xff0c;总计 4 页。 一、技术总结 1.benchmark suite The benchmark suite is the tool to use when comparing the complete performance of Python. The Python Benchmark suite is a collection of Pyth…...

Linux--权限

Linux系统的权限管理是保障系统安全的重要机制&#xff0c;以下详细讲解权限相关概念及操作指令&#xff1a; 一、基础权限机制 1. 权限的三元组&#xff0c;读&#xff08;r&#xff09;、写&#xff08;w&#xff09;、执行&#xff08;x&#xff09; 每个文件或目录有三组…...

java后端之登录认证

基础登录功能&#xff1a;根据提供的用户名和密码判断是否存在于数据库 LoginController.java RestController Slf4j public class LoginController {Autowiredprivate UserService userService;PostMapping("/login")public Result login(RequestBody User user) {…...

【矩阵二分】力扣378. 有序矩阵中第 K 小的元素

给你一个 n x n 矩阵 matrix &#xff0c;其中每行和每列元素均按升序排序&#xff0c;找到矩阵中第 k 小的元素。 请注意&#xff0c;它是 排序后 的第 k 小元素&#xff0c;而不是第 k 个 不同 的元素。 你必须找到一个内存复杂度优于 O(n2) 的解决方案。 示例 1&#xff1…...

C语言-构造数据类型

1、构造数据类型 结构体、共用体、枚举。 2、结构体 1、结构体的定义 结构体是一个自定义的复合数据类型&#xff0c;它允许将不同类型的数据组合在一起。 struct 结构体名 {数据类型1 成员变量1;数据类型2 成员变量2;数据类型3 成员变量3;数据类型4 成员变量4; } 2、结构体变…...

鸿蒙next 自定义日历组件

效果图预览 20250124-113957 使用说明 1.选择日期左右箭头&#xff0c;实现每月日历切换&#xff0c;示例中超出当前月份&#xff0c;禁止进入下一月&#xff0c;可在代码更改 2.日历中显示当前选择的日期&#xff0c;选中的日期颜色可自定义 3.日历中可展示历史记录作为数据…...

【express-generator】08-路由重定向

前言 通过前面两篇文章的讲解&#xff0c;我们已经介绍完第二阶段的前两点&#xff0c;本篇介绍第三点&#xff1a;路由重定向。 1. 路由重定向概述 路由重定向是指在服务器端将客户端的请求从一个 URL 重定向到另一个 URL 的过程。这通常通过 HTTP 状态码&#xff08;如 30…...

搭建Spring Boot开发环境

JDK&#xff08;1.8及以上版本&#xff09; Apache Maven 3.6.0 修改settings.xml 设置本地仓库位置 <localRepository>D:/repository</localRepository> 设置远程仓库镜像 <mirror><id>alimaven</id><name>aliyun maven</name&…...

Spatial Group-wise Enhance (SGE) module

来源&#xff1a; [1905.09646] Spatial Group-wise Enhance: Improving Semantic Feature Learning in Convolutional Networks 相关工作&#xff1a; #GroupedFeatures #AttentionModels 创新点&#xff1a; 贡献&#xff1a; 提出了一种轻量级的SGE模块&#xff0c;能够…...

二叉搜索树中的搜索(力扣700)

首先介绍一下什么是二叉搜索树。 二叉搜索树是一个有序树&#xff1a; 若它的左子树不空&#xff0c;则左子树上所有结点的值均小于它的根结点的值&#xff1b;若它的右子树不空&#xff0c;则右子树上所有结点的值均大于它的根结点的值&#xff1b;它的左、右子树也分别为二叉…...

记录让cursor帮我给ruoyi-vue后台管理项目整合mybatis-plus

自己整合过程中会出现 work.web.exception.GlobalExceptionHandler :100 | 请求地址/admin/device/install/detail/1,发生未知异常. org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.fire.mapper.DeviceInstallMapper.selectById at o…...

【可实战】Linux 系统扫盲、 Shell扫盲(如何写一个简单的shell脚本)

一、Linux系统扫盲 1.Linux 能运行主要的 UNIX 工具软件、应用程序和网络协议 2.Linux 的发行版说简单点就是将 Linux 内核与应用软件做一个打包。 目前市面上较知名的发行版有&#xff1a;Ubuntu、RedHat、CentOS、Debian、Fedora、SuSE、OpenSUSE、Arch Linux、SolusOS 等…...

sqlzoo答案4:SELECT within SELECT Tutorial

sql练习&#xff1a;SELECT within SELECT Tutorial - SQLZoo world表&#xff1a; namecontinentareapopulationgdpAfghanistanAsia6522302550010020343000000AlbaniaEurope28748283174112960000000AlgeriaAfrica238174137100000188681000000AndorraEurope46878115371200000…...

【fly-iot飞凡物联】(20):2025年总体规划,把物联网整套技术方案和实现并落地,完成项目开发和课程录制。

前言 fly-iot飞凡物联专栏&#xff1a; https://blog.csdn.net/freewebsys/category_12219758.html 1&#xff0c;开源项目地址进行项目开发 https://gitee.com/fly-iot/fly-iot-platform 完成项目开发&#xff0c;接口开发。 把相关内容总结成文档&#xff0c;并录制课程。…...

Lucene常用的字段类型lucene检索打分原理

在 Apache Lucene 中&#xff0c;Field 类是文档中存储数据的基础。不同类型的 Field 用于存储不同类型的数据&#xff08;如文本、数字、二进制数据等&#xff09;。以下是一些常用的 Field 类型及其底层存储结构&#xff1a; TextField&#xff1a; 用途&#xff1a;用于存储…...

适用于IntelliJ IDEA 2024.1.2部署Tomcat的完整方法,以及笔者踩的坑,避免高血压,保姆级教程

Tips:创建部署Tomcat直接跳转到四 一、软件准备 笔者用的是IntelliJ IDEA 2024.1.2和Tomcat 8.5。之前我使用的是Tomcat 10&#xff0c;但遇到了许多问题。其中一个主要问题是需要使用高于1.8版本的JDK&#xff0c;为此我下载了新的JDK版本&#xff0c;但这又引发了更多的兼容…...

XSS靶场通关详解

前言 这里作者采用phpstudy部署的xss-lab靶场&#xff0c;配置如下&#xff1a; 第一关 进入靶场后寻找页面的传参处&#xff0c;发现url中的name参数传了test给页面&#xff0c;可以在此处进行尝试xss 成功弹窗&#xff01; payload&#xff1a; <script>alert(1)<…...

Excel 技巧15 - 在Excel中抠图头像,换背景色(★★)

本文讲了如何在Excel中抠图头像&#xff0c;换背景色。 1&#xff0c;如何在Excel中抠图头像&#xff0c;换背景色 大家都知道在PS中可以很容易抠图头像&#xff0c;换背景色&#xff0c;其实Excel中也可以抠简单的图&#xff0c;换背景色。 ※所用头像图片为百度搜索&#x…...

备忘-humanplus相关的代码解析

-1: numpy必须为1.20.0&#xff0c;否则会报错&#xff0c;版本冲突0.rlvalue-based: 如q-learning&#xff08;走迷宫&#xff09;&#xff0c;对当前状态下作出的动作进行价值计算&#xff0c;通过贪婪策略穷尽所有可能选择最佳state-action,但是对于连续的动作空间&#x…...

Phi-3-mini-128k-instruct与智能车仿真:生成自然语言控制逻辑与调试报告

Phi-3-mini-128k-instruct与智能车仿真&#xff1a;生成自然语言控制逻辑与调试报告 最近在折腾一个智能车仿真项目&#xff0c;发现一个挺有意思的事儿&#xff1a;让AI来帮忙写控制逻辑和看报告&#xff0c;效率提升了不少。以前我们得手动把“绕过前面那个障碍物&#xff0…...

超实用AI专著生成攻略,掌握工具技巧,轻松搞定大型学术著作

学术专著创作困境与AI写作工具解决方案 撰写学术专著时的困难&#xff0c;不仅仅体现在“能够写出来”&#xff0c;更关键的是“能够成功出版并获得认可”。在当今的出版行业&#xff0c;学术专著的受众群体相对较小&#xff0c;出版社在选择题材时&#xff0c;对其学术价值以…...

AI净界-RMBG-1.4入门指南:理解Alpha通道、PNG透明度与导出规范

AI净界-RMBG-1.4入门指南&#xff1a;理解Alpha通道、PNG透明度与导出规范 你是不是也遇到过这样的烦恼&#xff1f;拍了一张不错的照片&#xff0c;想换个背景发朋友圈&#xff0c;或者做电商需要把商品图抠出来&#xff0c;结果发现边缘抠得跟狗啃的一样&#xff0c;头发丝和…...

终极指南:如何在Windows上实现完美的三指拖拽体验

终极指南&#xff1a;如何在Windows上实现完美的三指拖拽体验 【免费下载链接】ThreeFingersDragOnWindows Enables macOS-style three-finger dragging functionality on Windows Precision touchpads. 项目地址: https://gitcode.com/gh_mirrors/th/ThreeFingersDragOnWind…...

Node.js全栈项目集成Wan2.1-UMT5:实时视频生成进度推送

Node.js全栈项目集成Wan2.1-UMT5&#xff1a;实时视频生成进度推送 最近在做一个挺有意思的项目&#xff0c;需要把Wan2.1-UMT5这个视频生成模型集成到我们自己的系统里。用户上传一段文字描述&#xff0c;系统就能生成一段短视频。听起来挺酷&#xff0c;对吧&#xff1f;但问…...

Phi-3 Forest Laboratory 与SpringBoot微服务整合:打造企业级AI中台

Phi-3 Forest Laboratory 与SpringBoot微服务整合&#xff1a;打造企业级AI中台 最近和几个做企业级应用开发的朋友聊天&#xff0c;大家不约而同地提到了同一个痛点&#xff1a;公司内部有好几个业务团队都想用上最新的AI能力&#xff0c;比如用Phi-3这样的模型做智能客服、文…...

WRF风场后处理实战:用Python+Cartopy绘制500hPa风场矢量图(附完整代码)

WRF风场后处理实战&#xff1a;用PythonCartopy绘制500hPa风场矢量图&#xff08;附完整代码&#xff09; 气象数据分析中&#xff0c;风场可视化是理解大气环流特征的关键环节。WRF&#xff08;Weather Research and Forecasting&#xff09;模式输出的数据包含丰富的三维风场…...

AI智能二维码工坊后端对接:REST API接入业务系统指南

AI智能二维码工坊后端对接&#xff1a;REST API接入业务系统指南 1. 为什么需要后端对接&#xff1f;——从界面操作到系统集成的跨越 你可能已经试过在AI智能二维码工坊的WebUI里点点鼠标&#xff1a;输入一段文字&#xff0c;几毫秒就生成一张高清二维码&#xff1b;上传一…...

OpenClaw隐私增强:nanobot本地模型处理敏感财务数据

OpenClaw隐私增强&#xff1a;nanobot本地模型处理敏感财务数据 1. 为什么选择本地模型处理财务数据 去年我在帮朋友的小公司整理年度财报时&#xff0c;遇到了一个棘手的问题&#xff1a;他们使用的在线财务分析工具要求上传完整的Excel报表到云端服务器。虽然服务商承诺数据…...

春节不用愁对联:春联生成模型实战,3步生成专属春联

春节不用愁对联&#xff1a;春联生成模型实战&#xff0c;3步生成专属春联 1. 传统年味遇上AI科技 每到春节&#xff0c;家家户户贴春联是延续千年的传统习俗。一副好春联既要对仗工整&#xff0c;又要寓意吉祥&#xff0c;还要符合自家特色&#xff0c;这让不少人为之头疼。…...