PX4原生固件SPI驱动动编写与IMU传感器替换

2023-05-16

适用于PX4原生固件
核心目标:完成XSENS的MTI3,IMU替换。MTI3是一款航姿参考系统,可以独立的输出四元数,加速度,磁力计等,角速度等航姿信息。里面有完整的卡尔曼滤波,可以替换飞控本身里面的姿态估计部分。因为PX4里面所用的传感器器件都是消费级的元器件,所以MTI3这样的工业级的IMU替换还是非常有价值的。

一 PX4:SPI硬件介绍

PIXHAWK里面有3路SPI的硬件接口,分别是:

  • IMU的一路(通过片选信号来支持磁力计,陀螺仪,加速度计这几个SPI传感器)
  • 铁电存储器一路(存储飞控参数信息)
  • 外置SPI接口一路,可以外接SPI传感器的
                       外置SPI接口线路图
    

二 PX4:SPI驱动介绍

  • pixhawk内部的很多传感器都是用SPI进行通信的,所有SPI接口传感器都是基于继承了device::SPI这个SPI基类来实现的SPI传感器驱动的编写。比如:
    Src/Drivers/Hmc5883 磁力计,Src/Drivers/Mpu9250 陀螺仪等等都是基于SPI总线。
  • 里面的构造函数,init,read,write,ioctl几个虚函数,在本类里面重写即可。这里我们可以去看一下MPU9250,Hmc5883的SPI驱动的写法
    尤其这几个函数的写法。比如MPU9250的:

    比如5883的:

    这个虚函数的重写内容都是不一样的,具体的写法规则要更具具体的硬件手册来。所以驱动的编写硬件很重要我们看下SPI的硬件相关的内容。

    我们可以看到我们要操作的这个外置IMU的硬件接口是SPI4和一个SPI的Drdy接口预留。
  • 这是我们可以初步可以分析到的内容,软件上就是继承SPI基类,硬件上就是SPI4外置SPI接口。
    在nuttx系统层面上我们也可以看到一些东西:

  • 在nuttx系统的dev文件夹下面可以看到这些设备的文件,也就是说我们自己添加的设备文件也可以在这里看到。nuttx操作系统和linux类似,一切皆文件。
    以上是我们可以直观感受到的SPI驱动相关的硬件和软件部分,我们先有直观的认识。我们可以仿造5883的写法写好我们自己的SPI驱动的函框架
    那么我们要详细的看下这个SPI基类了,在src\drivers\device\spi.cpp中我们可以看到这个SPI基类:
    SPI::SPI(const char *name,
       const char *devname,
       int bus,
       enum spi_dev_e device,
       enum spi_mode_e mode,
       uint32_t frequency,
       int irq) :
      // base class
      CDev(name, devname, irq),
      // public
      // protected
      locking_mode(LOCK_PREEMPTION),
      // private
      _device(device),
      _mode(mode),
      _frequency(frequency),
      _dev(nullptr),
      _bus(bus)
    {
      // fill in _device_id fields for a SPI device
      _device_id.devid_s.bus_type = DeviceBusType_SPI;
      _device_id.devid_s.bus = bus;
      _device_id.devid_s.address = (uint8_t)device;
      // devtype needs to be filled in by the driver
      _device_id.devid_s.devtype = 0;
    }
    
  • 可以看到这些函数的传入函数name,设备名,驱动类型的枚举,SPI模式的枚举,SPI时钟频率,中断。我们在追踪SPI类,会发现他继承的VDev类。
    先不管这些我们来分析如果我们要新建一个我们自己的SPI类应该怎么办,那么我们看下MPU5883的看他怎么写的:
    HMC5883_SPI::HMC5883_SPI(int bus, spi_dev_e device) :
      SPI("HMC5883_SPI", nullptr, bus, device, SPIDEV_MODE3, 11 * 1000 * 1000 /* will be rounded to 10.4 MHz */)
    {
      _device_id.devid_s.devtype = DRV_MAG_DEVTYPE_HMC5883;
    }
    
    这是HMC5883_SPI的构造函数,我们可以看到要传入bus,device,device_type参数,其中注意到
    SPI("HMC5883_SPI", nullptr, bus, device, SPIDEV_MODE3, 11 1000 1000 / will be rounded to 10.4 MHz /)
    SPIDEV_MODE3和11 1000 1000指定了SPI的时钟模式和SPI的传输速度(传输速度和传感器硬件有关系,传感器手册有,按照这个来)
    这是传递给SPI这个基类的参数,做了一部分SPI的初始化的工作。但是这个bus和device我们还不知道,继续跟踪下。在HMC5883_SPI_interface(int bus)这个函数里面实例化了HMC5883_SPI这个类
    return new HMC5883_SPI(bus, (spi_dev_e)PX4_SPIDEV_HMC);
    传递了bus,device

