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

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

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

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转速为0
	MotB_Interface(VeOUTR_int32_FLWheel); // 初始化电机B转速为0
	MotC_Interface(VeOUTR_int32_BRWheel); // 初始化电机C转速为0
	MotD_Interface(VeOUTR_int32_FRWheel); // 初始化电机D转速为0
	SSenvo(0,VeOUTR_uint16_Srv0PWM);      // 初始化舵机0位置为1500
	SSenvo(1,VeOUTR_uint16_Srv1PWM);      // 初始化舵机1位置为1500
	SSenvo(2,VeOUTR_uint16_Srv2PWM);      // 初始化继电器电平为低电平

while(1)
{
	if( WaitTrue(0,20) ) //20ms运行一次
	{
		PS2_Interface();  //获取当前周期的PS2信号
		MTSR_MotionSolve_step();  //执行模型的step函数,算出输出参数
		
		//Mot_Interface
		MotA_Interface(VeOUTR_int32_BLWheel);  //更新该循环内电机A的转速
		MotB_Interface(VeOUTR_int32_FLWheel);  //更新该循环内电机B的转速
		MotC_Interface(VeOUTR_int32_BRWheel);  //更新该循环内电机C的转速
		MotD_Interface(VeOUTR_int32_FRWheel);  //更新该循环内电机D的转速
			
		//Senvo_Interface
		SSenvo(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工程,最后下载到控制器中进行测试。该阶段会暴露出很多问题,如果能够一一解决会有不小的收获。

>>返回个人博客总目录

  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值