167 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			167 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|  | import argparse | ||
|  | import time | ||
|  | 
 | ||
|  | import cv2 | ||
|  | import numpy as np | ||
|  | import placo | ||
|  | from mini_bdx_runtime.hwi import HWI | ||
|  | 
 | ||
|  | # from mini_bdx.hwi import HWI | ||
|  | from mini_bdx.utils.xbox_controller import XboxController | ||
|  | from mini_bdx.walk_engine import WalkEngine | ||
|  | 
 | ||
|  | parser = argparse.ArgumentParser() | ||
|  | parser.add_argument("-x", action="store_true", default=False) | ||
|  | args = parser.parse_args() | ||
|  | 
 | ||
|  | if args.x: | ||
|  |     xbox = XboxController() | ||
|  | 
 | ||
|  | 
 | ||
|  | hwi = HWI(usb_port="/dev/ttyUSB0") | ||
|  | 
 | ||
|  | max_target_step_size_x = 0.03 | ||
|  | max_target_step_size_y = 0.03 | ||
|  | max_target_yaw = np.deg2rad(15) | ||
|  | target_step_size_x = 0 | ||
|  | target_step_size_y = 0 | ||
|  | target_yaw = 0 | ||
|  | target_head_pitch = 0 | ||
|  | target_head_yaw = 0 | ||
|  | target_head_z_offset = 0 | ||
|  | time_since_last_left_contact = 0 | ||
|  | time_since_last_right_contact = 0 | ||
|  | walking = False | ||
|  | start_button_timeout = time.time() | ||
|  | 
 | ||
|  | robot = placo.RobotWrapper( | ||
|  |     "../../mini_bdx/robots/bdx/robot.urdf", placo.Flags.ignore_collisions | ||
|  | ) | ||
|  | 
 | ||
|  | walk_engine = WalkEngine( | ||
|  |     robot, | ||
|  |     frequency=1.5, | ||
|  |     swing_gain=0.0, | ||
|  |     default_trunk_x_offset=-0.013, | ||
|  |     default_trunk_z_offset=-0.023, | ||
|  |     target_trunk_pitch=-11.0, | ||
|  |     max_rise_gain=0.01, | ||
|  | ) | ||
|  | 
 | ||
|  | 
 | ||
|  | def xbox_input(): | ||
|  |     global target_step_size_x, target_step_size_y, target_yaw, walking, t, walk_engine, target_head_pitch, target_head_yaw, target_head_z_offset, start_button_timeout, max_target_step_size_x, max_target_step_size_y, max_target_yaw | ||
|  |     inputs = xbox.read() | ||
|  |     # print(inputs) | ||
|  |     target_step_size_x = -inputs["l_y"] * max_target_step_size_x | ||
|  |     target_step_size_y = inputs["l_x"] * max_target_step_size_y | ||
|  |     if inputs["l_trigger"] > 0.2: | ||
|  |         target_head_pitch = inputs["r_y"] / 2 * np.deg2rad(70) | ||
|  |         print("=== target head pitch", target_head_pitch) | ||
|  |         target_head_yaw = -inputs["r_x"] / 2 * np.deg2rad(150) | ||
|  |         target_head_z_offset = inputs["r_trigger"] * 4 * 0.2 | ||
|  |         print(target_head_z_offset) | ||
|  |         # print("======", target_head_z_offset) | ||
|  |     else: | ||
|  |         target_yaw = -inputs["r_x"] * max_target_yaw | ||
|  | 
 | ||
|  |     if inputs["start"] and time.time() - start_button_timeout > 0.5: | ||
|  |         walking = not walking | ||
|  |         start_button_timeout = time.time() | ||
|  | 
 | ||
|  | 
 | ||
|  | im = np.zeros((80, 80, 3), dtype=np.uint8) | ||
|  | 
 | ||
|  | 
 | ||
|  | # TODO | ||
|  | def get_imu(): | ||
|  |     return [0, 0, 0], [0, 0, 0] | ||
|  | 
 | ||
|  | 
 | ||
