本文是机甲大师机器人控制的系列博客之一。在软件单元测试阶段完成后,进行集成测试。本文内容与功能分析阶段相对应。另外,阅读本文的内容需要一些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. VMware虚拟机提示在该系统上全局禁用了虚拟机打印功能
  2. 《深入理解Oracle 12c数据库管理(第二版)》PDF
  3. vantui框架switch上显示提示文字_?Switch主机账号官网注册教程
  4. JZOJ 3875. 【NOIP2014八校联考第4场第2试10.20】星球联盟(alliance)
  5. Node.js 目录操作
  6. indexzero/http-server-2-使用
  7. 2017年 JavaScript 框架回顾 -- React生态系统
  8. 【10.20校内测试】【小模拟】【无向图建树判奇偶环】【树上差分】
  9. 异常java.lang.Thread.dumpStack(Unknown Source)
  10. “函数调用的左操作数”的理解
  11. 作者:谢华美(1976-),男,就职于中国人民银行征信中心数据部
  12. python提速qq邮箱邮件_python3通过qq邮箱发送邮件
  13. Java8 Date API 详解 - LocalDate,LocalDateTime,Instant
  14. Unity美术场景制作基础流程和注意事项梳理
  15. 从零编写一个解析器(1)—— 解析数字
  16. python炫酷动画源代码_Python tkinter实现的图片移动碰撞动画效果【附源码下载】...
  17. java设计九宫格拼图软件哪个好用_抖音超火的朋友圈九宫格用什么软件做的? 抖音九宫格图片制作教程...
  18. 头歌实训平台C语言答案
  19. SQL SERVER 2005/vs2008快捷键
  20. FastDFS,Redis,Solr,ActiveMQ核心技术整合五

热门文章

  1. 月光宝盒茶具使用说明篇
  2. Java中List初始化(亲测)
  3. 电脑自带录屏怎么录?教您2个简单的方法
  4. 如何在PS里用套索和磁性套索工具
  5. 美国航空航天局对数据中心进行整合
  6. Jenkins 2.X free-style CI/CD流水线搭建(一)
  7. 中谷教育python精讲_中谷教育Python视频教程资源推荐
  8. 用scp替换服务器上文件提示没权限,sh使用scp: /目录: Permission denied 权限受阻解决方法...
  9. PHP遍历数组的方法汇总
  10. 定位技术 TOA/TDOA/AOA/RSS