Ardupilot源码地址:https://github.com/ArduPilot/ardupilot,官网地址:http://ardupilot.org/

文章目录

  • 1、Ardupilot介绍
  • 2.库文件介绍
  • 3.主目录文件介绍
  • 4.姿态控制(Copter)
  • 5.Motors Library
  • 6.、用代码调度器(scheduler)运行你的代码

1、Ardupilot介绍

  目前开源飞控有两个:Pixhawk和APM。Pixhawk是硬件平台,PX4是pixhawk的原生固件,
APM(Ardupilot Mega)也是硬件,Ardupilot是APM的固件。后来开发者就把Ardupilot代码转移到了Pixhawk平台上,兼容了Pixhawh硬件平台,所以就导致现在Pixhawk上有两套飞控代码的原因,所以在Pixhawk硬件平台上可以运行PX4固件(原生固件),也可以运行APM固件。

  由于Ardupilot兼容Pixhawk,因此Ardupilot的HAL层也可以使用pixhawk硬件。Ardupilot是基于Pixhawk原生代码开发的上层应用,如下面的源码框架图所示,Ardupilot把底层的PX4Firmware和NuttX等都抽象为HAL,developer只需要关心上层应用即可,基于Pixhawk原生设计上层控制逻辑。Ardupilot其实是开源的、玩具级飞控,它为了兼容各种乱七八糟的板子、机型,有很多冗余的代码,这些冗余的代码让我们理解飞控本身增加了难度和学习成本。如果我们需要一款专业的飞控,完全可以去掉这些冗余的代码,只保留我们需要的精简过的功能,这样也就能大大降低它代码的复杂程度。

  Ardupilot目前主要是支持的5种设备的目录包括ArduPlane(固定翼)、ArduCopter(直升机/多旋翼)、APMrover2、AntennaTracker、ArduSub。其中ArduCopter是针对四旋翼飞行器的。为了方便更多不懂底层硬件的人来开发上层应用,所以这个项目将底层的一些东西进行了封装,抽象成了一堆的库,让软件开发人员根据这个库,就能实现上层应用的开发。Ardupilot的源码系统框架图如下:


相对上图更详细的框架

Barometer:气压计

2.库文件介绍

库文件介绍(位于\libraries目录下),libraries包含了所有需要的库函数头文件等。核心库:AP_AHRS              -姿态估计的库,使用DCM(方向余弦矩阵)或者EKF(卡尔曼滤波)AP_Common        -核心库会被其他库所依赖AP_Math              -各种各样的数学操作的函数,特别是对向量操作比较有用AC_PID                 -PID控制库AP_InertialNav     - 惯性导航库,已经将GPS及气压器的数据和加速度计进行了融合AC_AttitudeControl   -姿态控制库AP_WPNav             -导航库AP_Motors            -多旋翼和传统直升机混合的电机库,主要是跟电机输出有关的RC_Channel           -将从APM_RC接收到的pwm信号转换成内部单元,例如角度AP_HAL, AP_HAL_AVR, AP_HAL_PX4   - 硬件抽象层,主要将底层硬件进行抽象。使上层应用拥有统一的接口,使其更容易移植到不同的硬件上,其中AP_HAL目录定义了一个通用的接口,特别是hal.rc_out_write()函数将从 AP_Motors 类中接收的具体PWM转化为特定板子pin脚的输出。其他的目录AP_HAL_XXX针对不同硬件平台进行详细的定义。例如AP_HAL_AVR目录对于AVR平台,AP_HAL_PX4对应PX4平台,AP_HAL_Linux对应Linux平台。 传感器库:AP_InertialSensor   -读取陀螺仪和加速度的数据,以标准单元(deg/s,m/s)将数据提供给主函数和其他库AP_RangeFinder      -声呐和红外距离传感器接口库AP_Baro                   -气压计接口库AP_GPS                    -GPS接口库AP_Compass            -三轴磁力计(罗盘)接口库AP_OpticalFlow       -光流传感器接口库  其他库:AP_Mount,AP_Camera, AP_Relay:相机安装控制库,相机快门控制库AP_Mission: 从eeprom(电可擦只读存储器)存储/读取飞行指令相关库AP_Buffer:惯性导航时所用到的一个简单的堆栈(FIFO,先进先出)缓冲区AP_AccelCal、AP_Declination、AP_RCMapper、AP_RPM、AP_RSSIAP_ADC:Analog to DigitalAPM_Control: pitch/roll/yaw controllerDataFlash:flash memoryGCS_Console/GCS_MAVLink:地面站通信、飞行日志

