皮皮网

皮皮网

【stm32称重源码】【在线产品手册源码】【公众号源码查询】人机交互示例源码_人机交互示例源码怎么用

时间:2024-11-23 10:31:09 分类:知识

1.毕业设计分享 基于stm32的人机人机智能婴儿车系统(源码+硬件+论文)
2.OasisInputManager设计与实现
3.基于开源二兄弟MediaPipe+Rerun实现人体姿势跟踪可视化
4.系统解锁XCB新手玩家的Linux系统之旅xcblinux
5.用C语言开发简单的应用系统程序,源代码不得少于150行

人机交互示例源码_人机交互示例源码怎么用

毕业设计分享 基于stm32的交互交互智能婴儿车系统(源码+硬件+论文)

       毕业设计分享:基于STM的智能婴儿车系统

       在毕业设计中,选择创新且实用的示例示例项目是关键。本文分享一个以STM单片机为核心,源码源码用设计的人机人机智能婴儿车系统。该系统旨在解决传统婴儿摇篮需要持续看护的交互交互stm32称重源码问题,通过自动化控制,示例示例减轻看护者的源码源码用负担,提高婴儿睡眠质量与生活品质。人机人机

       系统设计思路

       智能婴儿车系统使用STM单片机作为核心控制器,交互交互集成了声音检测、示例示例湿度检测、源码源码用电机驱动、人机人机人机交互和报警模块。交互交互其主要功能包括:通过哭声信号启动摇篮,示例示例遇湿度信号激活报警系统。在线产品手册源码人机交互采用定时按键与LCD显示屏,步进电机实现摇篮晃动,LCD实时显示参数、尿床状态。

       硬件设计

       系统硬件设计包括原理图与PCB电路板,实现各模块功能集成。

       核心软件设计

       软件设计基于STM单片机的C语言程序,包含初始化、湿度检测、语音播报、LCD显示、电机控制、报警与音乐播放等功能。程序设计流程图直观展示系统工作流程。

       实现效果

       系统实现自动控制功能,公众号源码查询通过声音与湿度信号实现摇篮启动与报警,LCD显示实时参数,步进电机控制摇篮晃动,提升了婴儿睡眠体验与看护效率。

       最后,项目的详细内容与源代码已分享,供读者参考与学习。

OasisInputManager设计与实现

       å¼•è¨€

       äº¤äº’输入是引擎功能层中十分重要的一个功能,它允许用户使用设备,触摸或手势来与应用程序进行人机交互,在0.6里程碑中,我们初步搭建了Oasis的交互系统,目前已经支持了点击与键盘,而本文将与大家分享开发过程中的思路与不足。

整体设计主要架构

       è¾“入设备,触摸,XR设备等都属于交互系统的输入,在Oasis中我们将输入的所有逻辑收拢在输入管理器(InputManager)中,根据各种不同类型的输入再细分出触控管理器(PointerManager)与键盘管理器(KeyBoardManager)等特定输入。输入管理器分管所有特定输入管理器,在交互的帧处理中,只需要处理各个管理器内特定输入的逻辑即可。

API设计帧内生命周期

       å¦‚下是Oasis运行时帧处理的生命周期:InputManager的内部生命周期如下:

如何使用Pointer

       ä¸ºä¸‰ç»´ç©ºé—´å†…有碰撞体积的物体增加碰撞体。

       å‚考脚本组件(Script)内回调接口的触发条件添加适宜的逻辑。|接口|触发时机与频率||---|---||onPointerEnter|当触控点进入Entity的碰撞体范围时触发一次||onPointerExit|当触控点离开Entity的碰撞体范围时触发一次||onPointerDown|当触控点在Entity的碰撞体范围内按下时触发一次||onPointerUp|当触控点在Entity的碰撞体范围内松开时触发一次||onPointerClick|当触控点在Entity的碰撞体范围内按下并松开,在松开时触发一次||onPointerDrag|当触控点在Entity的碰撞体范围内按下时持续触发,直至触控点解除按下状态|

KeyBoard

       ç›´æŽ¥è°ƒç”¨äº¤äº’管理器(InputManager)提供的方法判断按键状态。

