“一切可以被控制的对象,都需要被数学量化”

这是笔者从事多年研发工作得出的道理,无论是车辆控制,机器人控制,飞机控制,还是无人机控制,所有和机械运动相关的控制,如果不能被很好的数学量化,那么将不会被很好的控制。

因为工作需要,笔者曾拜访过很多无人机研发公司,高校和研究所。发现大多数无人机研发公司的研发手段,相较于国外,还很初级。基本都是嵌入式开发居多,侧重于驱动的修改,飞行逻辑的修改。我认为这算不上是严格的无人机开发。因为大多数公司,都没有给被控对象(无人机),建立完整的数学模型。只是利用开源的框架,调整控制参数,没有完整的测试流程和测试指标。这样研发出来的飞机一致性很差,每一架飞机的飞行状态都不统一,完全不能满足于工业应用的场景。2018/2019年倒闭的无人机公司,大多数都是存在这种情况。

不乏有些原本从事互联网软件开发的公司,转行从事无人机开发。在运动控制领域,和互联网软件开发的不同。有的时候互联网软件开发,不需要建立被控对象的数学模型。秉承设计模式,软件架构设计,协作编程,大规模软件集中测试,上线。在无人系统开发中,软件构架设计也是必不可少的,但是在测试的环节,如果没有建立数学模型,测试无从谈起,因为一般的真机测试,代价,效率和测试密集程度远远达不到要求。因为一个BUG会导致飞机坠毁,而任何一个新系统,往往存在大量的BUG。

而在已经成熟工业界,比如汽车,飞机制造,电力电子,航天等领域大量采用了基于Matlab基于Simulink的模型开发手段。

我们阿木实验室提供如下的课程体系和打包工具:

课程将全面,细致地讲解如何基于模型(Simulink)的方法设计一套功能强大的飞控系统。本课程由多位一线资深飞控工程师设计,结合多年的基于模型的飞控开发经验,给大家提供最先进,最前沿的飞控开发体验。

概述

基于模型的开发将省去繁琐的代码编写步骤,只需要拖动几个模块,就像搭积木一般,轻松搭建您自己的飞控算法。飞控开发人员可以将更多的精力放在算法本身,而不需要过多关注代码实现的细节,这样将大大加快开发的效率,减少在代码编写过程中产生的错误。同时,基于模型的开发具有优秀的代码复用性。也就是说,已经设计好的功能模块,只需要简单的复制粘贴,就能轻松地应用到其它任何地方,免去了代码移植过程的繁琐。

基于模型的开发另外一个强大的优势即在于“一次试验,多次仿真”的目的。结合Simulink强大的开环和闭环仿真系统,只需采集一次数据,便可通过仿真再现在真实世界中的实际表现。通过修改模型算法或参数,可以进行在线的数据仿真和调试,大大简化调试的难度。

系统接口与总线设计

在我们设计控制系统之前,首先要做的就是定义系统的输入/输出接口。在Simulink中,接口一般都是以总线的方式进行定义。可以将总线理解为C语言中的结构体,当把Simulink模型自动生成C代码后,也可以看到总线最终是用结构体来进行实现的。

对于内环的姿态环控制器来说,输入总线设计如下:

Command_Bus

Element Type Unit Meaning
reset uint8 [0,1] 为1复位控制器
mode uint8 [0,1] 0:角度控制,1:角速度控制
base_th int16 0~1000 姿态环基础油门

Reference_Bus

Element Type Unit Meaning
phi_ref_rad single rad 目标roll
theta_ref_rad single rad 目标pitch
psi_ref_rad single rad 目标yaw
p_ref_radDs single rad/s 目标roll角速度
q_ref_radDs single rad/s 目标pitch角速度
r_ref_radDs single rad/s 目标yaw角速度

States_Bus

Element Type Unit Meaning
phi_rad single rad roll当前值
theta_rad single rad pitch当前值
psi_rad single rad yaw当前值
p_radDs single rad/s roll角速度当前值
q_radDs single rad/s pitch角速度当前值
r_radDs single rad/s yaw角速度当前值

