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

2023-05-16

 

 

 

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

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

转载:Pixhawk源码笔记一:APM代码基本结构 的相关文章

  • PS基础教程[1]如何制作微信泡泡

    PS是很多朋友都很喜欢额一款图像处理软件 xff0c 我们可以使用PS制作很多的效果 xff0c 本系列经验教程的起源就来源于知道中这位朋友问的微信泡泡如何使用 xff0c 下面就来简单的分享一下 微信泡泡制作方法 有很多的方法可以制作这种
  • 《计算机组成原理》第6章:总线

    第6章 xff1a 总线 6 1 总线概述 总线的定义 总线是一组能为多个部件分时共享的公共信息传送线路 分时和共享是总线的两个特点 分时是指同一时刻只允许有一个部件向总线发送信息 xff0c 如果系统中有多个部件 xff0c 则它们只能分
  • Fragment生命周期及add、replace、remove、hide&show方法分析

    转载自https blog csdn net u014699958 article details 52996143 项目有一个Activity类和3个Fragment类 Activity 中放置3个按钮 xff08 实质TextView
  • Fragment 中使用 getActivity()为null的原因---剖析源码

    问题 xff1a 使用 AS 在 Fragment 中调用 getActivity 方法的时候会出现可能为空指针的提醒 思考 为什么会出现这种情况 xff0c 按说当前 Activity 存在 xff0c 在 Fragment 中使用 ge
  • 测试用例设计方案

    以淘宝加入购物车为例 xff1a 1 看整个流程分为几个节点 xff1a a 选择物品 b 点击加入购物车 c 查看购物车 结果验证 2 根据每个节点的输入输出设计场景 a 选择物品的场景的影响因素 xff1a 请求来源 设备 账号 库存
  • CSS transform中的rotate的旋转中心怎么设置

    transform origin 属性 默认情况 xff0c 变形的原点在元素的中心点 xff0c 或者是元素X轴和Y轴的50 处 我们没有使用transform origin改变元素原点位置的情况下 xff0c CSS变形进行的旋转 移位
  • 松耦合和紧耦合

    Question 首先 xff0c 明确一点 xff0c 什么是松耦合 xff1f 什么是紧耦合 xff1f Answer 比如说两个模块 xff0c A模块和B模块 xff0c 当两者的关联非常多的时候 xff0c 就叫紧耦合 xff0c
  • 把pandas dataframe转为list方法

    把pandas dataframe转为list方法 先用numpy的 array 转为ndarray类型 xff0c 再用tolist 函数转为list 转载于 https www cnblogs com lichunl p 9622923
  • docker容器中使用top、free命令查看容器真实cpu和内存使用情况的实践

    参考 xff1a https www colabug com 1759782 html 转载于 https www cnblogs com robinunix p 10482908 html
  • 人性的弱点之情商

    处理好人际关系 真诚赞美他人 xff0c 不要过度批评他人 赢得他人喜爱的4个方式 xff1a 真诚关注他人 记住名字和生日 建立好的第一印象 保持微笑 善谈就是倾听 迎合对方兴趣 让他人为你所用 xff1a 避免争论 避免树敌 坦率承认自
  • 小米笔记本进入安全模式比较靠谱的方法

    在锁屏界面 xff0c 按住shift按键 xff0c 然后右下角进入重启就可以进入win10恢复模式 转载于 https www cnblogs com yang xiansen p 10471358 html
  • pytorch 中Tensor.uniform_代替numpy.random.uniform

    uniform from 61 0 to 61 1 Tensor 将tensor用从均匀分布中抽样得到的值填充 例如 a 61 torch Tensor 2 3 uniform 1 1 转载于 https www cnblogs com z
  • STM32 嵌入式操作系统的进入 HardFault_Handler分析

    STM32在使用中 xff0c 因为一般没有其他异常抛出 xff0c 所以抛出异常一般都是HardFault Handler 导致产生该现象的原因有一下几点 xff1a 1 数组越界操作 xff1b 2 内存溢出 xff0c 访问越界 xf
  • Linux批量加连续端口映射,批量端口映射

    内网ip 10 199 2 12 虚拟机网络 192 168 10 0 24 内网访问示例 xff0c 如访问ip为192 168 10 20的虚拟机 xff0c 远程桌面 10 199 2 12 6020 vnc 10 199 2 12
  • 想做Linux/Unix下的软件开发

    我学Linux Unix已经有段时间了 xff0c 工作中我也会写些Shell Script去完成一些任务 但是Linux Unix下的应用我还是没有开发过的 xff0c 基本上是拿来主义 xff0c 直接用别人开发好的软件包 其中最根本的
  • mpu和嵌入式linux区别,详解DSP、MCU、MPU的区别

    详解DSP MCU MPU的区别 2018年09月10日 11 17 57来源 xff1a 网络关键词 xff1a 嵌入式操作系统 CPU Central Processing Unit xff0c 中央处理器 发展出来三个分枝 xff0c
  • ug支持linux系统吗,Linux 黑话解释:什么是长期支持(LTS)版本?什么是 Ubuntu LTS?...

    在 Linux 的世界里 xff0c 特别是谈到 Ubuntu 的时候 xff0c 你会遇到 LTS 长期支持Long Term Support 这个词 如果你是一个经验丰富的 Linux 用户 xff0c 你可能知道 Linux 发行版的
  • ROS学习笔记十二:使用gazebo在ROS中仿真

    想要在ROS系统中对我们的机器人进行仿真 xff0c 需要使用gazebo gazebo是一种适用于复杂室内多机器人和室外环境的仿真环境 它能够在三维环境中对多个机器人 传感器及物体进行仿真 xff0c 产生实际传感器反馈和物体之间的物理响
  • 数学公式转换为图形的网站

    https www desmos com 贴一个动态图 xff0c 感受一下数学的魅力 转载于 https www cnblogs com lishidefengchen p 11089649 html
  • 激光雷达--看图

    转载于 https www cnblogs com tiandi p 10057244 html