第二个参数选择了SPI总线的片选信号线PX4_SPIDEV_HMC就是片选信号选择,我们知道这一版pixhawk的IMU传感器的通信都是基于SPI的,磁力计,陀螺仪都是SPI总线,我们选择了哪一个SPI接口,就要相应的片选使能,使能以后就可以读取相应的传感器参数。

这是V2这个硬件片选定义的地方

那么第一个参数是选择对应的SPI总线。

  • 注PIXHAWk有三路SPI总线接口,一路给铁电存储器,一路给内置IMU,一路给了外置的SPI。我们最后是要实现外置SPI的操作,但是先分析下这个内置的IMU的SPI总线。
    bus是

    bool
    start_bus(struct hmc5883_bus_option &bus, enum Rotation rotation)
    {
      if (bus.dev != nullptr) {
          errx(1, "bus option already started");
      }
    
      device::Device *interface = bus.interface_constructor(bus.busnum);
    
      if (interface->init() != OK) {
          delete interface;
          warnx("no device on bus %u (type: %u)", (unsigned)bus.busnum, (unsigned)bus.busid);
          return false;
      }
    
      bus.dev = new HMC5883(interface, bus.devpath, rotation);
    
      if (bus.dev != nullptr && OK != bus.dev->init()) {
          delete bus.dev;
          bus.dev = NULL;
          return false;
      }
    
      int fd = open(bus.devpath, O_RDONLY);
    
      if (fd < 0) {
          return false;
      }
    
      if (ioctl(fd, SENSORIOCSPOLLRATE, SENSOR_POLLRATE_DEFAULT) < 0) {
          close(fd);
          errx(1, "Failed to setup poll rate");
      }
    
      close(fd);
    
      return true;
    }
    

    bus.interface_constructor(bus.busnum);选择了SPI的传感器总线。这个5883选择的是PX4_SPI_BUS_SENSORS这个内置IMU SPI传感器总线,因为在硬件上IMU的各个传感器都是用的一路SPI接口,只是他们的片选信号线不同,片选信号线我们在前面看见了参数说明,

  • 总结下就创建SPI类的入口,还有各种参数的意义
  • SPI("HMC5883_SPI", nullptr, bus, device, SPIDEV_MODE3, 11 1000 1000 / will be rounded to 10.4 MHz /)核心就是在填充整个参数,知道各个参数的含义很重要
    "HMC5883_SPI"是名字,bus是那个SPI总线,device是指定相应的片选信号, SPIDEV_MODE3是你的SPI时钟模式,11 1000 1000是你的SPI的传感器读取速度。这些参数都对应了硬件的配置和物理的硬件接口要会分析硬件电路图。
    其实我们在SPI里面跟踪也会发现有个transfer函数,这个函数就是发送和读取的函数了,里面有:

    SPI_SETFREQUENCY(_dev, _frequency);
      SPI_SETMODE(_dev, _mode);
      SPI_SETBITS(_dev, 8);
      SPI_SELECT(_dev, _device, true);
    
      /* do the transfer */
      SPI_EXCHANGE(_dev, send, recv, len);
    
      /* and clean up */
      SPI_SELECT(_dev, _device, false);
    

    这几个函数实际上在调用Firmware/Nuttx/nuttx/arch/arm/src/stm32/stm32_spi.c系统的底层SPI库
    最开始的核心是SPI("HMC5883_SPI", nullptr, bus, device, SPIDEV_MODE3, 11 1000 1000 / will be rounded to 10.4 MHz /)这几个参数的理解,要更具硬件电路图来理解

