转载:Pixhawk源码笔记一:APM代码基本结构

 

 

 

Pixhawk源码笔记一:APM代码基本结构

 转自 新浪微博@WalkAnt 

基础知识

        详细参考:http://dev.ardupilot.com/wiki/learning-the-ardupilot-codebase/

第一部分:介绍

        详细参考:http://dev.ardupilot.com/wiki/learning-ardupilot-introduction/

        ArduPilot 代码分为5个主要部分,基本结构分类如下:

  •  vehicle directories
  •  AP_HAL
  •  libraries
  •  tools directories
  •  external support code

1、vehicle directories模型类型

        当前共有4种模型:ArduPlane, ArduCopter, APMrover2 and AntennaTracker。都是.pde文件,就是为了兼容arduino平台,以后可能会放弃。

2、AP_HAL硬件抽象层

        硬件抽象层,使得在不同硬件平台上的移植变得简单。

        其中AP_HAL目录定义了一个通用的接口。其他的目录AP_HAL_XXX针对不同硬件平台进行详细的定义。例如AP_HAL_AVR目录对于AVR平台,AP_HAL_PX4对应PX4平台,AP_HAL_Linux对应Linux平台。

3、tools directories工具目录

        主要提供支持。For examples, tools/autotest provides the autotest infrastructure behind theautotest.diydrones.com site and tools/Replay provides our log replay utility.

4、external support code外部支持代码

        对于其他平台,需要外部支持代码。例如Pixhawk、PX4的支持代码如下:

  •  PX4NuttX – 板载实时系统。the core NuttX RTOS used on PX4 boards
  •  PX4Firmware – PX4固件。the base PX4 middleware and drivers used on PX4 boards
  •  uavcan – 飞行器CAN通信协议。the uavcan CANBUS implementation used in ArduPilot
  •  mavlink – Mavlink通信协议。the mavlink protocol and code generator

5、系统编译

        针对不同的硬件板,编译可以采用“make TARGET”的形式。

  •  make apm1 – the APM1 board
  •  make apm2 – the APM2 board
  •  make px4-v1 – the PX4v1
  •  make px4-v2 – the Pixhawk

        如果要移植到新的硬件,可以在mk/targets.mk文件中添加。

        比如: make apm2-octa -j8

        或者: make px4-v2 -j8

        采用8通道并行编译方式,针对APM、Pixhawk硬件板(AVR、STM32),编译八旋翼代码。

第二部分: 学习sketch例程代码

        http://dev.ardupilot.com/wiki/learning-ardupilot-the-example-sketches/

        sketch,是指使用 .pde 文件编写的主程序。

        开始之前,你可以试着阅读、编译并运行下面的sketches

  •  libraries/AP_GPS/examples/GPS_AUTO_test
  •  libraries/AP_InertialSensor/examples/INS_generic
  •  libraries/AP_Compass/examples/AP_Compass_test
  •  libraries/AP_Baro/examples/BARO_generic
  •  libraries/AP_AHRS/examples/AHRS_Test

        例如,下面的编译方法,将在Pixhawk上安装AP_GPS例程sketch。

               cd libraries/AP_GPS/examples/GPS_AUTO_test

                make px4-clean

               make px4-v2

               make px4-v2-upload

        正确理解sketch例程代码,我们以GPS_AUTO_test.pde代码为例(目录ardupilot\libraries\AP_GPS\examples\GPS_AUTO_test),主要几个特点:

        1、 pde文件包含很多 includes;

        2、 定义了 hal 引用声明;

        3、 代码非常粗糙;

        4、 setup() 和 loop()函数

1、include文件

        pde文件转变为C++文件后,提供必要的库引用支持。

2、hal引用声明

        定义如下:

        const AP_HAL::HAL& hal = AP_HAL_BOARD_DRIVER;// pixhawk等价于AP_HAL_PX4

        该定义,方便访问硬件接口,比如console终端、定时器、I2C、SPI接口等。

        实际的定义是在HAL_PX4_Class.cpp中定义,如下:

                const HAL_PX4 AP_HAL_PX4;

        hal是针对 AP_HAL_PX4 的引用。

        经常使用的方法如下:

  •  终端字符输出。hal.console->printf() and hal.console->printf_P() to print strings (use the _P to use less memory on AVR)
  •  获取当前运行时间。hal.scheduler->millis() and hal.scheduler->micros() to get the time since boot
  •  延时。hal.scheduler->delay() and hal.scheduler->delay_microseconds() to sleep for a short time
  •  IO输入输出。hal.gpio->pinMode(), hal.gpio->read() and hal.gpio->write() for accessing GPIO pins
  •  I2C操作,hal.i2c
  •  SPI操作,hal.spi