随机推荐

  • css不常用属性

    1 出现滑动使用overflow xff1b 2 左右居中最常用的两种方法是margin 0 auto和text align center 3 透明背景使用transparent属性而不是使用rgba中的透明度数值来调节 4 文字连字符样式
  • 记录第一次互联网面经Momenta

    作为车辆的学渣 xff0c 去年开始研究图像算法 xff0c 也是第一次面纯做自动驾驶的公司 xff0c 留个纪念吧 1 简历过了第二天 xff0c HR就给打电话了 xff0c 还是非常效率的 xff0c 简单聊了两句就约了面试的时间 2
  • 大学学计算机专业高中怎样选课,高中选课大学对应专业 选什么科目能学的专业多...

    高中选课大学对应什么专业呢 xff0c 选什么科目大学可以选的专业多呢 xff0c 哪些组合是不推荐选择的呢 xff0c 下面小编为大家分析一下 xff0c 仅供大家参考 高中选课大学对应什么专业 新高考怎样选择学习的学科 第一 xff0c
  • GIT服务器配置

    GIT server build up 前几天说的任务启动了 xff0c 虽然server还在采购流程中 但已经在一台PC机上搞起来 xff0c 供小组内部测试啦 在此把过程记录下来吧 xff1a 硬件需求 xff1a 一台linux电脑
  • zookeeper(1)——zookeeper服务器集群搭建配置

    Zookeeper分布式集群管理系统 Author xff1a xusy 参考教程 xff1a http www cnblogs com z sm p 5691752 html 1 zookeeper下载 xff1a http mirror
  • ubuntu下安装intel realsense驱动

    在安装之前一定要确保系统是ubuntu 14 04 3 64位 xff01 由于一开始安装的是32位系统 xff0c 导致在升级内核版本到4 4时各种问题 xff0c 最终靠重装系统解决 因为intel给出的测试代码均是在64位14 04
  • linux网卡顺序发生变化,Linux 多网卡识别顺序邦定

    转自 http linux iyunv com bbs thread 1175497 1 1 html 使用linux系统时会出现这样的情况 xff0c 当你安装了某个网卡的驱动程序时 xff0c 或者安装了与网卡相关的程序后 网卡会出现所
  • js特效代码-onmouseover/onclick 改变标签(背景)颜色

    lt html gt lt head gt lt meta http equiv 61 34 Content Type 34 content 61 34 text html charset 61 gb2312 34 gt lt title
  • 利用Sphinx编写文档

    利用Sphinx编写文档 1 Sphinx简介和使用理由 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 Sphinx是一个用Python语言编写而成的文档编写工具 用Sphinx编写文
  • 通讯技术

    串口通讯基础 串口基本接线方法 xff08 作者 xff1a 龚建伟 2001 6 24 xff09 本文介绍了串口常用接线方法及注意事项 有关RS232与RS485接口的问答 来自中国工控网 xff09 RS232与RS485接口的区别及
  • microsoft微软登录新账户/切换账户失败,一直转圈,提示“你似乎没有连接到internet”

    无论有没有微软账户 xff0c 是切换账户还是新电脑登录 xff0c 原理都是一样的 xff0c 先使用一个账号注册 登录 设置好微软账户 xff0c 然后再进行你原本的操作 在可以进入到桌面并且联网的情况下 xff0c 登录不上微软账户的
  • 如何改善GPS的漂移?

    GPS飘移一直以来都是令用户和厂家比较头疼的问题 xff0c 也是很多用户选择GPS的首选指标 xff0c 好的产品定位精准 xff0c 漂移很小 xff0c 那么如何改善GPS的漂移 xff1f 1 xff09 纯软件方法 通过软件滤波算
  • Proteus仿真与实际的差别

    最近刚做好一个站 xff0c 基于rails 3 xff0c 教程为主 xff0c 大家捧场看看 xff0c 谢谢 xff01 www yo945 com 弄了几天的Proteus仿真 xff0c 终于觉得自己想做的东西 xff0c 已经全
  • 串口调试助手-打开报错

    问题 xff1a 串口调试助手sscom33打开报错 xff0c 报错信息如下图 解决方法 xff1a 1 将串口设备连接到电脑 1 xff09 若是台式机 xff0c 则直接用串口线连接电脑和串口设备 2 xff09 若是笔记本电脑 xf
  • 基于变分自编码器(VAE)利用重建概率的异常检测

    本文为博主翻译自 xff1a Jinwon的Variational Autoencoder based Anomaly Detection using Reconstruction Probability xff0c 如侵立删 http d
  • 让Eclipse的自动提示更加智能

    ddd在Eclipse MyEclipse的默认设置中 xff0c 只有输入一个点号后才自动提示 xff0c 不太友好 xff0c 我们把他修改一下 xff0c 只要输入字母就有提示 Windows Preferences Java Edi
  • 驱动的本质

    驱动的本质 参考 xff1a www zhihu com question 33 2 驱动程序的本质 xff01 CPU要与IO模块传送数据 xff0c 要编程 xff0c 这个与IO模块传送数据的程序就是 34 驱动程序 34 驱动程序的
  • c语言中变量/函数命名以单下划线(_)和双下划线(__) 开头的意义

    以单下划线 xff08 xff09 表明是标准库的变量 双下划线 xff08 xff09 开头表明是编译器的变量 建议自己在命名的时候不要用下划线开头 xff0c 避免与标准库中的命名冲突 命名方法有好多 xff0c 何必为自己找不自在呢
  • PADS9.5 原理图和封装制作——以STM32F103为例

    1 进入元件编辑有两种方法 xff0c 第一种 xff1a 文件 库 第二种 xff1a 工具 元件编辑器 2 选定你要保存的库 xff0c 选择元件 xff0c 按新建按钮 3 选择下面按钮进入编辑界面 xff0c 如果是建的新库里面没有
  • 转载:Pixhawk源码笔记一:APM代码基本结构

    转自 新浪微博 64 WalkAnt 基础知识 详细参考 xff1a http dev ardupilot com wiki learning the ardupilot codebase 第一部分 xff1a 介绍 详细参考 xff1a