1. 用start_bus函数实例化HMC5883_SPI类

2.用start_bus 实例化HMC5883类

3.把HMC5883_SPI类里面ioctl,write,read,init几个虚函数函数的重写

4.HMC5883类里面开启工作队列work_queue或者定时回调函数来读取传感器的值,然后通过ourb把数据发送出去。

5. 重点分析下SPI基类里面的函数 SPI_SETMODE,SPI_SELECT,SPI_EXCHANGE,SPI_SELECT几个函数的理解在Firmware/Nuttx/nuttx/arch/arm/src/stm32/stm32_spi.c底层驱动里面。

还有这篇文章也是不错的,详细描述的底层的关系:
http://blog.csdn.net/czyv587/article/details/53817154
可以看看。

二 XSENS_MTI3航姿参考系统的特性和替换

MTI3是XSENS公司推出的航姿参考系统,其中IMU单元直接输出四元数,这些四元数是经过这个硬件的IMU模块解算好的(内置了卡尔曼滤波),可以直接替换飞机的姿态检测部分。其中内置的陀螺仪,磁力计,加速度计都是工业级的,抗干扰和稳定性都优于pixhawk自带的IMU,9250等陀螺仪都是消费级的传感器,所以这方面的替换很有必要。我们在这里替换了PX4系统里面的姿态检测部分。主要工作就是根据MTI3这个传感器的SPI使用手册,来实现读写操作,原始数据解析工作和原有的ourb消息的替换工作。
MTI3传感器注意要点
1 接口外设选择为SPI的
2 DRDY数据就绪从MTI3硬件板子上引出来,接到飞控上,作为数据的就绪选择端
3 用专门的MTI3传感器配置软件,把传感器配置为四元数输出
4 用逻辑分析仪来调试SPI的驱动

  • 1 MTI3选择配置为四元数,加速度计,磁罗盘输出
    选择开关配置:

    我们先配置好为USB和电脑通信,来配置模块为SPI输出和四元数,加速度,角速度,磁力计输出:


按照上面的配置参数来,我们点击发送以后我们可以在预览界面里面看见各种输出,包括四元数,加速度和磁力计的。
接下来我们把拨码开关拨到SPI输出模式,接好线给飞控的外置SPI接口。开始写这个却动程序。

  • 还有比较重要的硬件改造

    这个白色的线的接口是飞控的PC14号接口,也是系统预留的DRDY接口。这个引脚的作用是告诉SPI主设备,从机SPI的一包数据已经准备好了,可以读取了。这个硬件改造比较重要,否则会造成数据读取错误。

到这里所有的硬件配置已经完毕,就是结合飞控写SPI驱动了。
整个SPI的驱动已提供好了,驱动调试,逻辑分析仪是少不了的。

上面是SPI驱动部分源码,不定期更新代码修复bug,请关注!
xsens_mti3_spi.cpp是SPI的读写类实现了读写操作
xsens_mti3.cpp是主函数,里面实例化了xsens_mti3_spi类来实现传感器的读写,用了hrt_call_every定时器来循环读取传感器参数,通过UORB发送出去。
mtinterface.cpp是读取缓冲区和数据解析的接口函数,MTI3是用的X_BUS协议,数据读取采用了缓冲区,xbusmessage.cpp,xbusparser.cpp
xbusutility.cpp都是数据解析函数

