源代码分析(4)

2019-05-17 19:06

};

第七点:具体的数据结构操作

DataFlash.Init(log_structure, sizeof(log_structure)/sizeof(log_structure[0])); log_num = DataFlash.StartNewLog(); DataFlash.WriteBlock(&pkt, sizeof(pkt));

DataFlash API隐藏了底层如何存储log文件的细节。另外,对于Pixhawk or Linux这样的支持 Posix IO的系统,日志文件是存储在microSD卡的“LOGS”目录中的。用户可以直接抽出SD卡,直接拷贝到电脑中。 4、Posix IO

有些板子是带操作系统的,支持类似Posix API,如Linux和NuttX。AP_Terrain library就是一个典型的例子。地形数据对于EEPROM是非常的大,经常要随机的存储。DataFlash API就不够灵活了,同时又了Posix IO支持,也就没必要再用DataFlash了。 查看AP_HAL_Boards.h文件,确认HAL_OS_POSIX_IO宏已定义,如下: #define HAL_OS_POSIX_IO 1 // 带文件系统,has posix-like filesystem IO 下面给出了LOG 和 TERRAIN 文件存放路径:

#define HAL_BOARD_LOG_DIRECTORY \日志文件地址

#define HAL_BOARD_TERRAIN_DIRECTORY \// 地表、地形文件地址

有上述信息,就表示支持Posix IO 功能,另外需要说明的是:

1、Posix IO函数,智能通过IO timer定时器,或者其他低优先级线程调用。IO线程优先级59。

2、不要通过其他API直接调用,哪怕是简单stat()函数,都不可以,除非你长得太帅。 3、尽量少存储,存储数据长度小,尽量少用seek(搜寻)功能。

很简单,一个原则,不要太耗时,影响飞控代码执行。一个简单的针对SD卡的IO操作有可能花上一秒钟,这段时间足够让你的飞行器翻转,垂直掉落,直接炸鸡了。Pixhawk SD卡读写操作一般几毫秒,偶尔花费的时间会很长。现在在你知道这么做了?

相关例程 libraries/AP_Terrain/TerrainIO.cpp,我们会发现处理IO的状态机都是通过AP_Terrain::io_timer调用的。

这里,我们对 APM 源码调用做一个简要介绍,并对APM 程序库做详细讲解。如有问题,可以交流30175224@qq.com。新浪@WalkAnt,转载本博客文章,请注明出处,以便更大范围的交流,谢谢。

第七部分 源代码预览与APM:Copter程序库

英文参考:http://dev.ardupilot.com/wiki/apmcopter-code-overview/

本节来源:http://liung.github.io/blog/apm/2014-08-30-APM-Arducopter代码预览.html

APM::Copter代码主要放在ArduCopter文件夹中,并且和ArduPlane和ArduRover使用同样的库文件。

下面这张图展示了从飞行模式到电机输出的调用关系:

APM:Copter程序库

http://dev.ardupilot.com/wiki/apmcopter-programming-libraries/

http://liung.github.io/blog/apm/2014-08-30-APM-Arducopter相关库介绍.html

这些库文件也同样被ArduPlane和ArduRover所使用。下面将列出一系列高层次的库的说明和它们的函数说明。 1 核心库

AP_AHRS:采用DCM(方向余弦矩阵方法)或EKF(扩展卡尔曼滤波方法)预估飞行器姿态。

AP_Common:所有执行文件(sketch格式,arduino IDE的文件)和其他库都需要的基础核心库。

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:硬件抽象层库,提供给其他高级控制代码一致的接口,而不必担心底层不同的硬件。 2 传感器相关库

AP_InertialSensor:读取陀螺仪和加速度计数据,并向主程序执行标准程序和提供标准单位数据(deg/s,m/s)。

AP_RangerFinder:声呐和红外测距传感器的交互库 AP_Baro:气压计相关库 AP_GPS:GPS相关库

AP_Compass:三轴罗盘相关库

AP_OpticalFlow:光流传感器相关库 3 其他库

AP_Mount,AP_Camera, AP_Relay:相机安装控制库,相机快门控制库 AP_Mission: 从eeprom(电可擦只读存储器)存储/读取飞行指令相关库 AP_Buffer:惯性导航时所用到的一个简单的堆栈(FIFO,先进先出)缓冲区 关于库的导航图,如下:

这里,我们以高度保持模式为例,对姿态控制程序调用关系进行了详细介绍。如有问题,可以交流30175224@qq.com。新浪@WalkAnt,转载本博客文章,请注明出处,以便更大范围的交流,谢谢。

第八部分 姿态控制预览

英文参考:http://dev.ardupilot.com/wiki/apmcopter-programming-attitude-control-2/

本节源自:http://liung.github.io/blog/apm/2014-08-31-APM-ArduCopter姿态控制概览.html

手动飞行模式,诸如自稳模式(Stabilize Mode)、特技模式(Acro Mode)、飘逸模式(Drift Mode),其程序结构如下图:

在主循环执行过程中(比如Pixhawk的任务调度周期2.5ms,400Hz;APM2.x为10ms,100Hz),每一个周期,程序会按下述步骤执行:

首先,高层次文件flight_mode.pde中的update_flight_mode()函数被调用。通过检查control_mode变量,前飞行器的飞行模式(使用变量),然后执行相应飞行模式下的_run()函数(如自稳模式的stabilize_run,返航模式(RTL)的rtl_run等)。执行_run的结果是,系统将会找到与飞行模式相对应的命名为control_.pde飞行控制文件(比如:control_stabilize.pde,control_rtl.pde等)。

_run函数负责将用户的输入(从g.rc_1.control_in,g.rc_2.control_in等读入)转换为此时飞行模式下的倾斜角(lean angle)、滚转速率(rotation rate)、爬升率(climb rate)等(也就是设置目标值roll\\pitch\\yaw\\throttle)。举个例子:AltHold(定高,altitude hold)模式中将用户的滚转和俯仰输入转换为倾斜角(单位:角度/°),将偏航输入转换为滚转速率(单位:°/s),将油门输入转换为爬升率(单位:cm/s)。

_run函数最后还必须要完成的就是将预期角度、速率等参数传送给姿态控制和/或方位控制库(它们都放在AC_AttitiudeControl文件夹内)。


源代码分析(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:基于导游讲解视角的景区旅游形象感知研究-以凤凰古城为例

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: