home *** CD-ROM | disk | FTP | other *** search
/ Virtual Reality Homebrewer's Handbook / vr.iso / vroom / puma2.pas < prev    next >
Pascal/Delphi Source File  |  1996-03-19  |  6KB  |  148 lines

  1. program puma2;
  2.  
  3. uses vroom,crt,cyberman;
  4.  
  5. var base,waist,shoulder,elbow,wrist,hand,fing1,fing2 : file_object3d;
  6.     box1 : file_object3d;
  7.     contact_point : file_object3d;
  8.     correct_key, mouse, cyber, junk : boolean;
  9.     ch : char;
  10.     waist_ang, elb_ang, shoul_ang : real;
  11.     t : real;
  12.     c : integer;
  13.  
  14. {$F+}
  15. function My_KeyCheck(key : char) : boolean;
  16. var test : boolean;
  17. begin
  18.            test:=true;
  19.            case key of
  20.                 'w' : begin
  21.                            waist.RotateZ(5);
  22.                            waist_ang:=waist_ang+5;
  23.                       end;
  24.                 'W' : begin
  25.                            waist.RotateZ(-5);
  26.                            waist_ang:=waist_ang-5;
  27.                       end;
  28.                 'a' : begin
  29.                            shoulder.RotateZ_About(-waist_ang,0,0,0);
  30.                            shoulder.RotateX(5);
  31.                            shoulder.RotateZ_About(waist_ang,0,0,0);
  32.                            shoul_ang:=shoul_ang+5;
  33.                       end;
  34.                 'A' : begin
  35.                            shoulder.RotateZ_About(-waist_ang,0,0,0);
  36.                            shoulder.RotateX(-5);
  37.                            shoulder.RotateZ_About(waist_ang,0,0,0);
  38.                            shoul_ang:=shoul_ang-5;
  39.                       end;
  40.                 'e' : begin
  41.                            elbow.RotateZ_About(-waist_ang,0,0,0);
  42.                            elbow.RotateX(5);
  43.                            elbow.RotateZ_About(waist_ang,0,0,0);
  44.                            elb_ang:=elb_ang+5;
  45.                       end;
  46.                 'E' : begin
  47.                            elbow.RotateZ_About(-waist_ang,0,0,0);
  48.                            elbow.RotateX(-5);
  49.                            elbow.RotateZ_About(waist_ang,0,0,0);
  50.                            elb_ang:=elb_ang-5;
  51.                       end;
  52.                 'g' : begin
  53.                            if (abs(contact_point.reference_point.x-box1.reference_point.x)<131072)
  54.                            and (abs(contact_point.reference_point.y-box1.reference_point.y)<131072)
  55.                            and (abs(contact_point.reference_point.z-box1.reference_point.z)<131072)
  56.                            then contact_point.addchild(@box1)
  57.                            else
  58.                            begin
  59.                                 sound(220);
  60.                                 delay(200);
  61.                                 NoSound;
  62.                            end;
  63.                       end;
  64.                 'r' : begin
  65.                            contact_point.RemoveChild(@box1);
  66.                       end
  67.            else
  68.                test:=false;
  69.            end;
  70.            My_KeyCheck:=test;
  71. end;
  72.  
  73. {$F-}
  74.  
  75. begin
  76.      writeln('Welcome to the teleoperator demo by Robin Hollands');
  77.      writeln;
  78.      writeln('In this demo you will be controlling a simplified PUMA robot arm.');
  79.      writeln('You can rotate the arm''s waist using ''w'' and ''W'' (shift w),');
  80.      writeln('likewise the shoulder and elbow can be controlled using ''a'',''A'',''e'', and ''E''.');
  81.      writeln;
  82.      writeln('The object is to manoevre the small box on the end of the arm near to');
  83.      writeln('the small box on the floor. Press ''g'' to grab the box. If you are too');
  84.      writeln('far away you will hear a beep. Once the box has been grabbed it can be ');
  85.      writeln('repositioned using the arm. Press ''r'' to release the box.');
  86.      writeln;
  87.      writeln('Press ''q'' when you''ve had enough.');
  88.      writeln;
  89.      writeln('Press ENTER to continue');
  90.      readln;
  91.      writeln('If the graphical picture represented the true enviroment that the robot');
  92.      writeln('arm was in, and if the orientation of the arm in the picture was governed');
  93.      writeln('by data coming from the real arm''s sensors, then it would be possible to');
  94.      writeln('to accurately control the arm without needing to be in the same location.');
  95.      writeln('This aspect of remote control is called Teleoperation. If the computer');
  96.      writeln('generatated image was an accurate representation of the robot working area');
  97.      writeln('then this is called Teleprescence.');
  98.      writeln;
  99.      writeln('In this second version of the demo, you can also move around the ');
  100.      writeln('environment using the mouse or cyberman and keypad as usual.');
  101.      writeln;
  102.      writeln('Press ENTER to continue');
  103.      readln;
  104.      waist_ang:=0;
  105.      elb_ang:=0;
  106.      shoul_ang:=0;
  107.  
  108.      mouse:=false;
  109.      cyber:=false;
  110.      if cyberman_available then cyber:=true else if mouse_available then mouse:=true;
  111.      Init_System;
  112.  
  113.      Set_Ambient_Intensity(0.5);
  114.      Set_Light(0.75,0,-1,-0.75);
  115.  
  116.      contact_point.Init('box.3d');
  117.      contact_point.Set_Reference_Point(5,5,5);
  118.      contact_point.Scale(0.1,0.1,0.1);
  119.      contact_point.MoveTo(-2.5,28.3,17.5);
  120.  
  121.      base.Init('base.3d');
  122.      waist.Init('waist.3d');
  123.      base.AddChild(@waist);
  124.      shoulder.Init('shoulder.3d');
  125.      waist.AddChild(@shoulder);
  126.      elbow.Init('elbow.3d');
  127.      shoulder.AddChild(@elbow);
  128.      elbow.AddChild(@contact_point);
  129.  
  130.      box1.Init('box.3d');
  131.      box1.Set_Reference_Point(5,5,5);
  132.      box1.Scale(0.1,0.1,0.1);
  133.      box1.MoveTo(15,15,0.5);
  134.  
  135.      Set_View(600,5,25,0,0,0);
  136.      Set_Window(-20,-15,20,15);
  137.      Store_Settings;
  138.      User_KeyCheck_Proc(My_KeyCheck);
  139.  
  140.      Redraw_Scene;
  141.  
  142.      repeat
  143.            junk:=false;
  144.            if cyber then junk:=cyberman_check else if mouse then junk:=mouse_check;
  145.            if KeyBoard_Check or junk then redraw_scene;
  146.      until false;
  147. end.
  148.