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

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

文章目录

  • 1 开发阶段
  • 2 代码集成
    • 2.1 生成代码
    • 2.2 STM32工程
      • 2.2.1 将模型代码导入STM32工程
      • 2.2.2 STM32工程的main文件
    • 2.3 编译与下载
  • 3 实物测试
    • 3.1 按键锁定
    • 3.2 底盘平面运动
      • 3.2.1 基本运动
      • 3.2.2 合成运动
    • 3.3 舵机云台二自由度运动
    • 3.4 发射器控制
  • 4 总结

1 开发阶段

集成测试阶段是开发的最终阶段,会逐个验证功能分析阶段中提出的每一条功能需求。

集成测试阶段会暴露出前几个步骤中带来的问题,因此会反复地回到前面的阶段去修改。

集成测试阶段分两步走。首先是代码集成过程,会将软件单元测试阶段初步验证过的模型生成代码,放到STM32工程中和其他的手写代码、寄存器配置代码一起编译成可执行文件。然后是实物测试过程,会将可执行文件刷到STM32驱动板中,然后通过手柄遥控,测试机甲大师机器人是否按照预期的方式行动。

2 代码集成

2.1 生成代码

Simulink模型是没有办法被编译器编译的,所以首先要从模型生成代码。博主在《Simulink代码生成》专栏里已经写了很多关于代码生成的配置方式,本文就不会细说这些配置,但是仍然有以下部分需要注意。

1)注意输入、输出接口信号的数据字典。本项目中,博主定义输入信号是由外部文件定义的,所以StorageClass要定义为ImportFromFile,同时要填好外部的头文件Manual_Code.h。

输出信号在自身的源文件中定义,所以StorageClass选择为ExportedGlobal。

2)选择正确的tlc文件和硬件。在配置窗口中,要选择Embedded Coder的tlc文件,也就是生成通用的嵌入式C代码。在工作中如果是基于Autosar标准的软件开发,这里就是autosar.tlc。

然后需要注意选择正确的硬件,不然数据类型的字长就对应不上。

3)配置好了以后就可以Ctrl + B生成代码。这里要注意,一定不能手动修改生成的代码,也不要阅读源文件中的step函数(虽然博主在以前的博客中经常这么做,但是对于实际项目生成的代码,就不要去阅读了)。如果需要确认一下接口变量和函数,只要读一下头文件即可。

2.2 STM32工程

一个完整的STM32工程的代码比较复杂,包括了寄存器配置和接口函数等等,已经超出了MBD技术的范围。因此,博主重点讲一下怎样将模型生成的代码嵌入到STM32的工程中,并且可以正确地编译、链接。

2.2.1 将模型代码导入STM32工程

1)在2.1节中,会生成一个C源文件和若干个头文件。不同地Matlab版本,或是不同的Simulink配置项,可能导致生成的头文件数量和博主的不一致,不过这个问题影响不大。

2)在STM32工程中新建一个Group,命名为Embedded_Coder。将生成的MTSR_MotionSolve.c文件添加到这个组中。

3)将模型生成的头文件所在的路径加入到STM32工程配置中。

这样的话,就完成了手动添加代码和头文件。

2.2.2 STM32工程的main文件

STM32工程中的main.c文件代码如下。

#include "BoardLib.h"
#include "OLED_I2C.h"
#include "Manual_Code.h"
#include "MTSR_MotionSolve.h"// 模型生成的头文件int main (void)
{PS2_Init();    // 初始化PS2用到的寄存器Manual_Code_initialize();  // 初始化手写代码MTSR_MotionSolve_initialize();  // 模型生成的初始化函数MotA_Interface(VeOUTR_int32_BLWheel); // 初始化电机A转速为0MotB_Interface(VeOUTR_int32_FLWheel); // 初始化电机B转速为0MotC_Interface(VeOUTR_int32_BRWheel); // 初始化电机C转速为0MotD_Interface(VeOUTR_int32_FRWheel); // 初始化电机D转速为0SSenvo(0,VeOUTR_uint16_Srv0PWM);      // 初始化舵机0位置为1500SSenvo(1,VeOUTR_uint16_Srv1PWM);      // 初始化舵机1位置为1500SSenvo(2,VeOUTR_uint16_Srv2PWM);      // 初始化继电器电平为低电平while(1)
{if( WaitTrue(0,20) ) //20ms运行一次{PS2_Interface();  //获取当前周期的PS2信号MTSR_MotionSolve_step();  //执行模型的step函数,算出输出参数//Mot_InterfaceMotA_Interface(VeOUTR_int32_BLWheel);  //更新该循环内电机A的转速MotB_Interface(VeOUTR_int32_FLWheel);  //更新该循环内电机B的转速MotC_Interface(VeOUTR_int32_BRWheel);  //更新该循环内电机C的转速MotD_Interface(VeOUTR_int32_FRWheel);  //更新该循环内电机D的转速//Senvo_InterfaceSSenvo(0,VeOUTR_uint16_Srv0PWM);  //更新该循环内舵机0的位置SSenvo(1,VeOUTR_uint16_Srv1PWM);  //更新该循环内舵机1的位置SSenvo(2,VeOUTR_uint16_Srv2PWM);  //更新该循环内继电器电平信号状态}
}}

