关于树莓派多旋翼无人机的程序控制程序部分,是我们这一个系列中最重要的一个部分,也是最后一个部分。我们今后的几讲都会围绕飞控程序源代码来进行详细说明。今天我们就来一起了解一下飞控程序源代码的整体架构,我们首先来看一看程序的目录结构:
├── engine
│ ├── config.c
│ ├── dlmod.c
│ ├── emode.c
│ └── engine.c
├── examples
│ ├── e.g.001.motor
│ │ ├── main.c
│ │ └── Makefile
│ └── e.g.002.motor_timer
│ ├── main.c
│ ├── Makefile
│ └── release
│ └── example
├── include
│ ├── config.h
│ ├── defconfig.h
│ ├── dlmod.h
│ ├── emode.h
│ ├── engine.h
│ ├── list.h
│ └── typedef.h
├── io
│ └── stm32
│ ├── libs
│ │ ├── libstm32.a
│ │ └── Makefile
│ ├── linker.ld
│ ├── linux
│ │ ├── main
│ │ │ └── main.c
│ │ ├── Makefile
│ │ └── release
│ │ └── main
│ ├── Makefile
│ ├── Makefile.common
│ ├── release
│ │ ├── main.bin
│ │ ├── main.elf
│ │ ├── main.hex
│ │ ├── main.info_code
│ │ ├── main.info_elf
│ │ ├── main.info_size
│ │ └── main.info_symbol
│ ├── src
│ │ ├── hardware
│ │ │ ├── crc.c
│ │ │ ├── exti.c
│ │ │ ├── frame.c
│ │ │ ├── frame_crc.c
│ │ │ ├── led.c
│ │ │ ├── led_light.c
│ │ │ ├── pwm_in.c
│ │ │ ├── pwm_out.c
│ │ │ ├── serial_port.c
│ │ │ ├── timer.c
│ │ │ ├── timer_tick.c
│ │ │ └── uart.c
│ │ ├── include
│ │ │ ├── crc.h
│ │ │ ├── crc_table.h
│ │ │ ├── crctable.h
│ │ │ ├── exti.h
│ │ │ ├── frame_crc.h
│ │ │ ├── frame.h
│ │ │ ├── led.h
│ │ │ ├── led_light.h
│ │ │ ├── pwm.h
│ │ │ ├── pwm_in.h
│ │ │ ├── pwm_out.h
│ │ │ ├── serial_port.h
│ │ │ ├── timer.h
│ │ │ ├── timer_tick.h
│ │ │ ├── typedef.h
│ │ │ └── uart.h
│ │ ├── main
│ │ │ ├── main.c
│ │ │ └── startup.c
│ │ ├── Makefile
│ │ ├── release
│ │ │ ├── app.a
│ │ │ ├── frame_crc.o
│ │ │ ├── led_light.o
│ │ │ ├── main.o
│ │ │ ├── pwm_in.o
│ │ │ ├── pwm_out.o
│ │ │ ├── serial_port.o
│ │ │ ├── startup.o
│ │ │ └── timer_tick.o
│ │ └── tags
│ └── tags
├── lib
│ ├── libcontroller.so
│ ├── libdisplay.so
│ ├── libio_stm32.so
│ ├── liblogger.so
│ ├── libmotor.so
│ ├── libmpu6050.so
│ └── libparamsctl.so
├── LICENSE
├── main
│ └── main.c
├── Makefile
├── mods
│ ├── command
│ │ ├── command.c
│ │ ├── command.h
│ │ └── Makefile
│ ├── controller
│ │ ├── controller.c
│ │ ├── controller.h
│ │ └── Makefile
│ ├── display
│ │ ├── display.c
│ │ ├── display.h
│ │ └── Makefile
│ ├── fheight
│ │ ├── fheight.c
│ │ ├── fheight.h
│ │ └── Makefile
│ ├── gy953
│ │ ├── gy953.c
│ │ ├── gy953.h
│ │ └── Makefile
│ ├── hcsr04
│ │ ├── hcsr04.c
│ │ ├── hcsr04.h
│ │ └── Makefile
│ ├── io_stm32
│ │ ├── io_stm32.c
│ │ ├── io_stm32.h
│ │ └── Makefile
│ ├── logger
│ │ ├── logger.c
│ │ ├── logger.h
│ │ └── Makefile
│ ├── motor
│ │ ├── Makefile
│ │ ├── motor.c
│ │ └── motor.h
│ ├── mpu6050
│ │ ├── i2cdev.c
│ │ ├── i2cdev.h
│ │ ├── Makefile
│ │ ├── mpu6050.c
│ │ └── mpu6050.h
│ └── paramsctl
│ ├── getch.c
│ ├── getch.h
│ ├── Makefile
│ ├── paramsctl.c
│ └── paramsctl.h
├── params
│ └── quadcopter.pms
├── README
├── release
│ └── bin
│ └── quadcopter
├── setup_I.png
├── setup_X.png
├── shell
│ ├── install.sh
│ ├── quadcopter_service
│ └── quadcopter.sh
└── util
└── list.c
我们来对每一个目录中源代码的功能做一下简单的说明,后续章节中我们会详细对这些功能代码做解析。
engine:其中实现了整个飞控的引擎功能,飞控从启动、运行、解锁、飞行、姿态解算、自动平衡、自平衡算法等等功能均在这里实现,并且包含了程序模块化功能,支持多模块的动态编译与动态挂载,而且还包含了一些调试电机、电调、遥控器等功能。
examples:存放了几个简单的例子。例如:我们可以通过第一个例子程序进行电调的最大行程校准和驱动电机。
include:这是一个C语言的头文件声明文件夹,里面包含了程序的定义与声明部分。例如:一些变量类型的重定义和引入一些标准C语言头文件等。
io:这里面存放的是stm32的固件代码。stm32程序的主要负责PWM信号的输入、输出部分。早期的飞控采用的是树莓派自己生成PWM信号 ,但由于树莓派的实时性不强,生成的PWM信号大概有30~50微秒的误差,所以导致飞机的信号控制有一些噪声;后期采用树莓派+STM32的设计,主控程序代码采用树莓派来完成,采集传感器数据,姿态解算,而由STM32采集PWM输入内容,也就是遥控器的读数,通过串口传递给树莓派。树莓派通过PID控制生成PWM目标值,再将这些PWM目标值通过串口发送给STM32。由STM32产生精准的PWM信号。
lib:存放了编译后的动态存放动态模块所编译后的动态链库。一般为lib*.so格式。飞控引擎会自动载入并将所有lib目录下的.so文件加入当前运行队列执行。
LICENSE:使用许可。
main:C语言程序的主函数入口。
Makefile:Linux下编译配置文件,其中设置了一些系统飞控选项和和参数等,并且包含了两种不同模式下的编译模块:例如:在编译树莓派全功能版时,树莓派飞控程序将被编译成具有PWM输出输入模块;而在编译树莓派+STM32版本时,则不编译树莓派的输出输入功能,而编译STM32作为IO输入输出。
mods:存放了所有的动态模块,这里的所有模块都为独立可编译程序,由其子目录中的Makefile文件编译成独立的动态链接库,所有的模块程序需要符合统一的开始和结束标准。
command:保留
controller:树莓派的PWM输入模块,即由树莓派来读取读取遥控器的信号输入。
display:显示模块,用于显示飞控当前所有的状态,并在不同内容之间切换。
fheight:保留。
gy953:保留。
hcsr04:保留。
io_stm32:树莓派与stm32通讯并处理IO功能模块。
logger:日志模块,用于记录飞控在飞行中的所有飞行数据。
motor:树莓派的PWM输出模块,即电机控制模块,也就是电机驱动。
mpu6050:MPU60650电子陀螺仪模块,读取当前欧拉角、角速度、加速度数据读数。
paramsctl:参数设置模块,可以设定飞控中的参数相关信息。
params:参数文件保存在此目录中
README:使用说明
release:编译后的可执行文件
setup_I.png:安装说明图 I 型。
setup_X.png:安装安装图解 X型。
shell:Linux可执行脚本 ,其中包括了安装脚本与随系统启动运行飞控程序功能。
util:工具函数。其中实现了一个简单的链表功能,由飞控引擎调用并将所有需要执行动态链接库在这个循环链表中循环执行。
以上就是整个飞控程序的整体架构,其实并不复杂,我们的飞控程序是以学习为目的,所以力求简单易懂,所以并没有像很多商业飞控那像复杂。在下一讲中我们将一起学习飞控的源代码。
Copyright © 2015-2023 问渠网 辽ICP备15013245号