[ModusToolbox™] 【英飞凌 CY8CKIT-062S2-AI评测】IMU 动作识别

[复制链接]
53|0
无垠的广袤 发表于 2025-11-20 12:26 | 显示全部楼层 |阅读模式
, , , ,

【英飞凌 CY8CKIT-062S2-AI评测】IMU 动作识别

本文介绍了英飞凌 CY8CKIT-062S-AI 开发板结合板载 IMU 传感器收集加速度计数据,并通过机器学习模型预测和推理特定运动,实现动作识别的项目设计。

项目介绍

该项目使用板载 IMU 传感器收集加速度计数据,发送至 ML 模型以检测特定运动,如振动或圆圈等行为;

  • 环境搭建:安装相关软件和机器学习工具,用以生成对应的模型代码;
  • 工程创建:使用 ModusToolbox 软件快速加载和编译固件及调试;
  • 工程代码:给出项目方案落地实现的关键代码,包括流程图等;
  • 效果演示:通过串口显示动作行为的概率,推理并给出预测结果。

环境搭建

  • 在 CY8CKIT-062S2-AI 设备 官方网站 下载对应的开发工具和 IDE 软件,包括

    • ModusToolbox ;
    • DEEPCRAFT™ Studio 或 Imagimob ;
  • 可通过 ModusToolbox Setup 软件安装相关软件和工具链;

  • 使用 ModusToolbox Programmer 软件烧录固件。

工程测试

加载 CY8CKIT-062S-AI 开发板 Demo 工程,演示了部署由 DEEPCRAFT™ Studio 生成的机器学习(ML)模型。
ML_motion_create.jpg

  • 代码示例从惯性测量单元(IMU)收集加速度计数据,然后发送给ML模型以检测特定运动,如震动或圆圈。
  • 直接使用了 DEEPCRAFT™ Studio 内部生成的 model.c/h 文件。
  • 基于运动检测项目的新模型可以直接加入项目。

工程创建

  • 进入 Eclipse for ModusToolbox 软件;
  • 在 Quick Package 标签界面下选择 Start - New Application;
  • 待加载出设备目录后(需要科学上网),在检索框中输入 CY8CKIT-062S2-AI 获取对应设备;
  • 勾选 Machine Learning 目录下的 DEEPCRAFT Deploy Model Motion 工程,点击 Create 按钮;

deepcraft_deploy_motion.jpg

  • 待完成 Demo 创建,右键项目,构建工程,确认无报错;

详见:Infineon/mtb-example-ml-deepcraft-deploy-motion .

流程图

flowchart_motion.png

工程代码

打开工程目录中的 main.c 文件,代码如下

#include <float.h>
#include <stdbool.h>
#include "cyhal.h"
#include "cybsp.h"
#include "bmi270.h"
#include "cy_retarget_io.h"

/* Model to use */
#include <models/model.h>

/*******************************************************************************
* Macros
*******************************************************************************/
#define BMI270_ADDRESS (BMI2_I2C_PRIM_ADDR)

/* X, Y and Z axes */
#define AXIS_COUNT            (3)

/* Total number of sensors - Accelerometer & Gyroscope */
#define SENSOR_COUNT          (2)

/* Earth's gravity in m/s^2 */
#define GRAVITY_EARTH         (9.80665f)

/* Accelerometer range in G. Must be one of 2, 4, 8, 16 */
#define IMU_ACCEL_RANGE_G     (8)

/* Gyro range in degrees per second. Must be one of 125, 250, 500, 1000, 2000 */
#define IMU_GYRO_RANGE_DPS    (500)

/* IMU Sample frequency (Hz), must be one of 25, 50, 100, 200, 400 */
#define IMU_FREQ              (50)

/* I2C Config */
#define _I2C_TIMEOUT_MS            (10U)
#define _READ_WRITE_LEN            (46U)
#define _SOFT_RESET_DELAY_US       (300)

