快播

曼谷 人妖你的位置:快播 > 曼谷 人妖 > cosplay 足交 Pixhawk系统架构先容

cosplay 足交 Pixhawk系统架构先容

发布日期:2025-04-16 08:09    点击次数:55

cosplay 足交 Pixhawk系统架构先容

      前段期间导师叫我作念扑翼无东说念主机,工程上需要扫尾的,无意通过程控飞起来cosplay 足交,嗅觉难度挺大。先从盘考PX4动手,缱绻一步步意会透所有这个词这个词PX4的框架,机型的适配、旋翼、固定翼的姿态逼迫,新机型的添加等等。不知说念能不行作念成,这里先立个flag吧。

    这篇文档是我课程功课的一个回报,包含4个方面,硬件架构分析,Linux开发环境搭建,软件架构分析,源代码分析等。由于源代码相比紊乱,这里简要分析下飞机的返航逼迫(RTL),旋翼的混控器,以及uORB的使用三个方面。

Pixhawk是一个孤立的名堂,旨在以低资本和高可用性为学术界,业余深爱界和工业界提供高端行业法式自动驾驶仪硬件。由于其庞大且丰富的硬件而广受无东说念主机深爱者的好评。Pixhawk营救APM和PX4的固件,这里咱们对原生的PX4固件作念软件架构分析。关于Pixhawk的系统架构分析我将从四方面来伸开,分别是:硬件架构先容、PX4开发环境搭建、PX4软件架构分析及追忆。这里咱们主要对软件架构伸开分析,说明架构的档次性对PX4中的导航模块、Mixer模块和uORB模块作念分析和先容。

要害词:Pixhawk、PX4、硬件架构、软件架构、uORB

1硬件架构分析

    Pixhawk是一款基于ARM芯片的32位开源飞控,由ETH的computer vision and geometry group的博士生Lorenz Meier开发。当先采纳的是分阵势的设想即px4(由px4fmu和px4io两个组件构成),后合并成一个合座酿成目下的pixhawk。其硬件和软件都开源,因此繁衍出好多不同的软硬件版块,当先的分销商是好意思国的3D Robotics。PIXHAWK是一款高性能自动驾驶仪,适用于固定翼,多旋翼,直升机,汽车,船只以及任何可移动的其他机器东说念主平台。它针对高端盘考,业余和行业需求,并聚首了PX4FMU PX4IO的功能。Pixhawk的外形如图1所示:

图片

图1 Pixhawk外形及接口

    Pixhawk采纳带有FPU的32位STM32F427芯片,它的采纳Cortex M4内核,主主频为168M,具有252MIPS的运算才略、256KB的RAM以及2MB的闪存,同期具有一派型号为STM32F103的故障协处理器芯片。在传感器的选用上头,它选用ST公司的MicroL3GD20H 16位陀螺仪和MicroLSM303D 14位加快度计/磁力计,选用Invensense公司MPU 6000 3轴加快度计/陀螺仪,采纳MEAS公司的MS5611气压计。同期领有格外丰富的硬件接口,它领有5个UART(串行端口),其中一个具有高功率,2个带HW流量逼迫,2个CAN(一个带里面3.3V收发器,一个带扩张勾通器)接口,Spektrum DSM / DSM2 / DSM-X卫星兼容输入接口,FutabaS.BUS兼容输入和输出接口,PPM和信号输入接口,RSSI(PWM或电压)输入接口,同期还有I2C、SPI、ADC、里面和外部microUSB接口等等。其丰富的接口不错欢快任何可移动的机器东说念主平台的需要。在电力系统与保护方面,Pixhawk具有自动故障迁徙功能的梦想二极管,无意适合大功率的伺服电机(最大10V)和大电流(10A ),所有这个词外围输出均过流保护,所有这个词输入均受ESD保护。Pixhawk提供三个电源,它不错在电源上扫尾三重冗余。三个电源分别是:电源模块输入,伺服电机输入,USB输入。它优先使用电源模块的输入,电压畛域为4.8V到5.4V,其次是伺服电机的电压输入,电压畛域也为4.8V到5.4V,终末聘请USB的电源输入,电压畛域亦然一样的。Pixhawk的道理图不错从https://raw.githubusercontent.com/PX4/Hardware/master/FMUv2/PX4FMUv2.4.5.pdf处下载。

Pixhawk的硬件架构合座框图如图2所示:

图片

图2 硬件框架

    由图中的内容不错看出硬件的约莫框架,STM32F427芯片动作主控器承担着一起传感器的数据读写,姿态的结算及逼迫,以偏激他信息的处理和逼迫。电源系统不仅为电机电调提供电源,同期还承担着主逼迫器器和所有这个词模块的电源供应。关于其它外围系统以及和主控器的通讯步地分别如下所示:能源系统由主控器的四路PWM逼迫,调试系统通过microUSB接口和主控器交互,文献系统通过SDIO合同和主逼迫器交互,数传系统通过433M模块和主控器交互,遥控系统通过SPI合同和主逼迫器交互,导航系统通过RTMC合同和主控器交互,定高及姿态逼迫系统都是通过I2C合同和主控器交互。这里相比故障协处理器相比道理,当飞机的主逼迫器跑飞或者发生其他诞妄导致无法对电机进行逼迫时,不错由协逼迫器感知到,进而获取电机的逼迫权,将电机逼迫在安全的模式下,直到检测到主控器对电机的逼迫规复泛泛。协逼迫器不定时的读取主控器的DMA计数寄存器,当此次计数寄存器的值和上去读取到的值一致时证明主控器莫得对电机的PWM进行更新,主逼迫器失去了对电机的逼迫,这时协逼迫器得知主逼迫器极端,动手接管对电机的逼迫,直到DMA计数器更新,主逼迫器规复对电机的逼迫。

2 PX4开发环境搭建

    PX4代码不错在 Mac OS,Linux 或者 Windows上进行开发,忽视在Mac OS和Linux上进行开发,因为图像处理和高档导航在windows上拦阻易开发。如果省略情,新的开发者应默许用Linux和刻下Ubuntu耐久营救版块(Ubuntu LTS edition)。如果对Docker纯属,你不错使用其中一个容器来装置开发环境。

    咱们使用Debian /Ubuntu LTS 动作Linux的法式营救版块,在这里我的Linux版块为Ubuntu 16.04。

2.1 权限树立

    为了便于开发,咱们需要把用户添加到用户组”dialout”中,实践:

sudo usermod -a -G dialout $USER

    然后刊出后,再行登录,因为再行登录后所作念的改造才会有用。瞩目:永恒不要使用sudo来诞生权限问题,不然会带来更多的权限问题,需要重装系统来处置。

2.2 装置PX4的依赖包

    更新包列表,装置底下编译PX4的依赖包。先装置cmake,实践:

sudo add-apt-repository ppa:george-edison55/cmake-3.x -y

sudo apt-get update

    装置必备的软件,比如python、git、qtcreator等等:

# 必备软件

sudo apt-get install python-argparse git-core wget zip \

    python-empy qtcreatorcmake build-essential genromfs -y

装置一些仿真用具:

# 仿真用具

sudo add-apt-repository ppa:openjdk-r/ppa

sudo apt-get update

sudo apt-get install openjdk-8-jre

sudo apt-get install ant protobuf-compiler libeigen3-devlibopencv-dev openjdk-8-jdk openjdk-8-jre clang-3.5 lldb-3.5 -y

2.3 装置交叉编译用具链

Ubuntu配备了一系列代理料理,这会严重阻止任何机器东说念主有关的串口(或usb串口),卸载掉它也不会有什么影响,咱们这里把它卸载:

sudo apt-get remove modemmanager

更新包列表和装置底下的依赖包:

sudo apt-get install python-serial openocd \

    flex bison libncurses5-devautoconf texinfo build-essential \

    libftdi-dev libtoolzlib1g-dev \

    python-empy  -y

装置arm-none-eabi编译用具链,在添加arm-none-eabi用具链之前,请确保删除残余:

sudo apt-get remove gcc-arm-none-eabi gdb-arm-none-eabibinutils-arm-none-eabi gcc-arm-embedded

sudo add-apt-repository --remove ppa:team-gcc-arm-embedded/ppa

如果需要在树莓派上开发则需要装置树莓派上关于的用具链。树莓派开发者应该从底下地址下载树莓派Linux用具链。装置剧本会自动装置交叉编译用具链:

git clone https://github.com/pixhawk/rpi_toolchain.git

