赞
踩
链接: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),如果用这块板子和上位机不仅系统结构更紧凑,主要是开发周期短,大致一周就可以了(嵌入式软件+机器学习算法)。
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来进行交互:
方法二:通过手机蓝牙设置即可,可以设置需要用到的传感器以及每个传感器的量程和采样率等。
这部分的主要任务是利用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, ®); 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]); } } }
本次我主要想演示系统的的振动检测功能。我是参考下面的视频结合自己的实践做出的:
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”文件。
把压缩包解压之后的文件目录如下图所示:
因为之前我都是用Keil库开发,但对于静态库文件,KEIL还需要进行下载gcc编译器什么的,比较麻烦,而且我自己也是特别想探索一下STM32Cube的其他的生态软件(因为之前就只用过MX和Programmer),而且STM32CubeIDE直接就可以使用静态库,添加一下路径就好了。
1.导入文件:
(1)这个是我的整个系统的目录,建立了文件夹"acc_lib",然后将文件拉进去即可;
(2)添加文件路径,将文件夹路径添加到工程中(包括Include与Library);
(3)还需要链接静态库,这样整个文件就导入完成。
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 */ } }
(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 */ }
3、实验结果
(1)系统开始学习:
(2)未制造异常监测情况:
(3)制造振动异常后恢复正常:
至此我完成了整个的实验步骤操作。
学会了:
1.利用了大概一周的时间完成了振动监测的功能,其实整个实验并不是很难,但是毕竟是也是探索一些新的工具,感觉还是有点挑战的;
2. 不得不感叹:目前我基本能想到的一些点,其实很多已经存在了,或者很成熟甚至已经商业化了,自己的眼界还是不够吧,需要继续努力,继续保持探索新事物的热情,勇敢地跳出自己的舒适圈,学习更多的东西,因为现在自己具备的技能还远远不够。
后面还需要探索的(利用空闲时间):
1.STM32CubeMX提供了一些传感器的BSP,我想自己总结一套模板出来,这样子后面的话可大大提高开发效率;
2.探索STM32Cube.AI工具,完成简易算法的落地;
3. 根据自己实习工作的需要,需要慢慢接触学习CV方面的知识了,也算是我感兴趣的一个方向了(虽然那个很卷),但是也算是一个探索嘛,多尝试!!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。