Source code for cozmo_taste_game.robot.cozmo_robot

from .robot import Robot
from cozmo.util import degrees
from cozmo.world import EvtNewCameraImage
from random import randint, getrandbits
from cozmo.anim import Triggers


[docs]class CozmoRobot(Robot): """Wrapper class for a :class:`cozmo.robot.Robot`""" def __init__(self, cozmo): self.cozmo = cozmo self.current_angle = 0
[docs] def add_event_handler(self, on_new_camera_image) -> None: self.cozmo.add_event_handler(EvtNewCameraImage, on_new_camera_image)
[docs] def set_start_position(self) -> None: """Sets the start position. :return: None """ self.cozmo.set_head_angle(degrees(0)).wait_for_completed() self.cozmo.set_lift_height(0.0).wait_for_completed()
[docs] def speak(self, text: str) -> None: """Wrapper method for :meth:`~cozmo.robot.Robot.say_text`. :param text: The text to say :return: None """ self.cozmo.say_text(str(text)).wait_for_completed()
[docs] def turn_in_place(self) -> None: """Wrapper method for :meth:`~cozmo.robot.Robot.turn_in_place`. :return: None """ rotation_amount = self.__get_rotation_amount() self.current_angle += rotation_amount self.cozmo.turn_in_place(degrees(rotation_amount)).wait_for_completed()
def __get_rotation_amount(self) -> int: """Gets an amount to rotate. :return: The amount to rotate """ min_rotate_angle = -10 max_rotate_angle = 10 if self.current_angle <= min_rotate_angle: rotation_amount = 5 + randint(0, 7) elif self.current_angle >= max_rotate_angle: rotation_amount = -5 - randint(0, 7) else: rotation_amount = 5 if getrandbits(1) == 0 else -5 if rotation_amount < 0: rotation_amount -= randint(0, 7) else: rotation_amount += randint(0, 7) return rotation_amount
[docs] def react_positively(self) -> None: """Performs a positive reaction. Chooses a random number from 0 to 4 and plays reaction that is tied to that number. :return: None """ positive_reactions = [ Triggers.MajorWin, Triggers.CodeLabHappy, Triggers.CodeLabYes, Triggers.CodeLabAmazed, Triggers.CodeLabCelebrate ] num = randint(0, 4) if num == 0: self.speak("That is Perfect!") self.__play_animation(positive_reactions[num]) elif num == 1: self.__play_animation(positive_reactions[num]) self.speak("Thank you!") elif num == 2: self.__play_animation(Triggers.CodeLabCurious) self.__play_animation(positive_reactions[num]) elif num == 3: self.__play_animation(positive_reactions[num]) else: self.speak("Yes, you got it!") self.__play_animation(positive_reactions[num])
[docs] def react_negatively(self) -> None: """Performs a negative reaction. Chooses a random number from 0 to 4 and plays reaction that is tied to that number. :return: None """ negative_reactions = [ Triggers.MajorFail, Triggers.CubeMovedUpset, Triggers.CodeLabUnhappy, Triggers.PounceFail, Triggers.CodeLabBored ] num = randint(0, 4) if num == 0: self.__play_animation(negative_reactions[num]) self.speak("I don't need that") elif num == 1: self.__play_animation(negative_reactions[num]) self.speak("Try again please.") elif num == 2: self.__play_animation(Triggers.CodeLabCurious) self.speak("No") self.__play_animation(negative_reactions[num]) elif num == 3: self.speak("That's not what I want.") self.__play_animation(negative_reactions[num]) else: self.__play_animation(negative_reactions[num])
[docs] def check_plate_and_celebrate(self, distance, speed, deg) -> None: """ :param distance: distance to drive in mm :param speed: speed that cozmo will drive :param deg: degrees cozmo will turn :return: None """ # self.speak("Congratulations, you filled up the plate!") self.cozmo.turn_in_place(degrees(deg)).wait_for_completed() # self.cozmo.drive_straight(distance_mm(distance), speed_mmps(speed)).wait_for_completed() self.cozmo.play_anim_trigger(Triggers.PopAWheelieInitial, ignore_body_track=True).wait_for_completed() self.cozmo.play_anim_trigger(Triggers.FeedingAteFullEnough_Normal).wait_for_completed() self.cozmo.play_anim_trigger(Triggers.DriveEndHappy).wait_for_completed()
def __play_animation(self, anim_trigger) -> None: """Wrapper method for :meth:`~cozmo.robot.Robot.play_anim_trigger`. :param anim_trigger: The animation to perform :return: None """ self.cozmo.play_anim_trigger(anim_trigger, ignore_body_track=True).wait_for_completed()