根深方能叶茂 在等待的日子里,刻苦读书,谦卑做人,养得深根,日后才能枝叶茂盛。--Better(根爷)
四旋翼再不写点东西,就都忘记了。
万事开头难,就这样先写点,后续再改进深化吧。
今天先说一下系统框架,之后的整理先说主要的四个文件:姿态的解算和控制,位置解算的控制,这四个文件之所以重点分析是因为他们可以看作飞机协议栈的中间层,向下是一些硬件的驱动drive/和一些命令commander/以及导航navigator/。commander和navigator给出了一些底层的命令和规划,产生一个position setpoint交给位置控制,位置控制根据现在的位置(位置解算)和期往的位置经过串级pid最终产生att_sp期往的姿态,之后姿态控制根据现在的姿态(姿态解算)和期望的姿态经过串级pid产生控制量actuators.control,控制量actuators.control向后交给mixer,具体的力矩分配由混控器自己去处理吧。
飞机整个大致的数据流如下:
飞机的通信依靠两种方式,飞机和外部之间通过mavlink通信,内部之间通过uorb通信。所以在飞机应用开发时,想实现定制功能,大致做两部分工作就好了:
其一:仿照其他的module模块,添加自己的模块,模块里做自己想做的事情,实现自己要求的功能。模块编辑完后后,添加到cmake编译配置文件中,这时你的模块就可以编译到固件之中。固件之中只是有你的代码,但是这时你的代码并没有启动,所以还需要在rcs启动文件中启动你的模块,如此两步你的模块就已经在系统之中正常工作。
其二:是信息流的问题,因为你的模块肯定需要从其他地方获取数据,处理好的数据肯定也需要publish出去。这一部分就是uorb进程间通信的问题,关于uorb一定要把他的基本使用完全掌握,这样整个信息流岂不是都在你手中。
uorb其实也就两部分,一部分是订阅数据,先订阅subscribe后拷贝copy,另一部分就是发布数据:先广播advert再发布publish。注意订阅和广播建议都写在主进程的初始化部分,因为他们只需要一次初始化操作。还有一点就是copy数据的问题,模块之中常用的是poll阻塞等待,模块使用它是为了保持大循环,其他地方取数据我更建议使用检查更新check,免得阻塞浪费资源影响他人。
懂得修改这两处,基本上就可以开发你的功能了,基于这一部分,我做了一点避障算法,低速避障效果很好,高速还有待完善。
下面再给大家几个整体图,供大家了解结构,如此先建立整体概念,方便入手。