3.主目录文件介绍

多旋翼飞控的所有文件都放在\Ardupilot的目录下。

Copter.h  : 各个头文件的集合,各种飞行模式初始化函数和执行函数的声明,日志和地面站的相关函数声明,自动    调参参数的声明。姿态控制中使用到的函数几乎都在该头文件中进行了声明。
Parameters.h :   定义了两个全局参数类,类中包含各种参数的定义
Define.h :   各种宏定义
inertia.h  :   从加速度计读取惯性力
ekf_check.cpp :   检测EKF或惯性导航系统的故障触发飞行的警报并帮助采取对策
esc_calibration.cpp:   检查和执行ESC校准的功能
events.cpp :    当故障安全更改时将调用此事件。
log.cpp :     飞行日志
failsafe.cpp :   失控保护
AP_Arming.cpp : 上电BB声、校准时的BB声、电机解锁BB声
fence.cpp :         地理围栏,阻止无人机飞入禁飞区
GCS_Mavlink.cpp : 地面通信站
motor.cpp :       电机BB响,电机解锁
motor_test.cpp :    MavLink电机测试
mode.cpp :           飞行模式初始化和切换
mode_acro.cpp :     特技
mode_althold.cpp : 定高
mode_auto.cpp :       自动
mode_autotune.cpp : 自动调参
mode_circle.cpp:     绕圈
mode_drift.cpp :    漂移
mode_flip.cpp :    空翻
mode_guided.cpp :  引导
mode_land.cpp :    着陆
mode_poshold.cpp :   定点
mode_rtl.cpp :        返航
mode_sport.cpp :  运动
mode_stabilize.cpp :  自稳

4.姿态控制(Copter)


由于代码在不断更新,所以会有很多版本的代码。大家能看在github上看到此项目的代码迭代介绍,目前的master版本已经没有ArduCopter.cpp了。代码版本为AC3.1.5和AC3.2姿态控制逻辑被作为 “the onion” 项目的一部分,新的架构如下图所示:
mark
更新频率为(在pixhawk上时400hz(2.5ms),在APM2.x上是100hz(10ms),pixhawk和APM2.X是APM不同版本的硬件板)

  • 顶层flight-mode.cpp的 “update_flight_mode()”函数是被调用的。这个函数是检测飞行模式的。(即“control_mode”这个变量)然后调用相应的run()的函数(例如:stabilize_run对应自稳模式, rtl_run对应返航模式)。_run() 这个函数能在名为control.cpp的文件中被找到(例如:control_stabilize.cpp, control_rtl.cpp)。
  • 这个_run函数负责将用户的输入转换为对应飞行模式的一个倾斜的角度,旋转速率,爬升率。取个例子,定高模式将用户的roll和pitch输入转化为倾斜的角度(以度为单位),yaw输入被转化为一个旋转的速率(单位为:度/s)。throttle输入被转化为一个爬升率(以cm/s为单位)。roll,pitch,yaw,throttle对应遥控器上两个摇杆的前后左右。
  • 这个_run函数必须要做的一件事情就是将这些期待的角度速率传递给Attitude Control 和Position Control库(这些都在 AC_AttitudeControl文件夹下)
    AC_AttitudeControl库提供了5个可能的方式来控制飞行器的姿态。最常用的三个如下:1.angle_ef_roll_pitch_rate_ef_yaw() :接收地理坐标系下roll和pitch的角度,地理坐标系下yaw的速率。举个例子,假设:roll = -1000, pitch = -1500, yaw = 500 意味着,飞行器向左横滚10度,机头向下俯15度,以5度/s的速率向右偏航。2.angle_ef_roll_pitch_yaw() 这个函数接收地理坐标系的 roll, pitch and yaw三个角度。假设:roll = -1000, pitch = -1500, yaw = 500,前两个量跟之前的一样,最后yaw意味着机器由北向东偏航5度。3.rate_bf_roll_pitch_yaw() 这个函数接收机体坐标系的roll pitch yaw的速率。例如:roll = -1000, pitch = -1500, yaw = 500 代表着飞行器以10度/s的速率向左横滚,以15度/s的速率向下俯,以5度/s的速率偏航。

