Pixhawk之获取传感器数据并更新姿态

2023-05-16

 

 

博主:UAV

声明:尊重版权,转载请注明出处。

原文地址:

联系方式:595493514@qq.com

技术交流QQ:595493514

 

 

 

read_AHRS();是负责更新姿态函数,更新姿态要获取传感器数据进行姿态解算,我们先来分析下传感器是怎么读取的。read_AHRS();调用的是ahrs.update();ahrs是类AP_AHRS_NavEKF的一个实例, ahrs.update()调用了下面三个函数,update_DCM(); update_EKF1(); update_EKF2();我们先分析update_DCM();  调用了AP_AHRS_DCM::update(),继续调用_ins.update();_ins.update()就是更新加速度和陀螺仪的数据,因为class AP_AHRS_DCM : public AP_AHRS,所以 AP_AHRS_DCM是AP_AHRS的一个子类。在AP_ARHS.h的文件中找到_ins 的定义:AP_InertialSensor   &_ins;找到函数void AP_InertialSensor::update(void)中更新数据的函数是_backends[i]->update();到这来就要分析下_backends是什么。在/src/APM/ardupilot/libraries/AP_InertialSensor/AP_InertialSensor.h 的头文件中有下面的定义AP_InertialSensor_Backend *_backends[INS_MAX_BACKENDS];所以_backends是一个指针数组。在/src/APM/ardupilot/libraries/AP_InertialSensor/AP_InertialSensor.cpp有对其进行赋值,_add_backend(AP_InertialSensor_PX4::detect(*this))。到这来我们分析出来了,传感器的数据获取是通过AP_InertialSensor_PX4实现:

bool AP_InertialSensor_PX4::update(void)
{
    // get the latest sample from the sensor drivers
    _get_sample();//读取底层传感器数据

    for (uint8_t k=0; k<_num_accel_instances; k++) {
        update_accel(_accel_instance[k]);//更新加速度
    }

    for (uint8_t k=0; k<_num_gyro_instances; k++) {
        update_gyro(_gyro_instance[k]);//更新陀螺仪
    }
   
    return true;
}

再分析下采样函数:

 

void AP_InertialSensor_PX4::_get_sample()
{
    for (uint8_t i=0; i<MAX(_num_accel_instances,_num_gyro_instances);i++) {
        struct accel_report accel_report;
        struct gyro_report gyro_report;

        bool gyro_valid = _get_gyro_sample(i,gyro_report);//获取陀螺数据
        bool accel_valid = _get_accel_sample(i,accel_report);//获取加速度数据

        while(gyro_valid || accel_valid) {

            if(gyro_valid && accel_valid && gyro_report.timestamp <= accel_report.timestamp) {
                _new_gyro_sample(i,gyro_report);
                gyro_valid = _get_gyro_sample(i,gyro_report);
                continue;
            }
 
            if(accel_valid) {
                _new_accel_sample(i,accel_report);
                accel_valid = _get_accel_sample(i,accel_report);
                continue;
            }
           
            if(gyro_valid) {
                _new_gyro_sample(i,gyro_report);
                gyro_valid = _get_gyro_sample(i,gyro_report);
            }
        }
    }
}

 

直接与最底层的read 函数打交道啦

这里的read其实就是对应驱动代码中的read 啦

我这里用测试打印验证的哦:

L3GD20::read

_get_gyro_sample 1

L3GD20::read

_get_gyro_sample 1

L3GD20::read

_get_gyro_sample 1

L3GD20::read

_get_gyro_sample 1

L3GD20::read

_get_gyro_sample 1

L3GD20::read

函数中_get_accel_sample(uint8_t i, struct accel_report &accel_report)的参数i其实就是选择文件路径啦

其实也是对应于传感器的数据项目

例如陀螺的路径

