95 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			95 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import os
 | |
| import time
 | |
| import numpy
 | |
| import argparse
 | |
| import itertools
 | |
| 
 | |
| from pypot.dynamixel import DxlIO, get_available_ports
 | |
| from pypot.dynamixel.protocol.v1 import DxlReadDataPacket, DxlSyncWritePacket
 | |
| from pypot.dynamixel.conversion import dxl_code
 | |
| 
 | |
| 
 | |
| def timeit(rw_func, N, destfile):
 | |
|     dt = []
 | |
|     for _ in range(N):
 | |
|         start = time.time()
 | |
|         rw_func()
 | |
|         end = time.time()
 | |
| 
 | |
|         dt.append(end - start)
 | |
| 
 | |
|     # We'll use raw file instead of numpy because of pypy
 | |
|     with open(destfile, 'w') as f:
 | |
|         f.write(str(dt))
 | |
| 
 | |
|     return numpy.mean(dt)
 | |
| 
 | |
| if __name__ == '__main__':
 | |
|     parser = argparse.ArgumentParser()
 | |
|     parser.add_argument('-l', '--log-folder',
 | |
|                         type=str, required=True)
 | |
|     parser.add_argument('-N', type=int, required=True)
 | |
|     args = parser.parse_args()
 | |
| 
 | |
|     bp = args.log_folder
 | |
|     if os.path.exists(bp):
 | |
|         raise IOError('Folder already exists: {}'.format(bp))
 | |
|     os.mkdir(bp)
 | |
| 
 | |
|     available_ports = get_available_ports()
 | |
| 
 | |
|     port = available_ports[0]
 | |
|     print('Connecting on port {}.'.format(port))
 | |
|     dxl = DxlIO(port)
 | |
| 
 | |
|     print('Scanning motors on the bus...')
 | |
|     ids = dxl.scan()
 | |
|     print('Found {}'.format(ids))
 | |
| 
 | |
|     ids = ids[:1]
 | |
|     print('Will use id: {}'.format(ids))
 | |
| 
 | |
|     if dxl.get_return_delay_time(ids)[0] != 0:
 | |
|         raise IOError('Make sure your motor has return delay time set to 0')
 | |
| 
 | |
|     print('Start testing !')
 | |
| 
 | |
|     print('Using "normal" pypot package...')
 | |
|     def rw_pypot():
 | |
|         dxl.get_present_position(ids)
 | |
|         dxl.set_goal_position(dict(zip(ids, itertools.repeat(0))))
 | |
| 
 | |
|     dt = timeit(rw_pypot, args.N, os.path.join(bp, 'rw_pypot.list'))
 | |
|     print('in {}ms'.format(dt * 1000))
 | |
| 
 | |
|     print('Using pref-forged packet...')
 | |
|     c_get = [c for c in DxlIO._AbstractDxlIO__controls
 | |
|              if c.name == 'present position'][0]
 | |
| 
 | |
|     c_set = [c for c in DxlIO._AbstractDxlIO__controls
 | |
|              if c.name == 'goal position'][0]
 | |
| 
 | |
|     pos = dxl_code(0, c_set.length)
 | |
|     rp = DxlReadDataPacket(ids[0], c_get.address, c_get.length)
 | |
|     sp = DxlSyncWritePacket(c_set.address, c_set.length, ids[:1] + list(pos))
 | |
| 
 | |
|     def rw_forged_packet():
 | |
|         dxl._send_packet(rp)
 | |
|         dxl._send_packet(sp, wait_for_status_packet=False)
 | |
| 
 | |
|     dt = timeit(rw_forged_packet, args.N, os.path.join(bp, 'rw_forged.list'))
 | |
|     print('in {}ms'.format(dt * 1000))
 | |
| 
 | |
|     print('Using raw serial communication...')
 | |
|     s_read = rp.to_string()
 | |
|     s_write = sp.to_string()
 | |
| 
 | |
|     def rw_serial():
 | |
|         dxl._serial.write(s_read)
 | |
|         dxl._serial.read(8)
 | |
|         dxl._serial.write(s_write)
 | |
|     dt = timeit(rw_serial, args.N, os.path.join(bp, 'rw_serial.list'))
 | |
|     print('in {}ms'.format(dt * 1000))
 | |
| 
 | |
|     print('Done !')
 |