3、setup()和loop()

        每个sketch都有一个setup()和loop()函数。板子启动时,setup()被调用。这些调用都来自HAL代码中的main()函数调用(HAL_PX4_Class.cpp文件main_loop())。setup()函数只调用一次,用于初始化所有libraries。

        Loop()循环被调用,执行主任务。

4、AP_HAL_MAIN()宏指令

        每一个sketch(.pde文件)最底部,都有一个“AP_HAL_MAIN();”指令,它是一个HAL宏,用于定义一个C++ main函数,整个程序的入口。它真正的定义在AP_HAL_PX4_Main.h中。

                #define AP_HAL_MAIN() \

                extern "C" __EXPORT int SKETCH_MAIN(int argc, char * const argv[]); \

                int SKETCH_MAIN(int argc, char * const argv[]) { \

                hal.init(argc, argv); \

                return OK; \

                }

        作为程序的起点,在AP_HAL_MAIN()里,就正式调用了hal.init()初始化代码。

        程序的执行过程就是:程序起点AP_HAL_MAIN() à hal.init()  à hal.main_loop() à sketch中的setup()和loop()。

转载于:https://www.cnblogs.com/pinlyu/p/4632454.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/290940.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nginx+tomcat8+memcached实现session共享具体操作

本次试验用到的软件包的版本如下:一、针对10.43.2.134的操作1.安装jdk环境tar zxf jdk-8u5-linux-x64.tar.gz mkdir /usr/javamv jdk1.8.0_05/ /usr/java/编辑/etc/profile在文档的末尾追加如下5行内容:JAVA_HOME/usr/java/jdk1.8.0_05JRE_HOME/usr/java…

.NET6之MiniAPI(十九):NLog

在本系例文章的第八篇中,我们聊过官方的日志实现,即《.NET6之MiniAPI(八):日志》。但官方的日志功能更多是提供了一个实现基础,对于要求一个灵活,强大,方便的日志体系,官方的还是有差距的&#…

完美:C# Blazor中显示Markdown并添加代码高亮

昨天发了一篇介绍这个库:C# Blazor中显示Markdown文件,介绍怎么在Blazor中显示Markdown内容的文章,文章内的代码是没有高亮的,思来相去,还是要做好,于是百度到这篇文章.NET C# Blazor 服务端渲染Markdown&a…

使用 FieldMask 提高 C# gRpc 服务性能

前言想象一下,有一个服务提供个多个客户端调用,但不是所有客户端都需要全部的返回参数:比如商品列表服务返回商品的所有信息,而订单服务调用商品列表服务,但它其实只需要商品的编码和名称就够了。当然,我们可以为这个需…

HTML accesskey 属性

2019独角兽企业重金招聘Python工程师标准>>> 带有指定快捷键的超链接&#xff1a; <a href"http://www.w3school.com.cn/html/" accesskey"h">HTML</a><br /> <a href"http://www.w3school.com.cn/css/" access…

Linux 2.6 完全公平调度算法CFS(Completely Fair Scheduler) 分析

转会http://www.ibm.com/developerworks/cn/linux/l-completely-fair-scheduler/index.html?cadrs-cn-0125 Linux 调度器简史 早期的 Linux 调度器使用了最低的设计&#xff0c;它显然不关注具有非常多处理器的大型架构&#xff0c;更不用说是超线程了。1.2 Linux 调度器使用了…

在计算机技术方面用英语怎么说,“计算机应用技术”用英语怎么说?

计算机应用技术 :1. Computer Applications Technology中国搜学网-学苑论坛 - 教育话题 - 学习交流 ... ...专利文献检索 The Searches of Patent Literature计算机应用技术 Computer Applications Technology精密电磁测量 Precise Electromagnetic Measurement ...2. Computer…

linux之nautilus .命令浏览当前文件目录

1、比如我们在终端目前想打开这个路径下的文件目录&#xff0c;我们如果再去更加路径一个一个的打&#xff0c;就太浪费时间了&#xff0c;我们可以在终端这个路径下输入下面的命令就可以 ~/Desktop$ nautilus . 2、效果如下图

C# 异步与Windows应用程序

把 async 关键字用于 UWP 应用程序&#xff0c;需要注意&#xff0c;在 UI 线程中调用 await 之后&#xff0c;当异步方法返回时&#xff0c;将默认返回到 UI 线程中。这便于在异步方法完成后更新 UI 元素。注意为了创建 UWP 应用程序&#xff0c;需要 Windows 10&#xff0c;W…

