px4原生源码学习二--实时操作系统篇

PX4代码解析(1) 前言 做pixhawk飞控有一段时间了,但在学习过程中遇到许多困难,目前网上找不到比较完整的PX4学习笔记,我打算结合自己理解,写写自己对PX4源码的理解,不一定对,只是希望与各位大佬交流交流,同时梳理一下无人机知识。 目前打算分享以下几个内容:代码架构;通信协议;姿态解算算法,控制算法。先这样,后面想到再加。本章先来聊聊px4代码结构 一、代码整体结构 既然要聊px4代码结构,那就先把px4代码结构图放出来,因为px4源码仍然在不断更新迭代,因此老版本与新版本目录结构可能有些不同,我的代码解析参考版本为V 阅读详情
/**************************************************************************************************************

  po上我使用到的硬件和开发环境

  px4硬件:某宝销量最高的pixhawk套件(主机,gps+指南针,数传,pwm转pmm,安全开关,蜂鸣器,电源转换接头)

  遥控器:某国产神器

  开发环境:虚拟机vm12+ubuntu14

 ps:此文章只针对纯代码分析,关于那些个飞机类型啦,硬件什么的我就不多说了,这个得自己去亲身体验才行,切不可贸然飞行,这个还是很危险的!!!!!

 还有就是什么Git,Linux,make什么的也不会多说,毕竟只是工具属性。

 获得更好支持可以访问http//:px4.io 我知道的大部分来自这个网站。

  **************************************************************************************************************/


    为什么我要谈到实时操作系统?首先据我所知,国内除了软件工程专业和计算机专业,其它专业应该很少会开操作系统这门课程,对于广大的自控和电子专业的学生来说,其实这非常不利的!!!!如果你只是开发一个简简单单的单片机程序,不用考虑以后对于程序的升级与修改,那么你简简单单写个main函数的while循环其实没什么不好。但你要遇到那种开发周期长,系统复杂的产品或者项目,那最好是基于实时操作系统开发,因为这对于代码重用和添加新功能或者新设备来说会方便挺很多,代码的编写程度也会简单很多。像早期的apm飞控也是基于板子的main函数,导致其代码复杂,冗余,后面直接被弃,因为可能每添加一个功能或者设备,代码就可能要重构。我们要讲的px4飞控其实也是基于一个叫做Nuttx的实时操作系统的(在此提醒各位拿到代码找main函数的同志们,不要白费力气,你找不到的,因为确实系统不是main函数启动的!!!,后面我会专门讲一下px4是如何启动的),其实我没猜错的话大疆飞控用的应该是在国内外很出名的开源实时操作系统µC/OS。所以要更好理解px4,就一定要有操作系统概念。下面我就基于两点谈谈:第一:什么是实时操作系统,第二:px4的实时操作系统Nuttx。



     首先谈谈操作系统,说到操作系统,大家首先会想到windows,linux或者Mac os,亦或者手机的一些操作系统。没错这些都是操作系统,但这些操作系统和今天要谈的实时操作系统有一些基本的概念和理论都是一样的,但他们又有一些不同。

   相同点:所以操作系统无非由以下四大部分组成(熟记这四个模块):

                   1.任务调度

                   2.内存管理

                   3.文件系统

                   4. I/O

     对于主流的操作系统而言,这四个缺一不可!!,而对于一些非常简单的实时操作系统可能会没有3和4。

     px4所使用的的Nuttx这四个模块都有。

     什么是任务调度(很多课本上会说进程管理,但后面操作系统发展出了线程,这个说法其实不严谨)?

     想想你日常使用的手机,有各式各样的APP,其实每个APP都可以把它抽象为一个简单的task(任务),你在各个APP之间切换自如,包括有一些后台运行的APP,假设你手机是单核的,一次只能运行一个task,那手机是怎么实现后台运行多个APP的呢?这个就得归功于操作系统的任务调度功能,由于大部分的APP都不会涉及到太多的计算,所以这些APP真正使用CPU的时间少之又少,大部分时间是在等待输入和输出操作的,这个时候就可以把他们挂起,让别的task使用CPU了,由于这个切换很快,你感觉不到,所以你就感觉事实上有多个程序在同时运行。

    简单点说任务调度就是一个程序,这个程序决定其他程序什么时候使用CPU,什么时候挂起。

    上面的说法就引出了一个问题,如果同时有两个task都要求使用CPU呢?怎么办!谁先用?这就引进了另外一个概念:优先级。谁优先级高谁用CPU。而这个就是实时操作系统同普通操作系统的区别。实时操作系统有严密的等级制度和相应制度即:高优先级task抢低优先级task (即使这个task在用CPU)CPU,对于高优先级的程序,要求系统有快速的反映时间(这是衡量一个实时操作系统好坏的主要标准)。

    什么是内存管理?

    程序要运行首先要干嘛?要把它从ROM(可理解为硬盘)里面加载到RAM(可理解为内存)里面。如果单片机就跑一个程序,整个内存都是你的,你想怎么用就怎么用。可是引入操作系统后,要对多个task进行调度,就得把他们全部加载到内存中,可是毕竟单片机或者mcu的内存有限(即使电脑的也有限),这就引出了内存管理。

   简单点说内存管理也是一个程序,这个程序决定谁驻留在内存,谁离开内存。

    
  什么是文件系统?

  在ROM里面保存的东西,如果是少量的东西,你可以随便保存。可是当你有几十个g种子的时候,你也直接用单片机的方式一个一个写到flash里面!!!你杂乱无章的保存会导致后面查找,删除,修改变得非常麻烦,使用我们要用文件系统来帮我们管理这些个文件,而我们只要对文件系统进行操作就能对文件操作了。

  简单点说文件系统是一个程序,它帮我们管理我们的文件,使我们操作文件更方便。

  什么是I/O?

   CPU不能独立的存在,它得和周围的设备通信,内存也好,flash也罢,这些都可以通归为I/O设备。对于px4来说I/O设备就更多了,什么gps,陀螺仪,加速计,气压计,空速计,pmm输入等等,还在一直加呢!我们自己写个main数,也可以读出这些设备的数据,但在操作系统中,对这些设备进行操作就不是那么简单了。由于I/O算的上计算机组件当中最复杂的东西了,你不能简简单单把它归类为某个程序。Unix系统对I/O设备有个很好的抽象:文件。Unix系统中把所有东西都抽象成文件,I/O设备是一种特殊的文件。因为事实上我们并不关心你I/O设备是什么,我们只想要其中的数据,文件可以存取数据,传感器数据不断更新,我就不断更新这个文件内容,其他程序想要里面的数据可以去读这个文件就行。

   不同系统对于I/O管理的理念大不相同,我无法把它抽象为一个程序或者文件,后面我会针对Nuttx的I/O谈谈。


  px4的实时操作系统Nuttx
   
    首先说说px4和Nuttx的渊源:PX4是一个软、硬件开源项目(遵守BSD协议),目的在于为学术、爱好和工业团体提供一款低成本高性能的高端的自驾仪。这个项目源于 ETH Zurich (苏黎世联邦理工大学)的计算机视觉与几何实验室的PIXHAWK项目、并得到了自主系统实验室和 自动控制实验室的支持。而Nuttx也是苏黎世联邦理工大学