方法名称方法释义isKeyHeldDown返回这个按键是否被持续按住isKeyDown返回当前帧是否按下过此按键isKeyUp返回当前帧是否抬起过此按键鼠标与触控背景

       PointerEvent是浏览器内鼠标与触控交互后续发展的势头,Pointer是输入设备的硬件层抽象,开发者不需要关心数据来源是鼠标,触控板或是触摸屏,但是它也有一定兼容性问题,可以看到在canIUse中,PointerEvent的设备覆盖率为:.%,需要通过导入Polyfill来解决。

需求调研

       åœ¨è„šæœ¬ç»„件中增加响应Pointer的钩子函数,对于在三维空间中有碰撞体积的实体,可以让开发者通过补充对应钩子函数内的逻辑方便地实现点击,拖动,选中等交互操作。

钩子函数触发时机与频率onPointerEnter当触控点进入Entity的碰撞体范围时触发一次onPointerExit当触控点离开Entity的碰撞体范围时触发一次onPointerDown当触控点在Entity的碰撞体范围内按下时触发一次onPointerUp当触控点在Entity的碰撞体范围内松开时触发一次onPointerClick当触控点在Entity的碰撞体范围内按下并松开,在松开时触发一次onPointerDrag当触控点在Entity的碰撞体范围内按下时持续触发,直至触控点解除按下状态原生事件

       å’ŒMouseEvent,TouchEvent一样,PointerEvent也可以通过监听捕获。canvas.addEventListener('pointerXXX',callBack);

MouseEventTouchEventPointerEvent按下mousedowntouchstartpointerdown抬起mouseuptouchendpointerup移动mousemovetouchmovepointermove离开mouseout|mouseleavetouchend|touchcancelpointerout|pointercancel|pointerleave流程图

       å¯ä»¥å½’纳出Pointer处理的大致流程,其中绿框代表原生事件。

射线检测

       åœ¨Pointer中要解决的最大问题是如何根据原生事件中的位置信息在三维空间中做射线检测,因为这部分内容不仅仅包含空间转换的基本知识,还包含了物理系统的基础使用。

       åœ¨æˆ‘们捕获了PointerEvent后,需要

       ä»ŽåŽŸç”Ÿäº‹ä»¶ä¸­èŽ·å–有效的屏幕位置信息。

       å°†ä½ç½®ä»Žå±å¹•ç©ºé—´è½¬æ¢åˆ°ä¸‰ç»´ç©ºé—´ï¼Œå¹¶èŽ·å–检测射线。

       å°„线与碰撞体相交检测。

       å›žè°ƒè„šæœ¬ã€‚

屏幕位置信息

       æˆ‘们期望拿到指针相对于目标元素的位置,但是原生事件中关于坐标的属性有很多,因此需要甄别哪个坐标信息是有效的。

原生事件坐标属性属性释义clientX&clientY相对于触发事件的应用区域的坐标(可视区域坐标)offsetX&offsetY相对于目标元素的坐标pageX&pageY相对于整个Document的坐标(包含滚动区域)screenX&screenY相对于主显示屏左上角的坐标(基本不会使用)x&y同clientX&clientY

       ä»–们有以下的转换关系(假设原生事件为event,点击的目标元素为canvas):可以得到的结论是:大多坐标属性都可以得到期望的坐标信息,其中offset最直接方便。

空间转换

       ç®€åŒ–射线检测,根据从获取到屏幕上点击的坐标得到三维空间中的一条射线,然后与三维空间中碰撞体进行碰撞检测。

       ä»¥é€è§†ç›¸æœºä¸ºä¾‹ï¼Œå½“获取到屏幕上点击的坐标后,只需要完成以下步骤便可得到射线:

       offset->屏幕空间

       å±å¹•ç©ºé—´->裁剪空间

       è£å‰ªç©ºé—´->世界空间

       æœ‰å›¾å½¢å¼•æ“ŽåŸºç¡€çš„同学比较熟悉我们在渲染时经过了如下变换:

       æ¨¡åž‹ç©ºé—´->世界空间

       ä¸–界空间->观察空间->裁剪空间

       è£å‰ªç©ºé—´->屏幕空间

       ä¼¼ä¹Žåªéœ€è¦å¾—到屏幕空间的坐标,然后再经过几个空间变换的逆变换即可。

