当前位置:   article > 正文

基于NanoEdgeAI Studio与STEVAL-STWIN的振动监测调试记录_steval-stwinkt1b

steval-stwinkt1b


这个是在STM32单片机板子上的代码(STM32L4R9)

链接:https://pan.baidu.com/s/1LA68NpVdsoQSJFrA72hgUQ
提取码:532e

一、实验目的

因自己毕设做的是风机的异常监测,当时用了Jetson Xaiver Nx (Linux)来部署异常检测算法(采用了COPOD、孤立森林等),但是因为以下几个原因想把整个系统优化一下:
(1)设备高级但系统并不复杂(“牛刀杀鸡”):在实际中,考虑到风机上有很多传感器,数据的维数会爆炸,同时在如果有很多组风机就会产生海量数据,因此选用了英伟达的Jetson Xavier Nx。它的功能太强大了,一般的图像训练与推理都绰绰有余。而对于我的毕设而言,只有一个风机,传感器有限,就之前介绍的一些转动数据(发电机采集)和振动数据(MPU6050),需要检测的只有6维。
(2)机缘巧合之下(当时推免结束之后去参加了STM32开发者大会,演讲者介绍了边缘AI平台(适合机器学习)和STM32Cube.AI(适合深度学习),虽然他们已经发布很久了…)。 NanoEdgeAI Studio是针对没有机器学习和深度学习基础的嵌入式软件工程师的,我当时觉着很友好,而最后可以将模型算法放到单片机上进行推理。但当时毕设时间比较紧,为了保险起见,没有尝试这种新方法,所以此处想弥补这个遗憾。
(3)传感器系统不够集成: 因我毕设中的多个传感器虽集成在一个PCB板上,但是大部分是买的小模块,然后插在PCB上,一直想要玩一个更加集成的板子。经过师兄介绍,认识了STEVAL-STWIN系列板子,上面集成了很多的传感器,而且体积很小。
(4)我毕设指导老师说的一段话我觉着很有意思,分享一下:凡是你能想到的东西,大概率都已经有的,要相信现在的市场规律,如果没有,大概率是输入的关键词不对。 有意思的事情太多了,我们能认识真的十分有限。但是虽然有很多人已经做过,但是我们依然要保持热情,因为眼界往往在你看过很多东西积累下来的,因此我很想去玩这块板子和这个软件(为了之后提升开发效率)。不过事实证明我做了接近两个月的毕设(大概半个多月的硬件+嵌入式软件;1个多月简单的机器学习模型和Pytorch),如果用这块板子和上位机不仅系统结构更紧凑,主要是开发周期短,大致一周就可以了(嵌入式软件+机器学习算法)。
在这里插入图片描述

二、STEVAL-STWINKT1B

1.开发板资源 如下图所示,我们可以发现它是专用于振动监测的一款,因此会有很多运动、振动传感器等,本次实验主要是对ISM330DHCX(6轴传感器,与MPU6050类似)。
在这里插入图片描述
在这里插入图片描述
2.对开发版的整体开发: ST提供了“FP-SNS-DATALOG1”软件包,这部分我只是使用了以下,因为整个软件包很轻大,很多传感器的驱动代码都有,而且关于上云、FreeRTOS嵌入式实时操作系统(我感觉看懂他的源码还是需要花费一点时间的,实际上我看了1个小时的代码,改的话不知道从哪里下手,因此并没有修改它的源码,直接拷到了集成板上了。)
(1)需要烧录固件(可用STM32Cube programmer烧录,烧录方法此处不再介绍);


3. 传感器选用设置:
(1)此处程序并不会再串口打印出代码,具体数据去哪里俺也找不到,但数据的采集它是可以存储到MicroSD上的,到时候可以把SD卡拔出来(它是可以拔的,因为不像树莓派里面有操作系统,单片机的SD卡只是用于本地存储功能,可以在断电后拔出来,看到.dat文件的数据,.dat是一种数据格式,可通过一些软件打开,后面会提到较新版的NanoEdgeAI中会有这种获取数据的方式);
(2)有些时候我们并不需要所有的传感器都工作,只想获取某些传感器的数据,这个其实是可以设置的(好像有两种方法)。