重装系统后恢复oracle数据

2019独角兽企业重金招聘Python工程师标准>>> 由于前段时间重装了系统&#xff0c;今天重装了数据库oracle XE版本&#xff0c;用“移花接木”的手段将新装oracle的目录用原有目录直接给覆盖&#xff0c;于是顺利的启动了oracle服务&#xff0c;然后又打开plsql deve…

java Split 用法

在java.lang包中有String.split()方法,返回是一个数组 我在应用中用到一些,给大家总结一下,仅供大家参考: 1、如果用“.”作为分隔的话,必须是如下写法,String.split("\\."),这样才能正确的分隔开,不能用String.split("."); 2、如果用“|”作为分隔的话,必…

html三列布局源码,HTML三列布局 - 黄柳淞的个人页面 - OSCHINA - 中文开源技术交流社区...

1.三列布局1三列布局body{padding: 0;margin: 0;}.left{width:33.3%;height: 500px;background-color: #ccc;float: left;}.middle{width:33.3%;height: 500px;background-color: #bbb;float: left;}.right{width:33.3%;height: 500px;background-color: #aaa;float: left;}33.…

nagios的搭建及配置----(中)

上篇文章写到了我们布置的nagios监控本机的状态&#xff0c;下面我们来看下nagios监控服务器状态的配置。至于为什么要这么配置&#xff0c;大家可以自行去百度下看看使用NRPE插件实现对remote server 进行监控&#xff0c;远程服务器配置1&#xff0c;编译安装nagios-plugin&a…

iNeuOS工业互联网操作系统,顺利从NetCore3.1升级到Net6的过程汇报,发布3.7版本...

目 录1..... 概述... 12..... 升级的工程... 33..... 升级的代码差异... 44..... 系统运行... 51. 概述我们团队一直在工业领域从事实时系统和业务系统的开发与集成工作&#xff0c;开发语言使用过C51/C/VB/VC/C#(Net Framework)/C#(Netcore3.1)/C#(NET6)。前几天微软发…

鲜为人知的编程真相

2019独角兽企业重金招聘Python工程师标准>>> 当程序员的经历让我知道了一些关于软件编程的事情。下面的这些事情可能会让朋友们对软件开发感到惊讶&#xff1a; 一个程序员用在写程序上的时间大概占他的工作时间的10-20%&#xff0c;大部分的程序员每天大约能写出10…

2. 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识yml

1. 前言入门篇我们已经成功运行hello.benchmarks.yml并输出测试结果&#xff0c;本篇我们就hello.benchmarks.yml、以及运行的shell脚本详细解读下其中的含义2. 剖析hello.benchmarks.yml2.1. job在hello.benchmarks.yml中我们定义了一个新的job: server&#xff0c;并指定了仓…

计算机应用问题,计算机应用的现状与发展的问题

计算机应用的现状与发展的问题来源&#xff1a;职称阁时间&#xff1a;2018-07-27 11:59热度&#xff1a;这篇论文主要介绍的是计算机应用的现状与发展的问题的相关内容&#xff0c;本文作者就是通过对计算机的应用现状等内容做出详细的阐述与介绍&#xff0c;特推荐这篇优秀的…

(2)从实际项目谈起,基于MEF的插件框架之总体设计

文章版权由作者李晓晖和博客园共有&#xff0c;若转载请于明显处标明出处&#xff1a;http://www.cnblogs.com/naaoveGIS/。 1.MEF框架简介 MEF的全称是Managed Extensibility Framework&#xff08;MEF&#xff09;&#xff0c;其是.net4.0的组成部分&#xff0c;在3.5上也可以…

Avalonia跨平台入门第四篇之Popup在uos下问题

上一篇简单玩耍了Popup,这不正当我洋洋自得的时候前线传来战报:你家伙做的效果在UOS下面有问题;然后直接发来一张捷报:明明在乌班图和优麒麟都没啥问题,单单就你这个UOS牛,结果发现个神奇的特效:开启神奇的特效,果然神奇:来看看最终实现的效果:最终简单的效果先这样吧;以后有时…

C++之用std::nothrow分配内存失败不抛异常

1、std::nothrow介绍 1&#xff09;.malloc分配时&#xff0c;如果内存耗尽分配不出来&#xff0c;会直接返回NULL&#xff1b; 2.&#xff09;早期C版本&#xff0c;new分配时&#xff0c;如果内存耗尽分配不出来&#xff0c;也会直接返回NULL&#xff1b; 我们可以使用关键…