ArduPilot开源飞控之GCS显示DPS310异常问题

ArduPilot开源飞控之GCS显示DPS310异常问题

  • 1. 源由
  • 2. 现象
  • 3. 分析
    • 3.1 Mission Planner
    • 3.2 Ardupilot
    • 3.3 AP_Baro分析
    • 3.4 AP_Baro定位
  • 4. 修复
  • 5. 效果
  • 6. 参考资料
  • 7. 补充
    • 7.1 Ardupilot提交PR注意事项
    • 7.2 修复主要使用到的命令

1. 源由

2020年Ardupilot官网论坛就有开始讨论DPS310芯片在GCS系统上显示为DPS280的问题。

但是直到最近在使用H743飞控板子的时候,发现问题依然存在。初步看了下,不是太复杂的问题,因此进行了一些分析。

2. 现象

Mission Planner上显示DPS280芯片。
在这里插入图片描述

  1. 硬件规格书上是DPS310芯片。
  2. 经飞控板确认,实际使用的是DPS310芯片。

3. 分析

这里整体上牵涉Mission Planner和Ardupilot飞控两部分软件代码,所以如果无法正确显示,两部分代码必须一致。

3.1 Mission Planner

通过github很快发现该设备类型存在。
在这里插入图片描述

3.2 Ardupilot

通过github也能发现该定义,且与Mission Planner一致。
在这里插入图片描述

3.3 AP_Baro分析

从Mission Planner和Ardupilot在github上的初步定义情况,从框架设计角度考虑,应该已经支持DPS310.

那么为什么现在有问题???

进一步搜索代码:

  1. 发现AP_Baro_DPS310 继承自AP_Baro_DPS280
  2. libraries\AP_HAL_ChibiOS\hwdef\H743_BMI270x2_v30\hwdef.h硬件定义AP_Baro_DPS310
