pixhawk的源码结构介绍(针对ArduCopter这套源码)(一)

版权声明

  • 博  主:thunder_fan
  • 声  明:喝水不忘挖井人,转载请注明出处。
  • 联系方式:cllshxz#163 DOT com(请自行改为正确格式)

前期准备

  • 源 码:自己到github上下载。可参阅这篇博客
  • 工 具:ecilpse用来查看源代码。

代码结构分析

当你从github上将Ardupilot这套源码下载下来以后,你会发现这套源码其实针对不同的上层应用。而其中ArduCopter是针对四旋翼飞行器的。由于是开源项目,为了方便更多不懂底层硬件的人来开发上层应用,所以这个项目将底层的一些东西进行了封装,抽象成了一堆的库,让软件开发人员根据这个库,就能实现上层应用的开发。

上图一张说明整个软件架构:

库文件介绍

主要位置:路径为ArduPilot/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_InertialSensor -读取陀螺仪和加速度的数据,进行校准,以标准单元将数据提供给主函数和其他库
  • AP_RangeFinder -声呐和红外距离传感器接口库
  • AP_Baro-气压计接口库
  • AP_GPS -GPS接口库
  • AP_Compass -三轴磁力计(罗盘)接口库
  • AP_OpticalFlow -光流传感器接口库

其他库

  • AP_Mount, AP_Camera, AP_Relay -相机云台控制库,相机快门控制库
  • AP_Mission-从EEPROM(存储器)中抽取任务命令或保存命令
  • AP_Buffer-一个简单的FIFO用于惯性导航的

姿态控制

由于代码在不断更新,所以会有很多版本的代码。大家能看在github上看到此项目的代码迭代介绍。代码版本为AC3.1.5和AC3.2姿态控制逻辑被作为 “the onion” 项目的一部分,新的架构如下图所示:

更新频率为(在pixhawk上时400hz,在APM2.x上是100hz,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脚的输出。

下期预告

今天有点累了,就写那么多,等有空再写《pixhawk的源码结构介绍(针对ArduCopter这套源码)(二)》,敬请期待。

注:本人水平有限,如有错误,欢迎指出,多多交流。

你可能感兴趣的:(飞控)