int
XSENS_MTI3::collect()
{
    //warnx("collect()");
    uint16_t notificationMessageSize = 0;
    uint16_t measurementMessageSize = 0;
    readPipeStatus(&notificationMessageSize, &measurementMessageSize);
    uint16_t size = 0;
    uint8_t pipe = 0;
    memset(&xbusMessagebuf,0,sizeof(xbusMessagebuf));
    memset(&rebuffer[2],0,sizeof(rebuffer) - 2);

    if (notificationMessageSize)
    {
        size = notificationMessageSize;
        pipe = 0x05;
    }
    else if (measurementMessageSize)
    {
        size = measurementMessageSize;
        pipe = 0x06;
    }
    else
    {
        return -1;
    }

    _interface->read(pipe,&rebuffer[2],size);


    XbusParser_parseBuffer(m_xbusParser, rebuffer, 2 + size);

    if(getXbusMessage(&xbusMessagebuf))
    {
       handleXbusMessage(&xbusMessagebuf);
    }
    return OK;
}

XbusParser_parseBuffer原始数据放入缓冲区
getXbusMessage(&xbusMessagebuf)得到消息包数据
handleXbusMessage解析数据
在解析函数handleXbusMessage中把解析到的数据通过uorb发送出去
同时有个DRDY引脚检测判断什么时候应该读取数据了( mti3_drdy_status = MTI3_DRDY)

void
XSENS_MTI3::cycle()
{
    mti3_drdy_status = MTI3_DRDY;
    if(mti3_drdy_status)
    {
        collect();
    }
    else
    {
     ;
    }
}

说到UORB发送数据,我们到底要替换什么数据。最新版的PX4构架的代码已经用EKF2来整合了姿态估计和位置估计的代码,姿态估计和位置估计是一体的。所以我们还是采用了以往的
modules/attitude_estimator_q
modules/local_position_estimator
我们还是采用的LPE来单独的位置估计和attitude_estimator_q开进行单独的状态估计,这里是要修改编译脚本和启动脚本,就是是修改nuttx_px4fmu-v2_default.cmake和rc.mc_apps
具体rc.mc_apps修改如下:

#!nsh
#
# Standard apps for multirotors:
# att & pos estimator, att & pos control.
#


#---------------------------------------
# Estimator group selction
#
# INAV (deprecated)
if param compare SYS_MC_EST_GROUP 0
then
    echo "ERROR [init] Estimator INAV deprecated. Using EKF2"
    param set SYS_MC_EST_GROUP 2
    param save
fi

# LPE
if param compare SYS_MC_EST_GROUP 2
then
    # Try to start LPE. If it fails, start EKF2 as a default
    # Unfortunately we do not build it on px4fmu-v2 due to a limited flash.
        if xsens_mti3 start
    #if attitude_estimator_q start
    then
        local_position_estimator start
    else
        echo "ERROR [init] Estimator LPE not available. Using EKF2"
        param set SYS_MC_EST_GROUP 2
        param save
    fi
fi

# EKF
#if param compare SYS_MC_EST_GROUP 2
#then
#    ekf2 start
#fi
#---------------------------------------
#xsens_mti3 start

mc_att_control start

mc_pos_control start

#
# Start Land Detector
#
land_detector start multicopter

我们强制启动了xsens_mti3 start和local_position_estimator start,以往的attitude_estimator_q start也屏蔽掉,因为我们的姿态估计用的是 xsens_mti3 start。那么实际上姿态估计也很简单主要是发布了两个消息主题:
orb_publish(ORB_ID(vehicle_attitude),_att_pub, &att);
orb_publish(ORB_ID(control_state),_ctrl_state_pub,&ctrl_state);
姿态和控制状态。因为这个MIT3是不需要校准的,所以我们没有去管校准的问题。以上就是主要IMU替换的地方。

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