---- AP_Baro_DPS310 Matches (3 in 3 files) ----
AP_Baro_DPS280.cpp (libraries\AP_Baro) line 70 : AP_Baro_Backend *AP_Baro_DPS310::probe(AP_Baro &baro,
AP_Baro_DPS280.h (libraries\AP_Baro) line 68 : class AP_Baro_DPS310 : public AP_Baro_DPS280 {
hwdef.h (libraries\AP_HAL_ChibiOS\hwdef\H743_BMI270x2_v30) line 232 : #define HAL_BARO_PROBE1  ADD_BACKEND(AP_Baro_DPS310::probe(*this,GET_I2C_DEVICE(0,0x76)))

到这里就更加奇怪了,貌似DPS280和DPS310可能差异并不大,而大部分的方法来DPS280。

libraries\AP_Baro\AP_Baro_DPS280.h给出AP_Baro_DPS310 定义。

class AP_Baro_DPS310 : public AP_Baro_DPS280 {// like DPS280 but workaround for temperature bug
public:using AP_Baro_DPS280::AP_Baro_DPS280;static AP_Baro_Backend *probe(AP_Baro &baro, AP_HAL::OwnPtr<AP_HAL::Device> dev);
};

在硬件芯片驱动probe过程,AP_Baro_DPS310会传如一个变量来区分是DPS280还是DPS310芯片。

libraries\AP_Baro\AP_Baro_DPS280.cpp给出AP_Baro_DPS310::probe 定义。

AP_Baro_Backend *AP_Baro_DPS310::probe(AP_Baro &baro,AP_HAL::OwnPtr<AP_HAL::Device> _dev)
{// same as DPS280 but with is_dps310 set for temperature fixreturn AP_Baro_DPS280::probe(baro, std::move(_dev), true);
}

该变量的主要目的是为了解决温度传感器的设置问题。
libraries\AP_Baro\AP_Baro_DPS280.cpp给出void AP_Baro_DPS280::set_config_registers 定义。

void AP_Baro_DPS280::set_config_registers(void)
{dev->write_register(DPS280_REG_CREG, 0x0C, true); // shift for 16x oversamplingdev->write_register(DPS280_REG_PCONF, 0x54, true); // 32 Hz, 16x oversampledev->write_register(DPS280_REG_TCONF, 0x54 | calibration.temp_source, true); // 32 Hz, 16x oversampledev->write_register(DPS280_REG_MCONF, 0x07); // continuous temp and pressure.if (is_dps310) {// work around broken temperature handling on some sensors// using undocumented register writes// see https://github.com/infineon/DPS310-Pressure-Sensor/blob/dps310/src/DpsClass.cpp#L442dev->write_register(0x0E, 0xA5);dev->write_register(0x0F, 0x96);dev->write_register(0x62, 0x02);dev->write_register(0x0E, 0x00);dev->write_register(0x0F, 0x00);}
}

至此,大体上理解了两个芯片的主要差异就在与寄存器初始化部分对于温度方面的workaround(芯片相关)。

3.4 AP_Baro定位

理解了前面关于DPS280和DPS310芯片的硬件差异以及驱动代码差异,接下来就是定位问题了。

DEVTYPE_BARO_DPS280DEVTYPE_BARO_DPS310相关的只发生在AP_Baro_DPS280::init过程中,问题是不管是DPS310还是DPS280,都只会dev->set_device_type(DEVTYPE_BARO_DPS280)

bool AP_Baro_DPS280::init()
{if (!dev) {return false;}dev->get_semaphore()->take_blocking();// setup to allow reads on SPIif (dev->bus_type() == AP_HAL::Device::BUS_TYPE_SPI) {dev->set_read_flag(0x80);}dev->set_speed(AP_HAL::Device::SPEED_HIGH);// the DPS310 can get into a state on boot where the whoami is not// read correctly at startup. Toggling the CS line gets its out of// this statedev->set_chip_select(true);dev->set_chip_select(false);uint8_t whoami=0;if (!dev->read_registers(DPS280_REG_PID, &whoami, 1) ||whoami != DPS280_WHOAMI) {dev->get_semaphore()->give();return false;}if (!read_calibration()) {dev->get_semaphore()->give();return false;}dev->setup_checked_registers(4, 20);set_config_registers();instance = _frontend.register_sensor();dev->set_device_type(DEVTYPE_BARO_DPS280);set_bus_id(instance, dev->get_bus_id());dev->get_semaphore()->give();// request 64Hz update. New data will be available at 32Hzdev->register_periodic_callback((1000 / 64) * AP_USEC_PER_MSEC, FUNCTOR_BIND_MEMBER(&AP_Baro_DPS280::timer, void));return true;
}

4. 修复

AP_Baro: Fix GCS DPS310 HWID issue #25087

diff --git a/libraries/AP_Baro/AP_Baro_DPS280.cpp b/libraries/AP_Baro/AP_Baro_DPS280.cpp
index 5103fb20bc..8eef71f3a7 100644
--- a/libraries/AP_Baro/AP_Baro_DPS280.cpp
+++ b/libraries/AP_Baro/AP_Baro_DPS280.cpp
@@ -60,7 +60,7 @@ AP_Baro_Backend *AP_Baro_DPS280::probe(AP_Baro &baro,if (sensor) {sensor->is_dps310 = _is_dps310;}
-    if (!sensor || !sensor->init()) {
+    if (!sensor || !sensor->init(_is_dps310)) {delete sensor;return nullptr;}
@@ -153,7 +153,7 @@ void AP_Baro_DPS280::set_config_registers(void)}}-bool AP_Baro_DPS280::init()
+bool AP_Baro_DPS280::init(bool _is_dps310){if (!dev) {return false;
@@ -190,8 +190,11 @@ bool AP_Baro_DPS280::init()set_config_registers();instance = _frontend.register_sensor();
-
-    dev->set_device_type(DEVTYPE_BARO_DPS280);
+    if(_is_dps310) {
+	    dev->set_device_type(DEVTYPE_BARO_DPS310);
+    } else {
+	    dev->set_device_type(DEVTYPE_BARO_DPS280);
+    }set_bus_id(instance, dev->get_bus_id());dev->get_semaphore()->give();
diff --git a/libraries/AP_Baro/AP_Baro_DPS280.h b/libraries/AP_Baro/AP_Baro_DPS280.h
index 799d71a600..79769261a4 100644
--- a/libraries/AP_Baro/AP_Baro_DPS280.h
+++ b/libraries/AP_Baro/AP_Baro_DPS280.h
@@ -29,7 +29,7 @@ public:static AP_Baro_Backend *probe(AP_Baro &baro, AP_HAL::OwnPtr<AP_HAL::Device> dev, bool _is_dps310=false);protected:
-    bool init(void);
+    bool init(bool _is_dps310);bool read_calibration(void);void timer(void);void calculate_PT(int32_t UT, int32_t UP, float &pressure, float &temperature);

5. 效果

在这里插入图片描述

6. 参考资料

【1】Ardupilot - Contributing Code
【2】ArduPilot Style Guide
【3】Ardupilot - Submitting Patches Back to Master
【4】DPS310 baro on I2C

7. 补充

7.1 Ardupilot提交PR注意事项

  1. 代码
    详见:ArduPilot Style Guide
  2. git注释
    在这里插入图片描述
    e.g.

在这里插入图片描述

7.2 修复主要使用到的命令

针对的版本修复

git clone git@github.com:lida2003/ardupilot.git
cd ardupilot/
$ git checkout  502702d
Note: switching to '502702d'.You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -c with the switch command. Example:git switch -c <new-branch-name>Or undo this operation with:git switch -Turn off this advice by setting config variable advice.detachedHead to falseHEAD is now at 502702df62 Copter: version to 4.4.0

确认版本

$ git log -n 1
commit 502702df62572519b56971fe9fed5b2883640879 (HEAD)
Author: Randy Mackay <rmackay9@yahoo.com>
Date:   Fri Aug 18 17:27:42 2023 +0900Copter: version to 4.4.0

板子配置文件

cp -r ../arducopter-4.4.0/libraries/AP_HAL_ChibiOS/hwdef/H743_BMI270x2_v30 libraries/AP_HAL_ChibiOS/hwdef/
mv H743_BMI270x2_v30 Aocoda-H743BMI270Dual

更新代码,如果不成功,请尝试多次执行,确保成功。

git submodule update --init --recursive

编译、构建指令。

./waf distclean
./Tools/scripts/build_bootloaders.py Aocoda-H743BMI270Dual
./Tools/gittools/submodule-sync.sh
./waf configure --board Aocoda-H743BMI270Dual
./waf copter

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机竞赛 深度学习卫星遥感图像检测与识别 -opencv python 目标检测

文章目录 0 前言1 课题背景2 实现效果3 Yolov5算法4 数据处理和训练5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **深度学习卫星遥感图像检测与识别 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐…

python基于轻量级卷积神经网络模型GhostNet开发构建养殖场景下生猪行为识别系统

养殖业的数字化和智能化是一个综合应用了互联网、物联网、人工智能、大数据、云计算、区块链等数字技术的过程&#xff0c;旨在提高养殖效率、提升产品质量以及促进产业升级。在这个过程中&#xff0c;养殖生猪的数字化智能化可以识别并管理猪的行为。通过数字化智能化系统&…

idea 通过tomcat 配置 https方式访问

步骤1&#xff1a;管理员模式打开cmd命令进行生成密匙 D:\software\apache-tomcat-8.5.93\bin\tomcat.keystore 是生成密匙存放的路径&#xff0c;修改成自己tomcat的路径即可 keytool -genkeypair -alias "tomcat" -keyalg "RSA" -keystore "D:\s…

【新版】系统架构设计师 - 案例分析 - 架构设计<Web架构>

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 文章目录 架构 - 案例分析 - 架构设计&#xff1c;Web架构&#xff1e;Web架构知识点单台机器 到 数据库与Web服务器分离应用服务器集群负载均衡负载均衡技术静态与动态算法Session共享机制有状态与无状态 持久化技…

使用香橙派 在Linux环境中安装并学习Python

前言 在实际项目中&#xff0c;经常会遇到需要使用人工智能的场景&#xff0c;如人脸识别&#xff0c;车牌识别等...其一般的流程就是由单片机采集数据发送给提供人工智能算法模型的公司&#xff08;百度云&#xff0c;阿里云...&#xff09;&#xff0c;然后人工智能将结果回…

C++ 继承详解

目录 C 继承介绍 继承中的特点 public 继承 protected 继承 private 继承 在类里面不写是什么类型&#xff0c;默认是 private 的 如果继承时不显示声明是 private&#xff0c;protected&#xff0c;public 继承&#xff0c;则默认是 private 继承&#xff0c;在 struct …

如何给Nginx配置访问IP白名单

一、Nginx配置访问IP白名单 有时部署的应用需要只允许某些特定的IP能够访问&#xff0c;其他IP不允许访问&#xff0c;这时&#xff0c;就要设置访问白名单&#xff1b; 设置访问白名单有多种方式&#xff1a; 1.通过网络防火墙配置&#xff0c;例如阿里云/华为云管理平台 2.…

百度资源搜索平台出现:You do not have the proper credential to access this page.怎么办?

Forbidden site not allowed You do not have the proper credential to access this page. If you think this is a server error, please contact the webmaster. 如果你的百度资源平台&#xff0c;点进去出现这个提示&#xff0c;说明您的网站已经被百度清退了。如果你的网站…

C语言数组和指针笔试题(三)(一定要看)

目录 字符数组四例题1例题2例题3例题4例题5例题6例题7 结果字符数组五例题1例题2例题3例题4例题5例题6例题7结果字符数组六例题1例题2例题3例题4例题5例题6例题7 结果 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 &#x1f412;&#x1f412;&#x1f412;个…

【数值计算方法】非线性方程(组)和最优化问题的计算方法:非线性方程式求根的二分法、迭代法、Newton 迭代法及其Python实现

目录 一、非线性方程式求根 1、二分法&#xff08;Bisection Method、对分法&#xff09; a. 理论简介 b. python实现 2、迭代法&#xff08;Iterative Method&#xff09; a. 理论简介 b. python实现 3、Newton 迭代法&#xff08;Newtons Method&#xff09; a. 理论…

电脑入门:电脑不认新硬盘时该怎么办?

电脑不认新硬盘时该怎么办? 当新硬盘加进后,正常工作时,没有什么问题。若电脑遇到特殊情况时,电脑对新硬盘“不认”,可采取以下措施让电脑重新“认”新硬盘,显示新分区(如G、H、I、J)。 咱的目的是保持S-ATA的开启,把控制板载S-ATA设定值由No变成Yes就可以。 首…

【数据结构与算法】链表的实现以及一些基本算法

目录 单选链表的基本实现 有序列表的合并&#xff08;双指针法&#xff09; 链表的反转 链表实现两数之和 判定链表是否有环 单选链表的基本实现 public class LinkedList1 {//头节点Node first;//尾节点Node last;//大小int size 0;//头插法public void addFirst(int…

微信小程序学习笔记3.0

第3章 资讯类:仿今日头条微信小程序 3.1 需求描述及交互分析 需求描述 仿今日头条微信小程序,要具有以下功能。 (1)首页新闻频道框架设计,包括底部标签导航设计、新闻检索框设计及新闻频道滑动效果设计。 (2)首页新闻内容设计,包括新闻标题、新闻图片及新闻评论设计…

TikTok的媒体革命:新闻业如何适应短视频时代?

在数字时代&#xff0c;媒体行业一直在不断演变和创新&#xff0c;以适应观众的变化需求和技术的发展。而在这个进化的过程中&#xff0c;短视频应用TikTok已经崭露头角&#xff0c;成为了一个重要的信息传播平台。 这篇文章将深入探讨TikTok如何引领了媒体的一场革命&#xf…

转载-C#学习笔记-基本概念(CLR、CTS、CLS...)

1. CLR(Common Language Runtime&#xff0c;公共语言运行时(库)) 可由多种.NET语言使用的运行时环境&#xff0c;其主要作用是定位、加载和管理.NET类型、内存管理、安全检查、线程管理等。.NET运行库提供了一个定义明确的运行库层&#xff0c;可以被支持.NET的所有语言和平台…

2、Linux中静态IP与动态IP的修改

修改为静态IP 打开文件 sudo vim /etc/network/interfaces修改如下 # interfaces(5) file used by ifup(8) and ifdown(8) auto lo iface lo inet loopbackauto ens33#配置网络为DHCP模式 #iface ens33 inet dhcp#配置网络 ens33为静态IP模式 iface ens33 inet static #设置…

基于Vue+ELement搭建动态树与数据表格实现分页

基于VueELement搭建动态树与数据表格实现分页 一、前言二、左侧动态树实现2.1.后台数据接口定义2.2.前端导航菜单绑定2.3.根据数据渲染页面 3.分页 一、前言 在上一篇博文我们搭建了首页导航和左侧菜单&#xff0c;但是我们的左侧菜单是死数据今天我们就来把死的变成活的&#…

自学WEB后端01-安装Express+Node.js框架完成Hello World!

一、前言&#xff0c;网站开发扫盲知识 1.网站搭建开发包括什么&#xff1f; 前端 前端开发主要涉及用户界面&#xff08;UI&#xff09;和用户体验&#xff08;UX&#xff09;&#xff0c;负责实现网站的外观和交互逻辑。前端开发使用HTML、CSS和JavaScript等技术来构建网页…

Leetcode 386. 字典序排数

文章目录 题目代码&#xff08;9.22 首刷看解析&#xff09; 题目 Leetcode 386. 字典序排数 代码&#xff08;9.22 首刷看解析&#xff09; 迭代DFS class Solution { public:vector<int> lexicalOrder(int n) {vector<int> ret(n);int number 1;for(int i 0…

Flink--6、输出算子(连接到外部系统、文件、kafka、MySQL、自定义Sink)

星光下的赶路人star的个人主页 世间真正温煦的春色&#xff0c;都熨帖着大地&#xff0c;潜伏在深谷 文章目录 1、输出算子&#xff08;Sink&#xff09;1.1 连接到外部系统1.2 输出到文件1.3 输出到Kafka1.4 输出到MySQL&#xff08;JDBC&#xff09;1.4 自定义Sink输出 1、输…