/*******************************************************************************
* Function Prototypes
*******************************************************************************/
static void init_board(void);
static void halt_error(int code);
static void imu_init(struct bmi2_dev* imu);
static float imu_lsb_to_mps2(int16_t val, float g_range, uint8_t bit_width);
static float imu_lsb_to_dps(int16_t val, float dps, uint8_t bit_width);
static bool imu_read(struct bmi2_dev* imu, float* dest);
static BMI2_INTF_RETURN_TYPE _bmi2_i2c_read(
        uint8_t reg_addr,
        uint8_t* reg_data,
        uint32_t len,
        void* intf_ptr);
static BMI2_INTF_RETURN_TYPE _bmi2_i2c_write(
        uint8_t reg_addr,
        const uint8_t* reg_data,
        uint32_t len,
        void* intf_ptr);
static void _bmi2_delay_us(uint32_t us, void* intf_ptr);


/*************************************************
* Function Name: main
*************************************************/
int main(void)
{
    float data_buffer[SENSOR_COUNT * AXIS_COUNT];
    float label_scores[IMAI_DATA_OUT_COUNT];
    char *label_text[] = IMAI_DATA_OUT_SYMBOLS;
    struct bmi2_dev imu = {0};
    cy_rslt_t result;
    int16_t best_label;
    float max_score;

    /* Basic board setup */
    init_board();

    /* ANSI ESC sequence for clear screen */
    printf("\x1b[2J\x1b[;H\x1b[?25l");

    /* Initialize model */
    result = IMAI_init();
    halt_error(result);

    /* Initialize IMU sampling */
    imu_init(&imu);

    for (;;)
    {
        /* Move cursor home */
        printf("\033[H");
        printf("DEEPCRAFT IMU Model Example\r\n\n");

        /* Read sensor data */
        memset(data_buffer, 0,  sizeof(data_buffer));
        if(!imu_read(&imu, data_buffer))
        {
            continue;
        }
        /* Give sensor data to model */
        result = IMAI_enqueue(data_buffer);
        halt_error(result);

        /* Check if there is any model output */
        best_label = 0;
        max_score = -1000.0f;
        switch(IMAI_dequeue(label_scores))
        {
            case IMAI_RET_SUCCESS:      /* We have data, display it */
                for(int i = 0; i < IMAI_DATA_OUT_COUNT; i++)
                {
                    printf("label: %-10s: score: %f\r\n", label_text[i], label_scores[i]);
                    if (label_scores[i] > max_score)
                    {
                        max_score = label_scores[i];
                        best_label = i;
                    }
                }
                printf("\r\n");
                printf("Output: %-30s\r\n", label_text[best_label]);
                break;
            case IMAI_RET_NODATA:   /* No new output, continue with sampling */
                break;
            case IMAI_RET_ERROR:    /* Abort on error */
                halt_error(IMAI_RET_ERROR);
                break;
        }
    }
}

保存代码。

固件上传

  • 连接开发板和电脑,点击菜单栏的运行按钮,完成固件上传;
  • 或使用 ModusToolbox Programmer 工具烧录固件

MT_programmer_run.jpg

  • 加载固件,配置烧录器、开发板型号;
  • 点击 Program 即可。

效果

  • 运行 Tera Term 软件,连接设备串口,配置波特率为 115200
  • 短按板载 RESET 键,终端显示 IMU 例程,并进行动作推理;

demo_motion.gif

  • 使开发板做摆动、绕圈等运动,开发板可根据 IMU 数据识别出相应的行为动作;

motion_move.gif

总结

本文介绍了英飞凌 CY8CKIT-062S-AI 开发板结合板载 IMU 传感器收集加速度计数据,并通过机器学习模型预测和推理特定运动,实现动作识别的项目设计,为相关产品在边缘 AI 领域的快速开发和设计应用提供了参考。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

31

主题

78

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部