QGC 地面站中获取电压完整教程(QGC中无法获取APM电压)
文章目录
- 一、演示
- 二、简介
- 三、代码修改
- 1. 后台数据获取
- 2. json 文件
- 3. 前台显示
- 4. APM 中电压校准
- 5. 工程文件部分
- 四、其它方法介绍(PX4)
关于QGC地面站其它文章请点击这里: QGC地面站
一、演示
老规先演示,看效果:
PX4 中:
数据列表中的 voltage 为电池组中获取的,PX4 中可以获取到
APM 中:
数据列表中的 voltage 为电池组中获取的,APM 中获取不到
二、简介
起因是在 APM 中无法在BATTERY_STATUS 帧中获取电压信息
而在 SYS_STATUS 系统状态中存在电压信息,于是乎想调用 SYS_STATUS 中的 voltage_battery
同样 PX4 中也可这样操作, 你如果不想改地面站,那就改飞控的 BATTERY_STATUS 数据源吧~
三、代码修改
1. 后台数据获取
● Vehicle.cc
//92:定义字段,将通过 "myVoltage" 找到 voltage 的数据
const char* Vehicle::_myVoltageFactName = "myVoltage";//149:初始化 _myVoltageFact
, _myVoltageFact (0, _myVoltageFactName, FactMetaData::valueTypeDouble)//297
, _myVoltageFact (0, _myVoltageFactName, FactMetaData::valueTypeDouble)//404
_addFact(&_myVoltageFact, _myVoltageFactName);//1339 在 _handleSysStatus(mavlink_message_t& message) 函数中获取电压
double voltage = static_cast<double>(sysStatus.voltage_battery)/1000;
_myVoltageFact.setRawValue(voltage);
● 2. Vehicle.h
//293
Q_PROPERTY(Fact* myVoltage READ myVoltage CONSTANT)//609
Fact* myVoltage () { return &_myVoltageFact; }//1217
Fact _myVoltageFact;//1262
static const char* _myVoltageFactName;
2. json 文件
{"name": "myVoltage","shortDesc": "Current voltage","type": "double","decimalPlaces": 2,"units": "v"
}
3. 前台显示
● 在 FlyViewWidgetLayer.qml 最后调用:
VoltageTest {anchors.top: parent.topanchors.topMargin: 50anchors.horizontalCenter: parent.horizontalCenter
}
● VoltageTest
可以参考此文 Qt QML 基于画布的扇形的进度条(Canvas)
import QtQuick 2.12
import QGroundControl.Vehicle 1.0
import QGroundControl 1.0
import QGroundControl.ScreenTools 1.0
import QGroundControl.Controls 1.0
import QGroundControl.FactSystem 1.0
import QGroundControl.FactControls 1.0Rectangle {id: valuesRootwidth: rowRoot.width + 10height: rowRoot.height + 10color: "black"///----内部使用:property var _activeVehicle: QGroundControl.multiVehicleManager.activeVehicle ? QGroundControl.multiVehicleManager.activeVehicle : QGroundControl.multiVehicleManager.offlineEditingVehicle///---另外个版本获取电压property var voltageVal: _activeVehicle ? _activeVehicle.voltage0 : 0property var voltageMax: 4.2 * 6 //6sproperty var voltageMin: 3.7 * 6 //6s///--只读常量readonly property color _themeColor: "#00EC00"readonly property real _mar: 5readonly property real defaultWidgetsWidth: (ScreenTools.isMobile ? 50*2 : 50)readonly property real defaultWidgetsHeight: (ScreenTools.isMobile ? 35*2 : 35)readonly property real _pointSize: 12///--获取模型的颜色function getModelColor(fact) {//voltage 22.2~25.2if(fact > voltageMin + (voltageMax-voltageMin) * 0.3) return _themeColorif(fact > voltageMin + (voltageMax-voltageMin) * 0.1) return "yellow"if(fact >= voltageMin + (voltageMax-voltageMin) * 0.0) return "red"return _themeColor}//电压显示Row {id: rowRootanchors.centerIn: parentspacing: 5property Fact fact: _activeVehicle.getFact("myVoltage");Column {spacing: 0anchors.verticalCenter: parent.verticalCenterQGCLabel {id: sgLabelcolor: getModelColor(rowRoot.fact.enumOrValueString)horizontalAlignment: Text.AlignHCentertext: qsTr("电压")font.pointSize: _pointSizefont.bold: true}QGCLabel {horizontalAlignment: Text.AlignHCentercolor: sgLabel.colortext: rowRoot.fact.valueEqualsDefault ? " " : rowRoot.fact.value.toFixed(1) + rowRoot.fact.unitsfont.pointSize: _pointSizefont.bold: true}}Loader {id: loaderDashanchors.verticalCenter: parent.verticalCentersourceComponent: canvasDash}Component.onCompleted: {loaderDash.item._text = "v"}///--更新值和颜色Timer{id: timerinterval: 1000running: truerepeat: trueonTriggered: {var val = isNaN(rowRoot.fact.enumOrValueString) ? 0.0 : rowRoot.fact.enumOrValueString //初步判断是否有效val = (val<0) ? 0 : val //初步判断是否为0val= (val - voltageMin) / (voltageMax - voltageMin) * 100loaderDash.item._value = (val<0) ? 0 : valloaderDash.item._color = sgLabel.color}}}///------------------ 动态小仪表 ------------------///电压和油门Component {id: canvasDashItem {width: defaultWidgetsWidthheight: defaultWidgetsHeightanchors.centerIn: parentproperty real _value : 0property real _angle: (_value * (180-10) / 100 + (180+10))property string _text : ""property color _color: '#01E9A9'property color _backgroundColor: "white"on_ValueChanged: canvas.requestPaint();Canvas{ ///画布id: canvaswidth: parent.width //40height: width/2 //20anchors.centerIn: parentcontextType: "2d";function paintGimbalYaw(ctx,x,y,r,angle1,angle2,color) {ctx.fillStyle = colorctx.save();ctx.beginPath();ctx.moveTo(x,y);ctx.arc(x,y,r,angle1*Math.PI/180,angle2*Math.PI/180);ctx.closePath();ctx.fill()ctx.restore();}onPaint: {var ctx = getContext("2d"); ///画师paintGimbalYaw(ctx,canvas.width/2, canvas.height, canvas.width/2, 180, 360, _backgroundColor)//'#005840')paintGimbalYaw(ctx,canvas.width/2, canvas.height, canvas.width/2, 180, _angle, _color)paintGimbalYaw(ctx,canvas.width/2, canvas.height, canvas.width/2*0.85, 0, 360, "#142c29")paintGimbalYaw(ctx,canvas.width/2, canvas.height, canvas.width/2*0.7, 180, 360, _backgroundColor) //'#005840')paintGimbalYaw(ctx,canvas.width/2, canvas.height, canvas.width/2*0.7, 180,_angle, _color)paintGimbalYaw(ctx,canvas.width/2, canvas.height, canvas.width/2*0.6, 0, 360, "#142c29")}//文字QGCLabel {id: txt_progressvisible: _text != ""anchors.bottom: parent.bottomanchors.bottomMargin: ScreenTools.isMobile ? -7 : -2anchors.horizontalCenter: parent.horizontalCenterfont.pointSize: 11text: _text //"V"color: _colorfont.bold: true}}}}
}
如果多个数据,加入Repeater-model 这将是个很好的模型框架
4. APM 中电压校准
就是此处的电压:
// property Fact vehicleVoltage: _batteryFactGroup.voltageproperty Fact vehicleVoltage: controller.vehicle.myVoltage
PX4 中没有修改校准,可以自己动手,其实一样
5. 工程文件部分
● qgroundcontrol.qrc
<file alias="QGroundControl/FlightDisplay/VoltageTest.qml">src/FlightDisplay/VoltageTest.qml</file>
● FlightDisplay\qmldir
VoltageTest 1.0 VoltageTest.qml
四、其它方法介绍(PX4)
在 v4.1 后的版本中,是动态实例化的电池组,咱们也从电池组中快速获取电压,只贴出关键代码:
vehicle.cc//构造函数中开定时器不断调用 getVoltage0()connect(&_upVoltageTimer, &QTimer::timeout, this, &Vehicle::getVoltage0);_upVoltageTimer.start(1000);bool Vehicle::getVoltage0(void)
{if(_batteryFactGroupListModel.count() < 1) {qDebug() << ("Valtage invalid!!!");return false;}QmlObjectListModel* batteriesList = batteries();VehicleBatteryFactGroup * groop = batteriesList->value<VehicleBatteryFactGroup*>(0);_voltage0 = groop->voltage()->enumOrValueString();emit voltage0Changed(_voltage0);return true;
}//start_cch_20210714
void Vehicle::setVoltage0(QString voltage0) {if(_voltage0 != voltage0) {_voltage0 = voltage0;emit voltage0Changed(_voltage0);}
}
前台调用:
property var voltageVal: _activeVehicle ? _activeVehicle.voltage0 : 0
QGC 地面站中获取电压完整教程(QGC中无法获取APM电压)相关推荐
- java中分支_[Java教程]JavaScript中的分支结构
[Java教程]JavaScript中的分支结构 0 2016-06-30 23:03:37 说到JavaScript中的分支结构,我们就不得不提到流程控制这个词,我们所有的程序都是由数据和算法组成的 ...
- win10中配置Java完整教程
首先,在官网下载 JDK:Oracle 官网 如上图所示,在 Oracle 官网下载 JDK,有一点需要注意,那就是在我们下载合适的 JDK 之前,需要先点击 标记 1 所在的按钮,选择接受.否则的话 ...
- JS 获取当前完整的 url 地址及获取 url 地址中各个部分
代码示例: window.location.host; //(域名 + 端口)返回url 的主机部分,例如:www.xxx.com window.location.hostname; //(域名)返回 ...
- QGC地面站二次开发(二)QGC 界面自定义和修改
目录 1.QGC 地面站的显示机制 1.1.C++类注册为 qml 可访问类型 1.2.注册属性或者方法 1.1.1. 属性声明 1.1.2.方法声明 2.QGC 地面站界面初步修改 3.QGC 地面 ...
- Ubuntu18.04下px4+MAVROSM+QGC地面站安装教程及避坑指南
下面安装建立在已经安装好了ROS的基础,未安装ROS的请先按照下面教程安装ROSROS 安装教程 目录 一.安装px4_toolchain 二.编译PX4固件 三.mavros and mavlink ...
- QGC地面站中视频流配置及gstreamer安装
QGC地面站中视频流配置及gstreamer安装 1. QGC地面站各版本视频流测试 2. 安装gstreamer 3. 修改路径 4. 地面站配置 5. Android版本安装 关于QGC地面站其它 ...
- QGC地面站小白安装与简单实用
QGC二次开发 电脑:联想拯救者Lenovo R720,在电脑上安装虚拟机-->在虚拟机中安装UBuntu系统-->在Ubuntu中安装QGC以及Qt编译器. 1 安装VMware Wor ...
- apm软件仿真+QGC地面站 环境搭建
本教程使用场景:apm软件仿真运行于虚拟机 ubuntu环境.qgc地面站位于windows 系统.两个环境在同一台电脑上. 一.apm仿真环境搭建 1.安装vm虚拟机及ubuntu 18. 2.ub ...
- QGC地面站Mavlink生成和MockLink模拟收发通讯
Mavlink生成和收发通讯 1. 演示效果 2. Mavlink 生成 2.1 安装python3 2.2 Mavlink下载和运行 2.3 xml文件修改 2.4 自定义Mavlink生成 3. ...
最新文章
- ​比9种SOTA GNN更强!谷歌大脑提出全新图神经网络GKATs
- php 前端及时同步,php与前端界面的实时通信
- python编程的条件语句_自学Python编程【第五节】if条件语句
- ORA-15096: lost disk write detected的解决与修复
- C语言判断素数的几种方法
- 诺基亚n9用linux软件,Nokia N9 卸载国行N9自带的第三方软件
- 信号完整性Sigrity2018各组件功能介绍
- 无盘服务器1410M,【说好的每周一贴】网维9系整套施工指南及常见问题与解决方法!!...
- Exchange反垃圾防病毒网关——SecurityGateway基本部署
- python场景文字识别_场景文字识别Attention_飞桨-源于产业实践的开源深度学习平台...
- 安装UWP版网易云音乐
- 无论被多少人喷,《王牌战士》这次真的火了吗?
- 二、Eureka之server端集群节点发现,数据同步
- Access 一些内部函数(Access 帮助里) .
- 【现代控制理论】传递函数建立状态空间表达式
- 【阿里1+x(初级)】阿里 1+x单选题
- MQL5 中艾略特波浪自动分析的实施
- 《进击的巨人》展现了日本羸弱的二次元文化
- Sublime Text教程
- PTCMS千千小说规则
热门文章
- 浅谈数据结构-关键路径
- Vue完成数据请求后内容超出显示省略号+显示查看全文按钮
- 软考高项:信息系统项目管理师试题(2022年11月)
- 数据结构课程设计之员工通讯录
- 使用空密码的本地帐户只允许进行控制台登陆_在群晖中运行Windows是什么样体验?教你VMM虚拟机简单使用...
- SpringBoot漏洞复现
- 计算机组成原理孙启良,[计算机硬件及网络]第1章 概论 计算机的基本组成.ppt
- Android R模块编译framework
- 【名单回顾】中国计算机学会NOI Online能力测试入门组获得前25%证书名单(北京地区小学组)
- 安装TortoiseGit后别忘了这一步