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.xdnf.cn/news/142826.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Learn Prompt- Midjourney案例:动漫设计

使用 Midjourney 生成动漫有两种方法&#xff1a;使用Niji模式或使用标准的 Midjourney 模型。Niji V5 是 Midjourney 的动漫专用模型。它建立在标准 Midjourney 模型的全新架构之上&#xff0c;更擅长生成命名的动漫角色。Niji V4于2023年12月发布&#xff0c;Niji V5于2023年…

国内大语言模型的相对比较:ChatGLM2-6B、BAICHUAN2-7B、通义千问-6B、ChatGPT3.5

一、 前言 国产大模型有很多&#xff0c;比如文心一言、通义千问、星火、MOSS 和 ChatGLM 等等&#xff0c;但现在明确可以部署在本地并且开放 api 的只有 MOOS 和 ChatGLM。MOOS 由于需要的 GPU 显存过大&#xff08;不量化的情况下需要80GB&#xff0c;多轮对话还是会爆显存…

网络安全--IDS--入侵检测

1. 什么是IDS&#xff1f; IDS---入侵检测是防火墙的一个有力补充&#xff0c;形成防御闭环&#xff0c;可以及时、准确、全面的发现入侵弥补防火墙对应用层检查的缺失。对系统的运行状态进行监视&#xff0c;发现各种攻击企图、过程、结果&#xff0c;来保证系统资源的安全&a…

【图论C++】链式前先星(图(树)的存储)