PX4原生固件SPI驱动动编写与IMU传感器替换 的相关文章

  • 关于使用SDKManager刷机出现No SDKs are available for your account的解决办法

    今天刷机出现 No SDKs are available for your account 这个错误 xff0c 所以连第一步都进不去 xff08 下图是用别人的错误图 xff09 最后在GG上找到了一个解决方案 xff0c https f
  • Mac系统装android开发环境无法创建SD卡解决方案

    无法创建SD卡是小事 xff0c 但是引起的问题却是大事 xff0c 模拟器无SD卡则android项目无法正常生成R文件 xff0c 导致HelloWorld都无法跑起来 xff0c 头大 xff0c 折腾了几天 xff0c 终于找到原因
  • Matlab App Designer编译打包exe后读取文件路径问题

    首先 xff0c 标题略长 其次 xff0c 当你看到这个长长的标题并点进来的时候 xff1a bro xff0c 恭喜你终于找到了一个行之有效的解决方案 xff01 好了 xff0c 下面我们言归正传 关于MATLAB App Desig
  • Arduino程序结构,数据类型,变量

    Arduino程序结构 Arduino程序可以分为三个主要部分 xff1a 结构 xff0c 值 xff08 变量和常量 xff09 和函数 span class token keyword void span span class tok
  • 前端基础之《ECMAScript 6(6)—数组》

    一 扩展运算符 1 扩展运算符能将 数组 转换为逗号分隔的 参数序列 声明一个数组 const school 61 39 张三 39 39 李四 39 39 王五 39 用 转换成逗号分隔的序列 xff1a 39 张三 39 39 李四 3
  • linux 安装npm

    1 下载源码安装 cd wget https nodejs org dist v14 15 4 node v14 15 4 linux x64 tar xz 2 解压并放入指定目录 tar xf node v14 15 4 linux x6
  • 【安博.牛耳】嵌入式培训介绍

    培训简介 安博教育集团联手中南地区最大的IT人才输出机构 牛耳软件教育 xff0c 在湖南地区首开专业嵌入式开发工程师培训 嵌入式开发工程师专业培训课程 xff0c 由安博联合各知名企业合作伙伴的精英专家 一线项目总监 经理 优秀技术人员共
  • 最受推荐的10本C/C ++书籍

    链接 xff1a https hackr io blog 10 best c cpp books C和C 43 43 是世界上最流行的编程语言之二 C 43 43 是C语言的扩展 xff0c 这两门语言的潜力都是不可估量的 xff0c 这就
  • Leetcode: Decode ways

    A message containing letters from A Z is being encoded to numbers using the following mapping 39 A 39 gt 1 39 B 39 gt 2
  • 调剂【非全日制】之前必看!关于非全就业情况的一点感想

    原文作者 秦时明月123fly 17年考入帝都的一所985级别的学校非全研究生 xff0c 学制是两年 xff0c 专业是土木口的工程管理 因为是辞职读的非全 xff0c 所以目前也在参加秋招 学土木的都知道 xff0c 要么去施工单位 x
  • 360分!这是某985计算机非全分数线!

    前几天 xff0c 武汉大学公布了计算机相关专业的分数线 xff1a 计算机学院 计算机科学与技术 xff08 学硕 xff09 xff1a 总分 xff1a 380 政治 xff1a 50 外语 xff1a 50 专业课1 xff1a 8
  • 计算机非全日制,究竟值得读吗?

    非全值得读吗 xff1f 作者 xff1a 四川大学 图像所 非全日制 研究生 文章为原创 非全值得读吗 xff1f 我想有这个疑问的大都是应届生 xff0c 而不是往届生或者已经工作的人 xff0c 特别是工作后工资相对较高 xff0c
  • 【非全研究生】到底哪些公司接受?

    很多同学都知道 xff0c 虽然非全在2017年改革了 xff0c 考试难度和毕业难度都加大了 xff0c 但是社会对于非全日制研究生的认可程度依然是个未知数 前几天小编在微博看到一位同学发的 统招非全日制研究生企业认可情况汇总表 xff0
  • 非全凉凉!武汉大学不允许18级19级非全日制硕士研究生参加校招?

    转载于知乎 链接 https www zhihu com question 343870391 作者 xff1a 张铁匠 链接 xff1a https www zhihu com question 343870391 answer 8118
  • 关于博士招生“申请-考核制”,教育部这样说!

    转载于 青塔 近日 xff0c 教育部在官网上就十三届全国人大二次会议 关于改进博士生招生 申请 考核制 的建议 进行答复 答复中称 xff1a 教育部在着力探索建立博士生招生质量第三方评价机制 xff0c 推动招生单位建立健全以自我评价为
  • Keil5.26、Keil5.27、Keil5.30下载地址

    亲测有效 xff0c 速速下载 mdk5 26下载地址 http www keil com fid vquv2wwtdy9j1w9xagw1om5eu9xbkks1e66vd1 files eval mdk526 exe mdk5 27下载
  • EEPROM和flash的区别

    之前对各种存储器一直不太清楚 xff0c 今天总结一下 存储器分为两大类 xff1a ram和rom ram就不讲了 xff0c 今天主要讨论rom rom最初不能编程 xff0c 出厂什么内容就永远什么内容 xff0c 不灵活 后来出现了
  • git merge最简洁用法

    一 开发分支 xff08 dev xff09 上的代码达到上线的标准后 xff0c 要合并到 master 分支 git checkout dev git pull git checkout master git merge dev git
  • 汇编cmp比较指令详解

    刚刚看到了cmp指令 xff0c 一开始有点晕 后来上网找了些资料 xff0c 终于看明白了 xff0c 为了方便初学者 xff0c 我就简单写下我的思路吧 高手绕过 xff0c 谢谢 xff01 cmp compare 指令进行比较两个操
  • vim中复制粘贴

    在vim中要进行复制粘贴 需要使用yy和p指令 但是会发现当我们想讲从vim外面复制的内容粘贴进文本中时 光使用p达不到效果 原因是 在vim中维护者许多的clipboard 而不是只有一个 我们从vim外部 如浏览器 复制的文本所在的cl