在以上这些函数被调用后, AC_AttitudeControl::rate_controller_run()被调用,这个函数将以上函数的输出转换成 roll, pitch and yaw输入,这些输入是通过 AP_Motors 库中的 set_roll, set_pitch, set_yaw and set_throttle 函数被发送的。

  • AC_PosControl 库用来实现飞行器3维位置的控制。通常仅仅用在Z轴控制在(即高度控制)。因为更为复杂的3维位置的飞行模式(如悬停模式)充分利用AC_WPNav库。在任何情况下,这些库通常包含以下方法:1.set_alt_target_from_climb_rate() 这个函数接收爬升率(cm/s)更新到一个绝对的高度目标。2.set_pos_target()接收一个3维位置向量,这个向量的起点为出发点(家的位置),以cm为单位。
    如果AC_PosControl中任何函数被调用,飞行模式代码也必须调用AC_PosControl::update_z_controller()函数,它将启动Z轴位置的PID控制循环和发送一个低层的 throttle(油门量)到AP_Motors 库中。如果任何XY轴的函数被调用,AC_PosControl::update_xy_controller() 函数一定会被调用。

  • AP_Motors 库负责将从AC_AttitudeControl 和AC_PosControl接收到的 roll, pitch, yaw and throttle值转化为电机的绝对输出(PWM值),因此这些上层库会充分利用以下这些函数:1.set_roll(), set_pitch(), set_yaw() 接收在-4500 ~ 4500(将度数放大100倍)范围内的值,这些不是预期的角度和平均速率而仅仅是一个值。举个例子,set_roll(-4500) 代表尽快向左横滚。2.set_throttle()接收一个在0 ~ 1000范围内的一个值,0 =电机关闭,1000 =满油门输出。

飞行器会有不同种类的机架(四轴,六轴,等)但是每一种飞行器都有一个“output_armed”函数负责实现 roll, pitch, yaw and throttle 值到PWM输出的转化。每一种机架都有不同的roll, pitch, yaw and throttle 最大值。在“output_armed” 函数底层有一个the hal.rcout->write()函数是用来将预期的PWM值传递到AP_HAL层。

  • AP_HAL库(硬件抽象层)被所有的硬件板提供了一致的接口。特别是hal.rc_out_write()函数将从 AP_Motors 类中接收的具体PWM转化为特定板子pin脚的输出。

5.Motors Library

  Ardupilot支持22种多旋翼框架。主要分下图几类

Multicopter Matrix : AP_MotorsMatrix
Multicopter Tri and Single:AP_MotorsTri,AP_MotorsSingle

Helicopte Single, Quadr: AP_MotorsHeli


Motors Library输入
Attitude Controller给Motors library 提供 roll, pitch and yaw(-1 ~ +1)和 throttle(0~+1)命令
可以在AC_AttitudeControl_Multi :: rate_controller_run()函数里找到

