文章目录

  • 一、演示
  • 二、简介
  • 三、代码修改
    • 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电压)相关推荐

  1. java中分支_[Java教程]JavaScript中的分支结构

    [Java教程]JavaScript中的分支结构 0 2016-06-30 23:03:37 说到JavaScript中的分支结构,我们就不得不提到流程控制这个词,我们所有的程序都是由数据和算法组成的 ...

  2. win10中配置Java完整教程

    首先,在官网下载 JDK:Oracle 官网 如上图所示,在 Oracle 官网下载 JDK,有一点需要注意,那就是在我们下载合适的 JDK 之前,需要先点击 标记 1 所在的按钮,选择接受.否则的话 ...

  3. JS 获取当前完整的 url 地址及获取 url 地址中各个部分

    代码示例: window.location.host; //(域名 + 端口)返回url 的主机部分,例如:www.xxx.com window.location.hostname; //(域名)返回 ...

  4. QGC地面站二次开发(二)QGC 界面自定义和修改

    目录 1.QGC 地面站的显示机制 1.1.C++类注册为 qml 可访问类型 1.2.注册属性或者方法 1.1.1. 属性声明 1.1.2.方法声明 2.QGC 地面站界面初步修改 3.QGC 地面 ...

  5. Ubuntu18.04下px4+MAVROSM+QGC地面站安装教程及避坑指南

    下面安装建立在已经安装好了ROS的基础,未安装ROS的请先按照下面教程安装ROSROS 安装教程 目录 一.安装px4_toolchain 二.编译PX4固件 三.mavros and mavlink ...

  6. QGC地面站中视频流配置及gstreamer安装

    QGC地面站中视频流配置及gstreamer安装 1. QGC地面站各版本视频流测试 2. 安装gstreamer 3. 修改路径 4. 地面站配置 5. Android版本安装 关于QGC地面站其它 ...

  7. QGC地面站小白安装与简单实用

    QGC二次开发 电脑:联想拯救者Lenovo R720,在电脑上安装虚拟机-->在虚拟机中安装UBuntu系统-->在Ubuntu中安装QGC以及Qt编译器. 1 安装VMware Wor ...

  8. apm软件仿真+QGC地面站 环境搭建

    本教程使用场景:apm软件仿真运行于虚拟机 ubuntu环境.qgc地面站位于windows 系统.两个环境在同一台电脑上. 一.apm仿真环境搭建 1.安装vm虚拟机及ubuntu 18. 2.ub ...

  9. QGC地面站Mavlink生成和MockLink模拟收发通讯

    Mavlink生成和收发通讯 1. 演示效果 2. Mavlink 生成 2.1 安装python3 2.2 Mavlink下载和运行 2.3 xml文件修改 2.4 自定义Mavlink生成 3. ...

最新文章

  1. ​比9种SOTA GNN更强!谷歌大脑提出全新图神经网络GKATs
  2. php 前端及时同步,php与前端界面的实时通信
  3. python编程的条件语句_自学Python编程【第五节】if条件语句
  4. ORA-15096: lost disk write detected的解决与修复
  5. C语言判断素数的几种方法
  6. 诺基亚n9用linux软件,Nokia N9 卸载国行N9自带的第三方软件
  7. 信号完整性Sigrity2018各组件功能介绍
  8. 无盘服务器1410M,【说好的每周一贴】网维9系整套施工指南及常见问题与解决方法!!...
  9. Exchange反垃圾防病毒网关——SecurityGateway基本部署
  10. python场景文字识别_场景文字识别Attention_飞桨-源于产业实践的开源深度学习平台...
  11. 安装UWP版网易云音乐
  12. 无论被多少人喷,《王牌战士》这次真的火了吗?
  13. 二、Eureka之server端集群节点发现,数据同步
  14. Access 一些内部函数(Access 帮助里) .
  15. 【现代控制理论】传递函数建立状态空间表达式
  16. 【阿里1+x(初级)】阿里 1+x单选题
  17. MQL5 中艾略特波浪自动分析的实施
  18. 《进击的巨人》展现了日本羸弱的二次元文化
  19. Sublime Text教程
  20. PTCMS千千小说规则

热门文章

  1. 浅谈数据结构-关键路径
  2. Vue完成数据请求后内容超出显示省略号+显示查看全文按钮
  3. 软考高项:信息系统项目管理师试题(2022年11月)
  4. 数据结构课程设计之员工通讯录
  5. 使用空密码的本地帐户只允许进行控制台登陆_在群晖中运行Windows是什么样体验?教你VMM虚拟机简单使用...
  6. SpringBoot漏洞复现
  7. 计算机组成原理孙启良,[计算机硬件及网络]第1章 概论 计算机的基本组成.ppt
  8. Android R模块编译framework
  9. 【名单回顾】中国计算机学会NOI Online能力测试入门组获得前25%证书名单(北京地区小学组)
  10. 安装TortoiseGit后别忘了这一步