2024艾迈斯欧司朗竞赛 - 基于TMF8821的dToF传感器模块 实现手势识别
该项目使用了TMF8821的dToF传感器模块,实现了手势识别的设计,它的主要功能为:可识别挥动,接近/远离等手部动作,并使用手势动作控制屏幕上的菜单功能。
标签
嵌入式系统
TMF8821
冲向天空的猪
更新2025-03-05
25

1.项目需求

将dToF可识别挥动,接近/远离等手部动作,并使用手势动作控制屏幕上的菜单功能。

2.处理思路

我们使用MicroPython驱动TMF8821的dToF传感器模块,之后我们将获取其中的置信值和距离作为我们手势判断标准,并且将温度值读取出来作为我们的菜单选项,再添加当前时间作为我们菜单的第二个选项。

3.流程图

4.实现步骤

4.1 下载TMF8821固件

我们将再GitHub上下载我们的TMF8821固件https://github.com/K1ngGrim/tmf882X_micropython
这里将我们的固件下载已经写完了,这里我们主要解决对于挥动远离接近的逻辑判断。

4.2 动作识别的实现

4.2.1 获取识别数据

在每一帧数据采集时,我们提取了第2、5、8个采样点的距离和置信度值,以便进行动作识别判断。

frames = tmf8821_util.measure_frame()  # 获取多帧数据
if frames:
  selected_results = [] # 存储第258个结果
  frame = frames[0] # 获取第一个帧
  for frame in frames:
      if len(frame.results) >= 8:
          selected_results.extend([frame.results[1], frame.results[4], frame.results[7]])

4.2.2 识别逻辑

通过分析距离和置信度的变化趋势,我们实现了挥动、接近和远离的判断:

def collect_data(self, result, temp):
  self.distances.append(result.distanceInMm)
  self.temp = temp
  if self.previous_distance is not None:
      distance_change = result.distanceInMm - self.previous_distance
      self.distance_changes.append(distance_change)
  self.previous_distance = result.distanceInMm

  if self.previous_confidence is not None:
      confidence_change = result.confidence - self.previous_confidence
      self.confidence_changes.append(confidence_change)
  self.previous_confidence = result.confidence

通过比较当前和前一时刻的距离与置信度变化,我们判断手势动作:

  • 接近: 当距离逐渐减小,且置信度增大时,判断为手势接近。
  • 远离: 当距离逐渐增大,且置信度减小时,判断为手势远离。
  • 挥动: 通过分析数据的波动模式(如距离的增减交替),判断是否为挥动动作。
def analyze_changes(self):
  if len(self.distance_changes) < 5 or len(self.confidence_changes) < 5 or self.default_distance is None:
      return "No sufficient data to analyze"

  distance_trend = sum(self.distance_changes)
  confidence_trend = sum(self.confidence_changes)

  if self.is_wave_gesture():
      self.wave_action()
      print("挥动")
  elif distance_trend > 80 and confidence_trend <=0:
      self.far_action()
      print("远离")
  elif distance_trend < -150 and confidence_trend <= 0:
      self.near_action()
      print("接近")
  else:
      print("不动")
  self.reset()

4.2.3 扩展的手势识别

此外,系统还实现了更精细的挥动检测。挥动手势识别不仅通过距离变化来判断,还结合了距离的波动模式。挥动的判断逻辑如下:

def is_wave_gesture(self):
  if len(self.distances) < 5:
      return False

  default_distance = self.distances[0]
  max_distance = max(self.distances)
  min_distance = min(self.distances)

  if (default_distance - min_distance > 15 and max_distance - default_distance > 15) or \
      (max_distance - default_distance > 15 and default_distance - min_distance > 15):
      return True
  return False

4.3 菜单界面设计

菜单界面设计分为三个界面:初始界面显示温度和时间,第二个界面显示传感器温度数据,第三个界面显示当前时间。用户通过挥动手势在菜单项之间切换,接近进入选择界面,远离退出或返回。

def display_menu(self):
  self.in_menu = True
  menu_y_offset = 50
  display.fill(st7789.BLACK)
  for index, item in enumerate(self.menu_items):
      color = st7789.WHITE
      if index == self.current_menu_index:
          color = st7789.GREEN
      display.text(font2, item, CENTER_X - 20, menu_y_offset + index * 40, color)

4.4 菜单界面切换

def enter_selected_menu_item(self):
  self.in_menu = False
  selected_item = self.menu_items[self.current_menu_index]
  if selected_item == "Temp":
      self.display_temp_page()
  elif selected_item == "Time":
      self.display_time_page()


5.效果展示

5.1 菜单界面

5.2 温度界面

5.3 时间界面

6. 项目总结

通过本项目,我们成功实现了一个基于TMF8821 dToF传感器的手势识别系统,系统能够识别接近、远离和挥动等常见手势,并根据手势控制屏幕菜单的切换。通过对传感器数据的分析,我们实现了高效、精确的手势识别。菜单界面设计简洁,用户可以通过手势轻松切换不同界面,查看温度、时间等信息。

7.后续计划

后续可以添加一些LGVL,让我们界面显示更加美观,然后再调试的过程中可能会导致一些误判,我们也可以添加一些滤波算法来调整我们的识别的操作。

附件下载
tmf882X_micropython-master.7z
团队介绍
热爱电子学生
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号