Skip to content

AO-FLY/HorizonControlCode

Repository files navigation

AO-FLY / Horizon飞控

介绍

AO-FLY 团队针对电赛飞行器的自主设计要求,推出 Horizon(地平线)飞控。Horizon的代码和硬件及相关拓展资源全开源,供广大无人机爱好者设计参考使用。

AO-FLY的主控芯片是STM32F407VGT6,使用CubeMX HAL库进行开发,设计周期短,且兼容大多数STM32F103系列内容,易于初学者上手。飞控编程的IDE软件是Clion,硬件设计的软件是立创EDA。搭载Jetson nano微型电脑,视觉导航使用T265,融合匿名光流的速度数据。

相关拓展资源会陆续公布。由于设计仓促,加之团队技术有限,欢迎广大爱好者提供宝贵的意见。

软件架构

软件使用freertos实时操作系统。共七个程序任务:

  1. 默认任务:空任务,用户可自由补充。此任务优先级为最低(空闲)。
  2. 传感器检测任务:最高优先级,用于获取陀螺仪数据和光流数据。T265的数据接收是循环DMA方式,不在任何任务里。
  3. PID计算任务:最高优先级,核心计算程序。各类繁杂的计算和主要控制程序在此任务中。
  4. 按键检测任务:检测外来控制信号(按键、无线串口等),同时可以作为计时任务使用,周期为1~1.5s(可通过osDelay调整)。次高优先级。
  5. 用户自主任务:用户根据具体指标要求,在此任务里设计实现。建议设计方法为:更改飞行器的高度期望、位置期望、启停相关动作(如投放物体等)。不建议在此任务里设计底层程序。次高优先级。
  6. Vofa上位机任务:用于调试过程中周期性发送飞行器数据至上位机,正式飞行时,需要关闭该任务中的数据发送。
  7. 电压检测任务:检测电池电压,可以乘以某个系数用于补偿平衡油门(若成线性变化),当前版本此任务为空。低优先级。

当前版本任务之间的通信为全局变量方式。这种方式的优点是实时性强,基本能满足实时检测、实时读取、实时写入;缺点是数据未得到保护,可能存在竞争与冲突。 为减小冲突发生几率,建议减少变量在任务间的直接通信,可使用任务内部缓冲变量临时缓存,或控制全局变量为单写入、多读取,不作为多个任务共同写入的对象。 信息传递只传递原始数据,相关计算由各自任务在其内部完成。该部分仍待优化。

2024年5月更新: 全局变量方式宜改为“消息中心(Message Center)”方式,这种方式我首次在湖南大学跃鹿战队(机甲大师比赛战队)写的代码中观察到,这种方式能够有效实现各任务间数据的解耦,同时能保证数据交换的实时性。

算法架构

控制算法主体为PID算法。除经典PID控制以外,还提供多种改良PID算法(见PID.h文件)和arm-math库中的优化算法接口(见arm_math.h文件)。 飞行器定高系统设计为一阶弹簧阻尼系统,由最小二乘法求得高度速度。一阶弹簧阻尼系统对参数调试要求不高,但是初始整定参数时,请务必加大阻尼系数,可防止飞行器高度失控撞顶。 注意该设计方法不能保证飞行器稳定地保持在指定高度上,会存在小幅度静差,参数在后期优化时需细心整定。如有实现条件,可设计为二阶弹簧阻尼系统,或者飞行器趋于稳定时, 使用传统PID算法进行控制,达到消除静差目的;同时需要保证平衡油门值取值合适,由于电机的油门会受电池电压影响(使用PWM式电调时),可设计程序在飞行器飞行一段时间后 进行平衡油门补偿。 当前版本未引入自适应PID算法。

使用说明

  1. git pull到本地
  2. 修改CMake工具链
  3. 修改CMakeLists.txt文件
  4. STM32CubeMX版本6.9.1,注意v6.5版本后,想要使用Clion开发32的话都要选择STM32CubeIDE生成项目
  5. 。。。

参与贡献

  1. 尹浩屹 飞控程序(主体),硬件设计,机械结构优化(主体),参数调试(主体)
  2. 李杰 硬件设计(主体),飞控程序,视觉算法(主体2),综合优化
  3. 孙树豪 视觉算法(主体1),Jetson Nano与STM32的通信,消防小车(主体)
  4. 柳凌峰 OpenMV视觉识别
  5. 3103实验室

后话

这个版本相对于1.0版本,将高度控制改回了PID控制,并且为大P大D; 1.0版本中我使用的一阶弹簧阻尼算法,由于准确性不好被我舍弃掉了。 但是一阶弹簧阻尼算法有个好处,就是调参的时候比PID快,并且安全性 很高。

HAL库中的硬件IIC似乎有其固有缺陷,谨慎使用。

请不要直接在这里打开工程!Clion编译时只能是英文路径运行, 因此你需要将工程文件夹移动到一个英文路径下。 首次编译时,请删掉项目树中的cmake-build-debug文件夹(默认是橙色的), 然后重新Cmake。

如你所见,这是一个写的非常烂的代码,我之后想过从几个方面进行改善, 包括但不限于:将任务间的通信方式改为“消息中心(Message Center)”方式, 而不采用全局变量的形式(消息中心采用链表形式);进一步封装定高和 巡航的代码(提高实时性);去掉陀螺仪的IIC通信方式,而改为串口通信 方式(规避硬件IIC)等。

这并不是一个值得参考的工程,但是对于我们的学习来说, 我想这是绕不开的。欢迎指正。

About

Horizon无人机主控代码

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages