顯示具有 C# 標籤的文章。 顯示所有文章
顯示具有 C# 標籤的文章。 顯示所有文章

2012年9月17日 星期一

復健-遮蔽效應 pt.1

週三(9/12)跟佑佶前往心衛協會進行部落格教學,教學結束後在路上與佑佶討論最近遇到的問題,遮蔽現象。

在三維空間中,肩與肘這兩座標形成一個向量,當手臂舉起來到達90度上下的位置,會產生遮蔽現象。真實世界中當我們看"手臂伸直"這畫面時,手臂看起來是直的,但是仔細一看可發現,手肘的高度會比肩膀與手腕低,如此會造成kinect偵測時判斷到的角度是錯誤的。例如:現實空間中應該是80度的角度,kinect偵測會讀到40度或是其他的角度,而且讀到的角度會一直亂跳。


一開始的時候,我想到的解決辦法是採用肩與手腕來做判斷,

上下高度的方向為y軸,當肩y = 腕y,這樣的情況代表手臂與身體呈垂直90度,如此的情況會產生遮蔽效應,讀到的值非90度,那麼我們就把手肘的y座標加到跟肩膀的y座標一樣的值即可,但是這樣做有個盲點,做復健時手臂不會永遠都是伸直的,而且依這邏輯去寫程式也不太好寫,後來就在邊走路邊找東西吃的時候我想到一個更好的辦法,


我們在做復健時,手肘與手腕的座標會一直改變,但是肩膀的y座標不變,遮蔽效應產生的主因是在一個範圍之內,讀到的y座標是錯誤,於是我們只要將手肘y座標的值加到跟肩膀y座標的值一樣就可以了,如此就可以解決角度判斷錯誤太大的問題。


依照我的想法,佑佶週三晚上就開始撰寫程式,禮拜四(9/13)討論時我們又遇到新的問題,復健動作正常情況是,手自然垂放,接著向上舉起,這樣的動作目前沒有問題,
但是當我們手不是由下往上舉,而是手快速舉起並往前伸直時(上方右圖),又會產生遮蔽現象的問題,當時與佑佶討一起討論後得出較好的方法是,依復健者的能力分區

我們有想過,現實生活中的復健並不會做到非常精確的角度,可能是下往上大概九十度,大概四十五度,它是一個略值,所以我們取大概的範圍即可,依照此想法出來的就是把手揮動的空間分段,如上圖所示


9/17(一)的討論

今天下午開完發明展的行前會後,佑佶跟我說他想到新的判斷方法。我們已經知道,產生遮蔽效應時,Kinect會讀到錯誤的手肘y座標,使得角度判斷錯誤,既然如此,我們可以在手自然垂放時,先記錄下肩膀y與手肘y這段的距離,暫時令之為A,手臂舉起後,如果讀到的長度不等於A,那麼就代表產生了遮蔽效應。
佑佶今天試著依這想法寫判斷式,不過目前還在DEBUG的階段




2012年8月26日 星期日

復健-角度偵測判定的想法與概念 pt.2

今天再來寫一下研究進度,因為paper開工後可能就放著進度紀錄不管了 :P

先前與學長討論用內積的方式做出角度判斷,在周六晚上已經成功弄出三維空間的向量了,今天下午找資料時發現一個很實用的程式碼Vector3D.AngleBetween,他可以讓我們直接做角度判斷,而不用很麻煩的寫內積公式來求cos再求acos

接下來的部分與佑佶共同討論,我只是負責記錄的。

所夾角度的判斷,這個問題解決後,我們今天下午討論時遇到的第一個問題是,如何夾出角度。應該說手舉起來後,我要相對於哪個向量來夾出我所要偵測的角度。








為了解決這問題,我想到讓手自然垂放這動作當作初始化的動作









也就是說,把手自然垂放時的向量當作vector1,手舉起來後的向量當作vector2,這樣就能夾出一個角度,於是佑佶想出了下面的判斷式
(PS: Z軸深度、X軸左右方向、Y軸上下高度,肩膀簡稱為肩,手肘簡稱為肘 )

if(肩x==肘x && 肩z==肘z && 肩y > 軸y)
{
    vector1;  //手自然垂放時的向量
    vector2;  //手舉起來時的向量
    AngleBetween(vector1, vector2 );  //求出兩向量所夾的角度
}

晚上實測後遇到的第一個問題就是向量跑不出來。經過討論後我們發現,現實生活中,肩x不會那麼剛好等於軸x,所以無法進入if 迴圈來產生向量,這個問題在設定誤差值後理論上應該能解決。

在討論時佑佶還有想到一個問題,就是在if迴圈裡所得到的角度,出了迴圈後就消失,經討論後,只要在外面設一個變數,讓這個變數儲存所得到的角度即可,原本的架構變為


double storage;
if(肩x==肘x && 肩z==肘z && 肩y > 軸y)
{
    vector1;  //手自然垂放時的向量
    vector2;  //手舉起來時的向量
    AngleBetween(vector1, vector2 );  //求出兩向量所夾的角度
    storage = AngleBetween;
}

這樣的話照理來說就能在離開if後繼續用所得到的夾角值,不過我有想到一個問題,這是簡單只存一個數值的時候,可是以後要存多個值的時候,可能要用到陣列用到指標,指標的部分我還需要加強,才可能弄得出多個數值的儲存吧我想。

2012年8月25日 星期六

復健-角度偵測判定的想法與概念 pt.1

本篇內容全都是與佑佶共同討論出的結果,我只是負責記錄的。

好久沒寫作研究的部落格了,今天寫的是這週跟佑佶討論的內容。
佑佶與物理治療師討論後決定用角度做為判斷復健動作是否標準,優點是可依復健者能力的不同,來輸入不同的角度,因為判定的方式從角度改為座標,理論上可以做到更精細的復健動作。
看了佑佶傳給我的資料,我決定先從肩關節內轉來構思如何做角度判定。

先從一個火柴人來思考的。讓火柴人的肩膀與手軸打直,使手軸與手臂成九十度,讓手臂往前轉180度(肩關節內轉),

這時我想到每個復健者的能力不同,手軸與手臂不可能每個人都能做到九十度,會有各種奇怪的形狀
所以我想到,藉由向量的概念,讓手軸與手臂視為不同方向的兩個向量,藉由這兩個向量來做出一平面

藉由旋轉平面所夾的角度來做角度判斷

判定的基準面與復健者的身軀平行,接著做出與身軀垂直的旋轉軸即可
這是我最初的想法,但是與佑佶討論後這方法實在有點太笨,與學長討論後改用內積公式做判定
在三維空間中做出兩向量,用反函數acos來求得角度
至於如何在三維空間中做出向量,以下是我孤狗找到的方式
http://msdn.microsoft.com/en-us/library/ms594925
期許這週能寫出來