配置方法可以参考: https://wiki.stmicroelectronics.cn/stm32mcu/wiki/AI:How_to_perform_anomaly_detection_using_FP-AI-MONITOR1

(3)方法一:利用“FP-AI_NANOEDG1” 软件包,它的应用手册中有详细的介绍,同时通过Tera Term来进行交互:
在这里插入图片描述
在这里插入图片描述
方法二:通过手机蓝牙设置即可,可以设置需要用到的传感器以及每个传感器的量程和采样率等。

三、STM32CubeIDE设计

这部分的主要任务是利用ISM330DHCX这个传感器,至于驱动什么的大家自己去下载我上传的那个工程就好了。下面主要介绍一下自己的核心代码。这里重点解释一下为啥有49组什么的:
(1)主要是为后面的NanoEdgeAI服务,之前我是3轴加速度直接送,但训练的效果很不好;
(2)官网的博主用的是64组的,因此我试了多组一起送,然后随机选择了49组送一次;
(3)相当于一个数据包有:49*3=147个数据,3指的是一组有3轴的加速度嘛;
(4)将传感器用起来就可以进行下面的NanoEdgeAI Studio的操作了。

void ism330dhcx_test(void){
    /* Read output only if new value is available */
    uint8_t reg;
    for(int i=0; i<49; i++)
    {
		ism330dhcx_xl_flag_data_ready_get(&dev_ctx, &reg);
		if (reg) {
		  /* Read acceleration field data */
		  memset(data_raw_acceleration, 0x00, 3 * sizeof(int16_t));
		  ism330dhcx_acceleration_raw_get(&dev_ctx, data_raw_acceleration);
		  aacx = ism330dhcx_from_fs2g_to_mg(data_raw_acceleration[0]);   //x轴加速度
		  aacy = ism330dhcx_from_fs2g_to_mg(data_raw_acceleration[1]);   //y轴加速度
		  aacz = ism330dhcx_from_fs2g_to_mg(data_raw_acceleration[2]);   //z轴加速度
		  //printf("%4.2f %4.2f %4.2f\r\n",acceleration_mg[0], acceleration_mg[1], acceleration_mg[2]);
		  acc_buffer[i*3] = aacx;
		  acc_buffer[i*3+1] = aacy;
		  acc_buffer[i*3+2] = aacz;
		}
		HAL_Delay(20);
    }
    for(int j=0; j<49; j++)
    {
    	if(j<=47)
    		printf("%4.2f %4.2f %4.2f ", acc_buffer[j*3], acc_buffer[j*3+1], acc_buffer[j*3+2]);
    	else{
    		printf("%4.2f %4.2f %4.2f\r\n", acc_buffer[j*3], acc_buffer[j*3+1], acc_buffer[j*3+2]);
    	}
    }
  }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

四、NanoEdgeAI Studio初探索

本次我主要想演示系统的的振动检测功能。我是参考下面的视频结合自己的实践做出的:

https://www.youtube.com/watch?v=bCZvzOYIYiA

1.从下面图中,我们可以看到它有4个功能,因为我只探索了最简单的AD;
在这里插入图片描述
2.异常检测主要分为以下几部分:

(1)创建工程(工程基础的配置)
(2)导入正常信号;
(3)导入异常信号;
(4)模型训练与仿真测试;
(5)导出可用于STM32的静态库与头文件(.a文件与.h文件)