offset->裁剪空间

       éœ€è¦å¯¹åƒç´ ï¼ˆpixel),设备独立像素(dips与设备像素比(divicePixelRatio有一个大致的了解,从点击事件中的属性offset获取的坐标信息携带的单位是设备独立像素,因此在求解屏幕空间坐标的时候需要注意分子与分母的单位一致。

       è£å‰ªç©ºé—´æ˜¯XYZ范围皆在-1到1的左手坐标系(裁剪空间可以形象地理解为当渲染范围超出这个区间就会被裁减),此处转换时需注意:

       æ±‚解触摸点在屏幕空间的相对位置时要注意分子与父母应都为像素或都为设备独立像素。

       è£å‰ªç©ºé—´Y轴方向向上,offset参考坐标系Y轴方向向下,因此Y轴需翻转。

       è£å‰ªç©ºé—´ä¸­depth离观察者越远值越大,简单来说近平面是-1远平面是1。

屏幕空间的点->世界空间的射线

       å…¬ç¤ºæŽ¨å¯¼ä¸­çŸ©é˜µä¸ºåˆ—为主序。

       ä»¥é€è§†ç›¸æœºä¸ºä¾‹ï¼Œä¸–界空间经过View变换和Project变换即可转换到裁剪空间,那么从裁剪空间转换到世界空间只需要经历这些变换的逆即可。

检测射线

       ä¸Šå¼ä¸­ä»£å…¥è¿‘平面深度与远平面深度依次求得触摸点在世界坐标空间下近平面与远平面的投影点,连接这两个点即可得到检测射线。

射线相交检测

       ç¢°æ’žä½“由规则几何体组成(长方体,球体等)可以查阅相关射线与几何体相交算法。

脚本回调

       å½“物理引擎返回命中的碰撞体后,可以认为它的Entity这就是当前帧的所有onPointerXXX回调的当事人了,在这个环节只需要根据收集的原生事件进行脚本回调即可。

性能优化

       åŽ‹æµï¼šæ•èŽ·PointerEvent后将原生事件压入数组,待执行到交互系统的tick时,再按序处理相应逻辑。

       Pointer合并:射线检测的性能损耗较大,所以在屏幕上有多个触控点时,我们会按照一定规则合并这几个触控点,因此在触控交互逻辑中每帧的射线检测至多只会执行一次。

       å¤šç›¸æœºåœºæ™¯ï¼šå½“出现多相机时,会依次检查渲染范围包含了点击点的所有相机,并根据相机的渲染顺序进行排序(后渲染优先),如果当前比较的相机渲染场景内没有命中碰撞体且相机的背景透明,点击事件会继续传递至上一个渲染的相机,直至命中或遍历完所有相机。

注意事项

       æ­£å¦‚开篇提到的兼容性问题,如果你的Oasis项目可能运行在低系统版本的机器中,可以导入我们定制的PointerPolyFill。Git源码地址/post/

基于开源二兄弟MediaPipe+Rerun实现人体姿势跟踪可视化

       人体姿势跟踪是计算机视觉中的关键任务,旨在识别关键身体位置、分析姿势并对其进行分类。实现这一目标依赖于预先训练的机器学习模型,用于评估视觉输入并在图像坐标和3D世界坐标中识别身体地标。尽管模型的准确性尚有提升空间,但其应用场景广泛,如人机交互、拼团设计源码运动分析、游戏、虚拟现实、增强现实、健康等。

       值得注意的是,尽管模型在许多场景中表现出色,但在个体差异较大的情况下,例如手臂和腿部尺寸不标准的人体,其精度可能受到影响。这提醒我们在集成技术时要充分考虑可能的不准确性,并寄希望于科学界未来能开发出更强大的模型。

       实施人体姿势跟踪时,还必须考虑伦理和法律因素。例如,java高效阅读源码在公共场所未经同意拍摄人体姿势可能侵犯隐私权。因此,在现实应用前应充分评估并遵守相关道德和法律要求。

       为了实现人体姿势跟踪,首先需要安装所需的库,包括Python的mediapipe、numpy、opencv-python和rerun-sdk。

       接下来,使用mediapipe跟踪人体姿势。mediapipe框架,特别是基于Python的版本,为希望集成计算机视觉和机器学习的设备提供了一个方便的工具。mediapipe可以检测图像中的人体标志,并将身体姿势标志评估为图像坐标和3D世界坐标。一旦成功运行模型,即可使用这些坐标进行可视化。

       mediapipe姿态标志检测指南提供了示例图像,展示了如何使用mediapipe进行人体姿势跟踪。为了实现这一点,需要读取mediapipe姿势结果集中的二维地标位置和三维地标位置。

       为了可视化mediapipe的输出,可以使用rerun库。rerun作为多模态数据的可视化工具,可以构建布局、自定义可视化并实现与数据的交互。通过rerun图像浏览器,可以记录和显示数据,如将人的姿势可视化为2D点或3D点。

       为了在视频中以可视化方式观察身体姿势的标志,需要使用rerun的实体路径层次结构记录多个组件。例如,可以创建“video”实体,并包括视频的“video/rgb”组件和身体姿势的“video/pose”组件。此外,要实现视频设计中的时间线概念,需要掌握时间的概念。

       为了将视频上的2D点可视化,可以实现一个函数,该函数读取mediapipe的预测结果,并将预测结果中的2D点记录到“video/pose/points”实体中。同样地,对于3D点,可以创建一个新实体“Person”,并输出有关这些三维点的数据,以创建人体姿势的三维演示。

       实现人体姿势跟踪后,可以使用GitHub仓库中的完整源代码进行探索、修改和理解。为了提高效率,可以压缩记录的图像,并限制内存使用以避免超过RAM容量。此外,可以根据需求自定义视觉效果以满足特定需求。

       通过本文的学习,您现在可以深入了解基于开源库mediapipe和rerun实现人体姿势跟踪及其可视化的技术细节。如果您对这个主题感兴趣,可查阅更多相关资源和文章,探索计算机视觉和机器人的更多可能性。

系统解锁XCB新手玩家的Linux系统之旅xcblinux

       XCB是一种常见的图形性编程,它可以提供Linux系统的人机交互界面。但是,在新手玩家不知道如何使用它之前,他们可能会面临使用它的困难。

       在学习如何使用XCB之前,新手需要先安装其库。这可以通过从源代码安装来完成,或者使用包管理器安装,如apt-get。

       安装完成后,下一步是了解XCB基本知识。XCB提供了多种功能,包括图形用户界面(GUI)的创建和编程,以及X窗口系统的构建和操作。

       新手玩家也可以尝试一些基础的XCB示例。下面代码展示了如何使用XCB在X窗口系统中创建一个简单的窗口:

       // Create a window

       xcb_window_t window = xcb_generate_id(conn);

       uint_t mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;

       uint_t values[2] = {

        screen->root_background_pixel,

        XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_BUTTON_PRESS

       };

       xcb_create_window(conn,

        XCB_COPY_FROM_PARENT,

        window,

        screen->root,

        0, 0,

        , ,

        ,

        XCB_WINDOW_CLASS_INPUT_OUTPUT,

        screen->root_visual,

        mask, values);

       新手玩家还可以阅读相关的文档并试用XCB的高级功能,比如设计自己的GUI界面。

       XCB的文档提供了大量的指导,它可以让新手玩家深入地学习和使用XCB。

       XCB是一种实用而有力的工具,新手玩家可以创建出令人印象深刻的图形窗口界面,这可以加深他们对Linux系统的理解和使用。

用C语言开发简单的应用系统程序,源代码不得少于行

       火车站售票查询系统:

       #include <conio.h>

       #include <stdio.h>

       #include <stdlib.h>

       #include <string.h>

       int shoudsave=0 ;

       int count1=0,count2=0,mark=0,mark1=0 ;

       /*定义存储火车信息的结构体*/

       struct train

       {

        char num[];/*列车号*/

        char city[];/*目的城市*/

        char takeoffTime[];/*发车时间*/

        char receiveTime[];/*到达时间*/

        int price;/*票价*/

        int bookNum ;/*票数*/

       };

       /*订票人的信息*/

       struct man

       {

        char num[];/*ID*/

        char name[];/*姓名*/

        int bookNum ;/*需求的票数*/

       };

       /*定义火车信息链表的结点结构*/

       typedef struct node

       {

        struct train data ;

        struct node * next ;

       }Node,*Link ;

       /*定义订票人链表的结点结构*/

       typedef struct people

       {

        struct man data ;

        struct people*next ;

       }bookMan,*bookManLink ;

       /* 初始界面*/

       void printInterface()

       {

        puts("