BodyPoseSequence.java
Go to the documentation of this file.
00001 package edu.tum.cs.ias.knowrob.vis.items;
00002 
00003 import java.io.BufferedReader;
00004 import java.io.File;
00005 import java.io.FileReader;
00006 import java.io.IOException;
00007 import java.util.ArrayList;
00008 
00009 import edu.tum.cs.ias.knowrob.util.datastructures.Point;
00010 import edu.tum.cs.ias.knowrob.vis.Canvas;
00011 import edu.tum.cs.ias.knowrob.vis.DrawableAnimated;
00012 
00013 import javax.vecmath.Vector3f;
00014 
00020 public class BodyPoseSequence extends ItemBase implements DrawableAnimated {
00021         
00022         protected ArrayList<Point[]> jointPositions = new ArrayList<Point[]>();
00023         protected Integer trackedBodyPart = null, trackedBodyPartStartTime;
00024         protected int color = 0xffff00ff;
00025         
00026         protected final float armsThickness = 0.035f;
00027         protected final float spineThickness = 0.04f;
00028         
00029         protected boolean wireMode = false;
00030 
00031         public void addPose(float EPISODE_NR, float TIME, String action, 
00032                           float BECX, float BECY, float BECZ,  float ULWX, float ULWY, float ULWZ, 
00033                           float OLWX, float OLWY, float OLWZ,  float UBWX, float UBWY, float UBWZ, 
00034                           float OBWX, float OBWY, float OBWZ,  float UHWX, float UHWY, float UHWZ,
00035                           float BRKX, float BRKY, float BRKZ,  float OHWX, float OHWY, float OHWZ,
00036                           float KOX,  float KOY,  float KOZ,   float SEHX, float SEHY, float SEHZ,
00037                           float OSLX, float OSLY, float OSLZ,  float USLX, float USLY, float USLZ, 
00038                           float FULX, float FULY, float FULZ,  float FBLX, float FBLY, float FBLZ,
00039                           float OSRX, float OSRY, float OSRZ,  float USRX, float USRY, float USRZ,
00040                           float FURX, float FURY, float FURZ,  float FBRX, float FBRY, float FBRZ,
00041                           float SBLX, float SBLY, float SBLZ,  float OALX, float OALY, float OALZ,
00042                           float UALX, float UALY, float UALZ,  float HALX, float HALY, float HALZ,
00043                           float FILX, float FILY, float FILZ,  float SBRX, float SBRY, float SBRZ,  
00044                           float OARX, float OARY, float OARZ,  float UARX, float UARY, float UARZ, 
00045                           float HARX, float HARY, float HARZ,  float FIRX, float FIRY, float FIRZ ){
00046                   
00047                   Point[] newPosition = new Point[28];
00048                  
00049                   newPosition[0]  = new Point(BECX, BECY, BECZ, EPISODE_NR, TIME, "BEC", action);         
00050                   newPosition[1]  = new Point(ULWX, ULWY, ULWZ, EPISODE_NR, TIME, "ULW", action);
00051                   newPosition[2]  = new Point(OLWX, OLWY, OLWZ, EPISODE_NR, TIME, "OLW", action);
00052                   newPosition[3]  = new Point(UBWX, UBWY, UBWZ, EPISODE_NR, TIME, "UBW", action);
00053                   newPosition[4]  = new Point(OBWX, OBWY, OBWZ, EPISODE_NR, TIME, "OBW", action);
00054                   newPosition[5]  = new Point(UHWX, UHWY, UHWZ, EPISODE_NR, TIME, "UHW", action);
00055                   newPosition[6]  = new Point(BRKX, BRKY, BRKZ, EPISODE_NR, TIME, "BRK", action);
00056                   newPosition[7]  = new Point(OHWX, OHWY, OHWZ, EPISODE_NR, TIME, "OHW", action);
00057                   newPosition[8]  = new Point(KOX,  KOY,  KOZ,  EPISODE_NR, TIME, "KO", action);
00058                   newPosition[9]  = new Point(SEHX, SEHY, SEHZ, EPISODE_NR, TIME, "SEH", action);
00059                   newPosition[10] = new Point(OSLX, OSLY, OSLZ, EPISODE_NR, TIME, "OSL", action);
00060                   newPosition[11] = new Point(USLX, USLY, USLZ, EPISODE_NR, TIME, "USL", action);
00061                   newPosition[12] = new Point(FULX, FULY, FULZ, EPISODE_NR, TIME, "FUL", action);
00062                   newPosition[13] = new Point(FBLX, FBLY, FBLZ, EPISODE_NR, TIME, "FBL", action);
00063                   newPosition[14] = new Point(OSRX, OSRY, OSRZ, EPISODE_NR, TIME, "OSR", action);
00064                   newPosition[15] = new Point(USRX, USRY, USRZ, EPISODE_NR, TIME, "USR", action);
00065                   newPosition[16] = new Point(FURX, FURY, FURZ, EPISODE_NR, TIME, "FUR", action);
00066                   newPosition[17] = new Point(FBRX, FBRY, FBRZ, EPISODE_NR, TIME, "FBR", action);
00067                   newPosition[18] = new Point(SBLX, SBLY, SBLZ, EPISODE_NR, TIME, "SBL", action);
00068                   newPosition[19] = new Point(OALX, OALY, OALZ, EPISODE_NR, TIME, "OAL", action);
00069                   newPosition[20] = new Point(UALX, UALY, UALZ, EPISODE_NR, TIME, "UAL", action);
00070                   newPosition[21] = new Point(HALX, HALY, HALZ, EPISODE_NR, TIME, "HAL", action);
00071                   newPosition[22] = new Point(FILX, FILY, FILZ, EPISODE_NR, TIME, "FIL", action);
00072                   newPosition[23] = new Point(SBRX, SBRY, SBRZ, EPISODE_NR, TIME, "SBR", action);
00073                   newPosition[24] = new Point(OARX, OARY, OARZ, EPISODE_NR, TIME, "OAR", action);
00074                   newPosition[25] = new Point(UARX, UARY, UARZ, EPISODE_NR, TIME, "UAR", action);
00075                   newPosition[26] = new Point(HARX, HARY, HARZ, EPISODE_NR, TIME, "HAR", action);                 
00076                   newPosition[27] = new Point(FIRX, FIRY, FIRZ, EPISODE_NR, TIME, "FIR", action);
00077                   
00078 //                // invert z
00079 //                for(int i = 0; i < newPosition.length; i++)
00080 //                        newPosition[i].z *= -1;
00081                   
00082                   jointPositions.add(newPosition);
00083                   defaultColor = color;
00084         }
00085         
00086         public ArrayList<Point[]> getSequence() {
00087                 return jointPositions;
00088         }
00089 
00090         public void addPose(float episode_nr, float time, String action, float[] coords) {
00091                 addPose(episode_nr, time, action, coords[0], coords[1], coords[2], coords[3], coords[4], coords[5], coords[6], coords[7], coords[8], coords[9], coords[10], coords[11], coords[12], coords[13], coords[14], coords[15], coords[16], coords[17], coords[18], coords[19], coords[20], coords[21], coords[22], coords[23], coords[24], coords[25], coords[26], coords[27], coords[28], coords[29], coords[30], coords[31], coords[32], coords[33], coords[34], coords[35], coords[36], coords[37], coords[38], coords[39], coords[40], coords[41], coords[42], coords[43], coords[44], coords[45], coords[46], coords[47], coords[48], coords[49], coords[50], coords[51], coords[52], coords[53], coords[54], coords[55], coords[56], coords[57], coords[58], coords[59], coords[60], coords[61], coords[62], coords[63], coords[64], coords[65], coords[66], coords[67], coords[68], coords[69], coords[70], coords[71], coords[72], coords[73], coords[74], coords[75], coords[76], coords[77], coords[78], coords[79], coords[80], coords[81], coords[82], coords[83]);
00092         }
00093         
00094         public void setColor(int color) {
00095                 this.color = color;
00096         }
00097         
00098         public void draw(Canvas c, int step) {          
00099                 drawPose(c, step);
00100                 
00101                 if(trackedBodyPart != null)
00102                         drawBodyPartTrajectory(c, trackedBodyPart, trackedBodyPartStartTime, step);
00103         }       
00104         
00105         public void drawPose(Canvas c, int step) {
00106                 if(wireMode)
00107                         drawPoseWire(c, step);
00108                 else
00109                         drawPoseFat(c, step);
00110         }
00111         
00112         public void drawPoseWire(Canvas c, int step) {
00113                 if(step > getMaxStep())
00114                         return;
00115                 
00116                 Point[] pose = this.jointPositions.get(step);
00117 
00118             //c.strokeWeight(5f);
00119             c.stroke(this.color);
00120                 
00121                 c.pushMatrix();
00122                 c.scale(100);
00123 
00124                 // draw trajectory
00125                 for(int i = 0; i < 9; i++) 
00126                         c.line(pose[i].x, pose[i].y, pose[i].z, pose[i + 1].x, pose[i + 1].y, pose[i + 1].z);           
00127 
00128                 // draw head
00129                 c.pushMatrix();
00130                 c.translate(pose[8].x, pose[8].y, pose[8].z);
00131                 c.sphere(0.09f);
00132                 c.popMatrix();
00133 
00134                 // draw body segments
00135                 c.line(pose[0].x, pose[0].y, pose[0].z, pose[10].x, pose[10].y, pose[10].z);
00136                 c.line(pose[0].x, pose[0].y, pose[0].z, pose[14].x, pose[14].y, pose[14].z);
00137                 c.line(pose[6].x, pose[6].y, pose[6].z, pose[18].x, pose[18].y, pose[18].z);
00138                 c.line(pose[6].x, pose[6].y, pose[6].z, pose[23].x, pose[23].y, pose[23].z);
00139 
00140                 for(int i = 10; i < 13; i++) 
00141                         c.line(pose[i].x, pose[i].y, pose[i].z, pose[i + 1].x, pose[i + 1].y, pose[i + 1].z);           
00142                 for(int i = 14; i < 17; i++) 
00143                         c.line(pose[i].x, pose[i].y, pose[i].z, pose[i + 1].x, pose[i + 1].y, pose[i + 1].z);           
00144                 for(int i = 18; i < 22; i++) 
00145                         c.line(pose[i].x, pose[i].y, pose[i].z, pose[i + 1].x, pose[i + 1].y, pose[i + 1].z);           
00146                 for(int i = 23; i < 27; i++) 
00147                         c.line(pose[i].x, pose[i].y, pose[i].z, pose[i + 1].x, pose[i + 1].y, pose[i + 1].z);           
00148                 
00149                 c.popMatrix();
00150         }
00151         
00152         public void drawPoseFat(Canvas c, int step) {
00153                 if(step > getMaxStep())
00154                         return;
00155                         
00156                 Point[] pose = this.jointPositions.get(step);
00157 
00158           //  c.strokeWeight(5f);
00159             c.color(color);
00160             c.fill(color);
00161                 
00162                 c.pushMatrix();
00163                 c.scale(100);
00164                 c.sphereDetail(20);
00165 
00166                 // draw trajectory
00167                 for(int i = 0; i < 8; i++){ 
00168                         c.color(0xffff0000);
00169                         cyl(c,pose[i].x, pose[i].y, pose[i].z, pose[i + 1].x, pose[i + 1].y, pose[i + 1].z, spineThickness);
00170                         new Sphere(pose[i].x, pose[i].y, pose[i].z, -spineThickness, this.color).draw(c);
00171                 }
00172                 
00173                 // draw head
00174                 new Sphere(pose[8].x, pose[8].y, pose[8].z, -spineThickness*2, color).draw(c);  
00175                 // draw cone for gaze direction
00176                 float lambda = 1.1f;
00177                 cone(c,pose[8].x, pose[8].y, pose[8].z, pose[8].x + lambda*(pose[9].x - pose[8].x), pose[8].y + lambda*(pose[9].y - pose[8].y), pose[8].z+ + lambda*(pose[9].z - pose[8].z), spineThickness, spineThickness * 0.05f);           
00178 
00179                 // draw body segments
00180                 cyl(c,pose[0].x, pose[0].y, pose[0].z, pose[10].x, pose[10].y, pose[10].z, armsThickness);
00181                 cyl(c,pose[0].x, pose[0].y, pose[0].z, pose[14].x, pose[14].y, pose[14].z, armsThickness);
00182                 cyl(c,pose[6].x, pose[6].y, pose[6].z, pose[18].x, pose[18].y, pose[18].z, armsThickness);
00183                 cyl(c,pose[6].x, pose[6].y, pose[6].z, pose[23].x, pose[23].y, pose[23].z, armsThickness);
00184                 
00185                 for(int i = 10; i < 13; i++) {
00186                         cyl(c,pose[i].x, pose[i].y, pose[i].z, pose[i + 1].x, pose[i + 1].y, pose[i + 1].z, armsThickness);
00187                         new Sphere(pose[i].x, pose[i].y, pose[i].z, -armsThickness, this.color).draw(c);
00188                 }
00189                 for(int i = 14; i < 17; i++){
00190                         cyl(c,pose[i].x, pose[i].y, pose[i].z, pose[i + 1].x, pose[i + 1].y, pose[i + 1].z, armsThickness);
00191                         new Sphere(pose[i].x, pose[i].y, pose[i].z, -armsThickness, this.color).draw(c);
00192                 }
00193                 for(int i = 18; i < 21; i++){ 
00194                         cyl(c,pose[i].x, pose[i].y, pose[i].z, pose[i + 1].x, pose[i + 1].y, pose[i + 1].z, armsThickness);
00195                         new Sphere(pose[i].x, pose[i].y, pose[i].z, -armsThickness, this.color).draw(c);
00196                 }
00197                 
00198                 cone(c,pose[21].x, pose[21].y, pose[21].z, pose[21].x + lambda*(pose[22].x - pose[21].x), pose[21].y + lambda*(pose[22].y - pose[21].y), pose[21].z+ + lambda*(pose[22].z - pose[21].z), armsThickness, armsThickness * 0.1f);
00199                 
00200                 for(int i = 23; i < 26; i++){ 
00201                         cyl(c,pose[i].x, pose[i].y, pose[i].z, pose[i + 1].x, pose[i + 1].y, pose[i + 1].z, armsThickness);
00202                         drawSphere(c, pose[i].x, pose[i].y, pose[i].z, armsThickness);
00203                 }
00204                 
00205                 cone(c,pose[26].x, pose[26].y, pose[26].z, pose[26].x + lambda*(pose[27].x - pose[26].x), pose[26].y + lambda*(pose[27].y - pose[26].y), pose[26].z+ + lambda*(pose[27].z - pose[26].z), armsThickness, armsThickness * 0.1f);
00206                 
00207                 // elbows
00208                 drawSphere(c, pose[20].x, pose[20].y, pose[20].z, armsThickness);
00209                 drawSphere(c, pose[25].x, pose[25].y, pose[25].z, armsThickness);
00210                 
00211                 c.popMatrix();
00212                 
00213         }
00214         
00215         protected void drawSphere(Canvas c, float x, float y, float z, float r) {
00216                 new Sphere(x, y, z, -r, this.color).draw(c);
00217         }
00218         
00219         protected void cyl(Canvas c, float x1, float y1, float z1, float x2, float y2, float z2, float r){
00220                 ConePrimitive cyl = new ConePrimitive(new Vector3f(x1, y1, z1), new Vector3f(x2, y2, z2), r);
00221                 cyl.draw(c);
00222         }
00223         
00224         
00225         protected void cone(Canvas c, float x1, float y1, float z1, float x2, float y2, float z2, float r1, float r2){
00226                 ConePrimitive cyl = new ConePrimitive(new Vector3f(x1, y1, z1), new Vector3f(x2, y2, z2), r1, r2);
00227                 cyl.draw(c);
00228         }
00229         
00230         public void trackBodyPart(Integer bodyPart, int startTime) {
00231                 this.trackedBodyPart = bodyPart;
00232                 this.trackedBodyPartStartTime = startTime;
00233         }
00234         
00235         public boolean isTrackingBodyPart() {
00236                 return trackedBodyPart != null;
00237         }
00238 
00239         public void drawBodyPartTrajectory(Canvas c, int bodyPart, int begin, int end) {                
00240                 c.pushMatrix();
00241                 c.stroke(255,255,0);
00242                 c.scale(100);
00243                 if((bodyPart != -1) && (end > 0)) {
00244                         for(int i = begin; i < end - 1; i++) {
00245                                 Point[] pose1 = jointPositions.get(i); 
00246                                 Point[] pose2 = jointPositions.get(i+1);
00247                                 c.line(pose1[bodyPart].x, pose1[bodyPart].y, pose1[bodyPart].z, pose2[bodyPart].x, pose2[bodyPart].y, pose2[bodyPart].z);
00248                         }
00249                 }
00250                 c.popMatrix();
00251         }         
00252         
00253         public int getMaxStep() {
00254                 return jointPositions.size()-1;
00255         }
00256         
00257         public boolean isEmpty() {
00258                 return jointPositions.size() == 0;
00259         }
00260         
00267     public void readData(File matlabAsciiFile) throws NumberFormatException, IOException {
00268                 BufferedReader r = new BufferedReader(new FileReader(matlabAsciiFile));
00269                 String line;
00270                 while((line = r.readLine()) != null) {
00271                         String[] parts = line.trim().split("\\s+");
00272                         float[] coords = new float[parts.length];
00273                         for(int i = 0; i < parts.length; i++)
00274                                 coords[i] = Float.parseFloat(parts[i]);
00275                         this.addPose(1, 0, "", coords);
00276                 }
00277     }
00278 
00279     public void setMode(boolean wireOnly) {
00280         wireMode = wireOnly;
00281     }
00282 
00283         @Override
00284         public void setColor(int color, int start, int end) {
00285                 System.err.println("not availible");
00286                 
00287         }
00288 }


mod_vis
Author(s): Moritz Tenorth, Jakob Engel
autogenerated on Sat Dec 28 2013 17:09:49