main.c文件的整体内容比较简单,通过裸机实现任务调度,也就是一个while(1)无限循环。整个main文件包含三部分:

1)头文件

  1. Manual_Code.h中包括博主对PS2信号处理以及电机接口处理的手写代码,包含该头文件后,main函数就可以调用PS2函数、电机接口函数和PS2输入信号;
  2. MTSR_MotionSolve.h是模型生成的头文件,包含该头文件后,main函数就可以调用模型的step函数(也就是模型中计算的过程)和模型输出的全局变量;

2)初始化函数

在while(1)循环之前,需要对PS2、模型、电机和舵机进行初始化。

  1. PS2_Init是对PS2通讯的初始化,这部分是开发板配套的示例函数;
  2. Manual_Code_initialize是对手写代码的初始化;
  3. MTSR_MotionSolve_initialize是模型生成的init函数;
  4. MotX_Interface是将电机X的转速初始值设为0,也就是停止转动;
  5. SSenvo是将舵机的位置初始为1500,也就是中间位置;

3)while循环

while循环每隔20ms周期运行一次,是控制策略实现的关键。

  1. PS2_Interface函数会获取当前PS2传给开发板的信号数值,也就是得知在这个循环内,操作者按下了PS2的哪个按键或者摇杆,该函数会修改PS2按键信号,也就是模型的输入信号;
  2. MTSR_MotionSolve_step是模型的step函数,会根据输入信号算出输出信号,也就是给电机和舵机函数的参数是多少;
  3. MotX_InterfaceSSenvo是电机、舵机和继电器的控制接口,其参数是上一步中的step函数输出的信号;

每个while循环会不停的更新控制器RAM中的全局变量,然后用接口函数驱动电机、舵机或者继电器。

2.3 编译与下载

熟悉Keil和STM32的博友肯定非常了解编译和下载按钮在哪儿,如下图所示。采用不同的下载器,例如Jlink或者ST-Link,需要进行不同的配置。

这里博主想说明一下,编译是整个DIY过程中的第一道障碍,经常会调试很久才能编译通过。博主在做的过程中就经常遇到错误,比方说漏掉了头文件、或者变量名没匹配正确等。这部分需要比较有耐心,才能解决掉所有的问题。

3 实物测试

实物测试是整个控制开发的最后一步。在这个过程中,可以直观地检测出之前的设计是否成功。本章节中,博主会根据功能分析阶段中提出的4条功能需求,来逐一测试其效果。测试方法就是操作PS2手柄,观察机甲大师机器人是否按照预期的功能去运动。由于博客上传图片大小有限,无法上传动图,测试结果会以图片的方式呈现在后文中。

另外,为了直观地体会这一节的内容,博主将本文的测试过程录制了两端简单的视频。

机甲大师平面运动

机甲大师云台及发射器

3.1 按键锁定

按键锁定功能没法通过动图直观地展现出来,效果就是当PS2上的红绿指示灯同时亮起来的时候,PS2上的其余按键才有效。只有红灯亮起的时候是无效的。

3.2 底盘平面运动

3.2.1 基本运动

1)前后拨动左摇杆的Y通道,底盘实现前进后退运动。


2)左右拨动左摇杆的X通道,底盘实现左右平移运动。


3)前后拨动左摇杆的Y通道,底盘实现绕正前方左右摆尾运动。


4)左右拨动左摇杆的X通道,底盘实现顺时针、逆时针自转运动。

3.2.2 合成运动

合成运动就是PS2摇杆的多个通道生效的运动,博主这里只验证几个比较有用的合成运动。

1)向左上方拨动左摇杆,此时左摇杆的X、Y通道同时生效,底盘向左上方运动。


四种对角线运动(左前、左后、右前、右后)都可以通过左摇杆的XY通道组合来实现。

2)向前拨动左摇杆,同时向右拨动右摇杆,此时左摇杆的Y通道和右摇杆的X通道同时生效,底盘实现右转弯。


