1.毕业设计分享 基于stm32的人机人机智能婴儿车系统(源码+硬件+论文)
2.OasisInputManager设计ä¸å®ç°
3.基于开源二兄弟MediaPipe+Rerun实现人体姿势跟踪可视化
4.系统解锁XCB新手玩家的Linux系统之旅xcblinux
5.用C语言开发简单的应用系统程序,源代码不得少于150行
毕业设计分享 基于stm32的交互交互智能婴儿车系统(源码+硬件+论文)
毕业设计分享:基于STM的智能婴儿车系统
在毕业设计中,选择创新且实用的示例示例项目是关键。本文分享一个以STM单片机为核心,源码源码用设计的人机人机智能婴儿车系统。该系统旨在解决传统婴儿摇篮需要持续看护的交互交互达人圈源码问题,通过自动化控制,示例示例减轻看护者的源码源码用负担,提高婴儿睡眠质量与生活品质。人机人机
系统设计思路
智能婴儿车系统使用STM单片机作为核心控制器,交互交互集成了声音检测、示例示例湿度检测、源码源码用电机驱动、人机人机人机交互和报警模块。交互交互其主要功能包括:通过哭声信号启动摇篮,示例示例遇湿度信号激活报警系统。收费图库源码人机交互采用定时按键与LCD显示屏,步进电机实现摇篮晃动,LCD实时显示参数、尿床状态。
硬件设计
系统硬件设计包括原理图与PCB电路板,实现各模块功能集成。
核心软件设计
软件设计基于STM单片机的C语言程序,包含初始化、湿度检测、语音播报、LCD显示、电机控制、报警与音乐播放等功能。程序设计流程图直观展示系统工作流程。
实现效果
系统实现自动控制功能,最新html源码通过声音与湿度信号实现摇篮启动与报警,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世界坐标中识别身体地标。尽管模型的准确性尚有提升空间,但其应用场景广泛,如人机交互、电子导游源码运动分析、游戏、虚拟现实、增强现实、健康等。
值得注意的是,尽管模型在许多场景中表现出色,但在个体差异较大的情况下,例如手臂和腿部尺寸不标准的人体,其精度可能受到影响。这提醒我们在集成技术时要充分考虑可能的不准确性,并寄希望于科学界未来能开发出更强大的模型。
实施人体姿势跟踪时,还必须考虑伦理和法律因素。例如,隔山背离源码在公共场所未经同意拍摄人体姿势可能侵犯隐私权。因此,在现实应用前应充分评估并遵守相关道德和法律要求。
为了实现人体姿势跟踪,首先需要安装所需的库,包括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("