无名小哥 2024年1月1日
通过对前面几讲中《零基础竞赛无人机积木式编程指南》系列开发教程的学习可知,在以往TI电赛真题的学习训练方案中飞行任务代码开发主要集中在Substask_Demo.c和Developer_Mode.c两个程序文件,其中在Substask_Demo.c内负责对具体飞行任务中每个阶段的无人机的飞行动作、航点位置、目标追踪、巡航速度、目标姿态、执行机构驱动(如蜂鸣器、激光笔、舵机、电机)等进行流程化的设计,Developer_Mode.c内用于实现自动起飞、降落、不同的飞行任务切换与执行。
尽管飞控代码内的相关的API函数接口已经实现得相当完备,但上述开发过程的对于初次接触整个飞控代码这一系统工程的学习者来讲,想要直接上手去二次开发仍然还有一定的难度,特别是在对飞控系统代码框架(硬件驱动层、传感器驱动、传感器滤波、姿态解算、惯性导航、机器视觉、基本飞行控制实现、API函数、导航控制、SDK自主任务等)没有整体的把握的情况下。
仅有C语言+单片机常用基础芯片资源使用知识的初学者按照提供的真题案例和二次开发教程“依葫芦画瓢”去实现特定任务往往容易会出现一些常识性错误,有些错误会直接导致整个飞控系统的“崩盘”。下面以实现无人机在前进的过程中搜寻到色块后,对色块进行跟踪这一任务为例子,将新手易错的问题整理如下:
另外由于飞控自身硬件资源有限,飞控自身外界的外设占用比较多,可供用户它用的串口、PWM、IO资源不再富裕,使用起来使用捉襟见肘,常常需要外部MCU进行扩展,既然都引入了外部MCU到无人机平台中了,很自然的会想到用自己熟悉的MCU飞无人机飞行任务进行开发。
综上所述,针对新手初学者来讲,面对略显庞杂的飞控系统代码,在进行二次开发时,若写出某些天坑级的BUG会导致无人机系统的整体崩溃,基本的姿态自稳都得不到保障,就会出现灾难级的炸机事故。因此为了使得二次开发更加简单、开发更加安全,有必要将和用户二次开发相关的API函数、导航控制、SDK自主任务控制部分代码的实现,单独用一个通用控制器去实现,我们只需要在飞控端将已有的API函数接口进行简单整合,在SDK模式中新增加外部控制offboard模式就可以,这部分工作量很少,很多都是现成的我们在后面的教程中进行介绍。
TIVA飞控硬件系统包括飞控主板与外设两部分组成,其中飞控主板上板载加速度计陀螺仪(带温控电路)、气压计传感器,带独立按键和五向按键,配备OLED显示屏进行人机交互,带蜂鸣器和RGB灯提示,板载的扩展接口包括8路串口、16路PWM、8个预留IO口、2组I2C口等。扩展接口用于外接机载端SLAM定位、offboard外部控制、光流、对地激光测距、GPS、机器视觉(如OPENMV/K210/树莓派OPENCV)、激光雷达点云数据等。
TIVA飞控软件系统包括芯片底层与应用相关驱动、传感器数据采集、传感器滤波、姿态解算、惯性导航、基础飞行控制、自主飞行API函数、SDK开发者模式等。
在传统的开发模式中主要是在飞控代码内部对SDK开发模式中编写飞行任务代码去实现特定任务,这些开发流程在之前按的教程中有详细的阐明。本教程需要解决的问题是如何将飞控软件框架中的自主飞行相关API函数和SDK开发者模式的应用层开发代码放在外部的通用的MCU中去实现,比如盘古TI MCU系统板(已完成)、STM32F103系列核心板(已完成)、STC32G12K128开发板(完成度90%)等。由于外部通用MCU中需要实现的代码量很少,对单片机处理资源和性能要求并不高,因此用户完全可以用任何一款自己熟悉的单片机,高效率得心应手的去开发,参照上述已实现的三款核心板方案,去自己实现飞控的外部控制这部分设计。为了方便后面表述,我们将带有offboard外部控制的飞控称为TIDronePilot(简称TPT/下位机/飞控端),将外部通用MCU开发板称为TIDronePlanner(简称TPR/上位机/应用端)。
TPT的实现工作量很小,就是在保留原来TIVA飞控所有功能的前提(仍然可以用传统方案开发)下,主要新增加了一下三点:
TPT发送飞控内部估计出的三维位置、速度、加速度、角速度、姿态四元数、融合标志等信息给外部控制端,TPR端解析到上述反馈数据后用于对无人机实现位置、速度等控制,并将最终的控制量串口打包发送给飞控端。
?
?
?
至此用于实现offboard外部控制飞控端的主要工作就全部实现了,单从控制部分抽象来看offboard模式下飞控端“退化”成只执行基本的飞行控制部分,主要包括姿态自稳、部分定高(竖直速度、加速度)功能,飞控内部并没有运行对无人机的位置、速度进行直接的控制的代码,相当于飞控在offboard外部控制模式下变成了一个“指哪打哪”、“一切行动听指挥”严格响应外部控制端TPR命令的被控对象。飞控负责保持自身姿态和竖直方向速度的稳定,其它应用层开发全部放在外部控制端TPR端去实现,新的开发模式下用户可以不用在飞控TPT端修改代码,把无人机作为一个整体被控对象去开发,自然也就不会出现第一节中天坑级BUG导致灾难性炸机的情况,在TPR端开发应用层代码不会影响飞控TPT端内部的控制,任何情况下遥控器都可以直接对无人机的控制进行接管。?
TIDronePlanner作为飞控offboard外部控制模式下的上层控制器,其主要作用是实现原飞控中用于自主飞行相关API函数、SDK开发模式的功能,由于TPR应用端内部需要实现无人机水平方向的位置、速度控制,竖直方向的高度位置控制,自然需要飞控端TPT给应用端TPR发送自身的位置、速度、姿态等无人机飞行状态的反馈信息,TPR接收到反馈信息后用于无人机的位置、速度闭环控制,最终将TPR控制器的输出封装成相关API接口变量,通过串口通讯打包发给TPT飞控端,从而实现了整个飞控位置、速度、加速度、姿态角度、姿态角速度的系统的完整闭环控制。
?
?
在通用MCU系统板中实现TIDronePlanner的工作量同样很少,除了对应单片机资源如串口通讯、PWM输出、按键、显示屏、定时器调度驱动实现外,剩下的工作只剩下解析飞控端发送过来的状态反馈信息、移植原飞控端位置控制、速度控制、SDK开发模式、API接口函数、串口打包发送API接口变量。
?
?
?
?
?
?
?
这里需要注意的是虽然Auto_Flight_Ctrl函数在定时器内周期性执行,但SDK任务执行与否取决于offboard_start_flag变量的值,当用遥控器/ADC按键操作飞控端切入offboard模式后,此标志位会被置1,Auto_Flight_Ctrl中的自主飞行任务才会执行。?
?
?TIDronePlanner中实现部分还包括外设如舵机/电机、激光笔、蜂鸣器等设备的驱动,辅助传感器如激光雷达点云、机器视觉等数据的接入,具体根据实际飞行任务要求来,由于TIDronePlanner的实现仅需要占用一个串口资源就可以实现其应用层,因此通用MCU核心板的其它预留出来的资源就可以供二次开发使用,此举能有效解决传统开发方案中,资源不够用的情况。
TIDronePilot和TIDronePlanner配合使用时的具体操作参见配套的视频教程...
?
?