的一个开源项目(这个学校在计算机方面可能算的上是欧洲最强的了,那个提出最短路径算法和信号量的教授就是这个学校的)。所以他们两个就走到了一起。

  下面背下书:NuttX 是一个实时操作系统(RTOS),强调标准兼容和小型封装,具有从8位到32位微控制器环境的高度可扩展性。NuttX 主要遵循  Posix 和 ANSI 标准,对于在这些标准下不支持的功能,或者不适用于深度嵌入环境的功能(如 fork()),采用来自 Unix 和常见 RTOS (如 VxWorks)的额外的标准 API。


   下面一篇文章我将着重讲解一下Nuttx系统的使用。

px4固件源码分析(文件夹作用以及总体架构) px4固件源码分析[文件夹作用以及总体架构]总体概述总体构架代码分块 总体概述 px4是一个操作系统,其中运行着很多程序(类比windows),比如我们十分感兴趣与关心的姿态解算、位置解算、姿态控制、位置控制等。每一个程序之间通过UORB通信。 总体构架 PX4固件可以分为三大部分:实时操作系统、中间件和飞行控制栈 Nuttx实时操作系统 PX4中间件:设备驱动与微对象请求代理(micro object request broker,uORB) PX4飞行控制栈:此部分可以细分为 决策导航部分 位置姿态 阅读详情

相关推荐

px4原生源码学习-(4)--Nuttx 实时操作系统编程

前面说到px4是基于Nuttx实时操作系统上的,那么px4也是由一些程序所构成,这些程序实现了飞行器的自主控制,只不过这些程序并不是我们通常所见到的单片机或者windows编程那样的程序,但基本编程思想是一致的。我认为如果要看懂px4的源码,那你一定要了解px4的那些程序是怎么编写出来,怎么运行的。所以本章我就大概介绍一下基于Nuttx的编程,我以一个所有编程入门都会介绍的一个程序作为例子。这个程

lyonlui的博客 1万+

【PX4-AutoPilot教程-源码】PX4源码文件目录架构分析

PX4源代码的结构复杂,本文介绍了源代码的总目录结构(以v1.13.0为例)。

在后厂村路努力科研搬砖的无人机控制方向练习生一名~ 1万+

px4原生源码学习-(3)--Nuttx实时操作系统的使用

/**************************************************************************************************************   po上我使用到的硬件和开发环境   px4硬件:某宝销量最高的pixhawk套件(主机,gps+指南针,数传,pwm转pmm,安全开关,蜂鸣器,电源转换接头)   遥

lyonlui的博客 1万+

px4原生源码学习-(2)--实时操作系统篇

/**************************************************************************************************************   po上我使用到的硬件和开发环境   px4硬件:某宝销量最高的pixhawk套件(主机,gps+指南针,数传,pwm转pmm,安全开关,蜂鸣器,电源转换接头)   遥

lyonlui的博客 7351

px4源码学习三--px4源码结构分析

px4源码结构分析Px4源码目录

znr1995的博客 5892

Windows下编译PX4源码并连接simulink

需要做pixhawk与matlab的联合仿真,对于常用windows不怎么使用ubuntu开发的同学,在虚拟机上编译px4显得相当繁琐。本文提供了在windows下编译px4源码的方法,可以使用cygwin工具链在控制台进行开发。最后,将pixhawk连接matlab,实现在simulink中传输传感器数据。...

Sanmmul的博客 6350

【Pixhawk】PX4源码控制逻辑详解(以UGV小车为例)

PX4启动流程 主体控制逻辑 commander:飞行模式控制 stickmapper:摇杆映射 position_estimator:从GPS获得的位置估计 navigator:读取航点,产生期望位置 pos_ctrl: 位置控制 attitude_estimator: 从IMU获得的姿态估计 att_ctrl: 姿态控制 mixer: 混控器根据机型分配力矩 详细控制逻辑(含数据结构体) 以UGV小车为例 1.在FIRMWARE/ROMFS/px4fmu_common/init.d/rc.ro

徐腾腾的博客 6002

PX4环境搭建、源码下载、编译

PX4环境搭建、源码下载、编译第一步:前期环境搭建第二步:编译源码第三步:下载指定版本源码 第一步:前期环境搭建 按照英文官网来即可。 注1:ubuntu_sim_nuttx.sh 下载方法:点开官网中的那个链接之后,右键另存为即可下载到本地。 注2:不要按照中文官网来,构建了几次,总是在 gcc-arm-none-eabi 这一步遇到问题,而且很难解决,建议耐心点,按照英文的来。 第二步:编译源...

weixin_42108684的博客 7878

px4原生源码学习-(1)

接触px4代码有几天了,想把自己所学所想记录下来.   px4就不过多介绍了,算得上目前使用的最广泛的开源飞控了。为什么说”px4原生代码学习呢”,这还得追溯到被大疆干死的3DR,3DR想做消费级无人机,但苦于团队难建,所以索性就纠集起那几个著名的开源飞控团队,让大家一起搞一起发财(熟知还是被大疆搞死),但还是留下了这个宝贵的开源飞控遗产。这些开源团队中出名的当数APM团队和pixhawk团队,

lyonlui的博客 1万+

不必通宵挂机,飞速克隆PX4源码的方法

不必通宵挂机,飞速克隆PX4源码的方法 国内github网速,那是慢的没法说,克隆个PX4源码要半天,然后更新子模块,那不得需要一夜的时间,有时早上一来,刷刷的提示更新失败,那也得继续更新啊,几天都不一定能搞定。介于以上,好在我们国内也有git服务器,接下来我们可以把px4的源码fork到国内的码云上,然后打开**.gitmodules**文件,把其中需要clone的子模块全部fork到码云上,当...

Zipout的博客 6035

PX4代码解析(2)

前言 在大致了解PX4代码架构后,我们需要了解PX4的通信机制。在PX4代码架构中,通信总线主要分为两个部分,一是内部通信总线uORB,二是外部通信总线Mavlink,

qq_36903625的博客 6911

PX4从放弃到精通(二):ubuntu18.04配置px4编译环境及mavros环境

先安装git git clone https://github.com/PX4/Firmware.git --recursive cd Firmware bash ./Tools/setup/ubuntu.sh 安装完重启电脑编译 如果报错一般是网速问题,重新执行脚本

超维空间科技的博客 6万+

PX4开发环境搭建--源码下载+基本工具链

PX4 开发环境搭建(2022.5.28)前言一、基本工具二、基本步骤1.安装虚拟机和Ubuntu操作系统注意2. 修改虚拟机上源网站(1)备份原来的sources.list(2) 打开sources.list进行修改(3)刷新列表附:apt命令介绍3. 配置虚拟机上git环境4. 下载PX4(包括子模块)源码5. 配置PX4所需库和工具总结

SteviaSong的博客 5265

PX4原生固件源码分析(挖坑)--1、代码结构

写在开头 最近开始学习PX4源码,并进行二次开发,苦于网上缺少有关PX4源码的分析,于是在这开个坑,记录自己学习PX4的过程,以此自勉,笔者第一次写博客,若有不足之处,还请多包涵。 硬件、固件版本 硬件:雷迅V5+飞控 固件版本:v1.11(PX4固件源码在20年有一次很大的改动) ...

lmh081910的博客 6865

PX4学习笔记

目录网址Pixhawk、PX4、APM 、 ArduPilot关系硬件照片、示意图逻辑图 集多旋翼控制框架软件框架辅助工具、软件说明(误区)裸机运行基于OS运行例子可执行程序、应用、源码(代码)、进程、线程源码、固件的区分Pixhawk的启动流程大概逻辑 网址 PX4原生固件及其地面站网址 https://github.com/PX4 http://px4.io/ https://github.com/mavlink/qgroundcontrol 原生固件代码:C++,构架清晰,容易维护修改,多进程 目

记录老板的每次pua,分享领导每天的毒鸡汤... 1万+

px4飞控源码

px4飞控源码,来自github。。。。。。。。。。。。。。。。

【Pixhawk】Ubuntu下编译原生固件PX4

环境: PC:Ubuntu20.0.4主机 1、下载PX4源码 新建一个pixhawk/source目录,cd进去git源码 cd pixhawk/source git clone https://github.com/PX4/Firmware.git 下载完成后,该目录下会出现一个Firmware目录 2、更新子模块 到Firmware目录中更新子模块 cd Firmware git submodule update --init --recursive 中途可能因为网络原因卡住,直接ctrl+

徐腾腾的博客 5731

冰河木马实验(V8.4)

简述: 百科词条 冰河木马开发于1999年,跟灰鸽子类似,在设计之初,开发者的本意是编写一个功能强大的远程控制软件。但一经推出,就依靠其强大的功能成为了黑客们发动入侵的工具,并结束了国外木马一统天下的局面,跟后来的灰鸽子等等成为国产木马的标志和代名词。 冰河的服务器端程序为G-server.exe,客户端程序为G-client.exe,默认连接端口为7626。其中攻击者使用G-client.e...

野原新之助 1万+

PX4源码学习(一):结构概述

最近在做PX4固件的移植开发工作,由于之前没有这方面开发经验,加之PX4源码又比较庞杂,所以想要通过一点一点的学习梳理和实践,使这部分工作能够尽快开展起来。博客中如有错误,恳请大家指正,同时欢迎小伙伴们一起交流学习。 PX4飞控源码系统框架介绍: 注:本篇内容中所编译的PX4 固件版本为v1.11,以 px4_fmu-v2_default 为例。 一、boards 各种不同的飞控板硬件配置文件。 二、px4_fmu-v2_default 编译后生成的文件,其路径为:Firmware/ bul

Kunfly的博客 3507

使用MeshLab高效对齐3D模型:从OBJ导入到坐标修正全流程

本文详细介绍了使用MeshLab高效对齐3D模型的全流程,涵盖从OBJ导入、坐标修正到最终导出的核心步骤。通过将模型中心归位至坐标原点,并利用主轴对齐功能快速摆正模型,为后续的3D打印、体素化等处理奠定精确的几何基础。

weixin_29313423的博客 92

CentOS 7 安装 Python 3.10

我这里已经软链接了,正常未链接之前是python->python2.7而不是python3.10。python2.7默认安装是在 /usr/bin目录中,切换到/usr/bin/更改yum配置,因为其要用到python2才能执行,否则会导致yum不能正常使用。2. 安装 Python 3.10 必需的 openssl >= 1.1.1。默认的centos7是没有安装pip,先添加epel扩展源。/usr/bin/python 修改为如下。添加软链接,将原来的链接备份。添加python3的软链接。

bensonyang888的博客 2905
上一篇: px4原生源码学习一
下一篇: px4原生源码学习三--Nuttx实时操作系统的使用
csshuke
博客等级 码龄16年 1517粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值