#define GYRO_BASE_DEVICE_PATH "/dev/gyro"
#define GYRO0_DEVICE_PATH "/dev/gyro0"
#define GYRO1_DEVICE_PATH "/dev/gyro1"
#define GYRO2_DEVICE_PATH "/dev/gyro2"

对于多传感器,肯定是要分多次读取,MPU6000和L3GD20都是在这里读取,数据格式为结构体accel_report和gyro_report的格式

读取数据的格式,例如陀螺的:

struct sensor_gyro_s {
 uint64_t timestamp;
 uint64_t integral_dt;
 uint64_t error_count;
 float x;
 float y;
 float z;
 float x_integral;
 float y_integral;
 float z_integral;
 float temperature;
 float range_rad_s;
 float scaling;
 int16_t x_raw;
 int16_t y_raw;
 int16_t z_raw;
 int16_t temperature_raw;
};

加速度:

struct sensor_accel_s {
 uint64_t timestamp;
 uint64_t integral_dt;
 uint64_t error_count;
 float x;
 float y;
 float z;
 float x_integral;
 float y_integral;
 float z_integral;
 float temperature;
 float range_m_s2;
 float scaling;
 int16_t x_raw;
 int16_t y_raw;
 int16_t z_raw;
 int16_t temperature_raw;
};

 

bool AP_InertialSensor_PX4::_get_accel_sample(uint8_t i, struct accel_report &accel_report)
{
    if (i<_num_accel_instances &&
        _accel_fd[i] != -1 &&
        ::read(_accel_fd[i], &accel_report, sizeof(accel_report)) == sizeof(accel_report) &&
        accel_report.timestamp != _last_accel_timestamp[i]) {
        return true;
    }
    return false;
}

bool AP_InertialSensor_PX4::_get_gyro_sample(uint8_t i, struct gyro_report &gyro_report)
{
    if (i<_num_gyro_instances &&
        _gyro_fd[i] != -1 &&
        ::read(_gyro_fd[i], &gyro_report, sizeof(gyro_report)) == sizeof(gyro_report) &&
        gyro_report.timestamp != _last_gyro_timestamp[i]) {
        return true;
    }
    return false;
}

读取l3gd20的read函数:

/src/APM/ardupilot/modules/PX4Firmware/src/drivers/l3gd20/l3gd20.cpp

