本文是机甲大师机器人控制的系列博客之一。在功能分析的基础上,本文设计软件的架构以及定义输入输出接口。

系列博客:
机甲大师机器人控制(一):概念与流程
机甲大师机器人控制(二):功能分析
机甲大师机器人控制(三):软件架构设计
机甲大师机器人控制(四):软件单元
机甲大师机器人控制(五):软件单元测试
机甲大师机器人控制(六):集成测试
机甲大师机器人控制(七):购买清单

文章目录

  • 1 开发阶段
  • 2 软件架构设计
    • 2.1 顶层子系统
      • 2.1.1 子系统模型
      • 2.1.2 输入接口
    • 2.2 电机控制子系统
      • 2.2.1 子系统模型
      • 2.2.2 输入接口
      • 2.2.3 输出接口
    • 2.3 舵机控制子系统
      • 2.3.1 子系统模型
      • 2.3.2 输入接口
      • 2.3.3 输出接口
    • 2.4 水弹枪控制子系统
      • 2.4.1 子系统模型
      • 2.4.2 输入接口
      • 2.4.3 输出接口
  • 3 数据字典定义
  • 4 总结

1 开发阶段

软件架构设计阶段在功能分析阶段之后,会按照功能分析中的每一条来设计架构和输入输出接口。软件架构设计阶段会在Simulink模型中搭建输入输出端口和子系统,但是还不会开始设计最内层子系统中的控制逻辑。

2 软件架构设计

软件架构设计这个阶段,博主主要做了两件事。首先,根据功能分析阶段提出的4个功能划分模型的子系统和内层子系统;然后,根据子系统功能来确定输入输出接口。Simulink模型文件命名为MTSR_MotionSolve.slx,含义为运动解算,简写为MTSR

2.1 顶层子系统

2.1.1 子系统模型

在模型最顶层是一个使能子系统,对应功能分析阶段的第1条功能:按键锁定。使能信号为1的时候,子系统被激活;使能信号为0的时候,子系统不被激活,也就达到了锁定按键的效果。如图所示。子系统名为MTSR

2.1.2 输入接口

虽然顶层的子系统连接了所有输入输出信号,但是从功能分类的角度来说,Mode按键对应的信号以外的其他信号都是和内层子系统相关的,所以本小节只研究使能信号输入接口VeINPR_uint8_PS2MODE

序号 信号名 数据类型 范围 存储类型
1 VeINPR_uint8_PS2MODE uint8 [0,1] ImportFromFile

这里对几个属性做一些简单的解释:

  • 信号名:对应的就是在代码中的变量名。这里的命名规范是博主从一个MBD的公众号上看到一名通用的工程师使用的。VeINPR代表它是输入信号,uint8表示了它的数据类型,PS2MODE是它的物理含义,也就是对应着Mode按键;
  • 数据类型:Simulink中的常用类型;
  • 范围:这里指的不是数据类型所对应的范围,而是底层所允许的范围;
  • 存储类型:也就是Simulink中的StorageClass,可以看看博主以前的博客介绍;

VeINPR_uint8_PS2MODE这个信号只有0和1两个取值,当按一下手柄的Mode键的时候,就从0跳转到1或者1跳转到0,同时绿色指示灯也会亮起(1)或者熄灭(0)。ImportFromFile的存储类型表示了这个信号是外部引入的,因为这个变量依赖于STM32工程中的其他文件,把PS2的传输协议解析出来,然后提供接口给模型。

双击进入顶层子系统后,可以看到第二层中又包含了三个子系统,分别是电机控制子系统、舵机控制子系统和水弹枪控制子系统。

2.2 电机控制子系统

2.2.1 子系统模型

电机控制子系统对应功能分析中的第2条:底盘平面运动。该子系统根据4路摇杆通道的输入,控制4个直流电机的转速和转向,从而带动麦轮转动,实现底盘平面运动的功能。子系统名为Motor_Ctrl

2.2.2 输入接口

电机控制子系统的输入接口是摇杆的4个通道:左摇杆的X通道、左摇杆的Y通道、右摇杆的X通道、右摇杆的Y通道,分别简写为LX,LY,RX,RY。其属性如下表:

