软件介绍
-
FMT (全称Firmament) 是首个基于模型设计 (MBD, Model-based design) 的开源自驾仪软件系统。可被用来快速构建无人机,无人车,无人船,机器人等无人控制平台的控制系统。FMT结合当前最先进的基于模型设计和3D仿真技术,致力于打造下一代的开源自驾仪系统。
FMT 项目主要由以下部分构成:
-
FMT-FW: 飞控嵌入式软件框架。由C语言编写,包含飞控的核心软件,驱动以及功能模块等。
-
FMT-Model: 飞控算法模型框架。包含了基于 MATLAB/Simulink 实现的算法模型,如导航,控制,状态机,被控对象模型等。算法模型通过自动代码生成可以合入到 FMT-FW中,从而构成完整的飞控系统软件。
功能特点
- C语言实现的轻量级、高实时、高性能的嵌入式软件系统,支持C/C++混合编译。
- 基于国产RTOS RT-Thread, 拥有活跃的开源社区以及丰富的第三方组件。
- 支持 MBD(Model-based Design)全流程开发 。MIL,SIL,HIL,SIH仿真支持。
- 基于Matlab/Simulink实现的算法和模型库,图形化编程,支持仿真和自动代码生成。
- 支持Mavlink协议以及开源地面站QGroundcontrol。
- 支持广泛使用的开源硬件Pixhawk/Pixhawk4等,以及QEMU模拟器。
- 采用跨平台的开发工具链,支持Win/Linux/Mac等平台的开发。
FMT-FW 软件框架
-
FMT-FW采用分层设计模式,
各个层级代码功能如下:
Target: 该目录存放各个目标平台的相关代码,比如外设驱动,板级相关文件等。如果要将FMT移植到一个新的硬件平台,那么只需要实现该目录下的文件。
Driver: 该目录存放IO驱动设备文件(注意:这里指的不是外设驱动)。IO驱动是指如传感器,Flash等其它板载芯片的驱动。
HAL: 该目录为硬件抽象层,为通用/抽象设备提供统一的上层接口。这样将大大方便软件的移植,也降低了上层与驱动之间的耦合。
RTOS: 该目录存放实时操作系统的代码,目前是存放RT-Thread的代码。
Middleware: 该目录存放中间层代码,包含FMT核心的功能和算法模块以及一些三方库。其中Modules为FMT组件代码,如基于发布/订阅模式的跨线程通信模块uMCN,分布式参数模块,分布式实时日志模块Mlog等。Models包含核心算法模块,如导航系统,控制系统等。算法模块可以是由Simulink模型自动生成的代码,也可以是手动编写的C/C++代码,或者是移植的算法,如PX4的EKF。
Task: 该目录包含FMT的顶层应用功能。每个Task通过调用Middleware中的模块,负责特定的业务逻辑。如task_vehicle负责被控对象整体控制的相关功能,包括导航,状态机,控制等。task_comm负责基于mavlink与地面站进行通信的功能。如不需要使用相关功能,则可以将对应的task注销,或者通过添加新的task来增加新的功能。
FMT-Model 软件框架
-
FMT-Model是基于MATLAB/Simulink搭建的一套MBD的开发框架。FMT-Model作为一个基础平台,提供了MBD开发所需要的基础组件,从而可以更方便、快捷的搭建算法模型。搭建好的模型可以进行MIL(Model-in-the-loop)仿真来快速验证算法,然后通过自动代码生成将算法模型一键部署到飞控(FMT-FW)上。反过来,在实际的测试以及仿真中采集真实的测试数据导入到FMT-Model中进行开环仿真,通过日志数据获取算法模型所有内部状态从而进行算法的性能调优和Bug分析。
FMT-Model各部分功能模块介绍如下:
Utils, Scripts: 该模块包含用MATLAB写的一些帮助脚本,如日志解析,传感器校准,数据分析&绘制等。
Model Library: 该模块包含FMT Toolbox,其完全基于Simulink基础模块编写,实现了基础的模型库,如Math,Quaternion,Filter,Transformation等。后续也会持续扩充FMT Toolbox。
Simulation: 为左边绿色模块框选的区域,包含一些基础仿真的模型,如MIL(模型在环仿真)和开环仿真模型。
Algorithm Model: 这个是FMT-Model的核心算法模型库,主要包含四大类别的算法模型:
-
INS :惯性导航系统。通过多种传感器数据融合算法,获得机体的所有状态信息,如姿态,速度,位置,传感器误差等。
-
FMS:飞行管理系统,或称状态机。负责逻辑控制和相关指令生成等,同时还负责安全相关的一些功能。
-
Controller:控制器。根据FMS的指令和INS的当前状态输出作动器指令,控制目标机体。
-
Plant:被控对象模型。包括动力学模型,作动器模型,传感器模型等。读取控制器输出的作动器指令,输出被控对象的状态信息,并通过状态信息生成模拟的传感器数据。通过对真实被控对象的参数建模和辨识,以建立接近于真实水平的被控对象模型。
FMT-Model作为MBD的基础框架,承载算法模型库,并为其提供必要的模型库和工具。今后结合社区的力量,使得算法库得到扩充,具备越来越多的算法模型(基于不同的算法或针对不同的被控对象)。当我们需要构建某个控制系统,如小车,那么首先去算法库中看看有没有可以满足需求的算法模型,有的话则直接拿来使用。若没有,则可以寻找类似的模型进行适当修改,或者从头搭建。新建立的算法模型可以再贡献给社区,让其他人也从中受益,这样就形成了一个大家互利互惠的良好生态。
之所以算法库采用Submodule这种分布式结构,是考虑到以后算法模型可能由不同的组织和个人贡献,通过submodule这种方式,可以更容易地将其他人的模型链接到FMT-Model中。当然,FMT官方团队也会维护一些算法模型,比如目前这套Base系列模型就是针对多旋翼开发的,以及未来会开发更多的针对不同被控对象的算法模型。
-
软件获取
-
本章节介绍如何获取FMT项目代码以及如何配置相关软件开发环境。
提示:
FMT用到的所有开发工具都是跨平台的,支持Linux,Windows或者Mac OS。这里仅以Linux为例,其它平台类似操作。
下载FMT-FW
-
使用git指令下载
git clone https://github.com/Firmament-Autopilot/FMT-Firmware.git --recursive --shallow-submodules
如遇网络原因下载不成功,可以尝试先将FMT-FW以及其包含的子模块 同步到gitee,然后再分别下载。
下载FMT-Model
-
使用git指令下载
git clone https://github.com/Firmament-Autopilot/FMT-Model.git --recursive
如因网络原因下载不成功,可以尝试先将FMT-Model及FMT-Model/model目录下的子模块同步到gitee,然后再分别下载。
下载软件
-
QGC地面站与nomachine下载链接
百度网盘:下载链接
提取码: amov
安装VSCode
-
FMT-FW使用VSCode IDE进行开发和调试。可以访问VSCode官网进行下载 。下载安装好后,点击File->Open Folder选择下载好的FMT-Firmware目录,即可打开工程,如下图所示
然后需要在VSCode中安装如下插件:
-
Arm Assembly:用于查看汇编代码。
-
C/C++:用于C/C++语法高亮和相关跳转功能。
-
Cortex-Debug:用于Cortex处理器的JLink调试。
安装MATLAB
-
FMT-Model基于MATLAB 2018b进行开发,所以推荐使用这个版本,但是理论上使用更高的MATLAB版本也是可以的。大家可以自行下载MATLAB安装包进行安装,具体安装步骤可以参照MATLAB官网说明。
FMT-Model需要用到如下的Toolbox,故在安装MATLAB的时候需要至少选择安装如下工具:
-
Aerospace Blockset (4.0)
-
DSP System Toolbox (9.7)
-
Embedded Coder (7.1)
-
Instrument Control Toolbox (3.14)
-
MATLAB (9.5)
-
Simulink (9.2)
-
Simulink 3D Animation (8.1)
-
Simulink Coder (9.0)
-
Stateflow (9.2)
安装好MATLAB后,打开MATLAB并将目录切换到FMT-Model。双击运行
FMT_Model.prj
将进行工程的初始化工作,如下图所示。
固件编译&刷写
-
本章介绍如何编译&刷写FMT固件至飞控硬件中。更多的信息,可以参考FMT用户手册 。
提示:
FMT的下载需要用到硬件中的bootloader并且不会破坏已有的bootloader,所以在刷写了FMT固件后,可以轻松刷回PX4或者APM固件。
下载工具链
-
如果是第一次编译FMT,在编译前需要做些准备工作,比如下载编译器、构建工具以及配置环境变量等。总的来说,FMT的编译环境配置还是非常简单的。
提示:
FMT支持在Linux,Windows或者Mac OS下编译,这里仅以Linux为例,其它系统类似。首先下载如下编译工具链:
-
编译器: arm-none-eabi- toolchain: 版本:
7-2018-q2-update
. -
构建工具: Scons: 可以使用
pip3 install SCons
来安装 scons. 然后将scons的路径加入到系统Path环境变量中. -
STM USB Driver: STM32 USB Driver: 仅针对Windows平台需要下载。
下载安装完工具链后,需要配置环境变量将编译器和构建工具的路径加入到系统路径中,比如:
export RTT_EXEC_PATH=/usr/local/bin/gcc-arm-none-eabi-7-2018-q2-update/bin export PATH=/usr/bin/scons:$PATH
笔记:
可以将环境变量配置的指令加入到系统启动脚本中,如~/.bashrc,这样便不用每次开机都需要配置一遍。
编译固件
-
针对Pixhawk以及其衍生的硬件,包含两颗MCU,主处理器FMU以及协处理器IO。所以FMT针对两颗MCU有分别的固件,fmt_fmu和fmt_io,需要分别编译和下载。
fmt_io通过fmt_fmu来间接下载,所以我们需要先下载了fmt_fmu固件后,再来下载fmt_io。
首先编译fmu固件,我们进入到目标板对应的target目录,然后输入如下指令:
cd FMT-Firmware/target/cuav/v5_plus/ scons -j4
编译完成后如下所示,将在build目录下生成我们需要的固件。
arm-none-eabi-objcopy -O binary build/fmt_cuav-v5.elf build/fmt_cuav-v5.bin arm-none-eabi-size build/fmt_cuav-v5.elf text data bss dec hex filename 656704 27496 121600 805800 c4ba8 build/fmt_cuav-v5.elf scons: done building targets.
下面我们编译io固件,类似的,进入到io的目录,然后输入如下指令:
cd FMT-Firmware/target/pixhawk/fmt-io/project scons -j4
编译完成后如下所示,将在build目录下生成io的固件。
arm-none-eabi-objcopy -O binary fmt_io.axf build/fmt_io.bin arm-none-eabi-size fmt_io.axf text data bss dec hex filename 16680 160 4952 21792 5520 fmt_io.axf scons: done building targets.
刷写固件
- 当前支持3种方式来刷写FMT固件,按复杂程度从易到难分别为:
-
使用python脚本下载
首先执行对应目标硬件平台目录下的uploader.py,然后通过USB将飞控连接到电脑上。在检测到飞控连接后,将自动开始下载,如下所示:
~/FMT-Firmware/target/cuav/v5_plus$ python3 uploader.py waiting for the bootloader... Auto-detected serial ports are: Not found fmt_fmu,please connect fmt_fmu! Not found fmt_fmu,please connect fmt_fmu! Not found fmt_fmu,please connect fmt_fmu! Found board id: 50,0 bootloader version: 5 on /dev/serial/by-id/usb-3D_Robotics_PX4_BL_FMU_v5.x_0-if00 sn: 0021001c3438510636363539 chip: 10016451 family: b'STM32F7[6|7]x' revision: b'Z' flash: 2064384 bytes Windowed mode: False Erase : [====================] 100.0% Program: [====================] 100.0% Verify : [====================] 100.0% Rebooting. Elapsed Time 6.803
-
使用QGC地面站下载
打开QGC地面站,选择Firmware Setup界面,通过USB连接飞控,将弹出下载界面。如下所示,选择Advanced Settings->Custom firmware file, 然后选择编译好的固件
build/fmt_cuav-v5.bin
进行下载。 -
使用JLink下载
前两种方式需要用到硬件上的bootloader,而通过JLink下载则不需要,必要时,也可以通过JLink来更新硬件上的bootloader(有风险,需谨慎)。JLink的具体方式请参考FMT的用户手册。
在下载完fmu的固件后,用USB连接飞控,正常的话应该能看到飞控的呼吸灯开始闪烁。打开QGC地面站将自动连接上飞控。如下所示:
下面需要将fmt_io的固件上传到飞控的SD卡中。我们首先点击QGC左上角的Widgets->Onboard Files,将弹出对应窗口。然后点击List Files将列出飞控上所有的文件/文件夹信息。这里我们选中usr文件夹,然后点击Upload Files上传刚刚编译好的
fmt_io.bin
至飞控的usr目录,如下所示:上传完成后,再次点击List Files将看到我们刚上传的io固件已经出现在usr目录下,如下图所示:
下一步我们切换到QGC的Mavlink Console页面,敲击两次回车,将看到飞控的控制台输出,我们在控制台输入指令
fmtio upload usr/fmt_io.bin
,通过fmu下载刚刚上传的io固件。如下所示io固件下载成功:提示:
若是第一次下载fmt_io固件,在输入fmtio upload指令后将返回sync error的错误。这是正常的,因为此时io芯片还没有fmt io的固件,故不能响应fmu发出的重启指令,所以无法进入bootloader从而开始io固件的下载。所以对于这种情况,我们需要连接GPS模块,按住GPS模块上的Safety安全开关按钮,然后给飞控上电。这时候io芯片将驻留在bootloader,然后我们再输入fmtio upload指令则可以正常下载。当io固件下载成功后,我们可以输入
fmtio hello
指令,若看到有返回值,则说明io固件运行正常,如下所示:msh />fmtio hello msh />[IO]:Hello, this is FMT IO!
首次飞行基本操作
-
上:Position位置控制模式
-
中:Altitude定高模式
-
下:Stabilize自稳模式
"SWD"开关从上拨到下为触发紧急上锁指令,用于紧急情况下停止电机。
当遥控信号无效的时候,飞行模式可以通过地面站来进行设置,如下图所示。若遥控信号有效,则会优先使用遥控所定义的模式,因为遥控相对于地面站拥有更高的控制优先级。
-
解锁/上锁
对于飞机解锁操作,将左边摇杆打到右下角不动,如下图所示。大约1.5秒后飞机解锁,电机怠速(Standby)旋转。
怠速模式下,将左边摇杆打至左下角不动,大约1.5秒后飞机上锁。
若飞机解锁升空后,将油门杆拉低,让飞机缓慢降落到地面,再将油门杆拉至最低,一段时间后飞机将自动上锁(若自动上锁失效,可以拨动“SWD”开关进行强制上锁)。
除通过遥控控制解锁/上锁外,也可以通过地面站来控制。如下,点击如图所示位置会出现解锁/上锁的选项,滑动滑块确认执行解锁/上锁操作。
-
起飞/降落/返航
起飞、降落和返航指令可以通过地面站来发送,如下图所示,点击左侧的Takeoff按钮,然后滑动滑块,飞机将自动解锁然后起飞到默认高度1.5m。
当飞机起飞后,可以点击左侧的Land或RTL按钮,然后滑动滑块,飞机将原地降落,或者保持当前高度返航至起飞点。
提示:
在执行起飞/降落/返航的过程中,可以随时点击左侧Pause按钮或者将模式设置为Hold,这样将暂停当前起飞/降落/返航的流程,飞机进入Hold模式并保持当前位置。除了通过地面站来触发起飞/降落/返航外,还可以设置遥控的相关通道来触发。这需要修改飞控的 sysconfig.toml 配置文件。如下图所示,可以在 [pilot-cmd] 中添加新的 pilot-cmd.command 指令。例如,如下所示是使用遥控通道7来触发,比如当遥控7的值在[1000,1200]以内的话则触发起飞指令。这里也可以根据实际情况使用其它遥控通道。更多配置信息,请参阅FMT用户手册的相关说明。
# FMT System Configuration File # The target should match with BSP's target name target = "CUAV V5+" ...... # Pilot CMD Configuration [pilot-cmd] ...... [[pilot-cmd.command]] type = 1 # 1:event | 2:status cmd = 1003 # FMS_Cmd_Takeoff channel = 7 range = [1000,1200] [[pilot-cmd.command]] type = 1 # 1:event | 2:status cmd = 1004 # FMS_Cmd_Land channel = 7 range = [1400,1600] [[pilot-cmd.command]] type = 1 # 1:event | 2:status cmd = 1005 # FMS_Cmd_Return channel = 7 range = [1800,2000] ......
当前支持的所有FMS指令如下:
/* enumeration of FMS command */ typedef enum { FMS_Cmd_None = 0, /* Default value */ FMS_Cmd_PreArm = 1000, FMS_Cmd_Arm, FMS_Cmd_Disarm, FMS_Cmd_Takeoff, FMS_Cmd_Land, FMS_Cmd_Return, FMS_Cmd_Pause, FMS_Cmd_Continue FMS_Cmd;
提示:
如需进一步进行FMT固件的开发,请到Firmament-Autopilot。
传感器校准
传感器校准
-
飞机出厂前一般都已经进行过传感器的校准,但是为了安全起见,到了一个全新的场地后,由于温度和物理位置的变化,最好重新进行校准。
校准完成后可以在控制台中输入
param list CALIB
指令来查看校准结果,然后输入param save
对校准结果进行保存,否则下次飞控重新上电后将丢失本次校准的数据。提示:
校准完成后连接地面站检查飞控姿态是否正常。若不正常可尝试重新校准。
陀螺仪校准
- 陀螺仪校准是通过QGroundControl进行。遵从QGroundControl的指导完成校准流程。
-
将机体放置水平并保持不动,然后点击Gyroscope传感器按钮。
-
点击OK开始校准。顶部的进度条将显示校准进度。
-
完成后,QGroundControl将显示进度条Calibration complete。
加速度计校准
- 加速度校准通过QGroundControl进行。遵循QGroundControl的指导完成校准流程。
-
点击Accelerometer传感器按钮。
-
点击OK开始校准。
-
将机体置于屏幕图片所示方向。一旦黄色框出现,将机体静置。当前方向校准完成后屏幕上对应图标的框将变绿。
-
将机体置于各个方向并重复以上步骤直至完成。
罗盘校准
- 罗盘校准通过QGroundControl进行。遵循QGroundControl的指导完成校准流程。
-
点击Compass按钮。
-
点击OK开始校准。
-
将机体置于红框所示(未完成)状态并保持不动。一旦黄色框出现,将机体沿着指定轴进行旋转。当前方向校准完成后屏幕上对应图标将变为绿框。
-
对各个方向重复校准步骤直至完成。
水平校准
- 水平校准通过QGroundControl进行。遵循QGroundControl的指导完成校准流程。
-
点击Level Horizon按钮。
-
将机体按水平飞行方向放置在平面上。
-
点击OK按钮开始校准。
-
等待校准完成。
注意!
校准完成后在控制台输入param list CALIB指令来查看校准结果,然后输入param save来保存校准参数
电调校准
- 如果电池连接后电机出现连续急促的“滴滴”声,说明电调需要进行校准。对于一般的电调,校准流程如下:
- 首先用USB给飞控上电(注意此时不要连接电池!)。
- 打开地面站,进入到Mavlink Console界面。
- 输入指令
mcn suspend control_output
屏蔽控制器输出,以免影响校准流程。 - 输入指令
act set --all -d main_out 2000
将电机主输出设为最大值。 - 此时连接电池。
- 在听到电机指示音后(如 滴滴-滴~),立马输入指令
act set --all -d main_out 1000
将电机主输出设为最小值。 - 此时电机应该没有滴滴声了,表示校准完成。
- 重启飞控。
遥控配置
-
遥控器配置需要修改飞控上sys目录下的sysconfig.toml文件,如果没有这个文件,可以从FMT的Github仓库 下载或联系阿木实验室客服获取。 飞机出厂时,我们会将默认配置好的toml文件上传至飞控的sys目录,其中包含三种基本的飞行模式切换(Position,Altitude,Stabilize)以及强制上锁指令(Disarm)用于危险情况下紧急关闭电机。
默认遥控配置如下 :
# Pilot CMD Configuration [pilot-cmd] # channel mapping for [yaw, throttle, roll, pitch] stick-channel = [4,3,1,2] [pilot-cmd.device] type = "rc" name = "rc" protocol = "sbus" # sbus or ppm channel-num = 6 # max supported channel: sbus:16, ppm:8 sample-time = 0.05 # sample time in second (-1 for inherit) range = [1000,2000] [[pilot-cmd.mode]] mode = 5 # Position mode channel = 5 range = [1000,1200] [[pilot-cmd.mode]] mode = 4 # Altitude mode channel = 5 range = [1400,1600] [[pilot-cmd.mode]] mode = 3 # Stabilize mode channel = 5 range = [1800,2000] [[pilot-cmd.command]] type = 1 # 1:event | 2:status cmd = 1002 # FMS_Cmd_Disarm channel = 6 range = [1800,2000]
起飞前需检查遥控的控制是否正常,包括摇杆映射,模式切换,强制上锁指令是否工作正常等。如不正常,需检查遥控设置与toml的默认配置是否一致,否则需修改遥控设置或者toml文件。
TBA(检查uMCN的rc_channels, pilot_cmd消息)
如需对toml的遥控配置进行修改,请参阅FMT用户手册 的相关说明。
电机配置
-
电机配置同样通过sysconfig.toml文件。出厂我们已经默认将电机的配置设置如下:
# Actuator Configuration [actuator] [[actuator.devices]] protocol = "pwm" name = "main_out" freq = 400 # pwm frequency in Hz [[actuator.devices]] protocol = "pwm" name = "aux_out" freq = 400 # pwm frequency in Hz [[actuator.mappings]] from = "control_out" to = "main_out" chan-map = [[1,2,3,4],[1,2,3,4]]
这里表示硬件上有两个电机输出口,分别是主输出(main_out)和辅助输出(aux_out)。控制器输出(control_out)的通道1-4默认被映射到主输出通道1-4上。故我们电机是接到main_out的接口1-4上的。
起飞前可以先尝试对飞控进行解锁,检查电机是否正常怠速旋转,并且旋转方向是正确的。
如需对toml的电机配置进行修改,请参阅FMT用户手册 的相关说明。
模型在环仿真
-
模型在环是在基于模型设计早期开发阶段对模型的仿真。 MIL 是一种廉价的算法测试方式。 为了算法能正常运行,必须在部署到真实硬件之前对其进行仿真,以检测任何可能导致灾难性后果的严重错误。
模型在环仿真是一种在仿真环境(如 Simulink)中开发和运行仿真模型的方法。 一个典型的自驾仪系统模型结构如图所示。该结构不光针对无人机系统,对于其它类型的无人控制系统,也可以采用类似的模型结构。
当我们在Simulink环境中搭建了如图所示的算法模型后,就可以在MATLAB中运行模型从而对模型进行仿真。通过仿真,我们可以获取模型的运行数据从而对其进行调优。通过可视化模块,我们可以观察被控对象的3D视图,获得与真实世界中相似的控制体验。
FMT-Model中已经提供了一套完整且功能强大的针对多旋翼的算法模型:
-
MC-Plant: 多旋翼被控对象模型
-
Base-INS: 通用惯性导航系统模型
-
Base-FMS: 通用飞行管理系统模型
-
Base-Controller: 多旋翼控制器模型
基于这套模型,我们可以很方便的对多旋翼进行模型在环仿真。当然,也可以通过开发新的算法模型来对更多的被控对象,如小车,无人船,机器人等,进行模型在环仿真。在这里也欢迎大家为FMT-Model贡献更多的算法模型!
MIL仿真步骤
- MIL仿真的的具体步骤如下:
-
在MATLAB (
版本2018b或以上
) 中打开 FMT-Model目录 -
双击
FMT_Model.prj
初始化工程 -
双击打开仿真模型
simulation/MILSIM.slx
,如下图所示 -
双击打开可视化模块
MILSIM/Virtualization/3D_Visualization/Matlab_3D/Visualization/VR Sink
。将viewpoint
设置为 Isometric - No Rotation -
点击模型上方 Run 按钮开始仿真
-
进入子模块
MILSIM/FCS/GCS
,将mode改为PilotMode.Position
,cmd_1改为FMS_Cmd.Takeoff
,飞机将自动解锁起飞,并悬停在高度为1.5m的位置 -
将cmd_1改为
FMS_Cmd.Land
,飞机将原地降落,触地后自动上锁 -
点击上方的Stop按钮结束仿真,并打开上方的Simulation Data Inspector查看仿真数据
对于更多的控制模式和指令定义,可以查看
FMS-Model/bus/enum
下的定义:当前支持的模式和指令如下:
classdef PilotMode < Simulink.IntEnumType enumeration None(0) Manual(1) Acro(2) Stabilize(3) Altitude(4) Position(5) Mission(6) Offboard(7) end
classdef FMS_Cmd < Simulink.IntEnumType enumeration None(0) PreArm(1000) Arm(1001) Disarm(1002) Takeoff(1003) Land(1004) Return(1005) Pause(1006) Continue(1007) end
比如若要进行Mission航点模式飞行,只需将mode设置为
PilotMode.Mission
,然后把cmd_1设置为FMS_Cmd.PreArm
或FMS_Cmd.Takeoff
即可。
纯硬件仿真仿真
-
纯硬件仿真 (Simulation-in-hardware, SIH) 是硬件在环仿真 (HIL) 的一种替代方案。在该配置中,所有的算法都运行在嵌入式硬件平台 - 控制器,导航系统,飞行管理系统以及对象模型。桌面电脑仅用来作为可视化设备,比如运行QGC地面站。
SIH 相比 HIL 有以下两个优点:
-
它通过避免与计算机的双向连接来确保时间同步。因此,用户不需要使用功能强大的台式计算机。
-
整个仿真运行在 FMT 环境中。开发人员可以更轻松地将他们自己的数学模型整合到仿真器中。例如,他们可以修改空气动力学模型或传感器的噪声水平,甚至可以添加新的要模拟的传感器。
-
简化配置和仿真流程。
运行SIH仿真
-
FMT-FW中已经集成了最新的FMT-Model的模型,所以要运行SIH仿真非常简单,只需在目标平台的
fmtconfig.h
打开宏开关#define FMT_USING_SIH
,然后重新编译并下载fmu的代码。通过serial0(FMU-Debug的串口,波特率57600)连接控制台,给飞控上电后可以看到如下输出:
_____ __ / __(_)_____ _ ___ ___ _ ___ ___ / /_ / _// / __/ ' \/ _ `/ ' \/ -_) _ \/ __/ /_/ /_/_/ /_/_/_/\_,_/_/_/_/\__/_//_/\__/ Firmware....................FMT FMU v0.1.0 Kernel....................RT-Thread v4.0.3 RAM.................................512 KB Target......................Pixhawk4 FMUv5 Vehicle.........................Quadcopter INS Model..................Base INS v0.1.0 FMS Model..................Base FMS v0.1.0 Control Model.......Base Controller v0.1.0 Plant Model.............Multicopter v0.1.0 Task Initialize: comm..................................OK logger................................OK fmtio.................................OK status................................OK vehicle...............................OK [559] I/StatusTask: SIH Simulation
也可以通过QGC地面站的Mavlink Console连接控制台,然后输入
boot_log
指令查看开机信息,如下:我们可以看到模型信息里面多了一个Plant Model——Multicopter v0.1.0的模型,这个模型就是被控对象模型,可以看到它是在我们飞控上运行的。
通过uMCN我们可以看到各个传感器的数据有在发布,这里数据不是从板上的传感器采集,而是从Plant Model中输出的。
然后我们可以像操作正常飞机一样来操纵SIH仿真,比如让飞机飞个航点
通过SIH仿真我们可以很方便地验证我们的算法以及飞控的各个软件模块。甚至在SIH仿真的同时,也可以记录日志数据来进行开环仿真。
软件在环仿真
-
软件在环 (Software-in-loop, SIL) 仿真是将源码进行编译并运行在电脑主机端,为系统功能或控制策略的开发和测试提供实用的虚拟仿真环境,同时也省去了购买硬件的成本。
FMT 的 SIL 环境是基于 QEMU 构建的。通过QEMU模拟的硬件平台(vexpress-a9)来让 FMT 运行在主机端,因为QEMU是跨平台的,所以基于QEMU实现的SIL可以运行在Windows,Linux和MacOS等。
如果没有安装过QEMU,需要先下载QEMU,可以去官网进行下载。下载安装完成之后,进入
FMT-Firmware/target/qemu/qemu-vexpress-a9
目录,然后编译固件jiachi@jc-laptop:~/src/FMT-Autopilot/FMT-Firmware/target/qemu/qemu-vexpress-a9$ scons -j4 scons: Reading SConscript files ... b'' scons: done reading SConscript files. scons: Building targets ... scons: building associated VariantDir targets: build CC build/board/board.o CC build/drivers/drv_sdio.o ...... CC build/kernel/components/libc/compilers/newlib/stdio.o CC build/kernel/components/libc/compilers/newlib/syscalls.o LINK build/fmt_fmu.elf arm-none-eabi-objcopy -O binary build/fmt_fmu.elf build/fmt_fmu.bin arm-none-eabi-size build/fmt_fmu.elf text data bss dec hex filename 1139824 28980 143256 1312060 14053c build/fmt_fmu.elf scons: done building targets.
-
编译完成后,首先打开QGC地面站,然后再运行
qemu.sh
(Windows平台则运行qemu.bat
),如下所示jiachi@jc-laptop:~/src/FMT-Autopilot/FMT-Firmware/target/qemu/qemu-vexpress-a9$ ./qemu.sh WARNING: Image format was not specified for 'sd.bin' and probing guessed raw. Automatically detecting the format is dangerous for raw images, write operations on block 0 will be restricted. Specify the 'raw' format explicitly to remove the restrictions. pulseaudio: set_sink_input_volume() failed pulseaudio: Reason: Invalid argument pulseaudio: set_sink_input_mute() failed pulseaudio: Reason: Invalid argument [I/SDIO] SD card capacity 65536 KB. [I/SDIO] switching card to high speed failed! can not load /sys/sih_param.xml, use default parameter value. TOML: fail to open file: /sys/sysconfig.toml _____ __ / __(_)_____ _ ___ ___ _ ___ ___ / /_ / _// / __/ ' \/ _ `/ ' \/ -_) _ \/ __/ /_/ /_/_/ /_/_/_/\_,_/_/_/_/\__/_//_/\__/ Firmware..................FMT FW v0.3.0-rc Kernel....................RT-Thread v4.0.3 RAM................................8192 KB Target....................QEMU vexpress-a9 Vehicle.........................Quadcopter INS Model..................Base INS v0.2.1 FMS Model..................Base FMS v0.3.2 Control Model.......Base Controller v0.2.1 Plant Model.............Multicopter v0.2.1 Task Initialize: local.................................OK comm..................................OK logger................................OK status................................OK vehicle...............................OK [1074] I/StatusTask: SIH Simulation Hello FMT!
提示:
对于Windows平台,在第一次通过QEMU启动FMT时,文件系统可能没有正常格式化,可以在控制台输入`mkfs sd0`指令来对文件系统进行格式化。 -
这时切到地面站,地面站应该也已经正常连接上飞控。恭喜,到这一步基于QEMU的SIL仿真已经运行起来了。
开环仿真
-
开环仿真是一种在基于模型设计领域分析算法性能的十分有效的方法。Mlog 模块记录必要的模型输入数据,其功能类似于“黑匣子”。只需要记录少量的模型输入数据,通过开环仿真即可获得模型所有的数据信息(包括输出和内部数据)。
自动代码生产能极大提高开发的效率,并应用于实际的产品中,因此生产代码的运行结果与模型仿真结果的一致性变得极为重要。基于FMT可以做到开环仿真的结构跟真实的结构几乎完全重合。
开环仿真步骤
-
首先第一步需要记录测试或仿真飞行的开机日志,因为模型是从开机后即开始运行的,所以为了获得完整的数据,我们需要记录从模型第一次运行起的所有数据。记录开机日志的方法为将
MLOG_MODE
参数设置为2或者3,其参数含义如下所示:/* define parameters */ static param_t __param_list[] = { /* Determines when to start and stop logging. 0: disabled 1: when armed until disarm 2: from boot until disarm 3: from boot until shutdown */ PARAM_INT32(MLOG_MODE, 0), }; PARAM_GROUP_DEFINE(SYSTEM, __param_list);
我们可以通过地面站设置MLOG_MODE参数的值,也可以在控制台中通过param指令来修改。记得修改完成后需要输入
param save
来保存参数。重新开机后,我们在控制台输入
mlog status
可以看到当前正在记录的日志信息。如下所示,当前记录的日志文件为/log/session_5/mlog1.bin
。最左边一列表示当前记录的所有日志的bus数据名称,record表示对应bus记录的日志条数,lost为丢失的条数。提示:
如果lost值不为0,表示对应的日志bus数据有丢失,这将导致我们开环仿真的结果和实际结果不一致的情况。导致日志丢失的原因有很多,一般是因为记录的日志数据量过大,而SD卡的写入速度不够,导致缓存区存满而造成数据丢失。解决办法可以是替换写入速度更快的SD卡或者加大Mlog模块的缓存大小。当飞机Disarm(MLOG_MODE=2)或者我们手动输入
mlog stop
时,将停止日志记录,并打印记录的日志状态,如下所示:然后我们可以通过QGC的Onboard Files页面下载日志
-
在得到日志以后,我们需要对日志进行解析。打开MATLAB并进入到FMT-Model目录,确保运行过FMT_Model.prj对工程进行初始化。运行
FMT-Model/utils/log_parser/parse_mlog.m
脚本并选中要解析的日志文件。解析完成后将在日志文件相同的目录输出解析后的**.mat*文件,如下所示 -
将所有的 .mat文件拖拽到MATLAB窗口以加载到MATLAB中,然后运行
FMT-Model/utils/log_parser/load_parameter.m
和FMT-Model/utils/mission_data_preprocess.m
。提示:
加载后的*.mat文件将出现在MATLAB的WorkSpace中,我们可以通过MATLAB直接查看数据或者将其导入到Simulation Data Inspector中查看。 -
双击打开开环仿真模型
FMT-Model/simulation/OpenLoopSIM.slx
。 -
点击上方的Run按钮运行仿真。
-
待仿真结束后可以点击右上方的蓝色按钮CompareModeOut,将绘制数据图形比较开环仿真的输出(红色)和记录的真实运行结果(蓝色)。两者应几乎完全重合,如不重合,则可能是日志数据有“丢包”现象或者记录的不是开机日志,或者仿真的模型版本跟飞控上的模型版本不一致所致。
-
也可以通过Simulink上端的Simulation Data Inspector来查看记录的仿真数据。
免责声明
注意!!!
-
为保护用户的合法权益,请您在使用本产品前务必仔细阅读本产品提供的使用文档 wiki 、免责声明和安全须知。阿木实验室保留对上述文档进行更新的权利。请您务必按照说明书和安全须知操作本产品。
-
本产品不适合未满 18 周岁及其他不具备完全民事行为能力的人士使用,请您避免上述人士接触本产品,在有上述人士出现的场合操作时请您格外注意。
-
本产品为科研教育性产品,源码开源支持二次开发,并非稳定的商业产品,使用时需有一定的基础,且稳定程度不能和商业产品相提并论。购买产品表示您知晓并理解此产品的特殊性。二次开发有一定门槛,需要使用者具备一定的开发能力、自主学习能力。
-
一旦开始使用本产品,即视为您已阅读、理解、认可和接受本产品的说明书、免责声明和安全须知的全部条款和内容。使用者承诺对自已的行为及因此而产生的所有后果负责。使用者承诺仅出于正当目的使用本产品,并且同意本条款及阿木实验室可能制定的任何相关政策或者准则。
-
在使用本产品的过程中,请您务必严格遵守并执行包括但不限于说明书和安全须知里的要求。对于违反安全须知所提示的使用行为或不可抗因素导致的一切人身伤害、事故、财产损失、法律纠纷,及其他一切造成利益冲突的不利事件,均由用户自己承担相关责任和损失,阿木实验室将不承担任何责任。
-
用户使用本产品直接或间接发生的任何违反法律规定的行为,阿木实验室将不承担任何责任。
-
在使用本产品前,请仔细阅读本文说明。一旦您开始使用本产品,表示您对本文全部内容的认可和接受。请严格遵守本文安装和使用说明。因用户不当使用、安装、私自改装等造成的任何结果和损失,阿木实验室将不承担法律责任。
安全指导手册
注意!!!
-
本产品不适合未满 18 周岁及其他不具备完全民事行为能力的人士使用
-
本产品具有较大的机身尺寸、高速旋转的螺旋桨和强大的飞行动力,在运行时具有一定的危险性。未按要求操作和使用本产品可能会发生危险和伤害
-
使用本产品时,请远离机场、铁路、高速公路、高层建筑、电线等危险环境。
-
使用本产品时,请远离手机基站,大功率发射设备等高电磁干扰的环境。
-
使用本产品时,请远离各种载人飞行器。
-
使用本产品时,请绑定安全绳操作,避免安全事故发生。
-
请勿在下雨、雷电、沙尘、雾气、下雪、大风、低温等恶劣环境使用本产品。
-
在高于 3000 米海拔以上飞行时,环境因素会导致飞行性能下降,请谨慎使用本产品。
-
本产品为非防水设计,请勿尝试在水面降落。
-
操作本产品在低空飞行时,请始终保持无人机和人或动物保持10米以上的安全距离。
-
在非人烟稀少的地区使用本产品时,请始终保持无人机在操作者目视范围内飞行。
-
不要将本产品悬停或飞越人群上空,请勿以惊吓他人为乐。
-
当有围观人群靠近时,请小心操控,尽快降落离开该场所,避免发生意外。
-
请勿在儿童嬉戏的场所附近操作本产品。
-
请勿使用本产品追逐交通工具或影响交通工具的正常运行。
-
非极其必要情况,请勿当本产品在空中飞行时关闭电机。
-
本产品不可在饮酒、疲劳、服用药物、身体不适等情况下使用。
-
请在每次使用前对本产品进行检查,包括但不限于零部件的牢固度、机体和螺旋桨的裂痕和磨损、电池电量、指示灯的有效性等。当发现异常时,请立即停止使用并更换相应配件。
-
工作状态异常的无人机可能会发生意外,切勿启动螺旋桨或勉强飞行。
-
请勿尝试阻止本产品工作中的任何运动部件。
-
请勿改装本产品,或将本产品用于非原设计用途。
-
本产品不包括载物功能,请勿用于运输用途。
-
请使用原厂配件进行维护和替换。
-
转借给其他人员操作,请确保操作人员理解和遵守本安全须知。
-
请访问阿木实验室官网获取最新的免责声明和安全须知。