77 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			77 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import socket
 | |
| import time
 | |
| import numpy as np
 | |
| import pickle
 | |
| from queue import Queue
 | |
| from threading import Thread
 | |
| from scipy.spatial.transform import Rotation as R
 | |
| from FramesViewer.viewer import Viewer
 | |
| import argparse
 | |
| 
 | |
| 
 | |
| class IMUClient:
 | |
|     def __init__(self, host, port=1234, freq=30):
 | |
|         self.host = host
 | |
|         self.port = port
 | |
|         self.freq = freq
 | |
|         self.client_socket = socket.socket()
 | |
|         self.connected = False
 | |
|         while not self.connected:
 | |
|             try:
 | |
|                 self.client_socket.connect((self.host, self.port))
 | |
|                 self.connected = True
 | |
|             except Exception as e:
 | |
|                 print(e)
 | |
|                 time.sleep(0.5)
 | |
|         self.imu_queue = Queue(maxsize=1)
 | |
|         self.last_imu = [0, 0, 0, 0]
 | |
| 
 | |
|         Thread(target=self.imu_worker, daemon=True).start()
 | |
| 
 | |
|     def imu_worker(self):
 | |
|         while True:
 | |
|             try:
 | |
|                 data = self.client_socket.recv(1024)  # receive response
 | |
|                 data = pickle.loads(data)
 | |
| 
 | |
|                 self.imu_queue.put(data)
 | |
|             except:
 | |
|                 print("missed imu")
 | |
| 
 | |
|             time.sleep(1 / self.freq)
 | |
| 
 | |
|     def get_imu(self):
 | |
|         try:
 | |
|             self.last_imu = self.imu_queue.get(False)
 | |
|         except:
 | |
|             pass
 | |
| 
 | |
|         return self.last_imu
 | |
| 
 | |
| 
 | |
| if __name__ == "__main__":
 | |
| 
 | |
|     parser = argparse.ArgumentParser()
 | |
|     parser.add_argument("--ip", type=str, required=True, help="IP address of the robot")
 | |
|     args = parser.parse_args()
 | |
| 
 | |
|     client = IMUClient(args.ip)
 | |
| 
 | |
|     fv = Viewer()
 | |
|     fv.start()
 | |
|     pose = np.eye(4)
 | |
|     pose[:3, 3] = [0.1, 0.1, 0.1]
 | |
|     try:
 | |
|         while True:
 | |
|             quat = client.get_imu()
 | |
|             try:
 | |
|                 rot_mat = R.from_quat(quat).as_matrix()
 | |
|                 pose[:3, :3] = rot_mat
 | |
|                 fv.pushFrame(pose, "pose")
 | |
|             except Exception as e:
 | |
|                 print("error", e)
 | |
|                 pass
 | |
|             time.sleep(1 / 30)
 | |
|     except KeyboardInterrupt:
 | |
|         pass
 |