序号 信号名 数据类型 范围 存储类型
1 VeINPR_uint8_PS2LX uint8 [0~255] ImportFromFile
2 VeINPR_uint8_PS2LY uint8 [0~255] ImportFromFile
3 VeINPR_uint8_PS2RX uint8 [0~255] ImportFromFile
4 VeINPR_uint8_PS2RY uint8 [0~255] ImportFromFile

这4路输入信号和Mode按键的信号一样,都是由STM32中其他的文件解析手柄的通信协议后所输出给模型的,所以也都是ImportFromFile。

4路通道的数据范围都是0~255的整数。0对应着X通道的最左或者Y通道的最上,255对应着X通道的最右或者Y通道的最下,如图所示。

2.2.3 输出接口

研究输出接口之前,首先先研究一下电机接口函数。电机接口函数是STM32驱动板的配套程序中给出的,如下表所示。

序号 函数名 含义 参数类型 参数范围
1 MotA_Interface(PWM) 电机A调速接口 int32 [-1000~1000]
2 MotB_Interface(PWM) 电机B调速接口 int32 [-1000~1000]
3 MotC_Interface(PWM) 电机C调速接口 int32 [-1000~1000]
4 MotD_Interface(PWM) 电机D调速接口 int32 [-1000~1000]

电机接口函数内部封装了控制电机的PWM波控制,调用函数只需要传入一个-1000~1000的整型数即可控制直流电机的正反转和转速。绝对值为1000时,电机两端电压等于电源电压。打个比方,如果电机由两节18650电池驱动,那么电池端电压就是7.4V。MotA_Interface(1000)函数就代表给电机加上正向电压7.4V,轮子就会以7.4V所对应的转速正转。

模型的输出接口正是电机接口函数中传入的参数,因此可以很好的将下表和上表对照。

序号 信号名 数据类型 范围 存储类型
1 VeOUTR_int32_FLWheel int32 [-1000~1000] ExportedGlobal
2 VeOUTR_int32_FRWheel int32 [-1000~1000] ExportedGlobal
3 VeOUTR_int32_BLWheel int32 [-1000~1000] ExportedGlobal
4 VeOUTR_int32_BRWheel int32 [-1000~1000] ExportedGlobal

VeOUTR_int32_FLWheel为例,FLWheel代表左前轮(Front-Left),这里的范围-1000~1000只是为了方便调用的一个虚拟值,不代表电压或者转速这样的实际物理含义,也不是真正的PWM波的数值。ExportedGlobal表示这个信号在生成代码对应的变量是在模型对应的源文件定义的,输出给其他文件使用。

在执行完模型的step函数后,4个输出接口就会赋值成解算出来的数值。然后调用4个MotX_Interface(PWM)函数,将输出变量作为参数,就可以控制电机转速和方向。

2.3 舵机控制子系统

2.3.1 子系统模型

电机控制子系统对应功能分析中的第3条:舵机云台二自由度运动。该子系统根据手柄右手的4个按键的输入,控制双舵机的正反转。子系统名为Servo_Ctrl

2.3.2 输入接口

舵机控制子系统的输入接口是右手4个按钮对应的信号:右手左按键、右手右按键、右手上按键、右手下按键,分别简写为RL,RR,RU,RD。其属性如下表:

序号 信号名 数据类型 范围 存储类型
1 VeINPR_uint8_PS2RL uint8 [0,1] ImportFromFile
2 VeINPR_uint8_PS2RR uint8 [0,1] ImportFromFile
3 VeINPR_uint8_PS2RU uint8 [0,1] ImportFromFile
4 VeINPR_uint8_PS2RD uint8 [0,1] ImportFromFile

这四个按键的属性和摇杆的四个通道类似,只是范围只有0和1。按下按键的时候,信号值是1,松开的时候,信号值是0。

按下RL或RR时,0号舵机左右转动;按下RU或RD时,1号舵机上下转动。

2.3.3 输出接口

研究舵机控制子系统输出接口之前,首先先研究一下舵机的接口函数。舵机接口函数也是STM32驱动板的配套程序中给出的,如下表所示。

序号 函数名 含义 参数1类型 参数1范围 参数2类型 参数2范围
1 SSenvo(Num,PWM) 舵机接口 uint8 [0,1,2,3] uint16 [500~2500]

