无人机 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 前言 之前文章添加了一个自定义的模块,本篇文章在之前的自定义模块中,添加两个自定义参数 使用QGC显示出来,并通过QGC调整参数值,代码实现参数更新 新增的参…...
【全栈】SprintBoot+vue3迷你商城-扩展:vue3项目创建及目录介绍
【全栈】SprintBootvue3迷你商城-扩展:vue3项目创建及目录介绍 往期的文章都在这里啦,大家有兴趣可以看一下 【全栈】SprintBootvue3迷你商城(1) 【全栈】SprintBootvue3迷你商城(2) 【全栈】SprintBootvu…...
Linux系统 C/C++编程基础——基于Qt的图形用户界面编程
ℹ️大家好,我是练小杰,今天周四了,距离除夕只有4天了,各位今年卫生都搞完了吗!😆 本文是接着昨天Linux 系统C/C编程的知识继续讲,基于Qt的图形用户界面编程概念及其命令,后续会不断…...
23.日常算法
1. 最小绝对差 题目来源 给你个整数数组 arr,其中每个元素都 不相同。请你找到所有具有最小绝对差的元素对,并且按升序的顺序返回。 每对元素对 [a,b] 如下: a , b 均为数组 arr 中的元素 a < b b - a 等于 arr 中任意两个元素的最小绝对…...
迅为RK3568开发板篇OpenHarmony实操HDF驱动控制LED-添加内核编译
编译内核时将该 HDF 驱动编译到镜像中,接下来编写驱动编译脚本 Makefile,代码如下所示: 加入编译体系,填加模块目录到 drivers/hdf_core/adapter/khdf/linux/Makefile 文件 更多内容可以关注:迅为RK3568开发板篇OpenHa…...
为AI聊天工具添加一个知识系统 之54 为事务处理 设计 基于DDD的一个 AI操作系统 来处理维度
本文要点 要点 Architecture程序 它被设计为一个双面神结构的控制器,它的两侧一侧编译执行另一侧 解释执行,自已则是一个 翻译器--通过提供两个不同取向之间 的 结构映射的显示器(带 图形用户接口GUI和命令行接口CLI 两种 接口)…...
Golang 中除了加锁还有哪些安全读写共享变量的方式?
Golang 中除了加锁还有哪些安全读写共享变量的方式? 在 Golang 中,除了使用 Mutex 锁来保护共享变量外,还可以通过 Channel 和 原子性操作 来实现安全读写共享变量。 1. 使用 Channel 原理 Channel 是 Golang 中用于 Goroutine 之间通信的…...
【优选算法】8----四数之和
有看过我上篇算法博客并且去做过的铁子们,对这道题的话应该就不会那么陌生了,因为这两道题 的解题思路有着异曲同工之妙~ -----------------------------------------begin------------------------------------- 题目解析: 跟三数之和就多了…...
订单状态定时处理、来单提醒和客户催单(day10)
Spring Task 介绍 Spring Task 是 Spring 框架提供的任务调度工具,可以按照约定的时间自动执行某个代码逻辑。 定位: 定时任务框架 作用: 定时自动执行某段Java代码 为什么要在 Java 程序中使用 Spring Task? 应用场景࿱…...
备赛蓝桥杯之第十五届职业院校组省赛第一题:智能停车系统
提示:本篇文章仅仅是作者自己目前在备赛蓝桥杯中,自己学习与刷题的学习笔记,写的不好,欢迎大家批评与建议 由于个别题目代码量与题目量偏大,请大家自己去蓝桥杯官网【连接高校和企业 - 蓝桥云课】去寻找原题࿰…...
【2024年华为OD机试】(C卷,100分)- 查找接口成功率最优时间段 (JavaScriptJava PythonC/C++)
一、问题描述 题目解析 题目描述 服务之间交换的接口成功率作为服务调用关键质量特性,某个时间段内的接口失败率使用一个数组表示。数组中每个元素都是单位时间内失败率数值,数组中的数值为 0~100 的整数。给定一个数值 minAverageLost,表…...
Linux进度条实现
Linux进度条实现 1.\r\n2.缓冲区3.缓冲区分类4.进度条实现 🌟🌟hello,各位读者大大们你们好呀🌟🌟 🚀🚀系列专栏:【Linux的学习】 📝📝本篇内容:\…...
Java如何实现反转义
Java如何实现反转义 前提 最近做的一个需求,是热搜词增加换一批的功能。功能做完自测后,交给了测试伙伴,但是测试第二天后就提了一个bug,出现了未知词 levis。第一眼看着像公司售卖的一个品牌-李维斯。然后再扒前人写的代码&…...
计算机网络 (57)改进“尽最大努力交付”的服务
前言 计算机网络中的“尽最大努力交付”服务是网络层的一种数据传输方式。这种服务的特点是网络层只负责尽力将数据报从源端传输到目的端,而不保证数据传输的可靠性。 一、标记与分类 为数据分组打上标记: 给不同性质的分组打上不同的标记&#x…...
Java 基于 SpringBoot 的校园外卖点餐平台微信小程序(附源码,部署,文档)
博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…...
重构(4)
(一)添加解释性变量,使得代码更容易理解,更容易调试,也可以方便功能复用 解释性的变量 总价格为商品总价(单价*数量)-折扣(超过100个以上的打9折)邮费(原价的…...
【Arduino】语言参考功能
前言 翻译Arduino 参考处列出的常用函数。文中为了减少篇幅,达到能快速翻到查询的目标,在介绍函数中,对部分内容进行了省略,不会列出函数输入参数类型,以及使用注意事项等等,所以若是首次使用或者是调试时出…...
CMake使用CPack制作安装程序
CPack的功能很强大,笔者前面有一博文使用CMake的CPack工具打包项目介绍了一下使用CPack来打包成7z压缩文件,不仅如此,它还可以生成各平台的安装包。 CPack支持以下类型的生成器: 名称文件类型平台及说明STGZSTGZ(.sh)自解压文件…...
Flink运行时架构
一、系统架构 1)作业管理器(JobManager) JobManager是一个Flink集群中任务管理和调度的核心,是控制应用执行的主进程。也就是说,每个应用都应该被唯一的JobManager所控制执行。 JobManger又包含3个不同的组件。 &am…...
平衡二叉树(力扣110)
所谓平衡二叉树,就是每一个节点的左右子树的高度差不大于1。而一个子树的高度,就是父节点的最大高度。这道题的思路其实和二叉树的最大深度(力扣104)-CSDN博客有很大的相似之处,都需要将左右子树的高度返回给父节点,因此也是采用后…...
【玩转全栈】---基于YOLO8的图片、视频目标检测
本篇主要讲YOLO8的具体操作,想要了解YOLO的具体原理,可以去官网查询 目录 下载ultralytics库 开始检测 介绍 YOLOv8(You Only Look Once Version 8)是 YOLO 系列的最新版本,由 Ultralytics 开发并发布,是一…...
ES6+新特性,var、let 和 const 的区别
在 JavaScript 中,var、let 和 const 都用于声明变量,但它们有一些重要的区别,主要体现在 作用域、可变性和提升机制 等方面。 1. 作用域(Scope) var: var 声明的变量是 函数作用域,也就是说,它…...
汇编实验·分支程序设计
一、实验目的: 1.能够熟练的进行分支程序的编写,掌握条件语句对应的汇编语言指令的实现 2.掌握多个条件的分支语句的实现原理,理解C语言中的逻辑运算“短路”特征 二、实验内容 1.对2和3任务中的C代码在VS2022中运行,设置生成对应的汇编代码,观察生成代码的不同,着重…...
激光线扫相机无2D图像的标定方案
方案一:基于运动控制平台的标定 适用场景:若激光线扫相机安装在可控运动平台(如机械臂、平移台、旋转台)上,且平台的运动精度已知(例如通过编码器或高精度步进电机控制)。 步骤: 标…...
【Python・机器学习】多元回归模型(原理及代码)
前言 自学笔记,分享给语言学/语言教育学方向的,但对语言数据处理感兴趣但是尚未入门,却需要在论文中用到的小伙伴,欢迎大佬们补充或绕道。ps:本文最少限度涉及公式讲解(文科生小白友好体质)&am…...
ubuntu20.04安装使用direct_visual_lidar_calibration标定雷达和相机
官方链接GitHub - koide3/direct_visual_lidar_calibration: A toolbox for target-less LiDAR-camera calibration [ROS1/ROS2] 官方安装方式 Installation - direct_visual_lidar_calibration 安装依赖 sudo apt install libomp-dev libboost-all-dev libglm-dev libglfw…...
Android 自定义View时四个构造函数使用详解
该文章我们以自定义View继承TextView为例来讲解 创建自定义View命名MyTextView,并使其继承TextView 1、自定义View时第一个构造函数 // 第一个构造函数主要是在Java代码中声明一个MyTextView时所用 // 类似这种(MyTextView myTextViewnew MyTextView(this);) // 不…...
linux中关闭服务的开机自启动
引言 systemctl 是 Linux 系统中用于管理 systemd 服务的命令行工具。它可以用来启动、停止、重启服务,管理服务的开机自启动,以及查看服务的状态等。 什么是 systemd? systemd 是现代 Linux 发行版中默认的 初始化系统(init sys…...
【go语言】go的卸载与安装
一、卸载go sudo rm -rf /usr/local/go sudo apt-get remove golang sudo apt-get remove golang-go sudo apt-get autoremove wget https://dl.google.com/go/go1.19.linux-amd64.tar.gz sudo tar -xzf go1.19.linux-amd64.tar.gz -C /usr/local go env -w GOPROXY"http…...
微软Win10 RP 19045.5435(KB5050081)预览版发布!
系统之家1月20日最新报道,微软面向Release Preview频道的Windows Insider项目成员,发布了适用于Windows10 22H2版本的KB5050081更新,更新后系统版本号将升至19045.5435。本次更新增加了对GB18030-2022标准的支持,同时新版日历将为…...
VUE elTree 无子级 隐藏展开图标
这4个并没有下级节点,即它并不是叶子节点,就不需求展示前面的三角展开图标! 查阅官方文档如下描述,支持bool和函数回调处理,这里咱们选择更灵活的函数回调实现。 给el-tree结构配置一下props,注意! :pr…...
python实现代理服务器转换
使用 http.server 模块和 requests 库来实现,代理服务器可拦截匹配指定路径的 HTTP 请求,并打印或存储请求头和响应体。 实现目标: 1、创建一个HTTP代理服务器。 2、代理所有流量,而对指定的接口(如 /api/target&#…...
计算机网络三张表(ARP表、MAC表、路由表)总结
参考: 网络三张表:ARP表, MAC表, 路由表,实现你的网络自由!!_mac表、arp表、路由表-CSDN博客 网络中的三张表:ARP表、MAC表、路由表 首先要明确一件事,如果一个主机要发送数据,那么必…...
Dangerzone:免费的危险的文件转换安全程序
我们知道很多杀毒软件会将很多文件视作恶意程序,尤其是带宏病毒的DOC文件,直接删除难免会带来不必要的麻烦,那么推荐一款免费的危险的文件转换安全程序:Dangerzone 。它可以检查各种可能有危险的文件并将其转换为安全版本…...
2025/1/21 学习Vue的第四天
睡觉。 --------------------------------------------------------------------------------------------------------------------------------- 11.Object.defineProperty 1.在我们之前学习JS的时候,普通得定义一个对象与属性。 <!DOCTYPE html> <h…...
【IEEE Fellow 主讲报告| EI检索稳定】第五届机器学习与智能系统工程国际学术会议(MLISE 2025)
重要信息 会议时间地点:2025年6月13-15日 中国深圳 会议官网:http://mlise.org EI Compendex/Scopus稳定检索 会议简介 第五届机器学习与智能系统工程国际学术会议将于6月13-15日在中国深圳隆重召开。本次会议旨在搭建一个顶尖的学术交流平台…...
如何使用虚拟现实技术有效提升模拟训练效率
虚拟现实(VR)技术在模拟训练中的应用正逐步展现其巨大的潜力,通过提供高度沉浸式的体验、灵活的训练场景和精准的数据分析,显著提升训练效率。本文将结合Varjo XR-4头显、Techviz多通道显示软件、Senseglove虚拟现实手套等具体案例…...
OpenEuler学习笔记(十一):OpenEuler上搭建LAMP环境
LAMP环境指的是Linux、Apache、MySQL(或MariaDB)和PHP的组合,下面为你介绍在OpenEuler上搭建LAMP环境的详细步骤: 1. 系统更新 首先要更新系统中的软件包,保证系统处于最新状态。 sudo dnf update -y2. 安装Apache…...
Anaconda安装(2024最新版)
安装新的anaconda需要卸载干净上一个版本的anaconda,不然可能会在新版本安装过程或者后续使用过程中出错,完全卸载干净anaconda的方法,可以参考我的博客! 第一步:下载anaconda安装包 官网:Anaconda | The O…...
【玩转全栈】----YOLO8训练自己的模型并应用
继上篇: 【玩转全栈】---基于YOLO8的图片、视频目标检测-CSDN博客 相信大家已经可以训练一些图片和视频了,接下来我将为大家介绍如何训练自己的特定模型,并用其进行检测 目录 准备数据 图片数据 标识数据 配置文件 运行 测试训练结果 存在的问…...
计算机视觉算法实战——无人机检测
✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ 1. 引言✨✨ 随着无人机技术的快速发展,无人机在农业、物流、监控等领域的应用越来越广泛。然而,无人机的滥用也带…...
css粘性定位超出指定宽度失效问题
展示效果 解决办法:外层容器添加display:grid即可 完整代码 <template><div class"box"><div class"line" v-for"items in 10"><div class"item" v-for"item in 8">drgg</div>&…...
⽤vector数组实现树的存储(孩⼦表示法)c++
在我们遇到的算法题中, ⼀般给出的树结构都是有编号的,这样会简化我们之后存储树的操作 ,⼀般提供两个信息; 结点的个数 n;n-1条x结点与y结点相连的边 题⽬描述: ⼀共9个结点셈 1号结点为根节点,接下来8⾏ÿ…...
高级java每日一道面试题-2025年01月23日-数据库篇-主键与索引有什么区别 ?
如果有遗漏,评论区告诉我进行补充 面试官: 主键与索引有什么区别 ? 我回答: 一、主键(Primary Key) 1. 定义 主键是关系型数据库中的一条记录中的某个属性组(可以是一个字段或多个字段的组合),用于唯一标识一条记…...
spring aop 中 返回值
使用环绕切面 Around(value "requsetInterceptor()")public Object logExectionTime(ProceedingJoinPoint joinPoint) throws Throwable {logger.info("-------logExectionTime--------");if(isRun){Object proceed joinPoint.proceed(); // 执行目标方…...
总结7。。
二叉树的遍历是指按某条搜索路径访问树中的每个结点,使得每个结点均被访问一次,而且仅能访问一次(说明不可二次访问,一遍而过)。遍历一颗二叉树便要决定对根结点N、左子树L和右子树的访问顺序。 二叉树常的的遍历方法有…...
9.中断系统、EXTI外部中断
中断系统原理 中断 中断系统是管理和执行中断的逻辑结构,外部中断是众多能产生中断的外设之一,所以本节我们就借助外部中断来学习一下中断系统。在以后学习其它外设的时候,也是会经常和中断打交道的。 中断:在主程序运行过程中…...
【软件测试项目实战 】淘宝网:商品购买功能测试
一、用例设计方法分析 在对淘宝网商品下单功能进行测试时,不同的测试角度和场景适合运用不同的用例设计方法,以下是针对该功能各方面测试所适用方法及其原因的分析: 商品数量相关测试:对于商品数量的测试,主要采用等…...
TangoFlux 本地部署实用教程:开启无限音频创意脑洞
一、介绍 TangoFlux是通过流匹配和 Clap-Ranked 首选项优化,实现超快速、忠实的文本到音频生成的模型。 本模型由 Stability AI 提供支持🚀 TangoFlux 可以在单个 A40 GPU 上在 ~3 秒内生成长达 34.1kHz 的立体声音频。 二、部署 安装方式非常简单 1…...
Android多语言开发自动化生成工具
在做 Android 开发的过程中,经常会遇到多语言开发的场景,尤其在车载项目中,多语言开发更为常见。对应多语言开发,通常都是在中文版本的基础上开发其他国家语言,这里我们会拿到中-外语言对照表,这里的工作难…...