APM飞控学习之路:4 源码裁剪与下载
来源:互联网 发布:ubuntu安装exe 编辑:程序博客网 时间:2024/04/28 00:49
“月盈则亏,水满则溢”。当博主编译完成,以为离成功更近一步准备下载的时候,殊不知陷阱也早已准备好,等待我的踏入。连上USB线,下载,timeout...,timeout...,timeout...,留下博主一脸懵逼,和一块已然变砖的APM板。遂作此文,为广大APM开发者避开下载的坑。
下载环境:APM2.8,固件版本3.2.1,通过USB下载。
原因定位
刷写Bootloader
虽然Bootloader被博主无意中破坏,但天无绝人之路,从哪里弄坏,就从哪里修好。当自己买电子元器件和电路板,根据开源的APM硬件焊接APM板时,也需要给APM板重新烧写Bootloader。
硬件准备
AVR单片机的USBASP或USBISP下载器×1。
软件准备
1. 下载器配套软件,推荐progisp1.72。
2. AVR的USB自编程软件:Flip。
3. 32u2的驱动程序。
4. 三个hex文件:Atmega2560的bootloader文件、32u2的bootloader文件和32u2的ppm程序文件。
烧写过程概述:先给Atmega2560烧写bootloader,然后给Atmega32u2烧写bootloader,最后给32u2写入PPM解码通讯程序。按照视频教程操作即可,可以不用转接线,直接用几根杜邦线连接,注意线序。
程序裁剪与下载
既然程序容量有限,就需要对程序进行裁剪,比如拿剪刀把APM板剪掉一角。好了正经一点,所谓裁剪,最简单的就是将部分程序注释或删除,使编译之后的程序容量变小。要想裁剪APM,首先需要对飞控程序的结构有个大致的了解,才能在注释或删除代码的同时保证飞控的稳定性。先看看官网是怎么介绍飞控程序的:“The ArduPilot code base is quite large (about 700k lines for thecore ardupilot git tree) and can be quite intimidating to a new user.”,翻译过来就是飞控代码太太太多了,足足70万行估计你这小白搞不定。
“他强任他强,清风抚山岗。他横由他横,明月照大江。”虽然飞控代码多,但是程序员有两板斧子,一看代码结构,二看主函数。
根据上篇博文所述,使用VS2012配合VM插件查看APM3.2.1工程代码,其代码主要由多个pde文件组成,可简单理解为cpp文件。根据pde文件的命名,博主将代码分为6类:(1)主函数ArduCopter;(2)各种飞行模式,占了大部分程序,如control_acro、control_althold、control_auto等;(3)系统初始化system;(4)Mavlink通信GCS_Mavlink;(5)用户程序UserCode;(6)其他杂项。既然飞行模式的程序最多,博主就准备拿它开刀。
要裁剪飞行模式,就得看主函数是如何调用各飞行模式的。看大型代码一定要带着目的去看,既然通过遥控可以切换飞行模式,那么判断处于飞行模式的代码一定是在某个循环中。这样一来就好办了,从ArduCopter.pde的fast_loop()函数入手,可以看到其代码不多,列出如下。
static void fast_loop(){ // IMU DCM Algorithm // -------------------- read_AHRS(); // run low level rate controllers that only require IMU data attitude_control.rate_controller_run(); #if FRAME_CONFIG == HELI_FRAME update_heli_control_dynamics();#endif //HELI_FRAME // write out the servo PWM values // ------------------------------ set_servos_4(); // Inertial Nav // -------------------- read_inertia(); // run the attitude controllers update_flight_mode(); // optical flow // --------------------#if OPTFLOW == ENABLED if(g.optflow_enabled) { update_optical_flow(); }#endif // OPTFLOW == ENABLED}细心的朋友可能注意到了,顾名思义,update_flight_mode()就是更新飞行模式的函数。右键转到定义或按快捷键F12,可查看update_flight_mode()中是一串熟悉的switch-case语句,根据不同的case切换不同的飞行模式。以常见的自稳模式stabilize为例,可一直追踪下去,如高度控制,电机控制等。醉翁之意不在酒,在乎“飞行模式”也。
- APM飞控学习之路:4 源码裁剪与下载
- APM飞控学习之路:3 APM系统介绍与开发环境搭建
- 【飞控学习】APM和PX4飞控源码下载及安装
- APM飞控学习之路:1 无人机的分类与发展
- APM飞控学习之路:2 四旋翼的工作原理与系统组成
- APM飞控学习之路:5 串口概述与收发调试
- ArduPilot/APM源码学习笔记(一)
- APM源码分析之 主流程
- APM源码分析之 姿态控制
- APM源码分析之 油门跟踪
- APM飞控解析
- apm飞控代码学习日记(一)
- PX4源码学习一--Pix和APM的区别
- APM源码导航
- APM源码导航目录
- pandaboard ES学习之旅——3 Uboot源码下载与编译
- Android_头像裁剪上传源码与讲解
- springFramework 源码学习日记(一)源码下载与编译
- 四舍五入与 银行家算法
- 神采奕奕
- 文章标题
- powermock、hadoop、Concordion、Java 8教程
- ListView详解
- APM飞控学习之路:4 源码裁剪与下载
- 三行代码实现贝塞尔曲线
- html5-访问历史记录
- 45个有用的JavaScript技巧,窍门和最佳实践
- js 的函数
- leetCode练习(131)
- 错题
- svn主干和分支的切换
- ShareSDK第三方平台的详细使用参考官方API