3. 创建工程:
我们选中这个选项卡,然后新建一个工程,因为我用的是开发板,正好有对应的选项卡;但是如果大家用普通的单片机,如STM32F103C8T6+MPU6050这种的也是可以使用的,因为只需要把数据给它就好了,通用性还是可以的。
在这里插入图片描述
4. 导入正常信号:
(1)导入正常信号包括3种方式:(a)从之前采集好的文件中(csv文件等);(b)从SD中读取.dat文件(直接将之前的工程文件烧录到单片机中,然后拔下SD卡,插入到电脑中,利用这个上位机即可实现读取);(c)直接利用USB(从串口读取),在本次实验中为了在上位机上完成实时监测,因此采用这种方式的来读取。
在这里插入图片描述
(2)数据采集完成,系统会把采集的数据进行可视化,同时我们自己也可选择是不是要进行FFT滤波,也是可以设置截至频率的,这个我觉着是非常好的一个点。
在这里插入图片描述
5. 导入异常信号: 因为整个实验是进行振动监测,故制造一些振动情况即可,采集方式与之前相同。
在这里插入图片描述
6. 训练模型
我们都知道机器学习或者深度学习在训练之前需要进行特征工程(数据清洗、数据标准化、数据集划分等),而且只能用自己写的那几种算法模型或网络来进行训练;然而NanoEdgeAI Studio帮我们省略了这些步骤,便于不精通机器学习的小白也可应用。这款软件不需要我们自己进行特征工程和选择算法,它会自动尝试一些经典的算法来不断优化,最终会返回最适合本系统的算法。
(1)模型训练完成界面: 对于之前我采集的数据它的准确率达到了97%,置信度也到了85%左右,我认为这样子就可以了,然后就把训练过程暂停了(当然训练时间的长短要根据数据量来判断),10 iterations 表示在后面的训练中至少要进行训练10轮才可以用。
在这里插入图片描述
(2)最终选择算法如下图所示,第一个是系统为我们推荐的,但也可自己选择用哪个;
在这里插入图片描述
(3)仿真测试:
当训练结束之后,在实际部署之前我们想测试一下算法效果怎么样,因此这个软件中也为我们提供了实时监测(不需要进行部署,直接可在上位机查看,但是在真实落地时,还是需要把算法部署到单片机中的)。
在这里插入图片描述
这个就是实时监测的界面,当我们学习完成后,会出现监测的按钮
在这里插入图片描述
当系统学习结束之后,即可开始测试
在这里插入图片描述
当给系统制造异常时,系统的相似度会降低,当低于阈值90时,系统表征输出信号异常。
在这里插入图片描述
7. 导出算法模型: 因传感器采集的数据本身就是有浮点类型,所以需要选择“Float abi”格式的。有用的主要是两个文件,即“.a”和“.h”文件。
在这里插入图片描述
把压缩包解压之后的文件目录如下图所示:
在这里插入图片描述

五、STM32CubeIDE部署

因为之前我都是用Keil库开发,但对于静态库文件,KEIL还需要进行下载gcc编译器什么的,比较麻烦,而且我自己也是特别想探索一下STM32Cube的其他的生态软件(因为之前就只用过MX和Programmer),而且STM32CubeIDE直接就可以使用静态库,添加一下路径就好了。
1.导入文件:
(1)这个是我的整个系统的目录,建立了文件夹"acc_lib",然后将文件拉进去即可;
在这里插入图片描述
(2)添加文件路径,将文件夹路径添加到工程中(包括Include与Library);
在这里插入图片描述
在这里插入图片描述
(3)还需要链接静态库,这样整个文件就导入完成。
![在这里插入图片描述](https://img-blog.csdnimg.cn/e2ba1845419648e9bb3b068f5c8e59bc.png
2. 编写程序
(1) NanoEdgeAI Studio给的框架如下所示,主要包括初始化、学习和推理。


/* Includes --------------------------------------------------------------------*/
#include "NanoEdgeAI.h"
/* Number of samples for learning: set by user ---------------------------------*/
#define LEARNING_ITERATIONS 49
float input_user_buffer[DATA_INPUT_USER * AXIS_NUMBER]; // Buffer of input values

/* Private function prototypes defined by user ---------------------------------*/
/*
 * @brief Collect data process
 *
 * This function is defined by user, depends on applications and sensors
 *
 * @param sample_buffer: [in, out] buffer of sample values
 * @retval None
 * @note   If AXIS_NUMBER = 3 (cf NanoEdgeAI.h), the buffer must be
 *         ordered as follow:
 *         [x0 y0 z0 x1 y1 z1 ... xn yn zn], where xi, yi and zi
 *         are the values for x, y and z axes, n is equal to
 *         DATA_INPUT_USER (cf NanoEdgeAI.h)
 */
void fill_buffer(float input_buffer[])
{
	/* USER BEGIN */
	/* USER END */
}
/* -----------------------------------------------------------------------------*/
int main(void)
{
	/* Initialization ------------------------------------------------------------*/
	enum neai_state error_code = neai_anomalydetection_init();
	uint8_t similarity = 0;

	if (error_code != NEAI_OK) {
		/* This happens if the library works into a not supported board. */
	}

	/* Learning process ----------------------------------------------------------*/
	for (uint16_t iteration = 0 ; iteration < LEARNING_ITERATIONS ; iteration++) {
		fill_buffer(input_user_buffer);
		neai_anomalydetection_learn(input_user_buffer);
	}
	
	/* Detection process ---------------------------------------------------------*/
	while (1) {
		fill_buffer(input_user_buffer);
		neai_anomalydetection_detect(input_user_buffer, &similarity);
		/* USER BEGIN */
    /*
    * e.g.: Trigger functions depending on similarity
    * (blink LED, ring alarm, etc.).
    */
		/* USER END */
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55

(2)代码整体思路较为简单:初始化、学习和推理,此处学习了20轮。

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART2_UART_Init();
  /* USER CODE BEGIN 2 */
  BSP_SPI3_Init();
  ism330dhcx_init();
  enum neai_state error_code = neai_anomalydetection_init();
  uint8_t similarity = 0;
  if(error_code != NEAI_OK){
	  while(1){printf("Faliure!!!!");}
  }
  printf("start learning....\r\n");
  for(int i=0; i<20; i++){
	  ism330dhcx_test();
	  printf("epoch:%d\r\n", i);
	  neai_anomalydetection_learn(acc_buffer);
  }


  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	 ism330dhcx_test();
	 neai_anomalydetection_detect(acc_buffer, &similarity);
	 if(similarity < 90)
	 {
		 printf("Anormal, %d\r\n", similarity);
	 }
	 else{
		 printf("Normal, %d\r\n", similarity);
	 }
  }
  /* USER CODE END 3 */
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63

3、实验结果
(1)系统开始学习:
在这里插入图片描述
(2)未制造异常监测情况:
在这里插入图片描述
(3)制造振动异常后恢复正常:
在这里插入图片描述
至此我完成了整个的实验步骤操作。

结论

学会了:
1.利用了大概一周的时间完成了振动监测的功能,其实整个实验并不是很难,但是毕竟是也是探索一些新的工具,感觉还是有点挑战的;
2. 不得不感叹:目前我基本能想到的一些点,其实很多已经存在了,或者很成熟甚至已经商业化了,自己的眼界还是不够吧,需要继续努力,继续保持探索新事物的热情,勇敢地跳出自己的舒适圈,学习更多的东西,因为现在自己具备的技能还远远不够。

后面还需要探索的(利用空闲时间):
1.STM32CubeMX提供了一些传感器的BSP,我想自己总结一套模板出来,这样子后面的话可大大提高开发效率;
2.探索STM32Cube.AI工具,完成简易算法的落地;
3. 根据自己实习工作的需要,需要慢慢接触学习CV方面的知识了,也算是我感兴趣的一个方向了(虽然那个很卷),但是也算是一个探索嘛,多尝试!!!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/338922
推荐阅读
相关标签
  

闽ICP备14008679号