输入接口总共有三个总线,分别是Command_BusReference_BusStates_Bus。其中Command_Bus是控制总线,用来对控制系统进行一些设置,如模式设置,复位等。Reference_Bus和States_Bus是目标信号总线和状态信号总线,可以理解为控制器的目标值和当前值。控制器的目的就是通过控制来使得当前值尽可能收敛到目标值。

输入接口设计完了,接下来是输出接口。输出接口相比输入要简单很多,无非就是多路pwm指令输出。这里我们预留6个pwm输出接口,即最多可以支持6轴的控制,当面,也可以根据自己的需要,来进行修改。

Control_Out_Bus

Element Type Unit Meaning
pwm1 uin16 1000~2000 电机1 pwm信号
pwm2 uin16 1000~2000 电机2 pwm信号
pwm3 uin16 1000~2000 电机3 pwm信号
pwm4 uin16 1000~2000 电机4 pwm信号
pwm5 uin16 1000~2000 电机5 pwm信号
pwm6 uin16 1000~2000 电机6 pwm信号

好了,现在接口都定义好了,那么下一步的问题就是如何在Simulink里面来实现这些接口定义了。

其实,在Simulink中实现这些接口定义很简单。Simulink提供了一个Bus Editor的工具,只需要进行简单配置就可以定义任何你需要的接口或者总线了。

下面一步一步地讲解一下总线的定义方法:

  • 首先打开控制模型,点击Edit->Bus Editor

  • 这里我之前已经配置过了,所以能看到我已经定义过的总线。但是如果是自己第一次进行设计的话,这里应该是空的。可以点击如红色圈圈所示的add bus来添加Bus信号,这里我们总共需要添加4个Bus。三个输入总线和一个输出总线。Bus添加好后,在最右边的Property,修改Bus的名称。添加好Bus之后,我们下面就需要往Bus里面添加Element,即总线的元素。首先选定一个Bus,然后点击蓝色圈圈圈出的add element选项,即可添加元素。


  • 然后需要对Element进行配置。如图所示,我们一般只需要对Name,Data Type和Dimension三个选项进行配置即可。Dimension为变量的维度,如果我们的element需要配置为向量或者矩阵,那么就需要对Dimension进行配置。

  • 配置完成后,需要点击File->Export to File来将Bus的配置保存成.m还活着.mat文件。因为Bus的定义都是保存在工作空间的。当你下次打开matlab的时候,工作空间都是会被清除的,所以我们需要将我们的Bus定义保存成文件,这样,当下次打开matlab的时候,只需要load一下我们的.mat/.m文件,就能将我们定义的Bus再load进工作空间。

微信公众号关注《阿木实验室》获取更多无人机开发测评信息,关注《阿木社区》获取更多学习课程信息。

社区论坛地址:bbs.amovauto.com 参与讨论。

