无人机 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 tags
                tags = '@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 updates
	if (_parameter_update_sub.updated() || force) {
		// clear update
		parameter_update_s pupdate;
		_parameter_update_sub.copy(&pupdate);

		// update parameters from storage
		ModuleParams::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型的参数与测试。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【真机调试】前端开发:移动端特殊手机型号有问题,如何在电脑上进行调试?

目录 前言一、怎么设置成开发者模式&#xff1f;二、真机调试基本步骤&#xff1f; &#x1f680;写在最后 前言 edge浏览器 edge://inspect/#devices 谷歌浏览器&#xff08;开tizi&#xff09; chrome://inspect 一、怎么设置成开发者模式&#xff1f; Android 设备 打开设…

2024年第十五届蓝桥杯青少组国赛(c++)真题—快速分解质因数

快速分解质因数 完整题目和在线测评可点击下方链接前往&#xff1a; 快速分解质因数_C_少儿编程题库学习中心-嗨信奥https://www.hixinao.com/tiku/cpp/show-3781.htmlhttps://www.hixinao.com/tiku/cpp/show-3781.html 若如其他赛事真题可自行前往题库中心查找&#xff0c;题…

Linux系统下速通stm32的clion开发环境配置

陆陆续续搞这个已经很久了。 因为自己新电脑是linux系统无法使用keil&#xff0c;一开始想使用vscode里的eide但感觉不太好用&#xff1b;后面想直接使用cudeide但又不想妥协&#xff0c;想趁着这个机会把linux上的其他单片机开发配置也搞明白&#xff1b;而且非常想搞懂cmake…

【FFmpeg】FLV 格式分析 ③ ( Tag Body 数据块体结构 - Vedio Data 视频数据 )

文章目录 一、Tag Body 数据块体结构 - Video Data 视频数据1、Vedio Data 视频数据 类型标识2、Vedio Data 视频数据 结构分析3、Composition Time Offset 字段涉及的时间计算4、AVC Packet Type 字段说明① AVC Sequence Header 类型② AVC NALU 类型③ AVC End of Sequence …

尚硅谷大数据数仓项目superset db upgrade报错解决(2025.1.23解决)

尚硅谷大数据数仓项目superset db upgrade报错解决&#xff08;2025.1.23解决&#xff09;和 superset安装MySQL报错解决 解决方法&#xff08;2025.1.23解决&#xff09; 0.卸载之前安装好的Superset -- 退出当前环境 conda deactivate-- 卸载Superset conda remove -n sup…

vue3+uniapp开发鸿蒙初体验

去年7月20号&#xff0c;uniapp官网就已经开始支持鸿蒙应用开发了&#xff0c;话不多说&#xff0c;按照现有规则进行配置实现一下鸿蒙开发效果&#xff1b; 本文基于macOS Monterey 版本 12.6.5实现 开发鸿蒙的前置准备 这里就直接说我的版本&#xff1a; DevEco Studio 5.…

996引擎 - 前期准备-配置开发环境

996引擎 - 前期准备 官网搭建服务端、客户端单机搭建 开发环境配置后端开发环境配置环境 前端开发环境配置环境 后端简介前端简介GUILayoutGUIExport 官网 996传奇引擎官网 所有资料从官网首页开始&#xff0c;多探索。 文档&#xff1a; 996M2-服务端Lua 996M2-客户端Lua 搭…

Python FastAPI 实战应用指南

文章目录 1. 前言2. FastAPI 的优势3. FastAPI 快速入门3.1 安装3.2 最简单的 API 案例 4. 基础功能应用4.1 模型验证和参数校验4.2 实现高级计划&#xff1a;用于实时功能和快速发布 5. 高级应用5.1 实现 OAuth2 认证5.2 提供 WebSocket 支持 6. 总结 1. 前言 FastAPI 是一个…

Vue3 项目打包并部署到Nginx

一、安装Nginx 官网下载链接&#xff1a; nginx: downloadhttps://nginx.org/en/download.htmlhttps://nginx.org/en/download.html 下载后解压并双击 nginx.exe 启动服务&#xff1a; 打开浏览器&#xff0c;访问 http://localhost/ &#xff0c;若出现如下页面&#xff0c…

二叉树(了解)c++

二叉树是一种特殊的树型结构&#xff0c;它的特点是: 每个结点至多只有2棵子树(即二叉树中不存在度大于2的结点) 并且二叉树的子树有左右之分&#xff0c;其次序不能任意颠倒&#xff0c;因此是一颗有序树 以A结点为例&#xff0c;左边的B是它的左孩子&#xff0c;右边的C是…

会议签到系统的架构和实现

会议签到系统的架构和实现 摘要:通过定制安卓会议机开机APP呈现签到界面&#xff0c;并且通过W/B结构采集管理签到信息&#xff0c;实现会议签到的功能。为达到此目标本文将探讨使用Redis提供后台数据支持&#xff1b;使用SocketIo处理适时消息&#xff1b;使用Flask进行原型开…

PIC单片机HEX文件格式分析

在调试PIC单片机在bootloader程序时&#xff0c;需要将hex文件转换为bin文件&#xff0c;在转换之前先了解一下hex文件中数据是如何定义的。 直接打开一个LED灯闪烁的程序生成的hex文件&#xff0c;芯片型号为PIC18F46K80 可以看到每条数据都是由6部分组成的&#xff0c;下面分…

17-使用椭圆制作鼻子

17-使用椭圆制作鼻子_哔哩哔哩_bilibili17-使用椭圆制作鼻子是一次性学会 Canvas 动画绘图&#xff08;核心精讲50个案例&#xff09;2023最新教程的第18集视频&#xff0c;该合集共计53集&#xff0c;视频收藏或关注UP主&#xff0c;及时了解更多相关视频内容。https://www.bi…

通过 Visual Studio Code 启动 IPython

在Visual Studio Code 中&#xff0c;你可以使用内置的终端来启动 ipython&#xff0c;当然首先要安装好ipython。 安装ipython的方法是在cmd里面输入以下命令安装&#xff1a; pip install ipython 启动ipython的步骤如下&#xff1a; 打开 VSCode 终端&#xff1a; 在 VSCo…

网络(三) 协议

目录 1. IP协议; 2. 以太网协议; 3. DNS协议, ICMP协议, NAT技术. 1. IP协议: 1.1 介绍: 网际互连协议, 网络层是进行数据真正传输的一层, 进行数据从一个主机传输到另一个主机. 网络层可以将数据主机进行传送, 那么传输层保证数据可靠性, 一起就是TCP/IP协议. 路径选择: 确…

Qt基础项目篇——Qt版Word字处理软件

一、核心功能 本软件为多文档型程序&#xff0c;界面是标准的 Windows 主从窗口 拥有&#xff1a;主菜单、工具栏、文档显示区 和 状态栏。 所要实现的东西&#xff0c;均在下图了。 开发该软件&#xff0c;主要分为下面三个阶段 1&#xff09;界面设计开发 多窗口 MDI 程序…

Python+langchain+通义千问qwen(大模型实现自己的聊天机器人)

Langchain langchain是一个用于开发由语言模型驱动的应用程序的框架&#xff0c;致力于简化AI模型应用的开发。简单来说&#xff0c;langchain就是一个&#xff08;帮助开发者轻松完成AI模型应用开发的&#xff09;框架,现在支持python和js两个版本&#xff0c;它集成多种大语…

FPGA中场战事

2023年10月3日,英特尔宣布由桑德拉里维拉(Sandra Rivera)担任“分拆”后独立运营的可编程事业部首席执行官。 从数据中心和人工智能(DCAI)部门总经理,转身为执掌该业务的CEO,对她取得像AMD掌门人苏姿丰博士类似的成功,无疑抱以厚望。 十年前,英特尔花费167亿美元真金白银…

【超详细】ELK实现日志采集(日志文件、springboot服务项目)进行实时日志采集上报

本文章介绍&#xff0c;Logstash进行自动采集服务器日志文件&#xff0c;并手把手教你如何在springboot项目中配置logstash进行日志自动上报与日志自定义格式输出给logstash。kibana如何进行配置索引模式&#xff0c;可以在kibana中看到采集到的日志 日志流程 logfile-> l…

探索Linux中的进程控制:从启动到退出的背后原理

个人主页&#xff1a;chian-ocean 文章专栏-Linux 前言&#xff1a; 进程控制是操作系统对进程的创建、运行、调度、中止等活动进行管理和协调的行为。它是操作系统中至关重要的一部分&#xff0c;保证多任务处理环境下的资源分配和系统稳定性。 进程创建 fork( ) fork() 调…