基于Matlab/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_Bus,Reference_Bus和States_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 参与讨论。
原文地址:https://www.cnblogs.com/amovlab/p/11692531.html
- [mobile开发碎碎念]手机页面上显示PDF文件
- Windows Server 2008 R2 配置AD(Active Directory)域控制器
- ios开发基础知识 - 2
- ios开发基础知识 - 1
- 为UINavigationBar添加自定义背景
- UIScrollView无法响应touches的解决方法
- WCF技术剖析之十七:消息(Message)详解(下篇)
- UITextView自动滚动的解决方案
- MVC解决Json DataGrid返回的日期格式是/Date(20130450000365)
- Easyui 让DataGrid适应浏览器宽度
- Easyui 让Window弹出居中与最大化后居中
- WCF技术剖析之十六:数据契约的等效性和版本控制
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(13)-系统日志和异常的处理③
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(12)-系统日志和异常的处理②
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 面试题系列第6篇:JVM字符串常量池及String的intern方法详解?
- 机器学习(一)——K-近邻(KNN)算法
- 机器学习(二)——K-均值聚类(K-means)算法
- windows下matplotlib的安装
- Python中常见的数据类型总结
- stm32中阻塞模式和非阻塞模式 in blocking mode 与 in non-blocking mode区别
- 机器学习(四)—决策树
- 机器学习(五)—朴素贝叶斯
- C语言面试题——位域及大小端模式的理解
- stm32添加串口调试
- STM32单片机极简方法 使用宏定义 代替复杂的重定向printf()函数,实现串口打印。(HAL库例程)
- 机器学习(六)— logistic回归
- 如果简化stm32中printf函数的使用——首先重定向
- TF-IDF算法(2)—python实现
- C语言定义数组时使用枚举作为数组的下标