2015-07-07 2 views
2

Я получил координаты плеча плеча, локтя и запястья человека с помощью устройства Microsoft Kinect (данные берутся в отношении устройства Kinect). Принимая координаты, я перемещаю руку вверх и вниз. образец данных может быть показан следующим образом.Вычислить угол между двумя линиями (которые представляют собой человеческую руку) с использованием набора данных Kinect в Java

7/7/2015 12:02:49 AM shoulder X -0.06475954 shoulder Y 0.266225 shoulder Z 1.414332 elbow X 0.002287441 elbow Y 0.03676218 elbow Z 1.424792 wrist X 0.1791002 wrist Y -0.06900118 wrist Z 1.455758 

7/7/2015 12:02:49 AM shoulder X -0.06655618 shoulder Y 0.2654685 shoulder Z 1.413007 elbow X 0.001183244 elbow Y 0.0374795 elbow Z 1.424512 wrist X 0.1779053 wrist Y -0.06793896 wrist Z 1.4554 

7/7/2015 12:02:49 AM shoulder X -0.0703955 shoulder Y 0.264899 shoulder Z 1.408783 elbow X -0.001478138 elbow Y 0.03802216 elbow Z 1.422277 wrist X 0.1769906 wrist Y -0.06481737 wrist Z 1.4514 

Затем я попытался вычислить угол в руке в двух условиях.

  1. Предполагая, что координаты Z фиксированы (на самом деле выше набор данных берется таким образом, что это предположение верно)
  2. Предполагая, что Z координата не являются фиксированными.

Я использовал код java для вычисления углов в двух вышеуказанных условиях. Код Java выглядит следующим образом.

import java.io.*; 

class main { 

    public static void main(String args[]){ 
     try{ 
      FileInputStream fstream = new FileInputStream("C:\\Users\\Chathu\\Desktop\\project code\\src\\output.txt"); 
      DataInputStream in = new DataInputStream(fstream); 
      BufferedReader br = new BufferedReader(new InputStreamReader(in)); 
      String strLine; 
      while ((strLine = br.readLine()) != null) { 
       String[] tokens = strLine.split(" "); 

       //time 

       //shoulder cordinates 
       double ShoulderX= Double.parseDouble(tokens[5]); 
       double ShoulderY= Double.parseDouble(tokens[8]); 
       double ShoulderZ= Double.parseDouble(tokens[11]); 


       //elbow cordinates 
       double ElbowX= Double.parseDouble(tokens[14]); 
       double ElbowY= Double.parseDouble(tokens[17]); 
       double ElbowZ= Double.parseDouble(tokens[20]); 


       //wrist cordinates 
       double WristX= Double.parseDouble(tokens[23]); 
       double WristY= Double.parseDouble(tokens[26]); 
       double WristZ= Double.parseDouble(tokens[29]); 



       //calculate angle if Z is fixed 

       double M1=((ShoulderY-ElbowY)/(ShoulderX-ElbowX)); 
       double M2=((WristY-ElbowY)/(WristX-ElbowX)); 

       double tanAlfa=Math.abs((M1-M2)/(1+(M1*M2))); 

       System.out.println("Time : "+getTimeinInt(tokens[1])); 
       System.out.println("2D angle: "+Math.toDegrees(Math.atan(tanAlfa))); 



       //calculate andgle when Z is not fixed 

       //Create 2 vectors 
       double[] u={ShoulderX-ElbowX,ShoulderY-ElbowY,ShoulderZ-ElbowZ }; 
       double[] v={WristX-ElbowX,WristY-ElbowY,WristZ-ElbowZ }; 

       double absu=Math.sqrt(Math.pow(u[0],2)+Math.pow(u[1],2)+Math.pow(u[2],2)); 
       double absv=Math.sqrt(Math.pow(v[0],2)+Math.pow(v[1],2)+Math.pow(v[2],2)); 

       double cosTheata=((dotProd(u,v))/(absu*absv)); 

       System.out.println("3D angle: "+Math.acos(cosTheata)); 


      } 
      in.close(); 
     }catch (Exception e){ 
      System.err.println("Error: " + e.getMessage()); 
     } 
    } 



