def draw(self,
          screen,
          q=Quaternion(1, 0, 0, 0),
          centre_pos=Vector3(0, 0, 0)):
     """ draw object at given rotation """
     assert isinstance(screen, Screen)
     self.origin()
     #self.rotate(q)
     self.rotate_move(q, centre_pos)
     sides = self.sides()
     edges = self.edges()
     drawables = sides + edges
     drawables.sort(key=lambda s: screen.depth(s.centroid()))
     [s.draw(screen) for s in drawables]
 def test_imu(self):
      delay_sec = .05
      imuc = IMUListener.IMUListener(delay_sec)
      imuc.init()
      while True:
         control = imuc.get()
         print(control)
         if control is not None:
             q = Quaternion(control["quatW"], control["quatX"],
                             control["quatY"], control["quatZ"]).normalized()
             posi = Vector3(0, 0, 0)
             if self.isGrid:
                 self.grid.draw(self.screen)
             self.cube.draw(self.screen, q, posi)
             event = pygame.event.poll()
             if event.type == pygame.QUIT \
                     or (event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE):
                 break
             pygame.display.flip()
             pygame.time.delay(20)
             self.cube.erase(self.screen)
Example #3
0
 def collect_anims2(self, joint, anims):
     for (joint_name, joint_matrix, child_joints, vertex_refs,
          actor) in joint:
         #print "anims for %s" % joint_name
         #get bone displacement
         displacement = actor.LocalDisplacement()
         origin = actor.Origin()
         parentOrigin = actor.Parent().Origin()
         if actor.Name() == self.figure.ParentActor().Name():
             parentOrigin = origin
         displacement = vec_add(vec_subtract(origin, parentOrigin),
                                displacement)
         displacement = vec_subtract(origin, parentOrigin)
         # get rotation
         quat_tuple = actor.LocalQuaternion()
         quat = Quaternion(quat_tuple[0], quat_tuple[1], quat_tuple[2],
                           quat_tuple[3])
         hpr = radians_to_degrees(quat.get_euler())
         #store displacement/rotation in anims data
         if joint_name not in anims:
             anims[joint_name] = []
         anims[joint_name].append((displacement, hpr))
         self.collect_anims2(child_joints, anims)
     return anims
