From f70e298aaee715e3c80fdb2a9b7722c5def5df66 Mon Sep 17 00:00:00 2001 From: o__-xpf-__o <2689129162@qq.com> Date: Tue, 3 Jun 2025 08:25:48 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=A1=E6=81=AF=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../.gradle/8.5/checksums/md5-checksums.bin | Bin 0 -> 19897 bytes .../.gradle/8.5/checksums/sha1-checksums.bin | Bin 0 -> 22169 bytes .../androidTestResultsUserPreferences.xml | 48 +++++++ .../lite/examples/poseestimation/data/angl.kt | 130 ++++++++++++++++++ 4 files changed, 178 insertions(+) create mode 100644 android/.gradle/8.5/checksums/md5-checksums.bin create mode 100644 android/.gradle/8.5/checksums/sha1-checksums.bin create mode 100644 android/.idea/androidTestResultsUserPreferences.xml create mode 100644 android/app/src/main/java/org/tensorflow/lite/examples/poseestimation/data/angl.kt diff --git a/android/.gradle/8.5/checksums/md5-checksums.bin b/android/.gradle/8.5/checksums/md5-checksums.bin new file mode 100644 index 0000000000000000000000000000000000000000..4094af6b9879c5410a4569e9fb12545f973d18fc GIT binary patch literal 19897 zcmeI4`BM{T7=U9;fM6gHwFU&`$T(F*sB$@sU>rmOK?_wx5iFqKg)p1~Ryw81jZ_>2 ziUMk?5mcyS9km>7ML|R@Er+cXlv_aup%UmpH@^GnG|OM$ygNhKd9u&G*=Ilag#;HC zOQbhNZ>)FQ+;_XUhXt?z7Qg~n01IFNEPw^D02aUkSO5!P0W5$8umBdo0$2bGye|bd zQ5T{O7b9BAR_zGlSS)KkwPW|H_2OGCEvG1 z64L?PW1R5w&pRhiX?9xEJeTkbZr7z*e-+*UF8!JCvYyg`wn||(aQ9HcFPWU#T2yc*N-1sWG!xOk?3gHiyiL-{2>|WBx z*AU(uCP}a|Vv!D;2p@R$|C7BaraH>cEA+12R%37;2!fGgftUrZlwOZfcFgEsk7`|E*wSP^by zw>E9~giHcl8b-KDqs+@X``HhJAF%)yzyeqR3t#~(fCaDs7Qg~n01IFNEPw^D02aUkSO5!P0W5$8 zumBdo0$2bGU;!+E1+V}XzyeqR3t#~(fCaDs7Qg~nK=mg2#nhMTP1vS-HX4~rSi8ES z;%|m)1)UyR%VNzqG1H)veuuU;mpW+K|BZ)x#<-to><;h_3LXC3SiXujE>K5O+w2|G zgPKt+cQkd5bUC}C#&b^dx{PnZ=n}sXSRCpM>c)-{pI+m-7XiWkSMvh6#f@M*Jwh8Q zQ*Fk0%z#&(B>DKnM?L$U8`njG(SHsMK8I=ST+M6g>gIPOwmWbSTU$`CUv=dJJTT_m zW*Vy&b=Pl9RKAD{lg)N=sFmBKQWD4ryqsbnN>SozZ{ZMk>Ps=jOXXU&{EA( zyN-)BY3F^*b1s(Nc3B`5*0qB%d=rc<)3kb={he)Q*^_k5!e^cHwii}_@!}~xL&2P( zIp<-GAiX!Yd_-ze)qKAUjF*o5?tn2tR>_AfS)Ksjvmb5P_@-xmHn>o z9fB((6K1$uMF%&x7{d(iK`?mJtld;uYrf^l4a1@?i|WzO{PJj{9}M9w<_z`P)iOXXpwZc<08T4^Z3;HZ9$sI7J@-I^k0AOEZ@ben6=2i|F5XwmCRPqkXqjCT3m z2kUi0uO_YRnw)>g{|Xqq*)T(t$TW@~^a+S-IT@QYZeZXt7JHXAV!+_pFb(UQ+9GJd#F36x^jL77@{|8_diZ_s;vM3 literal 0 HcmV?d00001 diff --git a/android/.gradle/8.5/checksums/sha1-checksums.bin b/android/.gradle/8.5/checksums/sha1-checksums.bin new file mode 100644 index 0000000000000000000000000000000000000000..0ce337c8020692efd187d84eeda922c2c11b45ee GIT binary patch literal 22169 zcmeI4c{mm81IGu)PL8E+NpVruNLML}$i5wpEoo6oi%8sT-BVFWQM%S}E0szp(IQ2Q zY}rzlB8gOFElbiZznSyS>pssp{dFFH{hs%Ip0hlkGvD)_`OKV|c^)&2F>E$89)Y*0b~Ff_O26M);;L!J}!KLw-%}f=ls+;Ap@d z8Ib3Bev0)Q6W9Q_b?_7qNw{0=l)nRTTNTJ}-ZJa#$ewuvaEA=Y?}yh9#l(u215Q_i zyhwpEe$Kbz50ckF{&?1rt$qd@1Od00GsR_0n%y;cvH^GYfV|T1c;Tr(+iXa_2=Y1& z#hCts%LV~=6o^&>xUBHHgh5GQon1^AGn8HUfL_jyT2T% zR#fbyf$8nUAnz&OEZeei=6b-*-$6c*+)@6L%X}5!4y}-XUB_QoYf)YexTO;09H%1+IDIqZ!fE@BX0&UP>)rY~J;f08x1{a7_mamIkv!u9cvAx*#RF@ER5h3ClRO-9 zB_Fp?li|EBz@3gmt{HCFRV42D0dSil$hGP}J%6#iRsnG9_mD3++SKuoGIA1d+f9%! zZ;w$p8$B9DeorLiEBM~zD`qri0Pe5{a(x|nk89)Y*0b~FfKn9QjWB?gJ29N<{02x3AkO5=>89)Y*0b~FfKn9Qj zWB?gJ29N<{02x3AkO5=>89)Y*0b~Ffm@Wgv#p#Ri#{%LZHCVwgv)m;(Jcc!hz1FbM z)@oF7#xSlVo;mI0Rir|^_=HQQBbB1!)WIKZdq^O*tSmeOkCQqDA4MsmQj8LeTYAky(XNh^xw3x;RU9d)xVJ?j7;iT5VDA zr82?#`I{m9&H%#UTX5wupQ;Xf7r$e@i(cNayZOr>iMpO^O?Rsd;n(3ZQxjkg_0O}X z2EF}EubP(xjp~ObICk&L3L46(0;$djkfIRF$Ff|Ur2^D=R(aPcc3F;Bml{R)>JK{3 zz?XxV!w;L8UE4Q`v3L0yJFmZ3Ts>1D;#jtOb*0boGjx0lB2phOgE0?qP!d~4slzp((n*M#WmCht9vDr4{BEG3@byS6P}%thC)I@z%~DEtrmX8b-3 zqO11`SS|sglf`^=&WAaQq6NND!jcDK!t@o(=!bnls_!mHQA?&PC8cdHeoA4>^_jfx zZbg$hA6h5so`9}?@``-dUu^R{g?e7M;)O+;bxK0r&pa(RU76tzQUm0DK?0fVb9gDg ztxCb^V$kE@-I)Pb>PsUAO<#f3ApScehUhQ4G>hVM$0}WE&f_LpsaeX_8q!7UKx$|O zNWJIAUs)XHJszs)Ig{<78goY>e_N3&-(O#gKxzcs=`kzPj6Efl;FxK4f)P3}5ifm9 z*mK*s_KD*lHF^hh38hU}O5ywAqZf-oDA_fNq=6K?b?E`3CoF%F~s46S4IUE!FqudBrm755ofPL+kyrm~$wNITAC7 z6^x9tcL{WFd8W?z8r>b05-u;jWbOjYrWmBSx|u0VuyVRmoe~zKeU%2k-ES@YJilDz z&?hxFFVMwp0JRJ{j%=tEJ>-=sk)L+CX!5*@ofTMU((#yL6;GOz00%v zW6j4osl0{GW!gnEcNNT z%0=5B2g6>k{`c0slB~BmF0%s3t{`R=X8VJ^Yn zFA8xi!G{vD6|>BtPM2#y5QD2AgkhiF|i5bchzT2f#4jHo6ylVZ#UW>@N^=MPbb;k( zuhLR_U6w!0-Lme&YtY3H?oj1o-e}0u6}jW4u(w-aqOe@t!P^hiQ>1KndVrJwdHkXh z$ChbH3E$rrH=BRS!jhk6mqu24S^W0ptt#jelq6i>|8sOd{>0M7S*k&$h+3=R-Dc$A zcDJ>0C$&K@A(ZUe$E?Bxwb{EkOEDVylj_&$GQOD@m$s%o(tcmO3Rg|6WkGU}ed9KJ zS7E=DfM- + + + + + \ No newline at end of file diff --git a/android/app/src/main/java/org/tensorflow/lite/examples/poseestimation/data/angl.kt b/android/app/src/main/java/org/tensorflow/lite/examples/poseestimation/data/angl.kt new file mode 100644 index 0000000..568a4b8 --- /dev/null +++ b/android/app/src/main/java/org/tensorflow/lite/examples/poseestimation/data/angl.kt @@ -0,0 +1,130 @@ +package org.tensorflow.lite.examples.poseestimation.data +import kotlin.math.abs + +class Angle { + + // 站立姿势(正面) + fun standList(): List { + val list = List(8) { 90; 90; 170; 170; 90; 90; 180; 180 } + return list + } + + // 硬拉(左侧面) + fun deadliftList(): List { + val list = List(8) { 90; 90; 180; 180; 150; 30; 120; 120 } + return list + } + + // 深蹲(侧面观察) + fun squatList(): List { + val list = List(8) { 10; 10; 180; 180; 20; 20; 70; 70 } + /*左肩膀与右肩膀保持水平 + list[1] = 180 // 右肩膀与左肩膀保持水平 + list[2] = 90 // 左肘部默认弯曲角度为90° + list[3] = 90 // 右肘部默认弯曲角度为90° + list[4] = 90 // 左髋部下降,接近平行 + list[5] = 90 // 右髋部下降,接近平行 + list[6] = 90 // 左膝盖弯曲至90° + list[7] = 90 // 右膝盖弯曲至90°*/ + return list + } + + // 平板支撑(Plank)- 侧面观察 + fun plankList(): List { + val list = List(8) { 90; 90; 90; 90; 180; 180; 180; 180 } + /*list[0] = 180 // 左肩膀与右肩膀保持水平 + list[1] = 180 // 右肩膀与左肩膀保持水平 + list[2] = 0 // 左肘部保持水平 + list[3] = 0 // 右肘部保持水平 + list[4] = 0 // 左膝盖保持直线 + list[5] = 0 // 右膝盖保持直线 + list[6] = 0 // 左脚踝与脚背成直线 + list[7] = 0 // 右脚踝与脚背成直线*/ + return list + } + + // 引体向上(正面) + fun pullUpList(): List { + val list = List(8) { 100; 100; 100; 100; 90; 90; 180; 180 } + return list + } + + /* + 俯卧撑(Push-up)- 侧面观察 + 肩膀(LEFT_SHOULDER, RIGHT_SHOULDER):肩膀应在肘部正上方,保持稳定,不要耸肩。 -> 左右肩膀的角度应接近180°,保持在肘部上方。 + 肘部(LEFT_ELBOW, RIGHT_ELBOW):肘部弯曲角度大约为90度,且肘部始终保持在肩膀下方。 -> 左右肘部角度为90°,肘部应下沉,不应过度弯曲。 + 脚踝(LEFT_ANKLE, RIGHT_ANKLE):身体应从脚踝到肩膀成一直线,避免臀部上升或下垂。 -> 左右脚踝角度为0°,保持直线。 + + */ + fun pushUpList(): List { + val list = List(8) { 90 } // 初始值设置为90° + /*list[0] = 180 // 左肩膀与右肩膀保持水平 + list[1] = 180 // 右肩膀与左肩膀保持水平 + list[2] = 90 // 左肘部弯曲至90° + list[3] = 90 // 右肘部弯曲至90° + list[4] = 0 // 左膝盖保持直线 + list[5] = 0 // 右膝盖保持直线 + list[6] = 0 // 左脚踝角度保持自然 + list[7] = 0 // 右脚踝角度保持自然*/ + return list + } +} + +class AngleDifference(private val angleObj: Angle) { + + // 假设getAngles()方法已经实现并能返回一个List + fun getAngles(): List { + return listOf(100.0, 95.0, 180.0, 85.0, 90.0, 75.0, 160.0, 170.0) + } + + // 计算角度差,并根据角度值判断是否大于10,返回相应的语句 + fun calculateAngleDifference(listType: String): String { + // 根据传入的参数选择不同的角度列表 + val selectedList = when (listType) { + "1" -> angleObj.standList() // 选择站立姿势列表 + "2" -> angleObj.deadliftList() // 选择硬拉列表 + "3" -> angleObj.pushUpList() // 选择俯卧撑列表 + else -> throw IllegalArgumentException("未知的列表类型: $listType") // 处理无效的输入 + } + + // 获取另一个类中的角度列表 + val angles = getAngles() + + // 确保两个列表的大小一致 + if (selectedList.size != angles.size) { + throw IllegalArgumentException("两个列表的大小不一致!") + } + + // 计算差值并检查条件 + val differenceList = mutableListOf() + for (i in selectedList.indices) { + differenceList.add((selectedList[i] - angles[i]).toDouble()) + } + + // 检查差值列表中的每个值 + val absoluteValues = differenceList.map { abs(it) } + if (absoluteValues.all { it < 10 }) { + // 如果所有值的绝对值都小于10 + return "动作标准" + } else { + // 根据不同的位置返回不同的语句 + for (i in absoluteValues.indices) { + if (absoluteValues[i] > 10) { + return when (i) { + 0 -> "第一个位置的角度差值超出标准,请调整!" + 1 -> "第二个位置的角度差值超出标准,请调整!" + 2 -> "第三个位置的角度差值超出标准,请调整!" + 3 -> "第四个位置的角度差值超出标准,请调整!" + 4 -> "第五个位置的角度差值超出标准,请调整!" + 5 -> "第六个位置的角度差值超出标准,请调整!" + 6 -> "第七个位置的角度差值超出标准,请调整!" + 7 -> "第八个位置的角度差值超出标准,请调整!" + else -> "未知位置的角度差值超出标准,请检查!" + } + } + } + } + + return "未知情况" + } +} \ No newline at end of file