无人机基于Matlab/Simulink的模型开发(连载一)的更多相关文章

  1. 基于Matlab/Simulink的模型开发(连载一)

    概述 基于模型的开发将省去繁琐的代码编写步骤,只需要拖动几个模块,就像搭积木一般,轻松搭建您自己的飞控算法.飞控开发人员可以将更多的精力放在算法本身,而不需要过多关注代码实现的细节,这样将大大加快开发 ...

  2. 如何基于Restful ABAP Programming模型开发并部署一个支持增删改查的Fiori应用

    Jerry之前的文章30分钟用Restful ABAP Programming模型开发一个支持增删改查的Fiori应用 发布之后,有朋友问我,"没错, 我是在你的文章里看到了Fiori应用的 ...

  3. 基于matlab的GUI界面开发软件

    matlab工具deploytool编译M为可执行程序 http://blog.sina.com.cn/s/blog_60f8483a0100gnsm.html

  4. 基于 Koa平台Node.js开发的KoaHub.js的控制器,模型,帮助方法自动加载

    koahub-loader koahub-loader是基于 Koa平台Node.js开发的KoaHub.js的koahub-loader控制器,模型,帮助方法自动加载 koahub loader I ...

  5. 基于MATLAB搭建的DDS模型

    基于MATLAB搭建的DDS模型 说明: 累加器输出ufix_16_6数据,通过cast切除小数部分,在累加的过程中,带小数进行运算最后对结果进行处理,这样提高了计算精度. 关于ROM的使用: 直接设 ...

  6. 基于MATLAB System Generator 搭建Display Enhancement模型

    基于MATLAB System Generator 搭建Display Enhancement模型

  7. 基于gin的golang web开发:模型绑定

    在前两篇文章介绍路由的时候,我们了解到gin可用通过类似DefaultQuery或DefaultPostForm等方法获取到前端提交过来的参数.参数不多的情况下也很好用,但是想想看,如果接口有很多个参 ...

  8. 基于gin的golang web开发:模型验证

    Gin除了模型绑定还提供了模型验证功能.你可以给字段指定特定的规则标签,如果一个字段用binding:"required"标签修饰,在绑定时该字段的值为空,那么将返回一个错误.开发 ...

  9. 基于MATLAB的多项式数据拟合方法研究-毕业论文

    摘要:本论文先介绍了多项式数据拟合的相关背景,以及对整个课题做了一个完整的认识.接下来对拟合模型,多项式数学原理进行了详细的讲解,通过对文献的阅读以及自己的知识积累对原理有了一个系统的认识.介绍多项式 ...

随机推荐

  1. 【1】KNN(K-nearest neighbors algorithm)

    基本原理 KNN算法又叫最近邻居法,是一种非常简单易于掌握的分类算法. 其基本原理是,存在一个已知标签的数据集合,也就是训练样本集. 这个样本集中的每一个数据所属的分类都是已知的. 当一个没有标签的新 ...

  2. vue.js安装教程

    vue.js环境搭建 1.下载node.js 网址:https://nodejs.org/en/ 版本:v10.16.3 2.安装node.js Node.js下载如下所示: 检查nodejs是否安装 ...

  3. 解决subline安装插件被墙失败的方法

    一.问题场景描述 当你完成subline和package control的安装后,准备使用install package安装各种各样的插件来丰富你的编辑器,却出现类似 “Unable to downl ...

  4. Go操作NSQ

    NSQ是目前比较流行的一个分布式的消息队列,本文主要介绍了NSQ及Go语言如何操作NSQ. NSQ NSQ介绍 NSQ是Go语言编写的一个开源的实时分布式内存消息队列,其性能十分优异. NSQ的优势有 ...

  5. FreeSql (二十七)将已写好的 SQL 语句,与实体类映射进行二次查询

    有时候,我们希望将写好的 sql 语句,甚至是存储过程进行查询,虽然效率不高(有时候并不是效率至上). 巧用AsTable var sql = fsql.Select<UserX>() . ...

  6. charles 镜像工具

    本文参考:charles 镜像工具 镜像工具会在你浏览指定网站时,把抓取到的文件克隆一份,并保存在你指定的路径下: 注意:如果你配置是www.aaa.com; 那么只会抓这个域名下的文件,这个域名如果 ...

  7. Day 22 进程管理2之系统的平均负载

    1.管理进程状态 当程序运行为进程后,如果希望停止进程,怎么办呢? 那么此时我们可以使用linux的kill命令对进程发送关闭信号.当然除了kill.还有killall,pkill 1.使用kill ...

  8. scrapy和scrapy-redis的区别

    scrapy是一个python爬虫框架,爬取的效率极高,具有高度的定制性,但是不支持分布式.而scrapy-redis是一套基于redis库,运行在scrapy框架之上的组件,可以让scapy支持分布 ...

  9. 第八届蓝桥杯java b组第十题

    标题: k倍区间 给定一个长度为N的数列,A1, A2, ... AN,如果其中一段连续的子序列Ai, Ai+1, ... Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍 ...

  10. Github 入门1 (下载git , 连接本地库与github仓库)

    /* 本篇建立在以注册GitHub账号的前提下*/ (1)  下载 git  https://www.git-scm.com // win10 可以直接红色箭头标识的 Download 2.22.0 ...