cd rpi_toolchain

./install_cross.sh

在用具链装置过程中需要输入密码。如果不想把用具链装置在默许位置/opt/rpi_toolchain,不错实践./install_cross.sh<PATH>向装置剧本传入其它地址。装置剧本会自动配置需要的环境变量。终末,运行以下高歌更新环境变量:

source ~/.profile

2.4 代码编译

    开发环境搭建好之后,就不错动手下载代码并编译了,PX4不错在逼迫台或者图形界面/IDE开发。在这里咱们对逼迫台的开发进行简要先容。

    先建立职责目次,然后从git险峻载代码:

mkdir -p ~/srccosplay 足交

cd ~/src

git clone https://github.com/PX4/Firmware.git

cd Firmware

git submodule update --init --recursive

cd ..

    目下不错通过编译源代码来构建二进制文献。在平直使用硬件前,推选先进行仿真。然后就不错对代码进行编译并下载了:

cd Firmware

make px4fmu-v2_default

    瞩目到“make”是一个字符高歌编译用具,“px4fmu-v2”是硬件/ardupilot版块,“default”是默出嫁置,所有这个词的PX4编译主义顺从这个规定。通过在高歌后头添加'upload’,编译的二进制要害就和会过USB上传到飞控硬件。下载奏效后的情况如下所示:

图片

    天然这么编译后的代码是无法平直让航行器飞起来的,如果但愿下载无意让我方飞机飞起来的代码忽视下载QGroundControl大地站软件,按照软件的请示来聘请我方的机型,改造传感器,一语气遥控器,调试参数等操作。

3 PX4软件架构分析

    PX4的软件架构将会从4方面来伸开发达,分别是:软件框架的分离,代码文献结构,航行逼迫进程以及源代码分析。其中源代码分析将挑选具有代表性的返航逼迫模块,混控器以及uORB中间件来分析,这三部分分别从属于软件框架档次中的独揽要害框架,库和操作系统。

3.1软件框架的分离

    PX4的代码开源在Github上,从https://github.com/PX4/Firmware上不错下载到源代码。PX4的软件建立在Nuttx操作系统上,它的大体框架如图3所示:

图片

图3 软件框架

    说明PX4软件的运作,同期为了便于咱们更好的意会,它不错分离红四个档次:

学生妹av

1)    独揽要害的API:这个接口提供给开发东说念主员,比如使用ROS(及时操作系统)或DroneAPI(DroneAPI是一个用于逼迫无东说念主机的Python库,不错单独的运行在机载电脑或者其他迷惑上,通过串口或者无线的步地与飞控板通讯),这一层旨在尽可能的精简、扁平及荫藏其复杂性。

2)    独揽要害框架: 这是为操作基础航行逼迫的默许要害集(节点)。比如旋翼的逼迫、直升机的逼迫、固定翼的逼迫等,还有位置算计、高歌逼迫、导航逼迫等。

3)    库: 这一层包含了所有这个词的系统库和基本交通逼迫的函数。比如数学库、逼迫库、MAV库等等。

4)    操作系统: 终末一层提供操作系统营救,比如任务的调度,硬件驱动要害,汇聚,UAVCAN和故障安全系统等功能。

3.2 文献结构

    分析完结合座的框架,对源代码文献结构的分析也雷同伏击,源代码的目次结构如图4所示。在firmware文献夹下有好多文献夹,咱们按照图片中的章程来栽种每个文献夹中代码的功能。其中cmake是编译用具;build_px4fmu-v2_default是在编译后产生中间静态文献和最毕生成的下载文献;src包含航行逼迫的主要代码;nuttx-config是nuttx的配置文献;tools文献夹下包含一些用具,比如下载用具;Nuttx里面则是Nuttx操作系统的源代码;ROMFS里面包含的是飞控板的启动代码。

    底下先容格外伏击的src文献夹里面包含的内容。systemcmds:主要摒弃了系统用具,无意通过启动文献启动或在nsh中去调用的用具。其中包括逼迫I2C,稽察修改参数,稽察软件版块,校准电调、稽察系统性能、bootloader升级等用具;drivers里面包含的主若是和硬件有关的驱动代码,比如stm32文献夹底下包括adc的基类、高精度定时器、伺服逼迫的驱动要害,device文献夹底下包含外设的基类界说,比如I2C和SPI等,boards目次下界说了这个型号的板子的接口配置以及相应配置接口(LED、PWM、USB、定时器等的配置);examples底下包含一些约略的实例要害,如果有一些实验性的代码不错放到这底下;include目次和lib目次包含其他代码需要用到的头文献和库;platforms底下界说了px4平台的系统接口浅易和nuttx操作系统分离,这么浅易移植到其他平台;modules底下分了好多文献夹,这些文献夹各自是不同的模块,这便是最表层的功能模块包括commder、navigator、mc_att_control、mc_pos_control等。

图片

图4 文献结构

3.3 航行逼迫进程

    航行逼迫的进程如图5所示。图中的左边是飞控系统的逼迫功能扫尾,咱们从上往下,从左往右按序分析。

1)    用户通过大地站或者遥控器发出模式切换以及摇杆操作对航行器进行逼迫,commander说明航行器确刻下情状对用户想要切换到的情状main_state进行判断:是否无意切换到主义情状,详情最终情状。stickmapper见名知意,摇杆映射,参见px4io.c、sensors.cpp文献。

2)    navigator决定航行器最终会何如作念航行模式nav_state的挫折,以及对应模式下飞机的航行逼迫。

3)    位置逼迫索取local postion(光流 IMU)或global postion(GPS)数传说明导航情状进行串级PID逼迫。外环输入位置差输出速率,内环输出推力。

4)    姿态逼迫采纳倾转分离的解耦合逼迫步地,先对皆Z轴再对皆偏航角。雷同采纳串级PID的逼迫步地,外环输入姿态角纰谬,输出姿态角速率,内环终末输出所需的力矩。

5)    mixer混控器说明机型进行力矩分拨。说明叶素表面,螺旋桨旋转产生的s升力/扭矩与转速的平方以及拉力所有这个词/扭矩所有这个词有关。构造力矩分拨矩阵。

6)    motor_driver驱动电机,逼迫航行器航行。

左边是位置算计较法的扫尾,GPS详情global postion,optical flow详情local postion,二者有其一材干参预到POSCTL模式。姿态算计是一切的基础,通过交融惯性传感器(和光流)各自优点解算出航行器确刻下姿态信息。

图片

图5航行逼迫进程

3.4 源代码分析

    在这里咱们将聚首源代码分析3个模块的功能及扫尾,分别是RLT(Return to launch返航逼迫)模块,mixer(混控器模块),uORB(Micro Object Request Broker,微对象肯求代理器)音信中间件。

3.4.1 RTL

    RTL(return to launch,返航模式)是独揽要害框架Navigator中的一部分。它的功能顾名想义便是提供返航功能,复返并降落到“家”的位置。当航行模式切换到返航模式时,航行器会先爬升到返航设定的最低的高度,然后再家的上方悬停几秒(可设定),终末降落到“家”的位置,即航行器腾飞的位置或者说是航行器解锁时的位置。在RTL逼迫中,把返航航行分离红了7个部分,如图6所示。

图片

图片

图6 返航航行的分离

    航行模式相对应的逼迫函数存储在_navigation_mode_array的数组里面,如图7所示,比如RTL模式的逼迫函数存放在第3个位置,在导航函数中对依期的查验刻下的模式,然后运行刻下模式的代码,如图8所示。当第一次运行_rtl函数时需要先调用on_activation()函数,非第一次运行_rtl函数则运行on_active函数,因为在第一次运行时需要对飞机进安全性查验,具体不错看图9的on_activation()函数,将按序进行如下判断:

1)    如果刻下仍是着陆,作假践。

2)    如果刻下正在实践降落高歌,则平直切换到RTL_STATE_RETURN。

3)    如果高度小于最小返航高度,则爬升到设定高度,如果大于最小高度,则以刻下高度返航。

4)    其他情况平直切换到RTL_STATE_RETURN。

5)    终末实践set_rtl_item函数,为不同情状实践不同的逼迫。

图片

图7 _navigation_mode_array

图片

图8 导航模式的轮询

图片

图9 on_activation()函数

3.4.2 mixer

Mixer(混控器)是说明机型进行力矩分拨的库,有了混控器使得PX4架构保证了中枢逼迫器中不需要针对机身布局作念极端处理。混控指的是把输入指示(例如:遥控器打右转)分拨到电机以及舵机的实践器(如电调或舵机PWM)指示。关于固定翼的副翼逼迫而言,每个副翼由一个舵机逼迫,那么混控的酷好便是逼迫其中一个副翼抬起而另一个副翼落下。雷同的,对多旋翼而言,俯仰操作需要改造所有这个词电机的转速。将混控逻辑从践诺姿态逼迫器均分离出来不错大大进步复用性。Mixer简要的逼迫进程是这么的,一个特定的逼迫器(如姿态逼迫器)发送特定的归一化(-1.. 1)的高歌到给羼杂(mixing),然后羼杂后输出孤立的PWM到实践器(电调,舵机等).在经过输出驱动如(串口,UAVCAN,PWM)等将归一化的值再转回脾气的值(如输出1300的PWM等)。在混控器中每个机架都会有我方关于的混控文献,比如旋翼关于的混控文献是mixer_multirotor.cpp。

这里拿四旋翼的X模式来例如证明一下,机架的轴向及力矩分拨矩阵如图10所示:

 

图片

图片

图10 机架轴向及力矩分拨矩阵

    力矩分拨矩阵中,每一滑代表一个电机,而况和它们的编号章程疏通,第1列到第三列分别代表的是Roll、Pitch和Yaw轴的输入。比如刻下需要加大Roll轴的角度,其他轴的的角度保执不变,那么2,3号的电机转速应该加多,1,4号电机的转速应该较小,对比在力矩分拨矩阵上你不错看到,第2,3行的第一列是恰巧,久了转速和Roll的盼望角度正有关,第1,4行是负值,代表和Roll的角度负有关。

    在混控器文献中,最先会得到某个通说念在对应轴向的力矩输入,比如说来自飞机姿态逼迫器的输入,或者是逼迫器的输入等,畛域会逼迫在-1~1之间,得到输入后,混控器会把输入力矩的大小羼杂映射到每个电机上,雷同每个电机得到幅度为0~1畛域内的输出(0代表停转,1代表满转),终末把这个输出值计较出PWM的占空比,然后通过电调来退换电机的转速。混控器的逼迫进程分为底下几步:

1)    读取逼迫通说念的输入。

2)    先对Roll、Pitch的输入通说念进行计较,得到输出值,因为姿态退换中最先探讨的是Roll和Pitch是否巩固,联系于Yaw则莫得那么伏击,然后说明计较得到的最大最小值判断是否富余。富余的酷好便是说每个电机的的输出是否进步了0~1的畛域,如果进步和0~1的畛域然则最大最小值之间莫得进步1,则不错通过平移来处置,如果幅度进步了1,则需要通过缩放处置。

3)    详情Roll和Pitch轴不错欢快输出条件后,这时加入Yaw,再次计较是否富余,如果富余恰当退换油门来反映Yaw。

4)    终末得到每个电机的输出,判断改造幅度是否过大,作念一个限幅。

源代码分别如图11,12,13,14所示:

图片

图11 得到通说念0的输入

图片

图12 对Roll和Pitch轴进行重复计较

图片

图13 纪录下电机出入的的最大幅度

图片

图14 对电机的输出进行评议或缩放操作

3.4.3 uORB分析

    uORB(Micro Object Request Broker,微对象肯求代理器)是PX4/Pixhawk系统中格外伏击且要害的一个模块,它肩负了所有这个词这个词系统的数据传输任务,所有这个词的传感器数据、GPS、PPM信号等都要从芯片获取后通过uORB进行传输到各个模块进行计较处理。践诺上uORB是一套跨「程度」 的IPC通讯模块。在Pixhawk中,所有这个词的功能被孤立以程度模块为单元进行扫尾并职责。而程度间的数据交互就由为伏击,必须要无意恰当及时、有序的特色。

    Pixhawk使用的是NuttX及时ARM系统,uORB践诺上是多个程度开放归拢个迷惑文献,程度间通过此文献节点进行数据交互和分享。程度通过定名的总线交换的音信称之为主题(topic),在Pixhawk 中,一个主题仅包含一种音信类型,豪放点便是数据类型。每个程度不错订阅或者发布主题,不错存在多个发布者,或者一个程度不错订阅多个主题,然则一条总线上耐久唯有一条音信,如图15所示。

图片