舵机控制原理很简单,给舵机输入一个周期为20MS 的PWM波,其中脉冲宽度从0.5到2.5ms,舵机对应的位置为0度到180度。表中的第一个参数是舵机编号,从0到3;第二个参数是舵机的PWM控制参数,从500到2500,也就是us为单位的脉宽。

模型的输出接口就是舵机控制函数的第二个参数,对照表格如下:

序号 信号名 数据类型 范围 存储类型
1 VeOUTR_uint16_Srv0PWM uint16 [500~2500] ExportedGlobal
2 VeOUTR_uint16_Srv1PWM uint16 [500~2500] ExportedGlobal

在执行完模型的step函数后,2个舵机输出接口就会赋值成解算出来的数值。然后调用2次SSenvo(Num,PWM)函数,将输出变量作为第二个参数,就可以控制舵机在这个周期内的目标位置。

2.4 水弹枪控制子系统

2.4.1 子系统模型

水弹枪控制子系统对应功能分析中的第4条: 发射器控制。该子系统根据手柄右手顶部的R1按键的输入,控制继电器的断开和闭合。子系统名为Gun_Ctrl

2.4.2 输入接口

水弹枪控制子系统的输入接口是右手顶部的按键,简写为R1。这里的名称直接沿用了按键上面刻的字样。其属性如下表:

序号 信号名 数据类型 范围 存储类型
1 VeINPR_uint8_PS2R1 uint8 [0,1] ImportFromFile

这里的按键采用了右手顶部的第一个按键R1,当按下按键的时候,VeINPR_uint8_PS2R1为1,松开的时候,VeINPR_uint8_PS2R1为0。

2.4.3 输出接口

在STM32中,可以配置引脚的GPIO寄存器,来实现该引脚输出高电平或者低电平。这里博主偷了个懒,没有在底层做这样的配置,而是直接沿用了舵机接口函数SSenvo(Num,PWM),来控制引脚输出高低电平给继电器(3.3v或0v)。

上一小节提到了,舵机接口函数的第二个参数PWM的范围是500~2500。事实上,如果对舵机控制和PWM输出比较了解的话,可以将这个参数设为接近20000的数,然后舵机引脚就会输出接近3.3v的高电平。具体原因博主就不再展开说,有兴趣可以自己做做舵机实验。

根据上面的思路,就可以定义模型的输出接口:

序号 信号名 数据类型 范围 存储类型
1 VeOUTR_uint16_Srv2PWM uint16 [500,19500] ExportedGlobal

从命名上看,还是把接口做成2号舵机的名称。但是,取值范围是500和19500两个整数。取值为500的时候,引脚输出0.1v左右的低电平,继电器保持断开;取值为19500时,引脚输出3.2v左右的高电平,继电器闭合。也就是说,继电器处于常断开的状态,按下R1按键的时候,继电器闭合,水弹枪开始连续发射。

3 数据字典定义

在第二章中,根据架构划分,建立好了各个子系统和输入输出端口。根据其中对输入输出的属性描述,可以在这个阶段顺便建立一下输入输出接口的数据字典。关于数据字典的建立方法,可以参考博主以前的博客《Simulink代码生成:数据字典的建立、关联模型》。
数据字典中如图所示,主要是需要定义名称、类型和存储类型(StorageClass)。对于范围(最大最小值)只是一个概念性的,不需要在数据字典中定义。

4 总结

本文是MBD开发机甲大师控制策略的第三篇,主要设计了模型的架构以及定义了接口相关的属性。下一步会在每个子系统中建立具体的控制策略,也就是软件单元设计阶段。

>>返回个人博客总目录

