我是靠谱客的博主 震动棒棒糖,最近开发中收集的这篇文章主要介绍机甲大师机器人控制(三):软件架构设计1 开发阶段2 软件架构设计3 数据字典定义4 总结,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

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

文章目录

  • 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

序号信号名数据类型范围存储类型
1VeINPR_uint8_PS2MODEuint8[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。其属性如下表:

序号信号名数据类型范围存储类型
1VeINPR_uint8_PS2LXuint8[0~255]ImportFromFile
2VeINPR_uint8_PS2LYuint8[0~255]ImportFromFile
3VeINPR_uint8_PS2RXuint8[0~255]ImportFromFile
4VeINPR_uint8_PS2RYuint8[0~255]ImportFromFile

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

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

2.2.3 输出接口

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

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

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

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

序号信号名数据类型范围存储类型
1VeOUTR_int32_FLWheelint32[-1000~1000]ExportedGlobal
2VeOUTR_int32_FRWheelint32[-1000~1000]ExportedGlobal
3VeOUTR_int32_BLWheelint32[-1000~1000]ExportedGlobal
4VeOUTR_int32_BRWheelint32[-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。其属性如下表:

序号信号名数据类型范围存储类型
1VeINPR_uint8_PS2RLuint8[0,1]ImportFromFile
2VeINPR_uint8_PS2RRuint8[0,1]ImportFromFile
3VeINPR_uint8_PS2RUuint8[0,1]ImportFromFile
4VeINPR_uint8_PS2RDuint8[0,1]ImportFromFile

这四个按键的属性和摇杆的四个通道类似,只是范围只有0和1。按下按键的时候,信号值是1,松开的时候,信号值是0。
在这里插入图片描述
按下RL或RR时,0号舵机左右转动;按下RU或RD时,1号舵机上下转动。

2.3.3 输出接口

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

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

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

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

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

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

2.4 水弹枪控制子系统

2.4.1 子系统模型

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

2.4.2 输入接口

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

序号信号名数据类型范围存储类型
1VeINPR_uint8_PS2R1uint8[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的高电平。具体原因博主就不再展开说,有兴趣可以自己做做舵机实验。

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

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

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

3 数据字典定义

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

4 总结

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

>>返回个人博客总目录

最后

以上就是震动棒棒糖为你收集整理的机甲大师机器人控制(三):软件架构设计1 开发阶段2 软件架构设计3 数据字典定义4 总结的全部内容,希望文章能够帮你解决机甲大师机器人控制(三):软件架构设计1 开发阶段2 软件架构设计3 数据字典定义4 总结所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部