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