|  | # hwi.turn_off() | ||
|  | # exit() | ||
|  | hwi.turn_on() | ||
|  | time.sleep(1) | ||
|  | # hwi.goto_init() | ||
|  | # exit() | ||
|  | gyro = [0, 0.0, 0] | ||
|  | accelerometer = [0, 0, 0] | ||
|  | 
 | ||
|  | skip = 10 | ||
|  | prev = time.time() | ||
|  | while True: | ||
|  |     dt = time.time() - prev | ||
|  |     t = time.time() | ||
|  |     if args.x: | ||
|  |         xbox_input() | ||
|  | 
 | ||
|  |     # Get sensor data | ||
|  |     # gyro, accelerometer = get_imu() | ||
|  |     right_contact = abs(hwi.get_present_current("right_ankle")) > 1 | ||
|  |     left_contact = abs(hwi.get_present_current("left_ankle")) > 1 | ||
|  |     # print("left_contact", left_contact, "right_contact", right_contact) | ||
|  |     walk_engine.update( | ||
|  |         walking, | ||
|  |         gyro, | ||
|  |         accelerometer, | ||
|  |         left_contact, | ||
|  |         right_contact, | ||
|  |         target_step_size_x, | ||
|  |         target_step_size_y, | ||
|  |         target_yaw, | ||
|  |         target_head_pitch, | ||
|  |         target_head_yaw, | ||
|  |         target_head_z_offset, | ||
|  |         dt, | ||
|  |         ignore_feet_contact=True, | ||
|  |     ) | ||
|  |     angles = walk_engine.get_angles() | ||
|  | 
 | ||
|  |     if skip > 0: | ||
|  |         skip -= 1 | ||
|  |         continue | ||
|  |     hwi.set_position_all(angles) | ||
|  | 
 | ||
|  |     # print("-") | ||
|  |     cv2.imshow("image", im) | ||
|  |     key = cv2.waitKey(1) | ||
|  |     if key == ord("p"): | ||
|  |         # gyro[1] += 0.001 | ||
|  |         walk_engine.target_trunk_pitch += 0.1 | ||
|  |     if key == ord("o"): | ||
|  |         walk_engine.target_trunk_pitch -= 0.1 | ||
|  |         # gyro[1] -= 0.001 | ||
|  |     if key == ord("m"): | ||
|  |         walk_engine.max_rise_gain += 0.001 | ||
|  |     if key == ord("l"): | ||
|  |         walk_engine.max_rise_gain -= 0.001 | ||
|  |     if key == ord("b"): | ||
|  |         walk_engine.default_trunk_x_offset += 0.001 | ||
|  |     if key == ord("n"): | ||
|  |         walk_engine.default_trunk_x_offset -= 0.001 | ||
|  |     if key == ord("i"): | ||
|  |         walk_engine.default_trunk_z_offset += 0.001 | ||
|  |     if key == ord("u"): | ||
|  |         walk_engine.default_trunk_z_offset -= 0.001 | ||
|  |     if key == ord("f"): | ||
|  |         walk_engine.frequency -= 0.1 | ||
|  |     if key == ord("g"): | ||
|  |         walk_engine.frequency += 0.1 | ||
|  |     if key == ord("c"): | ||
|  |         walk_engine.swing_gain -= 0.001 | ||
|  |     if key == ord("v"): | ||
|  |         walk_engine.swing_gain += 0.001 | ||
|  |     if key == ord("w"): | ||
|  |         walking = not walking | ||
|  | 
 | ||
|  |     # print("gyro : ", gyro) | ||
|  |     # print("target_trunk pitch", walk_engine.trunk_pitch) | ||
|  |     # print("trunk x offset", walk_engine.default_trunk_x_offset) | ||
|  |     # print("trunk z offset", walk_engine.default_trunk_z_offset) | ||
|  |     # print("max rise gain", walk_engine.max_rise_gain) | ||
|  |     # print("frequency", walk_engine.frequency) | ||
|  |     # print("swing gain", walk_engine.swing_gain) | ||
|  |     # print("===") | ||
|  | 
 | ||
|  |     prev = t |