ssize_t L3GD20::read(struct file *filp, char *buffer, size_t buflen)

 


 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Pixhawk之获取传感器数据并更新姿态 的相关文章

  • Pixhawk之UAV控制理论、ardupilot源码框架介绍

    一 开篇 您有无人机么 xff1f 没有 那赶紧去某宝买一套 昨天 开会开到接近下午一点钟 xff0c 收获相当大 xff0c 原本不太清楚的ardupilot框架现在也大致熟悉了 xff0c 接下来主要就是结合源码了解其控制过程了 xff
  • Pixhawk无人机精准降落

    转自 xff1a http blog sina com cn s blog 6266a8840102xa77 html 多标记识别 xff0c 比官方的IR LOCK还要灵活 xff1a
  • 【Pixhawk】PX4添加麦克纳姆轮车架

    PX4中提供了很多机架 xff0c 但要开发PX4不支持的机架类型 xff0c 需要我们自定义 比如麦克纳姆轮 1 在ROMFS px4fmu common init d airframes 下添加 hil机架文件 参考其他 命名为7000
  • Pixhawk ulog飞行日志分析

    在python下安装pyulog xff0c 在 ulog文件目录下输入ulog2csv即可将ulog转化为csv形式输出 ulog文件的保存时间 43 8即为飞行实际的时间 timestamp为时间戳 xff0c 除以10 6后单位为秒
  • 通过pixhawk飞行日志读取飞行路线以及对应地图

    px4飞行日志为 bin文件或者 log文件 xff0c 将文件数据导入到flightplot中 xff0c 输出轨迹 xff08 export track xff09 xff0c 下载一个Google地图 xff0c 将保存成的文件在Go
  • 在PX4下更换pixhawk的IMU

    写在前面 出于一些原因 xff0c 这篇文章不给出具体的源码 xff0c 因此博主试着将这篇写成了一篇科普性质的文章 xff0c 如果你认真读的话 xff0c 应该会有收获的 为什么要更换pixhawk的传感器 xff1f 大多数的玩家拿到
  • PIXHAWK添加自定义消息存储到SD卡

    四旋翼调试阶段总会出现很多难以预见的现象 xff0c 这时为了找到所出问题的原因 xff0c 就需要获得原始相关数据进行分析 xff0c pixhawk代码提供了记录飞行日志的功能 xff0c 能够将飞行中的重要数据存入SD卡中 xff0c
  • PIXHAWK位置控制整体框架及期望推力向量转化成目标姿态旋转矩阵算法的深度解析

    万事开头难 xff0c 这是我的第一篇博客 谨以此将所学所悟记录下来 xff0c 以防遗失 xff0c 同时欢迎与大家进行技术交流 xff0c 共同学习 xff0c 共同进步 xff0c 玩的开心 xff01 这里的位置控制主要看PX4的m
  • Pixhawk学习1——CMakeList.txt的解析

    在PX4的工程文件中 xff0c src modules下是具体的飞控代码 里面主要包含了传感器采集 姿态结算 姿态控制 xff0c 位置结算 位置控制等程序模块 在进行二次开发时 xff0c 需要添加的模块也是在这个文件夹里 每个文件夹里
  • Pixhawk学习7——位置解算

    Pixhawk的位置解算分为两部分 xff0c 第一部分主要为传感器的数据获取 xff0c 而该部分最主要的就是GPS数据的提取 第二部分为与惯性器件之间的组合导航 组合导航的好处我就不用多说了 Pixhawk代码中目前主要有两处组合导航的
  • 转载:Pixhawk源码笔记八:添加新的参数

    转载 xff1a 新浪 64 WalkAnt 第九部分 添加新的参数 英文参考 xff1a http dev ardupilot com wiki code overview adding a new parameter 本节源自 xff1
  • PX4/Pixhawk---高速成为开发人员(Windows)

    1 高速成为开发人员新手教程 xff08 翻译 xff09 官方 1 1 编译环境之版本号控制系统 xff08 1 xff09 安装 MSysGIT 安装完毕后 xff0c 配置GIT 安装注意 安装过程中除了以下一步外 xff0c 其它的
  • pixhawk position_estimator_inav.cpp思路整理及数据流

    写在前面 xff1a 这篇blog主要参考pixhawk的高度解算算法解读 xff0c 并且加以扩展 xff0c 扩展到其他传感器 xff0c 其实里面处理好多只是记录了流程 xff0c 至于里面实际物理意义并不是很清楚 xff0c 也希望
  • pixhawk position_estimator_inav.cpp思路整理及数据流

    写在前面 xff1a 这篇blog主要参考pixhawk的高度解算算法解读 xff0c 并且加以扩展 xff0c 扩展到其他传感器 xff0c 其实里面处理好多只是记录了流程 xff0c 至于里面实际物理意义并不是很清楚 xff0c 也希望
  • pixhawk: px4代码初学分析:追溯电机控制--pwm输出

    追溯电机控制 pwm输出 正常工作状态下pwm输出过程简述 xff1a 其他状态下pwm输出 xff1a 正常工作状态下pwm输出过程简述 xff1a 姿态解算部分得出姿态控制量通过px4io cpp把姿态控制量发送给IOIO串口读取姿态控
  • F450机架 Pixhawk飞控实现自动避障(2019.11.29)

    之前进行无人机项目 xff0c 实现避障 巡航 定点 航拍等功能 xff0c 项目结束 xff0c 在这里进行分享经验 xff0c 项目所用器件为自己使用的 xff0c 仅供参考 xff0c 实际实现须结合自己实际情况 1 传感器选择 权盛
  • 树莓派结合PIXHAWK飞控实现四轴双目视觉避障

    树莓派结合Pixhawk飞控实现四轴双目视觉避障 灰信网 xff08 软件开发博客聚合 xff09 无人机双目视觉避障的实现 本文将介绍如何使用树莓派结合PIX飞控实现无人机双目视觉避障的功能 主要硬件 我们以双目摄像头 43 树莓派 43
  • 我设计了一款开源飞控,性能远超Pixhawk,运行APM固件-怒飞垂云

    从2009年到现在 xff0c 我从事无人机研发将近11年了 xff0c 中途设计过很多飞控 xff0c 有闭源的无人飞艇飞控 大型固定翼无人机飞控 xff0c 也有在开源飞控Pixhawk基础上修改的飞控 xff0c 如今 xff0c 基
  • 教程:使用树莓派连接Pixhawk飞控

    教程 xff1a 使用树莓派连接Pixhawk飞控 树莓派可以与Pixhawk飞控相连 xff0c 读取飞控中的状态信息 xff0c 同时对飞控发送指令 树莓派作为一个更高性能的计算平台 xff0c 可以运行图像识别 机器学习 实时路径规划
  • pixhawk 整体架构的认识

    此篇blog的目的是对px4工程有一个整体认识 xff0c 对各个信号的流向有个了解 xff0c 以及控制算法采用的控制框架 PX4自动驾驶仪软件 可分为三大部分 xff1a 实时操作系统 中间件和飞行控制栈 1 NuttX实时操作系统 提