Example #4
0
 def deserialise(self, ser, estimated=False):
     (px, py, pz)=ControlledSer.vAssign(ser, ControlledSer._POS)
     (aw, ax, ay, az)=ControlledSer.qAssign(ser, ControlledSer._ATT)
     (vx, vy, vz)=ControlledSer.vAssign(ser, ControlledSer._VEL)
     
     return Mirrorable.deserialise(self, ser, estimated).setPos(Vector3(px,py,pz)).setAttitude(Quaternion(aw,ax,ay,az)).setVelocity(Vector3(vx,vy,vz))
    def run(self):
        tic = time.time()
        if self.isGrid:
            self.grid.draw(self.screen)
                    
        if self.control_method == 'test':
            q = Quaternion(1,0,0,0) # Unit Quaternion
            incr = Quaternion(0.96,0.01,0.01,0).normalized()
            count = 0

            while 1:
                q = q*incr
                if self.isGrid:
                    self.grid.draw(self.screen)
                self.cube.draw(self.screen, q, Vector3(-count,count,count))       
                event = pygame.event.poll()
                if event.type == pygame.QUIT \
                    or (event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE):
                    break
                pygame.display.flip()
                pygame.time.delay(100) 
                self.cube.erase(self.screen)
                count-=1

        # First Order Rotation/Translation Model
        elif self.control_method == 'xbox':
            sample_rate = .0005
            #xbl = XboxListenerWindows.XBoxListener(delay_sec)
            xbl = XboxListenerLinux.XBoxListener(sample_rate)
            xbl.init()

            rot_yaw_rate = 0.0
            rot_pitch_rate = 0.0
            rot_roll_rate = 0.0
            vel_rate = 0.0
            TOP_RATE = 2/3*np.pi
            rpy = Vector3(0, 0, 0)
            rpy_t = Vector3(0, 0, 0)
            xyz = Vector3(self.cube.a, self.cube.b, self.cube.c)
            xyz_t = Vector3(self.cube.a, self.cube.b, self.cube.c)
            d_xyz = Vector3(0, 0, 0)
            cur_pose = Quaternion(1, 0, 0, 0)
            d_rpy = Vector3(0, 0, 0)

            # Need To implement full quaternion dynamics
            quat = np.matrix([1,0,0,0]).T
            pos = np.matrix([0,0,0]).T
            vel = np.matrix([0,0,0]).T
            R = np.matrix(np.eye(4))
            u = np.array([0,0,0,0]) # angular velocity and acceleration
            # 1) With input form rotation matrix 
            # 2) Apply rotation matrix to position and velocity updates
            # 3) Apply quaternion update formula for orientation

            t = time.time()
            while True:
                dt = 0.05  # Desired
                tnow = time.time()
                if tnow - t < dt:
                    time.sleep(dt - (tnow - t))
                else:
                    dt = tnow - t
                t = time.time()

                control = xbl.get()
                if control is not None: # new update
                    rot_yaw_rate = float(control['leftX'])
                    rot_pitch_rate = float(control['rightY'])
                    rot_roll_rate = float(control['rightX'])
                    acc_rate = float(control['leftY'])
                else:
                    rot_rate_yaw = 0
                    rot_pitch_rate = 0
                    rot_roll_rate = 0
                    acc_rate = 0
                # Need To implement full quaternion dynamics
                u[0] = TOP_RATE*rot_roll_rate
                u[1] = TOP_RATE*rot_pitch_rate
                u[2] = TOP_RATE*rot_yaw_rate
                u[3] = 40*acc_rate
                acc = np.matrix([0,0,u[3]]).T
                # Apply Quaternion Update:
                Omega = SO3.get_omega_matrix(u[0],u[1],u[2])
                #quat = quat + 1/2*dt*Omega*quat # ZOH -- qdot = .5*Omega*quat
                quat = la.expm(Omega*dt/2.0)*quat
                R = SO3.quaternion_to_rotation_matrix(np.array(quat))
                pos = pos + vel*dt + 1/2*dt**2*R*acc
                vel = vel + dt*R*acc

                xyz = Vector3(pos[0],pos[1],pos[2])
                pose = Quaternion(quat[0],quat[1],quat[2],quat[3])

                #print("Current Position", pos)
                #print("Current Pose", quat)
                if self.isGrid:
                    self.grid.draw(self.screen)
                # Draw Updates
                self.cube.draw(self.screen, pose, xyz)
                
                event = pygame.event.poll()
                if event.type == pygame.QUIT \
                    or (event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE):
                    break
                pygame.display.flip()
                pygame.time.delay(1) #Fast Update
                self.cube.erase(self.screen)
                #for c in cubes:
                #    c.erase(self.screen)

        elif self.control_method == 'imu':
            delay_sec = .05
            imuc = IMUListener.IMUListener(delay_sec)
            imuc.init()
            while True:
                control = imuc.get()
                print(control)
                if control is not None:
                    q = Quaternion(control["quatW"], control["quatX"], control["quatY"], control["quatZ"]).normalized()
                    posi = Vector3(0,0,0)
                    if self.isGrid:
                        self.grid.draw(self.screen)
                    self.cube.draw(self.screen,q,posi)       
                    event = pygame.event.poll()
                    if event.type == pygame.QUIT \
                        or (event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE):
                        break
                    pygame.display.flip()
                    pygame.time.delay(20) 
                    self.cube.erase(self.screen)
            
        else:
            print('invalid control input!')
Example #6
0
 def __init__(self, pos=None, rot=None, vel=None):
     self.pos = pos if pos is not None else Point3()
     self.rot = rot if rot is not None else Quaternion()
     self.vel = vel if vel is not None else Vector3()