随机推荐

  • NP问题真的很难理解

    希望通过这篇文章可以不仅让计算机相关专业的人可以看懂和区分什么是P类问题什么是NP类问题 xff0c 更希望达到的效果是非专业人士比如学文科的朋友也可以有一定程度的理解 有一则程序员界的笑话 xff0c 就是有一哥们去google面试的时候
  • USB转TTL、USB转串口、USB转232的区别

    PO主作为一个没有专业背景的小白 xff0c 在初玩单片机时曾被上面的几个名词所混淆 xff0c 不过后来终于大彻大悟 xff0c 现在把自己的理解写在这里 xff0c 同样准备入门单片机的小白可以看看 xff0c 或许对你有所帮助 首先
  • STM32的时钟系统RCC详细整理

    一 综述 xff1a 1 时钟源 在 STM32 中 xff0c 一共有 5 个时钟源 xff0c 分别是 HSI HSE LSI LSE PLL HSI 是高速内部时钟 xff0c RC 振荡器 xff0c 频率为 8MHz xff1b
  • 第一章 PX4程序编译过程解析

    版权声明 xff1a 本文为博主原创文章 xff0c 未经博主允许不得转载 第一章 PX4程序编译过程解析 PX4是一款软硬件开源的项目 xff0c 目的在于学习和研究 其中也有比较好的编程习惯 xff0c 大家不妨可以学习一下国外牛人的编
  • 第二章 PX4-RCS启动文件解析

    版权声明 xff1a 本文为博主原创文章 xff0c 未经博主允许不得转载 第二章 PX4 RCS启动文件解析 RCS的启动类似于linux的shell文件 xff0c 如果不知道shell文件是什么东西可以理解成是为程序的流程框 xff0
  • pixhawk position_estimator_inav.cpp思路整理及数据流

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

    1 创建本地分支 git branch 分支名 xff0c 例如 xff1a git branch 2 0 1 20120806 注 xff1a 2 0 1 20120806是分支名称 xff0c 可以随便定义 2 切换本地分支 git c
  • 第一章 PX4-Pixhawk-程序编译过程解析

    第一章 PX4程序编译过程解析 PX4是一款软硬件开源的项目 xff0c 目的在于学习和研究 其中也有比较好的编程习惯 xff0c 大家不妨可以学习一下国外牛人的编程习惯 这个项目是苏黎世联邦理工大学的一个实验室搞出来的 该方案是基于NUT
  • 详解几种飞控的姿态解算算法

    姿态解算是飞控的一个基础 重要部分 xff0c 估计出来的姿态会发布给姿态控制器 xff0c 控制飞行平稳 xff0c 是飞行稳定 的最重要保障 有关姿态解算的基础知识 xff0c 这里笔者不会细细描述 xff0c 有关这方面的资料 xff
  • 陀螺仪的数据处理

    1 陀螺仪数据校准 1 1 原理 一款飞控上的传感器是需要进行校准的 xff0c 比如这里讲的陀螺仪 目前大多数的陀螺校准其实就是去掉零点偏移量 xff0c 采集一定的数据 xff0c 求平均 xff0c 这个平均值就是零点偏移 xff0c
  • LevelDB源码分析之从Put说起

    之前分享的文章leveldb实现原理分析详细描述了LevelDB的实现原理 xff0c 本文从Put接口来看下leveldb数据写流程的源码实现 LevelDB的读写接口在类DB中定义 xff08 leveldb db h xff09 xf
  • 大神浅谈无人机飞控软件设计 系统性总结

    写在前面 深感自己对飞控软件 算法的知识点过于杂乱 xff0c 很久没有进行系统的总结了 xff0c 因此决定写几篇文章记录一些飞控开发过程的知识点 主要是针对一些软件 算法部分进行讨论 xff0c 如内容有错误 xff0c 欢迎指出 1
  • 作为资深的无人机从业者,卡尔曼滤波你不能不知道 通俗易懂的来说卡尔曼滤波

    旋翼无人机的两类主要算法 先说一个旋翼类无人机系统的算法主要有两类 xff1a 姿态检测算法 姿态控制算法 姿态控制 被控对象 xff08 即四旋翼无人机 xff09 姿态检测三个部分构成一个闭环控制系统 被控对象的模型是由其物理系统决定
  • pixhawk commander.cpp的飞行模式切换解读

    commander cpp逻辑性太强了 xff0c 涉及整个系统的运作 xff0c 所以分别拆分成小块看 另此篇blog大部分是参考 xff08 Pixhawk原生固件解读 xff09 飞行模式 xff0c 控制模式的思路 xff0c 笔者
  • Pixhawk代码分析-源码框架

    源码框架 pixhawk代码框架 xff1a pixhawk代码框架基础分析 xff1a 阅读下面内容时请结合源码阅读 xff0c 便于理解 The basic structure of ArduPilot is broken up int
  • Pixhawk代码分析-姿态解算篇A

    姿态解算篇A 基本知识 1 如何实现控制 一个无人机系统的算法主要有两类 xff1a 姿态检测算法 姿态控制算法 姿态控制 被控对象 姿态检测三个部分构成一个闭环控制系统 被控对象的模型是由其物理系统决定 xff0c 设计无人机的算法就是设
  • 电路知识--认识原理图(一)

    开源硬件 xff0c 一个很重要的的一点就是有开放的原理图 xff0c 通过原理图 xff0c 我们可以了解一个模块的输入输出 xff0c 以及使用的芯片类型从而知道使用方法等几乎一切信息 原理图上有很多信息 xff0c 到底怎么看呢 xf
  • 初学PX4之飞控算法

    通知 xff1a 如果你对本站无人机文章不熟悉 xff0c 建议查看无人机学习概览 xff01 xff01 xff01 注意 xff1a 基于参考原因 xff0c 本文参杂了APM的算法分析 本篇文章首先简述了下px4和apm调用姿态相关应
  • Pixhawk之姿态控制篇

    一 开篇 姿态控制篇终于来了 来了 来了 心情爽不爽 xff1f 愉悦不愉悦 xff1f 开心不开心 xff1f 喜欢的话就请我吃顿饭吧 xff0c 哈哈 其实这篇blog一周前就应该写的 xff0c 可惜被上一篇blog霸占了 但是也不算
  • PX4原生固件SPI驱动动编写与IMU传感器替换

    适用于PX4原生固件 核心目标 xff1a 完成XSENS的MTI3 xff0c IMU替换 MTI3是一款航姿参考系统 xff0c 可以独立的输出四元数 xff0c 加速度 xff0c 磁力计等 xff0c 角速度等航姿信息 里面有完整的