随机推荐

  • 4G图传数传一体机GSLINK实测20180930

    4G图传数传一体机GSLINK实测20180930 时间 xff1a 2018年9月30日 地点 xff1a 江苏南京 测试平台 xff1a pixhawk F450 4G图传 43 数传 xff1a GSLINK A1 HDMI xff1
  • 搭建ROS小车——下位机篇(基于arduino mega2560,L298N)

    ROS与arduino的通讯使用了ros arduino bridge xff0c 代码也是根据学校师兄的代码进行修改的 xff0c 师兄说直接烧录就可以使用了但我还是遇到了很多问题 xff0c Debug的很难受 xff0c 以下操作仅供
  • 树莓派入门操作及VNC显示 cannot currently show the desktop 解决方法

    新手入门 xff0c 装好了系统 xff0c ssh已经设置好了 插入SD卡 电源 绿灯闪烁代表正常开机 查树莓派IP xff0c 最快捷方法直接进入路由器后台配置界面 xff0c 查看ip地址 或者下载工具 xff1a advanced
  • 【Matlab】建立最优控制LQR控制器模型

    前言 之前做了有关于系统辨识以及配置极点来控制系统响应的相关内容 xff0c 那些相当于是打开了一个新世界的大门 xff0c 在此基础上 xff0c 一直想学习一下最优控制的相关内容 xff0c 并应用在项目上 xff0c 因此 xff0c
  • 人工智能算法公式中常见的数据符号的定义和解释?

    长期更新中 没有记录的希望大家留言补充 对数 xff1a xff08 log xff0c lg xff0c ln xff0c lb xff09 log log4 xff08 8 xff09 61 log4 xff08 4 2 xff09 6
  • 我的2014

    弹指间2014过去了 xff0c 在过去的一年里 xff0c 或许你收获了成功 xff0c 取得了令人瞩目的成绩 又或许你失意落魄 xff0c 躲在角落了自舔伤口 但这些都不重要 xff0c 重要的是今年是2015不是2014 新的一年里有
  • 51单片机实现串口偶校验

    1 STC单片机串口 2 PSW是一个8位寄存器 PSW的全称是Program Status Word xff0c 即程序状态字 奇偶标志位P 每执行一条汇编指令 xff0c 单片机都能根据A中1的个数的奇偶自动令P置位或清零 xff0c
  • SLAM十四讲第二版ch7位姿估计实践的编译问题

    在看ch7中遇到了g2o OptimizableGraph Vertex clone const 未定义的引用的问题 为了方便以后复现 xff0c 记录如下 我的环境配置 Pangolin 0 5 Opencv 3 4 16 cere 1
  • SLAM十四讲第二版ch6的未定义的引用问题

    在使用slam十四讲第二版做题的时候发现 xff0c ch6编译问题 xff0c 特此记录如下 make时遇到问题如下 xff1a 对 g2o OptimizableGraph Vertex clone const 未定义的引用 对 g2o
  • Ubuntu18.04配置ORB_SLAM3(ROS)

    一 安装ROS 建议按照官网操作 cn melodic Installation Ubuntu ROS Wiki http wiki ros org cn melodic Installation Ubuntu 二 安装eigen3 3 7
  • Semantic Visual Simultaneous Localization and Mapping: A Survey阅读笔记

    Abstract xff1a 通过语义和vslam结合可以很好解决动态和复杂环境中良好定位 首先回顾了语义vslam发展 xff0c 关注优势和差异 其次探讨了 xff1a 语义信息提取和关联 语义的应用和语义的优势然后收集分析了最先进的s
  • git上传到gitee的记录

    一 安装和配置 sudo apt get install git git config global user email 你的邮箱 git config global user name 64 你的昵称 二 上传 先在github或者gi
  • Burst Imaging for Light-Constrained Structure-From-Motion论文翻译记录

    准备开始2022ICRA的SLAM论文阅读记录 Abstract 在极低光照条件下拍摄的图像受噪声限制 xff0c 会导致现有的机器人视觉算法失效 在本文中 xff0c 我们开发了一种图像处理技术 xff0c 用于从弱光条件下采集的图像中辅
  • ROS常用指令

    非代码 一 创建工作空间 mkdir p catkin ws src cd catkin ws src catkin init workspace 二 创建功能包 cd workspace src catin create pkg name
  • 【Matlab】线性跟踪微分器

    线性跟踪微分器介绍 xff1a 线性跟踪微分器出自自抗扰控制ADRC xff0c 线性跟踪微分器有两个作用 xff0c 一是可以用来滤波 xff0c 而是可以用来求取输入的微分 这里有一篇文章可以推荐看看 xff1a https blog
  • FreeRTOS启动流程

    Reset Handler xff1a 芯片上电默认进Reset Handler SystemInit xff1a 初始化时钟及中断向量映射 main xff1a main函数入口 main xTaskCreate xff1a pvPort
  • 基于STM32F411使用SPI+DMA驱动LCD

    先看效果 F411CE 硬件SPI xff0b DMA驱动LCD 基于HAL库 其实HAL库我用不太习惯 xff0c 一直也是用的标准库 但HAL库确实是好上手一些 xff0c 就迅速创建一个新的template 这次就当尝试一下吧 xff
  • 动手深度学习-环境配置(手动安装,一步一步教你,有截图可看)

    一 xff1a 官网教程 这一部分对应了书中的第二讲 xff1a 预备知识部分 因为我是Windows用户 xff0c 所以这里先只讲Windows部分的安装过程 1 xff1a 第一步是根据操作系统下载并安装Miniconda xff0c
  • 机器学习算法原理与实践(三)、卡尔曼滤波器算法浅析及matlab实战

    协方差矩阵 状态协方差矩阵传递 状态协方差的更新 Matlab 实现 Matlab效果 测试代码 测试效果 原创 Liu LongPo 转载请注明出处 CSDN http blog csdn net llp1992 卡尔曼滤波器是一种利用线
  • Pixhawk之获取传感器数据并更新姿态

    博主 xff1a UAV 声明 xff1a 尊重版权 xff0c 转载请注明出处 原文地址 xff1a 联系方式 xff1a 595493514 64 qq com 技术交流QQ xff1a 595493514 read AHRS 是负责更