/*** file * author jUicE_g2R(qq:3406291309)————彬(bin-必应)* 一个某双流一大学通信与信息专业大二在读 * * brief 一直在竞赛算法学习的路上* * copyright 2023.9* COPYRIGHT 原创技术笔记&#xff1a;转载需获得博主本人…

Go 多版本管理工具

Go 多版本管理工具 文章目录 Go 多版本管理工具一、go get 命令1.1 使用方法&#xff1a; 二、Goenv三、GVM (Go Version Manager)四、voidint/g4.1 安装4.2 冲突4.3 使用 在平时开发中&#xff0c;本地新旧项目并行开发的过程中&#xff0c;你大概率会遇到一个令人头疼的问题&…

OmniOutliner 5 Pro for Mac(信息大纲记录工具)v5.12正式版 支持M1、M2

OmniOutliner 5 Pro是一款功能强大的大纲工具&#xff0c;可以帮助用户进行头脑风暴、组织思维和创建结构化的笔记。以下是这款软件的一些主要功能和特点&#xff1a; 大纲模式。OmniOutliner 5 Pro支持全屏模式、分屏模式、实时预览模式和导航模式等多种创作模式&#xff0c;…

【深度学习】【Opencv】Python/C++调用onnx模型【基础】

【深度学习】【Opencv】python/C调用onnx模型【基础】 提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 文章目录 【深度学习】【Opencv】python/C调用onnx模型【基础】前言Python版本OpenCVWindows平台安装OpenCVopencv调用onnx模型 C版本OpenCVWindows平…

Linux shell编程学习笔记3:查询系统中已安装可以使用的shell

〇、更新记录 20230926 编写 一、前言 目前可以在Linux系统上运行的shell有许多种&#xff1a;sh、bash、cshell、tcsh、zsh……但是对一台具体的系统来说&#xff0c;未必包括上面列的所有这些shell&#xff0c;很可能包括其中两三个。 那么我们如何查询系统中已经安装有哪…

性能测试之使用Jemeter对HTTP接口压测

我们不应该仅仅局限于某一种工具&#xff0c;性能测试能使用的工具非常多&#xff0c;选择适合的就是最好的。笔者已经使用Loadrunner进行多年的项目性能测试实战经验&#xff0c;也算略有小成&#xff0c;任何性能测试&#xff08;如压力测试、负载测试、疲劳强度测试等&#…

Git与Repo:开源开发的得力工具组合

Git与Repo&#xff1a;开源开发的得力工具组合 1. 引言 开源开发在当今的软件行业中扮演着至关重要的角色。它不仅推动了技术的创新和进步&#xff0c;也促进了开发者之间的合作与共享。随着越来越多的开源项目的涌现&#xff0c;有效的代码管理和版本控制成为了必不可少的工…

8. 基于消影点进行相机内参(主点)的标定

目录 1. ocam模型2. 消影点3. 基于消影点进行相机主点标定3.1 基于ocam模型的主点标定 感谢大家的阅读。 1. ocam模型 可以参考我的另一篇博客ocam模型。 这里简单提一下ocam模型&#xff1a; 这个模型将中心折反射相机和鱼眼相机统一在一个通用模型下&#xff0c;也称为泰勒模…

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

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

Linux0.11——操作系统怎么把自己从硬盘搬到内存

这里先直接给出答案&#xff1a;中断 此时&#xff0c;操作系统用短短几行代码&#xff0c;将数据段寄存器ds和代码段寄存器cs设置为了0x9000&#xff0c;方便之后的程序访问代码和数据&#xff0c;并且将栈顶地ss:sp设置在了远离代码的位置0x9000足够遥远的0x9FF00&#xff0c…

鸿鹄工程项目管理系统 Spring Cloud+Spring Boot+Mybatis+Vue+ElementUI+前后端分离构建工程项目管理系统

. 项目背景 一、随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性&#xff0c;公司对内部工程管理的提升提出了更高的要求。 二、企业通过数字化转型&#xff0c;不仅有利于优化业务流程、提升经营管…

LLM各层参数详细分析(以LLaMA为例)

网上大多分析LLM参数的文章都比较粗粒度&#xff0c;对于LLM的精确部署不太友好&#xff0c;在这里记录一下分析LLM参数的过程。 首先看QKV。先上transformer原文 也就是说&#xff0c;当h&#xff08;heads&#xff09; 1时&#xff0c;在默认情况下&#xff0c; W i Q W_i^…

电商项目高级篇-02 elasticsearch-下

电商项目高级篇-02 elasticsearch-下 4.2、QueryDSL返回指定字段 4.2、QueryDSL 返回指定字段 返回单个字段 GET bank/_search {"query": {"match_all": {}}, "sort": [{"balance": {"order": "desc"}}], &quo…

详解yolov1理论 代码

目标检测要解决的3大问题&#xff1a; 1、有没有&#xff1f; 图片中是否有要检测的物体&#xff1f;&#xff08;检测物体&#xff0c;判定前景背景&#xff09; 2、是什么&#xff1f; 这些物体分别是什么&#xff1f;&#xff08;检测到的物体是什么&#xff09; 3、在…

【RV1103】RTL8723bs (SD卡形状模块)驱动开发

文章目录 前言硬件分析Luckfox Pico的SD卡接口硬件原理图LicheePi zero WiFiBT模块总结 正文Kernel WiFi驱动支持Kernel 设备树支持修改一&#xff1a;修改二&#xff1a; SDK全局配置支持 wifi全局编译脚本支持编译逻辑拷贝rtl8723bs的固件到文件系统的固定目录里面去 上电后手…

Learn Prompt- Midjourney案例:Logo设计

Logo设计是一个充满挑战的任务&#xff0c;因为Logo是品牌重要价值的浓缩。 快速开始​ 直接使用logo design for...来获取灵感。 备注 图像中生成文字在Midjourney中的效果还不是很好&#xff0c;但你可以用Canva编辑图片并替换自己的文字。 在提示中使用那些擅长你所寻找的…

Spring整合RabbitMQ——生产者(利用配置类)

1.生产者配置步骤 2.引入依赖 3.编写配置 配置RabbitMQ的基本信息&#xff0c;用来创建连接工厂的 编写启动类 编写配置类 4. 编写测试类