图15 uORB订阅发布久了图

    在uORB中订阅或者发布主题的进程如图16所示,最先使用orb_subscribe订阅某个主题,订阅后获取一个句柄,对句柄运升沉化,比如说运升沉为检测POLLIN事件,之后使用poll函数来监视文献形容符,如果对应的践诺发生,使用orb_copy来获取对应的音信。

图片

图16 uORB订阅/发布数据进程

接下来对一些常用的uORB函数进行先容。

1)    int orb_subscribe(const structorb_metadata *meta)

功能:订阅主题(topic);证明:即使订阅的主题莫得被公告,然则也能订阅奏效;然则在这种情况下,却得不到数据,直到主题被公告;参数:    meta:uORB元对象,不错以为是主题id,一般是通过ORB_ID(主落款)来赋值;复返值:    诞妄则复返ERROR;奏效则复返一个不错读取数据、更新话题的句柄;如果待订阅的主题莫得界说或声明则会复返-1,然后会将errno赋值为ENOENT;eg:int fd =orb_subscribe(ORB_ID(topicName));

2)    int poll(struct pollfd fds[],nfds_t nfds, int timeout)

功能:监控文献形容符(多个);证明:timemout=0,poll()函数立即复返而不挫折;timeout=INFTIM(-1),poll()会一直挫折下去,直到检测到return > 0;参数:    fds:struct pollfd结构类型的数组;    nfds:用于标识数组fds中的结构体元素的总额量;    timeout:是poll函数调用挫折的期间,单元:毫秒;复返值:    >0:数组fds中准备好读、写或出错情状的那些socket形容符的总额量;    ==0:poll()函数会挫折timeout所指定的毫秒期间长度之后复返;-1:poll函数调用失败;同期会自动树立全局变量errno;

3) intorb_copy(const struct orb_metadata *meta, int handle, void *buffer)

功能:从订阅的主题中获取数据并将数据保存到buffer中;参数:    meta:uORB元对象,不错以为是主题id,一般是通过ORB_ID(主落款)来赋值;    handle:订阅主题复返的句柄;    buffer:从主题中获取的数据;复返值:    复返OK久了获取数据奏效,诞妄复返ERROR;不然则有说明的去树立errno;eg:    struct sensor_combined_s raw;orb_copy(ORB_ID(sensor_combined),sensor_sub_fd, &raw);

4)orb_advert_t orb_advertise(const struct orb_metadata *meta, const void *data)

功能:公告密布者的主题;证明:在发布主题之前是必须的;不然订阅者天然能订阅,然则得不到数据;参数:    meta:uORB元对象,不错以为是主题id,一般是通过ORB_ID(主落款)来赋值;    data:指向一个已被运升沉,发布者要发布的数据存储变量的指针;复返值:诞妄则复返ERROR;奏效则复返一个不错发布主题的句柄;如果待发布的主题莫得界说或声明则会复返-1,然后会将errno赋值为ENOENT;eg:    struct vehicle_attitude_s att;    memset(&att, 0, sizeof(att));intatt_pub_fd = orb_advertise(ORB_ID(vehicle_attitude), &att);

5)    int orb_publish(const structorb_metadata *meta, orb_advert_t handle, const void *data)

功能:发布新数据到主题;参数:    meta:uORB元对象,不错以为是主题id,一般是通过ORB_ID(主落款)来赋值;    handle:orb_advertise函数复返的句柄;    data:指向待发布数据的指针;复返值:OK久了奏效;诞妄复返ERROR;不然则有说明的去树立errno;eg:    orb_publish(ORB_ID(vehicle_attitude),att_pub_fd, &att);
4 追忆

Pixhawk硬件的功能仍是无意欢快绝大部分航行器的硬件需求了cosplay 足交,同期由于硬件开源的特色,服气以后的硬件功能也会越来越庞大。PX4软件代码建立在Nuttx操作系统上,巩固性不错得到很大的保险,其使用的uORB音信中间件本领也大大的简化了开发,同期PX4模块化的编程想想也为开发东说念主员的阅读和二次开发提供了很大的便利。

本站仅提供存储事业,所有这个词内容均由用户发布,如发现存害或侵权内容,请点击举报。

Powered by 快播 @2013-2022 RSS地图 HTML地图

Copyright Powered by365站群 © 2013-2024

top