转载: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,一经查实,立即删除!

相关文章

html页面阴影怎么做,html – 做弯曲阴影的最佳方式

您将使用伪元素和box-shadow属性来执行此操作.我在这里为你做了一个例子:http://jsfiddle.net/joshnh/NWnXw/这在IE9及以上工作./* Shadow */.shadow {box-shadow: 0 1px 5px hsla(0,0%,0%,.25),inset 0 0 50px hsla(0,0%,0%,.05);position: relative;}.shadow:afte…

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…

Android之解决Base64 encode中文乱码问题

1、问题 需求需要,把字符串转化为UTF-8编码之后需要base64.encode处理,但是我写了 String ss new String(value.getbytes("UTF-8"), "UTF-8");Base64.encode(ss); 死活出不来,依然乱码,然后写了检测当前编码…

.NET6之MiniAPI(十九):NLog

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

mysql-proxy

yum -y install mysql-proxy#mysql-proxy?--daemon?--log-leveldebug?--log-file/var/log/mysql-proxy.log?-P?10.254.157.xxx:3310(本机内网IP,端口自己随意设置)?--proxy-backend-addresses10.137.192.xxx:3306(rds内网IP) 您看下这几个步骤 是…

字符串倒序

#include "stdafx.h" #include <stdio.h>#include "t11.h" #include <string.h> #include <stdlib.h>//以下代码是把一个字符串倒序 int t11() {char* src "1234567890";int len strlen(src);char* dest (char*)malloc(len…

html地区三级联下拉列表,JS-三级联下拉列表

/p>var types"家电,服饰,家具,日用";var types_str1"电视机,洗衣机,电冰箱,空调|外套,衬衣,大衣,裤子|书桌,书柜,饭桌,衣柜|清洁,洗发,纸品,厨房";var types_str2"索尼,海信,康佳,飞利浦^海尔,LG,三星^海尔,飞利浦,韩电^格力,美的,海尔,长虹"…

Android ndk之Check that/ndk/openssl/crypto/libsfk.so exists or that its path is corret

1、问题 编译ndk里面的子模块的时候出现这个错误 Android ndk Check that/ndk/openssl/crypto/libsfk.so exists or that its path is corret 2、解决办法 是因为编译模块依赖libsfk.so这个文件&#xff0c;所以把这个文件拷贝到这个编译的模块就可以执行 ndk-build succe…

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

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

微服务架构成功之路

本文来源于我在InfoQ中文站翻译的文章&#xff0c;原文地址是&#xff1a;http://www.infoq.com/cn/news/2015/07/success-of-microservices近年来&#xff0c;在软件开发领域关于微服务的讨论呈现出火爆的局面&#xff0c;有人倾向于在系统设计与开发中採用微服务方式实现软件…

读《一个程序猿的生命周期》有感

《一个程序猿的生命周期》中的作者来自贫困家庭&#xff0c;可以说是一个从大山里走出来的人。他深知&#xff0c;只有刻苦学习才能改变现状&#xff0c;所以他学习非常努力。 但人生总不是这样一帆风顺的&#xff0c;总会在我们的人生路上给与我们一些打击。意想不到的事情发生…

ymPrompt

ymPrompt消息提示组件4.0 组件调用方式1(传统参数传入方式)&#xff1a;示例调用方法 ymPrompt.alert(http://www.qq.com,null,null,确认要提交吗?,handler) ymPrompt.succeedInfo(document.getElementById(txt).innerHTML,400,260,null,handler2) ymPrompt.errorInfo(操作失败…

html点击关闭代码,怎样开放和关闭html代码?

如何使ASP输出结果不支持html语法&#xff1f;整理编辑&#xff1a;China ASP网友aspboy1原创有时候我们会为这样一个问题而烦恼,就是如何在asp页面中避免支持html语法.例如: 下面一句话"这是一个表单语句"当我们在ASP文件中用response.write"这是一个表单语句&…

linux之如何复制文件夹所有文件到其它文件夹

1、复制文件夹所有文件到其他文件夹 比如复制文件夹test1里面的所有文件到文件夹test2里面去,test1和test2都在同一个路径下面 cd test1cp * ../test2/ 如果是复制文件夹里面的所有内容到另外一个文件夹 cp -rf Android/* ../../chenyu/ 2、如果解决一开始运行项目没问题&…

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

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

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…

python 生成排列、组合以及选择

from <python cookbook> 19.15 任务 需要对一个序列的排列&#xff08;permutation&#xff09;、组合&#xff08;combination&#xff09;或选择&#xff08;selection&#xff09;进行迭代操作。即使初始的序列长度并不长&#xff0c;组合计算的规则却显示生成的序列可…

html5制作线路图,HTML5绘制上海地铁线路图

某市政项目用到地铁图展示&#xff0c;展示地铁站点以及相关信息流&#xff0c;使用Qunee组件可以很好的解决这类需求&#xff0c;做出优美的展现&#xff0c;下面以上海2012地铁图为例&#xff0c;效果如下&#xff1a;上海2012地铁图效果示例讲解首先需要解决数据问题&#x…

Cocos2d-x VS. OGEngine,联盟与部落的战争

在近期的全球移动开发者大会上&#xff0c;Unity发布了2D引擎&#xff0c;触控在同时发布了Cocos 3D引擎&#xff1b;而在差不多同时间&#xff0c;以安卓为主的OGEngine也发布了新版本&#xff0c;并宣布将支持跨平台。各大引擎频频大动作并不是巧合&#xff0c;这代表着移动游…

Android之获取设备的型号和手机厂商

1. 获取手机型号&#xff1a; String model android.os.Build.MODEL; 2. 获取手机厂商&#xff1a; String carrier android.os.Build.MANUFACTURER;