From b895ca6cbe47da643a3eff5754ee4f8a71ebc2ba Mon Sep 17 00:00:00 2001 From: Thomas Pietrzak Date: Wed, 23 Jan 2013 10:55:46 +0000 Subject: [PATCH] Added Tactile fluids, fixed tactile buttons git-svn-id: svn+ssh://thomaspietrzak.com/var/svn/rep@100 47cf9a05-e0a8-4ed5-9e9b-101a649bc004 --- DwellCursor.sln | 20 ---- DwellCursor.suo | Bin 56832 -> 0 bytes PushButtons/MainScene.cpp | Bin 6115 -> 6154 bytes PushButtons/PushButton.cpp | 3 +- TactileButtons.sln | 6 + TactileButtons.suo | Bin 70656 -> 79360 bytes TactileFluids/KinectInput.cpp | 99 +++++++++++++++++ TactileFluids/KinectInput.h | 29 +++++ TactileFluids/OneEuroFilter.cpp | 113 +++++++++++++++++++ TactileFluids/OneEuroFilter.h | 62 +++++++++++ TactileFluids/TactileFluids.cpp | 100 +++++++++++++++++ TactileFluids/TactileFluids.h | 33 ++++++ TactileFluids/TactileFluids.vcxproj | 163 ++++++++++++++++++++++++++++ TactileFluids/main.cpp | 10 ++ TactileFluids/tactilefluids.qrc | 4 + TactileFluids/tactilefluids.ui | 157 +++++++++++++++++++++++++++ 16 files changed, 778 insertions(+), 21 deletions(-) delete mode 100644 DwellCursor.sln delete mode 100644 DwellCursor.suo create mode 100644 TactileFluids/KinectInput.cpp create mode 100644 TactileFluids/KinectInput.h create mode 100644 TactileFluids/OneEuroFilter.cpp create mode 100644 TactileFluids/OneEuroFilter.h create mode 100644 TactileFluids/TactileFluids.cpp create mode 100644 TactileFluids/TactileFluids.h create mode 100644 TactileFluids/TactileFluids.vcxproj create mode 100644 TactileFluids/main.cpp create mode 100644 TactileFluids/tactilefluids.qrc create mode 100644 TactileFluids/tactilefluids.ui diff --git a/DwellCursor.sln b/DwellCursor.sln deleted file mode 100644 index 588db48..0000000 --- a/DwellCursor.sln +++ /dev/null @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 2010 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DwellCursor", "DwellCursor\DwellCursor.vcxproj", "{2928B2FC-98F8-427E-B0D2-2CEA2DA1FFC9}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {2928B2FC-98F8-427E-B0D2-2CEA2DA1FFC9}.Debug|Win32.ActiveCfg = Debug|Win32 - {2928B2FC-98F8-427E-B0D2-2CEA2DA1FFC9}.Debug|Win32.Build.0 = Debug|Win32 - {2928B2FC-98F8-427E-B0D2-2CEA2DA1FFC9}.Release|Win32.ActiveCfg = Release|Win32 - {2928B2FC-98F8-427E-B0D2-2CEA2DA1FFC9}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/DwellCursor.suo b/DwellCursor.suo deleted file mode 100644 index ed03066a642708839f4cd45acf1b7b56c1ef2abc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56832 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 KYI5((`2P diff --git a/PushButtons/MainScene.cpp b/PushButtons/MainScene.cpp index 08ecd6a52eae625fae73696b85ff411bba72f1d3..e60d433405ae287daedb998f2f891ff8342ff31d 100644 GIT binary patch delta 95 zcmaE?-(|4Do|(~Nvjg*NK80#tE>6zOGzASsh0K!FTwS}&;((&m;^Nd44NXm;+~iw= sI*hfOnT14{*bNN~bQBB?Hp_~RZy8r+H delta 60 zcmeA&c&xv{o|(~Pvjg*NzR7 +#include QColor PushButton::_bgcolor = Qt::gray; QColor PushButton::_hovercolor = Qt::lightGray; @@ -8,7 +9,7 @@ QColor PushButton::_validatedcolor = Qt::red; QColor PushButton::_targetcolor = Qt::green; QColor PushButton::_targethovercolor = Qt::yellow; -const float PushButton::_pushdistance = 0.1; +const float PushButton::_pushdistance = 0.05; PushButton::PushButton(QGraphicsItem *parent) diff --git a/TactileButtons.sln b/TactileButtons.sln index c7b7611..b12eb95 100644 --- a/TactileButtons.sln +++ b/TactileButtons.sln @@ -5,6 +5,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PushButtons", "PushButtons\ EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DwellCursor", "DwellCursor\DwellCursor.vcxproj", "{2928B2FC-98F8-427E-B0D2-2CEA2DA1FFC9}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TactileFluids", "TactileFluids\TactileFluids.vcxproj", "{014A41B9-3E4D-48F0-B5D7-8C6FE42A142E}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 @@ -19,6 +21,10 @@ Global {2928B2FC-98F8-427E-B0D2-2CEA2DA1FFC9}.Debug|Win32.Build.0 = Debug|Win32 {2928B2FC-98F8-427E-B0D2-2CEA2DA1FFC9}.Release|Win32.ActiveCfg = Release|Win32 {2928B2FC-98F8-427E-B0D2-2CEA2DA1FFC9}.Release|Win32.Build.0 = Release|Win32 + {014A41B9-3E4D-48F0-B5D7-8C6FE42A142E}.Debug|Win32.ActiveCfg = Debug|Win32 + {014A41B9-3E4D-48F0-B5D7-8C6FE42A142E}.Debug|Win32.Build.0 = Debug|Win32 + {014A41B9-3E4D-48F0-B5D7-8C6FE42A142E}.Release|Win32.ActiveCfg = Release|Win32 + {014A41B9-3E4D-48F0-B5D7-8C6FE42A142E}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/TactileButtons.suo b/TactileButtons.suo index a914ffb1936113823fa2d850d9923995e1b7d215..95b9ff68fbc8d38f0706f6ca0cdbbc6fcc708875 100644 GIT binary patch delta 7455 zcmc&Z3sh5Aw)a4SHxMD=XF!w?5kCc*U_?*^0s#>ef}*xGqKJT0OfX!OQCfmB{z_}i zwx%Cjk+$lzBcRbr)fTMwX{YMYPFJU$+KzNO&a2~_;xjW-TOYoCZf+?0M%w9e=3U*K zbM`);efR&|SPzJ-*F>GHH^~Hv_k8jQEcV_bYGxS5E~@tLS)UQ}`ZpJdH;%1VSSPv& zr*dMUCy|8)agN9b(G=lyi47t+6Qu^LTm<#Lb40rY3b=fW_$8cQ0h|_ToGw3u7dsBA z5;~(PaiWv+@AYN_a5PfD02gTWxlI^m8w1}4=8HxNc%K&RTnU7ALAk6ScKto`T|tLQ z8fbzGp(exz+nkAzsK~H~)_b|cur4$g^g(KHg&Nq~_=I~Faif|8_K9(XPd5I`WRl_b zcpc1fCONGNj!56o<&wFn{W(W}+hVqdpO)}KkmGF1HMqi?$r1S3=v>GQm}!rw_sS-) zE+Stf9h?wh^+~{iZwjm%vrSATSb;niI3F6jf`D=$-LAwvZHOK_xI}4Sl{lE_L2yw9 zQ6L?lj3rC4^C|)Ziw7pbvaoPxx~j(;Od;v8!Bh>c$Ah6HEZzRAaK~kDqJ-4*QmAqH zIOj}QE0Hi`a2-q6^1Q2iSuY%f3J9l5Q{V%qljedgX^NOUPtjD(uA~A9iN?_g&qOZy z!(dU0Faj>W05XF#;L68&RJbz-=N0@?5@A9W<|5=FSP`B^$Vb?P04Wdmh@QbtTd|bX z0NGMS%HVxzBm~Mrq2@2X$$3l_V`9pgGKOP}%o;|+#4}T|N3mtt<}-EJpN}(4Of6$( zEJ$C0$D5&aYb6BlD*;=-0*qT(h*=U2vOW3GyCoD7DuSWaTm(zcve45K2+_q6AbV;K zs9TiqLCbUCdUDesj;_D)8qH@)tL!{y;*)xT!7hI)YIs*E? zRzss!3axe@I0Gp#BQXXKVj-$H5;-q|{>g!;9qNc@;QIMmXnk>^w~fh!+f9Xyttj6C zREtAspB38YvE427U&MBg(5G|Tu>X=Ueg)foLjM4^zYzMbVf#y=-;QmE&_9IjVWEG7 zFmcRLVQ@@n-@x{`&_9Xon?nB`Y~j`hqwcrZ`5567f$%A|mxTW3LVFq8KB4~yY`+xx zSFrsP6mBf@X1vhO_cTIlg$!i-L}1@%M~iqIRV9Bk2=yNg25Ta;TU01H>KOIV_jMHX z|6K;RRz`z=`$UM|zY~t2tz2%eCq+n2gYME`i0|}43o3!$E(Kidkb<^z7kP-MHm*@X z`yn5GO{+QEzU`bSOi-uOwM|Mu)e-|eHkSCpp^ELe$p+p;)h!WXY6$Jn_w&Ud+nfLf z<5*O08oXb*9#qX%=&20mEiHWq9=jzFnyXr%ZF@1;YzoSTgqr-r2y1YMax`gQcyN&q z?l2WbKH7mZ6=0}dM^+4Z!4%St7HbCe#8eEyQMh&!HJ7w;PSwuOC9q-D7W9PTnMF(~ z?|W5DHTqaK{-yr59DU8m+?(e1!Dv!lS~;=pRAf=)Sn;EXpLg4_lp@Oi`an$!z2q+>_jgB{r0 zIR>ofL}V2@?qV>U(~?TiG%fkw!7CKVpa|4WB9!$`JY`U>p!^F<79kI7!RDSNo{i_` z^U6-E^+ygPK)x>uJ~*!c#o+^x60%(lR;(4U>Tm9mh;zvT&rwo|Z{MF{-hb zfq_iVOv7FhW}QUD(m4sZj;>C?(PPl0m>{M(alW(LsT09}SLRSp$75$e$EI$K{>8d` zy!H=jsEnz>e+;t{UvD zlFF%i`*UyD&@qQsPAoLO(F6l!p(qn2eBA}4nU8g~V8hEb&YEAzNaH`LA7%z0(SP9We!Rxv(AmsEzg~J)31{9-ftt=l z=wHQRCJ&}A37t0-u>0MK-n*Gh=j{u6!q-#WuUovKIz&I~o(lZuY!8~8Y4+oZZ6A8k z0*!xKfmA&_c6f7hT0hG45|f|d0(U|9af?^TKa3!7DkhB3Eeq|JazsC;3-~JVQVW?; zj$x*H*Z_0S;Dg(S&;k;RnryxtSOtXxK|~3sA|s(>zz4dH=fK6|QjiWT45nrrvN0np zToPVzbl{VO#uKYc;8K`^)-U{1yCS2G1zD9 zUX!d%NIHBu6UEttTW>+&YcTE$18c^?lOBZYivlqdLr1jq;{IR|Z50L~FJNZt!~uPD z7(%dAWw0vvZl%<;ynK1pGIPCg`Py=)^-C*(WdkuFzY=c$FD$NL@8MAaca>1kc<_;e z;dS{B)rMgu9%DBR9aFZ;PC@U2zP$}2eBM0JSR;ng?htPax?I!2hjV}G-YXdOmB4g+aa++<+F7YwoBHWyIS zca48;wLgI!v5{=WUF(u-@#s=qS&j_VppfYCoWM*KvkGz5{C>w)JT%vj+d4JKuw~J* zx2#)iJS)pqYFXo5TSE7&v2s~a?S`w17EfAzYUdd;;-qVW`G*cz4K$<_itbu$$J&DH!?d;N;iQLSs@(-}`@%R-)v4Hxhb}XBkWDz=Cg8yJ4c@JG zB|zQHKcXY|St4QGw`V6(6DUWZ@}^~!+aWiOXe~~xZ97r7=9TE>x1P_~Of?uJH8b^0 z?)NebgKH~Ui0ulFEJN*8^JY%#wbIkE7fYe?%7I%s%j`#QCXb>DXry|s#&eb-+bgk8 zgBN9*GDt7?G;mXfHzUwMwE=;?kOP6}*_{xIT@Ms6{*56u4#gOut*8eQLki+8LAP9GT z912^^SbItN>O@RSNk@%{B;iFcf0qx*ln@clibUYUx~nY~TJ=~@=0-qIl2-gGhHm^! zpnm|`vLYNkfrJ%NNzl3C{YdL_(+cQp5laQe3kk`7FC+ORBJctE`M6yo63Uka{S~Q{ zAIIa~ge6_bUZv;efGp#GhQrckHF!M|E$2cvojAWN=bg^;842+t>kTptad^*evQ0pV z$cPd4RW}jJ)9z({TH* zV7@(QymW+XT05UL`_lNDL@xyl6AcG%AiMP{Mvx@wfycjdmf{N2)%Ah{Yr|I$cWEf`-(j2$tMDPBz zL%)txekpBDe#%g;>qM)Mlw^)Jick?^EE z41H+Gw<^0X8dQ;jckdO1BJM=@eI9P6qvz|6p3H{|5lbWDc+YAl zl7U~X%HtzR;p>R0MKXPUS~-$}u2X|jG%>08t<@Kr|V>K2DpIt&Yo>s-G5@l$n^FrA^Rjv{H58SWaaGmj z+0}Jb%WI88N6`15iPE76M>9*3XP>#B`;Q*F|DDIzI(D!mmK=wsuWaz_rw`1&uP-*- z!SoscXFg4FbW6zs$AeNbX?D;3eCe<|UplYKR9?o-Hr3Q|^yJ3fp0jib*;&)HS(>RI<*|m8xmC4g*{H(W)P}O@MuWv%X(?T$`)t+|3z&e!MF8r?@3*J$FW8mmlY#{9af`Q@fsvn75-L&JK#8h4)xqpwDila60Y zh~1InM;>tZpMW>7B{(1dyq+v13?WSEg?-txY?k!{=W4O_+WYotKnyq0=9d2sC{4p*(63 z+uuzS#3(4e`q4;gKb~id<1$OO!>Vh(&d>flj)3A?02F*T(vcTHj?%ck+#5fwK~!EO z9dr)BasQKZcX1wGNq+$vE~Y7vj7qu~Li>{U59-iVSRXyy**piaA(Yi5dzi;}^sUBtS%KH&Q}&Q25qR2m_{MwHw9PwNO7PpP!6o zkwH`Mq#o5o6qds1*=dk&%va7QnUH2&0*{R?qNz?%$w9p-pNn7}d`mMq_!bnRf+M&h zcZUqH#iBvDJQw;SvO@Am9?2nd=b#Wb7wV@pso2)n;sT507h@_Y3=E}fV#rTP zIeCdx!)WXk4T(hyE5bjb)xl3eAt9)6*&L9o6(+1k#oGvc;CJU{!~Jt=6(L7Rj+|+~ zs02|?0KsgAod=hLJH86;?iOHU8xMsyb#mUcmo*w1gFSiH+qZCG&=&$zKp}h6iqsm) z;vOHgam^`$oH+%cpZhHHf$W|;VB{8zwH6k^WiAc8{YUO)^W80QKD zZ^-z0zmJ3+#X4}VO2!b(1Nzkl*ijw^?l?8diEyGb67;)Q!r%cDErFZeyP$td7`B+9 z`oK1N8cO>Pf}kiE4I1zh0-aMcxQ=t5M_9c!x7g+$a67yhcr zMv_9-kWKg_BpgCJC5S7wK!0bMrUEs3#B#O;8+gv>A*MSKH?~RK>1cQjU3wTHA&wx9 zBH9tJBaR`M+uQJcJn(%2-yMiI5GN78L3ASCM06qELcEQ52XPAVF5)zz8{t8mLG&PG z#Cw#?An)VH2Z&xoAL15}9u!Fs+lVkOQv0nBz=_uGM1rXL-Atlcso#yCDNS&d>g@r-dqZQDy z&J04eRmJ?j6d4wa(O3@FYhf@_$%EnD6lj^O6)OZJr~z79c{&lgtG0k=*bFJxc$x>X zRe)rx3FaPT08gEAchyt{T^!t63~zR?w7OJ(Nf8#nht-T6$ukBrqX&y+gBS>OV;Bm zQepTi&_i&0I0uehod?(Nq-&ld0xRf509#uD9Enc=#}EgHhZb?yCXQYP8)uG-*p)pw zN)uJ|{*yn=Y&gGpC64sHCkOKxvd)))(-|lCpU>vRGPXr)z!6~mlBdc3=y#i00fWJd zYS{Tn6O?(fIxcaL?aW6~=%|P_rvb7S7@%!HjVUbBjkx+1AXFIWLRj@pG^Rocy2+wi zgbO%^HEtW!J&cE0kBYIBo8j)w1h{)6L!1`nqi0rM6x=!)CvUp0ryy>qgJV@ZIOEd; zlrzGW_zZD!I@Yd!aE@&6xs^lVvMEh={k~agOTnt+B$XtTXfcZOND0}Dm8gWw!g$U> z%!DuWlNy+A4O-UVF;#-v6p|YF`;ssEsbj5G7y&1?t|L{xkxTKNierwKQ%D6KXKCa| zBpv6OPTK$f>^K|F0Qde80oq3~lmAyg7NZUF=pCxywd6G|A!;HCiL_33f10CEk*(Ow z&VAYY$7Y43wa{G2Foj|^y@9phUOcytwX<5_y4Osl6E^ySbaV=Rwztbl>!`Mu=FSuF zw=J#bevU#z8_{}Kpa-}|(``|e;e;-* zwU(n}bXsnk4y%x*}+S zZzqD?n!iWX=y3+@hDv-yH7y&bW> + +#define TIMEOUT 100 + +KinectInput::KinectInput() +:_running(false), _skeletonid(-1), _skeletonEvent(NULL) +{ + //creates the kinect sensor (id 0) + if(FAILED(NuiCreateSensorByIndex(0, &_kinect))) + { + qDebug() << "Cannot find a KINECT sensor" << endl; + //I should do something else, sucha as an exception + return; + } + + if (_kinect->NuiInitialize(NUI_INITIALIZE_FLAG_USES_DEPTH_AND_PLAYER_INDEX | NUI_INITIALIZE_FLAG_USES_SKELETON) == E_NUI_SKELETAL_ENGINE_BUSY) + { + qDebug() << "Cannot initialize the KINECT sensor" << endl; + return; + } + + //initialize the skeleton tracking + _skeletonEvent = CreateEvent(NULL, TRUE, FALSE, NULL); + if(!HasSkeletalEngine(_kinect) || FAILED(_kinect->NuiSkeletonTrackingEnable(_skeletonEvent, 0))) + { + qDebug() << "Cannot Initialize skeleton tracking" << endl; + return; + } +} + +KinectInput::~KinectInput() +{ + NuiShutdown(); + if( _skeletonEvent && ( _skeletonEvent != INVALID_HANDLE_VALUE ) ) + CloseHandle( _skeletonEvent ); +} + +//thread that manages the kinect events +void KinectInput::run() +{ + _running = true; + while(_running) + { + //wait for an event + if (WaitForSingleObject(_skeletonEvent, TIMEOUT) != 0) + continue; + + //get skeleton values + NUI_SKELETON_FRAME SkeletonFrame; + HRESULT hr = _kinect->NuiSkeletonGetNextFrame( 0, &SkeletonFrame ); +// qDebug() << "Kinect frame " << SkeletonFrame.dwFrameNumber; + + //if no skeleton already identified or not tracked anymore, search for one + if (_skeletonid < 0 || SkeletonFrame.SkeletonData[_skeletonid].eTrackingState != NUI_SKELETON_TRACKED) + { + for( int i = 0 ; i < NUI_SKELETON_COUNT ; i++ ) + { + if(SkeletonFrame.SkeletonData[i].eTrackingState == NUI_SKELETON_TRACKED) + { + _skeletonid = i; + break; + } + } + } + + //no skeleton found + if (_skeletonid < 0) + continue; + + //retrieve information on the skeleton + NUI_SKELETON_DATA &data = SkeletonFrame.SkeletonData[_skeletonid]; + + //checking if we have a skeleton +/* if (data.eTrackingState != NUI_SKELETON_TRACKED) + continue;*/ + + //smooth out the skeleton data + _kinect->NuiTransformSmooth(&SkeletonFrame, NULL); + + + if (data.eSkeletonPositionTrackingState[NUI_SKELETON_POSITION_HAND_RIGHT] == NUI_SKELETON_NOT_TRACKED) + continue; //right hand not detected + else + { +/* float posx, posy; + NuiTransformSkeletonToDepthImageF(data.SkeletonPositions[NUI_SKELETON_POSITION_HAND_RIGHT], &posx, &posy); + emit rightHandMove(posx, posy,0);*/ + Vector4 &skelpos = data.SkeletonPositions[NUI_SKELETON_POSITION_HAND_RIGHT]; + emit rightHandMove(skelpos.x, skelpos.y, skelpos.z); + } + } +} + +void KinectInput::stop() +{ + _running = false; +} diff --git a/TactileFluids/KinectInput.h b/TactileFluids/KinectInput.h new file mode 100644 index 0000000..b4bf077 --- /dev/null +++ b/TactileFluids/KinectInput.h @@ -0,0 +1,29 @@ +#ifndef __KINECTINPUT__ +#define __KINECTINPUT__ + +#include +#include +#include +#include + +class KinectInput: public QThread +{ + Q_OBJECT + public: + KinectInput(); + ~KinectInput(); + + void run(); + void stop(); + + private: + INuiSensor* _kinect; + HANDLE _skeletonEvent; + bool _running; + int _skeletonid; + + signals: + void rightHandMove(float x, float y, float z); +}; + +#endif diff --git a/TactileFluids/OneEuroFilter.cpp b/TactileFluids/OneEuroFilter.cpp new file mode 100644 index 0000000..02377c4 --- /dev/null +++ b/TactileFluids/OneEuroFilter.cpp @@ -0,0 +1,113 @@ +#include "OneEuroFilter.h" + +#define _USE_MATH_DEFINES +#include +#include + +LowPassFilter::LowPassFilter(double alpha, double initval) +:_y(initval), _s(initval), _initialized(false) +{ + setAlpha(alpha); +} + +double LowPassFilter::filter(double value) +{ + double result; + if (_initialized) + result = _a * value + (1.0 - _a) * _s; + else + { + result = value; + _initialized = true; + } + _y = value; + _s = result; + return result; +} + +double LowPassFilter::filterWithAlpha(double value, double alpha) +{ + setAlpha(alpha); + return filter(value); +} + +bool LowPassFilter::hasLastRawValue(void) +{ + return _initialized; +} + +double LowPassFilter::lastRawValue(void) +{ + return _y ; +} + +void LowPassFilter::setAlpha(double alpha) +{ + if (alpha <= 0.0 || alpha > 1.0) + throw std::range_error("alpha should be in ]0.0., 1.0]"); + _a = alpha; +} + + +OneEuroFilter::OneEuroFilter(double freq, double mincutoff, double beta, double dcutoff) +:_x(new LowPassFilter(alpha(mincutoff))), _dx(new LowPassFilter(alpha(dcutoff))), _lasttime(UndefinedTime) +{ + setFrequency(freq); + setMinCutoff(mincutoff); + setBeta(beta); + setDerivateCutoff(dcutoff); +} + +OneEuroFilter::~OneEuroFilter(void) +{ + delete _x; + delete _dx; +} + +double OneEuroFilter::filter(double value, TimeStamp timestamp) +{ + // update the sampling frequency based on timestamps + if (_lasttime != UndefinedTime && timestamp != UndefinedTime) + _freq = 1.0 / (timestamp - _lasttime); + _lasttime = timestamp; + // estimate the current variation per second + double dvalue = _x->hasLastRawValue() ? (value - _x->lastRawValue()) * _freq : 0.0; // FIXME: 0.0 or value? + double edvalue = _dx->filterWithAlpha(dvalue, alpha(_dcutoff)); + // use it to update the cutoff frequency + double cutoff = _mincutoff + _beta * fabs(edvalue); + // filter the given value + return _x->filterWithAlpha(value, alpha(cutoff)); +} + +double OneEuroFilter::alpha(double cutoff) +{ + double te = 1.0 / _freq; + double tau = 1.0 / (2 * M_PI * cutoff); + return 1.0 / (1.0 + tau/te); +} + +void OneEuroFilter::setFrequency(double f) +{ + if (f <= 0) + throw std::range_error("freq should be >0"); + _freq = f; +} + +void OneEuroFilter::setMinCutoff(double mc) +{ + if (mc <= 0) + throw std::range_error("mincutoff should be >0"); + _mincutoff = mc; +} + +void OneEuroFilter::setBeta(double b) +{ + _beta = b; +} + +void OneEuroFilter::setDerivateCutoff(double dc) +{ + if (dc <= 0) + throw std::range_error("dcutoff should be >0"); + _dcutoff = dc; +} diff --git a/TactileFluids/OneEuroFilter.h b/TactileFluids/OneEuroFilter.h new file mode 100644 index 0000000..100a5ae --- /dev/null +++ b/TactileFluids/OneEuroFilter.h @@ -0,0 +1,62 @@ +/* + * OneEuroFilter.h/.cpp - + * + * Author: Thomas Pietrzak (thomas.pietrzak@lifl.fr) + * based on code from + * Nicolas Roussel (nicolas.roussel@inria.fr) + * + */ + + +#ifndef __ONEEURO__ +#define __ONEEURO__ + + +typedef double TimeStamp ; // in seconds + +static const TimeStamp UndefinedTime = -1.0 ; + + +class LowPassFilter +{ + public: + LowPassFilter(double alpha, double initval=0.0); + + double filterWithAlpha(double value, double alpha); + inline bool hasLastRawValue(void); + inline double lastRawValue(void); + + private: + double _y, _a, _s; + bool _initialized; + + void setAlpha(double alpha); + double filter(double value); +} ; + +class OneEuroFilter +{ + public: + OneEuroFilter( + double freq, + double mincutoff=1.0, + double beta_=0.0, + double dcutoff=1.0); + + ~OneEuroFilter(); + + double filter(double value, TimeStamp timestamp=UndefinedTime); + + private: + double _freq, _mincutoff, _beta;, _dcutoff; + LowPassFilter *_x, *_dx; + TimeStamp _lasttime; + + double alpha(double cutoff); + inline void setFrequency(double f); + inline void setMinCutoff(double mc); + inline void setBeta(double b); + inline void setDerivateCutoff(double dc); +} ; + +#endif diff --git a/TactileFluids/TactileFluids.cpp b/TactileFluids/TactileFluids.cpp new file mode 100644 index 0000000..83ab8d3 --- /dev/null +++ b/TactileFluids/TactileFluids.cpp @@ -0,0 +1,100 @@ +#include "TactileFluids.h" + +#include +#include + +TactileFluids::TactileFluids(QWidget *parent, Qt::WFlags flags) +: QMainWindow(parent, flags), _filter(100.0, 1.0) +{ + try + { + _tactonplayer = new TactonPlayer("COM8"); + } + catch (...) + { + _tactonplayer = NULL; + qDebug() << "No wristband found"; + } + + setupUi(this); + + _pos.x = _pos.y = _pos.z = 0.0; + + _tactonplayer->setFrequency(_frequency->value()); + + connect(_frequency, SIGNAL(valueChanged(int)), this, SLOT(updateFrequency(int))); + + connect(&_kinectsensor, SIGNAL(rightHandMove(float,float,float)), + this, SLOT(updateHand(float,float,float))); + + _kinectsensor.start(); + _timer.start(); + + _tactonplayer->setFrequency(_frequency->value()); +} + +TactileFluids::~TactileFluids() +{ + _kinectsensor.stop(); + + if (_tactonplayer) + { + unsigned char amp[] = {0, 0, 0, 0}; + _tactonplayer->setAmplitudes(4, amp); + delete _tactonplayer; + } +} + +void TactileFluids::updateFrequency(int f) +{ + _tactonplayer->setFrequency(f); +} + +void TactileFluids::updateHand(float x, float y, float z) +{ + float dx = x - _pos.x; + float dy = y - _pos.y; + float dz = z - _pos.z; + float speed = 100000 * sqrt(dx*dx + dy*dy + dz*dz) / _timer.elapsed(); + + //filter the speed value + try + { + speed = _filter.filter(speed, QDateTime::currentMSecsSinceEpoch()); + } + catch(...) + { + qDebug() << "Filter went wrong speed=" << speed << " timestamp=" << QDateTime::currentMSecsSinceEpoch(); + } + + //cap values between 0 and 255 + if (speed <= _minspeed->value()) + { + unsigned char amp[] = {0, 0, 0, 0}; + _tactonplayer->setAmplitudes(4, amp); + } + else if (speed >= _maxspeed->value()) + { + unsigned char amp[] = {255, 255, 255, 255}; + _tactonplayer->setAmplitudes(4, amp); + } + else + { + unsigned char amp[4]; + memset(amp, unsigned char(255 * (speed - _minspeed->value()) / (_maxspeed->value() - _minspeed->value())), 4); + _tactonplayer->setAmplitudes(4, amp); + } + + //qDebug() << "deltat = " << _timer.elapsed() << " dist = " << sqrt(dx*dx + dy*dy + dz*dz) << "\n"; + _timer.restart(); + + _pos.x = x; + _pos.y = y; + _pos.z = z; + + _x->setText("x=" + QString::number(_pos.x, 'f', 3)); + _y->setText("y=" + QString::number(_pos.y, 'f', 3)); + _z->setText("z=" + QString::number(_pos.z, 'f', 3)); + _v->setText("v=" + QString::number(speed, 'f', 3)); + +} diff --git a/TactileFluids/TactileFluids.h b/TactileFluids/TactileFluids.h new file mode 100644 index 0000000..c3b80c0 --- /dev/null +++ b/TactileFluids/TactileFluids.h @@ -0,0 +1,33 @@ +#ifndef TACTILEFLUIDS_H +#define TACTILEFLUIDS_H + +#include +#include "ui_tactilefluids.h" + +#include +#include + +#include "KinectInput.h" +#include "OneEuroFilter.h" + +class TactileFluids : public QMainWindow, public Ui::TactileFluidsClass +{ + Q_OBJECT + + public: + TactileFluids(QWidget *parent = 0, Qt::WFlags flags = 0); + ~TactileFluids(); + + private: + KinectInput _kinectsensor; + TactonPlayer *_tactonplayer; + struct { float x, y, z; } _pos; + QTime _timer; + OneEuroFilter _filter; + + public slots: + void updateHand(float, float, float); + void updateFrequency(int); +}; + +#endif // TACTILEFLUIDS_H diff --git a/TactileFluids/TactileFluids.vcxproj b/TactileFluids/TactileFluids.vcxproj new file mode 100644 index 0000000..1ba5787 --- /dev/null +++ b/TactileFluids/TactileFluids.vcxproj @@ -0,0 +1,163 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {014A41B9-3E4D-48F0-B5D7-8C6FE42A142E} + Qt4VSv1.0 + + + + Application + + + Application + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + AllRules.ruleset + + + AllRules.ruleset + + + $(SolutionDir)$(Platform)\$(Configuration)\ + $(SolutionDir)$(Platform)\$(Configuration)\ + + + + UNICODE;WIN32;QT_LARGEFILE_SUPPORT;QT_DLL;QT_CORE_LIB;QT_GUI_LIB;%(PreprocessorDefinitions) + $(KINECTSDK10_DIR)\inc;.\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;%(AdditionalIncludeDirectories) + Disabled + ProgramDatabase + MultiThreadedDebugDLL + false + + + Windows + $(OutDir)\$(ProjectName).exe + $(KINECTSDK10_DIR)\lib\x86;;$(QTDIR)\lib;%(AdditionalLibraryDirectories) + true + TactonPlayerd.lib;Kinect10.lib;qtmaind.lib;QtCored4.lib;QtGuid4.lib;%(AdditionalDependencies) + + + + + UNICODE;WIN32;QT_LARGEFILE_SUPPORT;QT_DLL;QT_NO_DEBUG;NDEBUG;QT_CORE_LIB;QT_GUI_LIB;%(PreprocessorDefinitions) + $(KINECTSDK10_DIR)\inc;.\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;%(AdditionalIncludeDirectories) + + + MultiThreadedDLL + false + + + Windows + $(OutDir)\$(ProjectName).exe + $(KINECTSDK10_DIR)\lib\x86;;$(QTDIR)\lib;%(AdditionalLibraryDirectories) + false + TactonPlayer.lib;Kinect10.lib;qtmain.lib;QtCore4.lib;QtGui4.lib;%(AdditionalDependencies) + + + + + true + + + true + + + + + + + + + true + + + true + + + + + + + + + $(QTDIR)\bin\moc.exe;%(FullPath) + Moc%27ing TactileFluids.h... + .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB "-I$(KINECTSDK10_DIR)\inc" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" + $(QTDIR)\bin\moc.exe;%(FullPath) + Moc%27ing TactileFluids.h... + .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB "-I$(KINECTSDK10_DIR)\inc" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" + + + + + Document + $(QTDIR)\bin\uic.exe;%(AdditionalInputs) + Uic%27ing %(Identity)... + .\GeneratedFiles\ui_%(Filename).h;%(Outputs) + "$(QTDIR)\bin\uic.exe" -o ".\GeneratedFiles\ui_%(Filename).h" "%(FullPath)" + $(QTDIR)\bin\uic.exe;%(AdditionalInputs) + Uic%27ing %(Identity)... + .\GeneratedFiles\ui_%(Filename).h;%(Outputs) + "$(QTDIR)\bin\uic.exe" -o ".\GeneratedFiles\ui_%(Filename).h" "%(FullPath)" + + + + + + + $(QTDIR)\bin\moc.exe;%(FullPath) + Moc%27ing KinectInput.h... + .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB "-I$(KINECTSDK10_DIR)\inc" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" + $(QTDIR)\bin\moc.exe;%(FullPath) + Moc%27ing KinectInput.h... + .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB "-I$(KINECTSDK10_DIR)\inc" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" + + + + + Document + %(FullPath);%(AdditionalInputs) + Rcc%27ing %(Identity)... + .\GeneratedFiles\qrc_%(Filename).cpp;%(Outputs) + "$(QTDIR)\bin\rcc.exe" -name "%(Filename)" -no-compress "%(FullPath)" -o .\GeneratedFiles\qrc_%(Filename).cpp + %(FullPath);%(AdditionalInputs) + Rcc%27ing %(Identity)... + .\GeneratedFiles\qrc_%(Filename).cpp;%(Outputs) + "$(QTDIR)\bin\rcc.exe" -name "%(Filename)" -no-compress "%(FullPath)" -o .\GeneratedFiles\qrc_%(Filename).cpp + + + + + + + + + + + \ No newline at end of file diff --git a/TactileFluids/main.cpp b/TactileFluids/main.cpp new file mode 100644 index 0000000..c42ab7b --- /dev/null +++ b/TactileFluids/main.cpp @@ -0,0 +1,10 @@ +#include "TactileFluids.h" +#include + +int main(int argc, char *argv[]) +{ + QApplication a(argc, argv); + TactileFluids w; + w.show(); + return a.exec(); +} diff --git a/TactileFluids/tactilefluids.qrc b/TactileFluids/tactilefluids.qrc new file mode 100644 index 0000000..486c8c8 --- /dev/null +++ b/TactileFluids/tactilefluids.qrc @@ -0,0 +1,4 @@ + + + + diff --git a/TactileFluids/tactilefluids.ui b/TactileFluids/tactilefluids.ui new file mode 100644 index 0000000..22abb01 --- /dev/null +++ b/TactileFluids/tactilefluids.ui @@ -0,0 +1,157 @@ + + + TactileFluidsClass + + + + 0 + 0 + 322 + 164 + + + + TactileFluids + + + + + + + + + Min speed + + + + + + + 10000 + + + 10 + + + 5 + + + + + + + cm/s + + + + + + + + + + + Max speed + + + + + + + 1 + + + 10000 + + + 10 + + + 100 + + + + + + + cm/s + + + + + + + + + + + Frequency + + + + + + + 1 + + + 1000 + + + 10 + + + 250 + + + + + + + Hz + + + + + + + + + + + x= + + + + + + + y= + + + + + + + z= + + + + + + + v= + + + + + + + + + + + + + + -- 2.30.2