    public static int getTimeinInt(String time){ 

     String[] tokens = time.split(":"); 
     int hours = Integer.parseInt(tokens[0]); 
     int minutes = Integer.parseInt(tokens[1]); 
     int seconds = Integer.parseInt(tokens[2]); 
     int duration = 3600 * hours + 60 * minutes + seconds; 

     return duration; 
    } 

    public static double dotProd(double[] a, double[] b){ 
     if(a.length != b.length){ 
      throw new IllegalArgumentException("The dimensions have to be equal!"); 
     } 
     double sum = 0; 
     for(int i = 0; i < a.length; i++){ 
      sum += a[i] * b[i]; 
     } 
     return sum; 
    } 
} 

Но когда я запускаю этот код и проверить расчетные значения угла я получил совершенно разные значения в соответствии с выше двух предположений.

первые 3 ответа следующим образом (ответы соответствуют выше набору данных выборки)

Time : 43369 
2D angle: 42.82568606638748 
3D angle: 2.3907040436551847 
Time : 43369 
2D angle: 42.63544266854971 
3D angle: 2.3947689168198463 
Time : 43369 
2D angle: 43.151072486090776 
3D angle: 2.387883634441205 

Может кто-нибудь помочь мне найти проблему там?

+0

Почему бы не использовать формулу косинуса? – crbah

+0

@Cbahadir Использовалась формула косинуса, здесь она называется «3d-угол» – kpie

+0

@kpie. Думаю, я не понял, что вы подразумеваете под «3d углом». Косинусная формула (которую я понял, что вы упомянули в своем ответе) дает угол между векторами, определенными на плоскости, этими векторными формами. – crbah

ответ

0

Спасибо всем за вашу помощь. Наконец-то я нашел ошибку в своем java-коде. Я использую System.out.println("3D angle: "+Math.acos(cosTheata)); для печати угла между двумя векторами в трехмерном пространстве. Когда я прочитал документацию метода acos(), он говорит, что этот метод возвращает угол в радиан. В результате 2D-плоскости я использовал метод Math.toDegrees() для преобразования углов в градусы. Таким образом, все мои значения координат 3D-координат находятся в радиусе.

2

Вы можете найти угол между двумя линиями с косинусом. enter image description here

wrist = point1 
elbo = point2 
soulder = point3 

vector1 = point1 - point2 
vector2 = point1 - point3 

Теперь, когда у вас есть векторы 1 и 2, указывающих от локтя до запястья и плеча соответственно угол можно найти, взяв:

The ARccOS о соотношении продукта точки из них 2 вектора над произведением их величины.

Для получения дополнительной информации о математике здесь проверить This page on Wikipedia

Что и у вас есть для «3d угла ...»

Вы не можете использовать свой Атан подход, потому что ваш угол локтя не 90. Если бы вы знали, почему именно вы его ищете?

Я действительно не уверен, что именно это вы собираетесь с «2d угол ...»

+0

На самом деле я использую формулу выше косинуса, чтобы найти угол между двумя векторами в трехмерном пространстве. на самом деле слово «3D-угол» используется для отображения угла между двумя векторами в трехмерном пространстве. На самом деле, что я пытаюсь сделать, Сначала пренебрегайте координатой Z и считайте, что рука находится в 2D-пространстве. затем переместите рычаг и возьмите координаты и вычислите угол. " Затем я беру координату Z в расчет, а затем рука находится в трехмерном пространстве, поэтому я удаляю свое предположение (координата Z руки фиксирована), поэтому теперь я вычисляю угол, и я хочу сравнить результаты –

+0

вы можете измерить векторы, проецируемые на подпространства, путем удаления измерений, но не ожидайте увидеть угол, который «существует», скорее получено восприятие ... удаление данного измерения say z проецирует эту ситуацию на xy, где ответ не будет таким же, как R3:) – kpie

Смежные вопросы