void AC_AttitudeControl_Multi::rate_controller_run()
{Vector3f gyro_latest = _ahrs.get_gyro_latest();_motors.set_roll(rate_target_to_motor_roll(gyro_latest.x, _rate_target_ang_vel.x));_motors.set_pitch(rate_target_to_motor_pitch(gyro_latest.y, _rate_target_ang_vel.y));_motors.set_yaw(rate_target_to_motor_yaw(gyro_latest.z, _rate_target_ang_vel.z));

这些定义可以在 AP_Motors_Class.h找到

// set_roll, set_pitch, set_yaw, set_throttle
void set_roll(float roll_in) { _roll_in = roll_in; };        // range -1 ~ +1
void set_pitch(float pitch_in) { _pitch_in = pitch_in; };    // range -1 ~ +1
void set_yaw(float yaw_in) { _yaw_in = yaw_in; };            // range -1 ~ +1
void set_throttle(float throttle_in) { _throttle_in = throttle_in; }; // range 0 ~ 1

Roll +1 代表motor和servo向右转最大给定
Pitch +1 代表向上最大给定
Yaw +1 代表顺时针转最大给定
throttle +1 代表油门最大给定

限幅可以在 AP_Motors_Class::limit中找到

// structure for holding motor limit flags
struct AP_Motors_limit {uint8_t roll_pitch      : 1; // we have reached roll or pitch limituint8_t yaw             : 1; // we have reached yaw limituint8_t throttle_lower  : 1; // we have reached throttle's lower limituint8_t throttle_upper  : 1; // we have reached throttle's upper limit
} limit;

6.、用代码调度器(scheduler)运行你的代码

在给定时间间隔内来运行你的代码的最灵活的方式就是使用调度器。这可以通过将你的函数添加到文件ArduCopter.pde中的scheduler_tasks数组来完成。需要表明的是:实际上该文件中有两个任务列表,上面的任务列表是针对高频CPUs(如Pixhawk),对应的调度频率是400Hz,下面的是针对低频CPUs(如APM2),对应的调度频率是100Hz。 添加一个任务是相当的简单,你只要在列表添加新的一行代码就可以了(列表中位置越靠前意味着拥有更高的级别)。任务顷中的第一列代表了函数名,第二列是以2.5ms为单位的数字(或者APM2中以10ms为单位)。所以,如果你想要你的函数执行频率为400Hz,那举该列就需要填写为“1”,如果想要50Hz,那举就需要改为“8”。任务项的最后一列代表该函数预计运行花费的微秒(百万分之一秒)时间。这可以帮助调度器来预估在下一个主循环开始之前有否有足够的时间来运行你的函数。
ArduCopter中一些参数的定义





Ardupilot源码框架相关推荐

  1. Pixhawk代码分析-源码框架

    源码框架 pixhawk代码框架: pixhawk代码框架基础分析: 阅读下面内容时请结合源码阅读,便于理解. The basic structure of ArduPilot is broken u ...

  2. Ardupilot源码编译(二)

    最新参考:Ardupilot开发环境搭建(Ubuntu18.04,20190407)   目前Ardupilot的master版本需要用waf编译 waf 是一个帮助构建和编译系统的框架,采用pyth ...

  3. [Pixhawk] ardupilot源码windows编译教程

    [声明] 此教程最开始取自于淘宝商家,后查找资料发现淘宝商家取自"怒飞垂云"的教程,但原教程中有些冗余和错误导致无法通过编译,我做更改整理后发出,如有疑问请各位一起讨论. 目录 一 ...

  4. 基恩士PLC KV8000+XH16EC总线控制,全ST程序实例 全程序无加密,公司级框架,功能齐全,提供项目源码框架FB源码

    基恩士PLC KV8000+XH16EC总线控制,全ST程序实例,本人自己开发全程序无加密,公司级框架,功能齐全,提供项目源码框架FB源码,触摸屏源码. 需要一定ST基础才能看懂. 重在分享编程思想 ...

  5. 2022年最新视觉框架VM PRO 2.7版本,C#源码框架,机器视觉源码框架

    2022年最新视觉框架VM PRO 2.7版本,C#源码框架,机器视觉源码框架,编程语言C#,算法使用的是halcon,参考了cognex visionpro的输入输出,有C#基础和Halcon基础学 ...

  6. 2022年最新视觉框架VM PRO 2.7版本,增加了机器人 流程框架 多任务流程 C#源码框架,机器视觉源码框架

    2022年最新视觉框架VM PRO 2.7版本,增加了机器人 流程框架 多任务流程 C#源码框架,机器视觉源码框架,编程语言C#,算法使用的是halcon,参考了cognex visionpro的输入 ...

  7. 2022年视觉框架,增加了机器人 流程框架 多任务流程 C#源码框架,机器视觉源码框架,编程语言C#,算法使用的是halcon

    2022年最新视觉框架VM PRO 2.7版本,增加了机器人 流程框架 多任务流程 C#源码框架,机器视觉源码框架,编程语言C#,算法使用的是halcon,参考了cognex visionpro的输入 ...

  8. 2022年最新视觉框架VM PRO 2.7版本,增加了机器人 流程框架 多任务流程 C#源码框架,机器视觉源码框架,编程语言C#,算法使用的是halcon,参考了cognex visionpro的输入

    2022年最新视觉框架VM PRO 2.7版本,增加了机器人 流程框架 多任务流程 C#源码框架,机器视觉源码框架,编程语言C#,算法使用的是halcon,参考了cognex visionpro的输入 ...

  9. 视觉框架 增加了机器人 流程框架 多任务流程C#源码框架,机器视觉源码框架

    视觉框架VM PRO 2.7版本,增加了机器人 流程框架 多任务流程C#源码框架,机器视觉源码框架,编程语言C#,算法使用的是halcon,参考了cognex visionpro的输入输出,有C#基础 ...

最新文章

  1. nginx-ingress 配置https,同支持http
  2. 4、Eternal框架-持有者
  3. Scikit-learn环境的搭建
  4. 记录 之 Argparse 中的 可选参数 action 用法
  5. golang 热插拨 插件_从零开始实现一个插件化框架(一)
  6. 【机器学习】主元分析(PCA)以及与SVD的区别联系
  7. mysql 并发_Mysql事务,并发问题,锁机制
  8. Jquery操作CSS常用方法
  9. python的字符串内建函数
  10. epoll或者kqueue的原理是什么?
  11. 二十大数据可视化工具(二)
  12. 利用U-Net进行两阶段超声图像分割,并增加测试时间
  13. Java| 编译和反编译
  14. matlab计算abc三相短路电流_供配电系统设计需要用到的计算公式(结合手册简要总结)...
  15. excel转置怎么操作_Excel拆分文本,想怎么拆就怎么拆,简单易学,一看就会
  16. 2020淘宝双11最强星秀猫怎么玩 怎么退出队伍你知道吗
  17. 曹鹏 其言其人 2009-06-15 17:44
  18. Web前端面试常用技巧
  19. sqlmap之tamper脚本编写
  20. 如果张柏芝的孩子长大

热门文章

  1. 移动通信核心网络技术总结(三)EPC网络的结构及原理
  2. 我的世界基岩版json_我的世界基岩版1.12指令大全 中国版指令大全列表
  3. 最新二开南风表情包小程序+前后端去授权版/最火表情包小程序源码
  4. python基础之温度转换
  5. java实例成员和类成员变量_Java 中成员变量又分为 和类成员变量。_学小易找答案...
  6. chapter2 基因组学
  7. SpringBoot集成flyway、mybatis-plus(超详细)
  8. 百度编辑器调用135编辑器方法
  9. PS如何制作圆角矩形图片
  10. python从入门到人生巅峰