机甲大师机器人控制(三):软件架构设计相关推荐

  1. 机甲大师机器人控制(一):概念与流程

    本文是机甲大师机器人控制的系列博客之一.本文主要介绍了机甲大师机器人以及博主在开发其控制策略时所采用的流程.本系列博客的模型和代码已经上传CSDN资源. 系列博客: 机甲大师机器人控制(一):概念与流 ...

  2. 机甲大师机器人控制(四):软件单元

    本文是机甲大师机器人控制的系列博客之一.在软件架构设计的基础上,本文设计每个模块中的控制算法. 系列博客: 机甲大师机器人控制(一):概念与流程 机甲大师机器人控制(二):功能分析 机甲大师机器人控制 ...

  3. 机甲大师机器人控制(六):集成测试

    本文是机甲大师机器人控制的系列博客之一.在软件单元测试阶段完成后,进行集成测试.本文内容与功能分析阶段相对应.另外,阅读本文的内容需要一些STM32调试经验. 系列博客: 机甲大师机器人控制(一):概 ...

  4. 机甲大师机器人控制(二):功能分析

    本文是机甲大师机器人控制的系列博客之一.本文介绍了博主在开发控制策略的前期对其进行的功能分析并熟悉一些基本原理. 系列博客: 机甲大师机器人控制(一):概念与流程 机甲大师机器人控制(二):功能分析 ...

  5. 机甲大师机器人控制(七):购买清单

    本文详细介绍博主在DIY机甲大师机器人的过程中所购买的零件和工具. 系列博客: 机甲大师机器人控制(一):概念与流程 机甲大师机器人控制(二):功能分析 机甲大师机器人控制(三):软件架构设计 机甲大 ...

  6. SolidWorks_机甲大师——麦克纳姆轮设计

    SolidWorks_机甲大师--麦克纳姆轮设计 第一步: 第二步: 第三步: 第四步: 第五步: 第六步: 第七步: 第八步: 第九步: 第十步: 第十一步: 第十二步: 第十三步: 交叉曲线–面面 ...

  7. 详细介绍软件架构设计的三个维度

    如果你对项目管理.系统架构有兴趣,请加微信订阅号"softjg",加入这个PM.架构师的大家庭 架构设计是一个非常大的话题,不管写几篇文章,接触到的始终只是冰山一角,更多的是实践中 ...

  8. 软件架构设计的三个维度,软件架构师需要知道的点,了解一下吧!

    架构设计是一个非常大的话题,不管写几篇文章,接触到的始终只是冰山一角,更多的是实践中去体会.这篇文章主要介绍面向对象OO.面向方面AOP和面向服务SOA这三个要素在架构设计中的位置与作用. 架构设计有 ...

  9. 软件架构设计_软件架构设计的三个维度,软件架构师需要知道的点,了解一下吧...

    架构设计是一个非常大的话题,不管写几篇文章,接触到的始终只是冰山一角,更多的是实践中去体会.这篇文章主要介绍面向对象OO.面向方面AOP和面向服务SOA这三个要素在架构设计中的位置与作用. 架构设计有 ...

最新文章

  1. Dlib库中实现正脸人脸关键点(landmark)检测的测试代码
  2. Spring Cloud分布式微服务云架构—源码结构图
  3. PKUWC 2018游记
  4. 从centos7默认安装的/home中转移至根目录/ (LVM操作简明教程)
  5. 使用IntelliJ, 让lombok生效的方式
  6. vue自定义组件,插槽,自定义事件
  7. SSIS变量属性中EvaluateAsExpression设置的作用
  8. frps搭建内网穿透服务器(frp隧道)
  9. import sys; print“%s.%s.%s”% sys.version_info[ :3];
  10. python爬虫十二种方法_Python爬虫的N种姿势
  11. P2030 - 【BJOI2006】狼抓兔子
  12. Python绘图模块 -- turtle
  13. 极限思想之阿基里斯和乌龟赛跑
  14. 用 Python 玩视频剪辑 让生活简易化
  15. Python 爬虫实战(1):分析豆瓣中最新电影的影评并制作词云
  16. php秒表计时器,JS实现可暂停秒表计时器的效果(图文详解)
  17. AIDL使用以及原理分析
  18. 图像识别教程(百度AI开放平台)
  19. Mixly第三方库开发——OLED库
  20. Vue组件化,你学废了吗

热门文章

  1. 斐波那契数列和斐波那契数
  2. 网页-如何控制台调试网页
  3. 小游戏的processing实现
  4. (附源码)SSM医疗健康查询系统JAVA计算机毕业设计项目
  5. layui动态添加的表单元素显示异常
  6. Symfony框架系列----常用命令
  7. 记一次针对鹅厂的盗号追踪——盗号,朋友,以及妹子的故事
  8. Java程序员必备辅助开发神器
  9. JDK、JRE、Server JRE的简介
  10. 逆变器阻抗扫描 扫频法 阻抗扫描 阻抗建模验证