另外,左前转弯、左后转弯、右前转弯、右后转弯都可以通过此方法实现。

3.3 舵机云台二自由度运动

PS2右手的4个按键控制舵机云台的二自由度运动。双舵机的二自由度运动可以使水弹枪在一定范围内瞄准目标。

1)按下RL,RR按钮,舵机云台实现在水平平面内左右运动,扇形角度为180度。


2)按下RU,RD按钮,舵机云台实现在竖直平面内上下运动,扇形角度为180度。

3.4 发射器控制

按下手柄右手的R1按键可以使继电器闭合,从而控制水弹枪连续发射。

4 总结

本文是最后的集成测试阶段,在该阶段中会将模型生成代码、编译STM32工程,最后下载到控制器中进行测试。该阶段会暴露出很多问题,如果能够一一解决会有不小的收获。

>>返回个人博客总目录

机甲大师机器人控制(六):集成测试相关推荐

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

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

  2. 机甲大师机器人控制(三):软件架构设计

    本文是机甲大师机器人控制的系列博客之一.在功能分析的基础上,本文设计软件的架构以及定义输入输出接口. 系列博客: 机甲大师机器人控制(一):概念与流程 机甲大师机器人控制(二):功能分析 机甲大师机器 ...

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

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

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

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

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

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

  6. 大疆机甲大师教育机器人Python开发:中文命名变量初尝试

    简言之, 官方例程中的Twister程序, 略加修改添加了一个中文变量, 运行成功! def start()速度 = 120...chassis_ctrl.set_rotate_speed(速度)gi ...

  7. python 中文变量名_大疆机甲大师Python开发: 中文命名变量初尝试

    简言之, 官方例程中的Twister程序, 略加修改添加了一个中文变量, 运行成功! def start() 速度 = 120 ... chassis_ctrl.set_rotate_speed(速度 ...

  8. zpl指令打印中文内容_大疆机甲大师Python开发: 中文命名变量初尝试

    简言之, 官方例程中的Twister程序, 略加修改添加了一个中文变量, 运行成功! def start()速度 = 120...chassis_ctrl.set_rotate_speed(速度)gi ...

  9. 神奇的大疆机甲大师来了!fire!fire!fire!

    [惊奇科技]大疆Robomaster S1体验:看似玩具 实则硬核 作者 | 陈功.韩一冰 出品 | 网易手机&数码<易评机>栏目组 油管&B站:惊奇科技 抖音:JQ163 ...

最新文章

  1. run loop详解
  2. 整理一些sql server基础资料
  3. [测试]单元测试框架NUnit
  4. 数据库系统概论:第五章 数据库完整性
  5. zigbee 编译source_zigbee_sensor_monitor_v1_2_1 vs2008 qt-win-opensource-src-4.4.3
  6. 单词搜索Python解法
  7. 中科院开源 RISC-V 处理器“香山”流片,已成功运行 Linux
  8. 计算机网络之传输层:7、TCP拥塞控制
  9. Python3中的map与reduce的用法
  10. oracle电梯案例,Oracle技术嘉年华的一个案例,redo的那些事,连载一
  11. 联合多企业成立泛娱乐IP联盟 迅雷将打造新内容消费生态
  12. tpx色卡电子版_pantone色卡电子版-pantone色卡中文版 3.0 免费版 - 河东下载站
  13. 获取取本月一号、本月月末 日期
  14. Unity 之 2D水插件推荐和模拟水效果制作分享
  15. 【电商吧 - 1】一文带你梳理支付宝支付时用到的加密规则
  16. 二级c语言培训资料,全国计算机二级考试C语言,培训资料.doc
  17. java代码如何运行?
  18. 基于知识图谱的推荐系统(KGRS)综述
  19. Android基础知识——Android SDK Manager详解
  20. 保弘实业|工薪阶层家庭理财需要管理的四大钱包

热门文章

  1. element表单验证中的 手机号和身份证 验证
  2. 【疑难解决】华为eNSP工具(版本1.3.00.100)开启AR路由器出现40报错问题进行解决分析
  3. 计算机和台式机哪个好,台式机、一体机和笔记本电脑哪个好
  4. 我的世界连接服务器显示XX,我的世界连接服务器显示bad login
  5. M1、M2芯片Mac安装虚拟机
  6. js 构造函数里的 return 语句
  7. Widget星球—widget web 网页Widget 最好的widget widget开发
  8. windows重命名文件脚本
  9. 使用JavaScript写一个三级下拉框联动
  10. 关于hive自定义JsonSerde处理json