mirror of
https://github.com/apirrone/Open_Duck_Mini_Runtime.git
synced 2025-09-04 04:04:02 +00:00
103 lines
2.9 KiB
Python
103 lines
2.9 KiB
Python
"""
|
|
Sets up the robot in init position, you control the head with the xbox controller
|
|
"""
|
|
|
|
import time
|
|
import numpy as np
|
|
from mini_bdx_runtime.rustypot_position_hwi import HWI
|
|
from mini_bdx_runtime.duck_config import DuckConfig
|
|
from mini_bdx_runtime.xbox_controller import XBoxController
|
|
|
|
|
|
from mini_bdx_runtime.eyes import Eyes
|
|
from mini_bdx_runtime.sounds import Sounds
|
|
from mini_bdx_runtime.antennas import Antennas
|
|
from mini_bdx_runtime.projector import Projector
|
|
|
|
duck_config = DuckConfig()
|
|
|
|
xbox_controller = XBoxController(50, only_head_control=True)
|
|
|
|
if duck_config.speaker:
|
|
sounds = Sounds(volume=1.0, sound_directory="../mini_bdx_runtime/assets/")
|
|
if duck_config.antennas:
|
|
antennas = Antennas()
|
|
if duck_config.eyes:
|
|
eyes = Eyes()
|
|
if duck_config.projector:
|
|
projector = Projector()
|
|
|
|
hwi = HWI(duck_config)
|
|
|
|
kps = [8] * 14
|
|
kds = [0] * 14
|
|
|
|
hwi.set_kps(kps)
|
|
hwi.set_kds(kds)
|
|
hwi.turn_on()
|
|
|
|
limits = {
|
|
"neck_pitch": [-20, 60],
|
|
"head_pitch": [-60, 45],
|
|
"head_yaw": [-60, 60],
|
|
"head_roll": [-20, 20],
|
|
}
|
|
|
|
try:
|
|
while True:
|
|
|
|
last_commands, buttons, left_trigger, right_trigger = (
|
|
xbox_controller.get_last_command()
|
|
)
|
|
|
|
l_x = last_commands[5]
|
|
l_y = last_commands[4]
|
|
r_x = last_commands[6]
|
|
# r_y = last_commands[3]
|
|
|
|
head_yaw_deg = (
|
|
l_x * (limits["head_yaw"][1] - limits["head_yaw"][0]) / 2
|
|
+ (limits["head_yaw"][1] + limits["head_yaw"][0]) / 2
|
|
)
|
|
head_yaw_pos_rad = np.deg2rad(head_yaw_deg)
|
|
|
|
head_roll_deg = (
|
|
r_x * (limits["head_roll"][1] - limits["head_roll"][0]) / 2
|
|
+ (limits["head_roll"][1] + limits["head_roll"][0]) / 2
|
|
)
|
|
head_roll_pos_rad = np.deg2rad(head_roll_deg)
|
|
|
|
head_pitch_deg = (
|
|
l_y * (limits["head_pitch"][1] - limits["head_pitch"][0]) / 2
|
|
+ (limits["head_pitch"][1] + limits["head_pitch"][0]) / 2
|
|
)
|
|
head_pitch_pos_rad = np.deg2rad(head_pitch_deg)
|
|
|
|
# neck_pitch_deg = (
|
|
# -r_y * (limits["neck_pitch"][1] - limits["neck_pitch"][0]) / 2
|
|
# + (limits["neck_pitch"][1] + limits["neck_pitch"][0]) / 2
|
|
# )
|
|
# neck_pitch_pos_rad = np.deg2rad(neck_pitch_deg)
|
|
|
|
hwi.set_position("head_yaw", head_yaw_pos_rad)
|
|
hwi.set_position("head_roll", head_roll_pos_rad)
|
|
hwi.set_position("head_pitch", head_pitch_pos_rad)
|
|
# hwi.set_position("neck_pitch", neck_pitch_pos_rad)
|
|
|
|
if duck_config.antennas:
|
|
antennas.set_position_left(right_trigger)
|
|
antennas.set_position_right(left_trigger)
|
|
|
|
if buttons.B.triggered:
|
|
if duck_config.speaker:
|
|
sounds.play_random_sound()
|
|
|
|
if buttons.X.triggered:
|
|
if duck_config.projector:
|
|
projector.switch()
|
|
|
|
# pygame.event.pump() # process event queue
|
|
time.sleep(1 / 60)
|
|
except KeyboardInterrupt:
|
|
if duck_config.antennas:
|
|
antennas.stop()
|