From 835144eff57c87ff43d92d2c7066bbfef01f3703 Mon Sep 17 00:00:00 2001 From: Santiago Carrion Date: Wed, 14 Feb 2018 20:52:02 +0100 Subject: [PATCH 1/2] Improves in color detection --- .../data/test_cat_mouse_2.sb2 | Bin 0 -> 74092 bytes .../scripts/scratch2python.py | 36 ++++++-- .../src/scratch2jderobot/drone.py | 19 +++++ .../src/scratch2jderobot/test_cat_mouse_2.py | 80 ++++++++++++++++++ .../scratch2jderobot/test_drone_blocks_4.py | 2 - .../scratch2jderobot/test_robot_blocks_1.py | 1 + 6 files changed, 128 insertions(+), 10 deletions(-) create mode 100644 src/tools/scratch2jderobot/data/test_cat_mouse_2.sb2 create mode 100755 src/tools/scratch2jderobot/src/scratch2jderobot/test_cat_mouse_2.py diff --git a/src/tools/scratch2jderobot/data/test_cat_mouse_2.sb2 b/src/tools/scratch2jderobot/data/test_cat_mouse_2.sb2 new file mode 100644 index 0000000000000000000000000000000000000000..1febae9b04c99430b4bfbad44487521547db2d02 GIT binary patch literal 74092 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 Z`7hmU)l?8aUH)VohJuDCCwx-#{{!aiTs{B* literal 0 HcmV?d00001 diff --git a/src/tools/scratch2jderobot/scripts/scratch2python.py b/src/tools/scratch2jderobot/scripts/scratch2python.py index 91d26bd07..6ea6f8e17 100755 --- a/src/tools/scratch2jderobot/scripts/scratch2python.py +++ b/src/tools/scratch2jderobot/scripts/scratch2python.py @@ -60,11 +60,25 @@ def is_conditional(sentence): @param sentence: The sentence to check. @return: True if it has a conditional, False otherwise. """ - if "if" in sentence: return True return False + + +def is_list(sentence): + """ + Returns if a sentence use list or not. + + @param sentence: The sentence to check. + @return: True if it has a list, False otherwise. + """ + if "insert" in sentence: + return True + if "add" in sentence: + return True + + return False def similar(a, b): @@ -210,18 +224,24 @@ def execute(robot):\n\ python_program = "" for s in sentences: - # count number of tabs - num_tabs = s.replace(' ', tab_seq).count(tab_seq) - python_program += tab_seq * (num_tabs + 1) - # pre-processing if there is a condition (operators and types) if is_conditional(s): s = s.replace("'", "").replace("=", "==") - # mapping original, translation = sentence_mapping(s) - # print original, translation - # set the code + + # count number of tabs + num_tabs = s.replace(' ', tab_seq).count(tab_seq) + + # check if there is list + + if is_list(s): + python_program += tab_seq * (num_tabs + 1) + python_program += translation.split(".")[0]+" = []\n\t" + + python_program += tab_seq * (num_tabs + 1) + + # set the code if translation != None: python_program += translation else: diff --git a/src/tools/scratch2jderobot/src/scratch2jderobot/drone.py b/src/tools/scratch2jderobot/src/scratch2jderobot/drone.py index 2d3d9acd9..6f0ac9e59 100755 --- a/src/tools/scratch2jderobot/src/scratch2jderobot/drone.py +++ b/src/tools/scratch2jderobot/src/scratch2jderobot/drone.py @@ -6,6 +6,7 @@ import imutils import cv2 + from parallelIce.cameraClient import CameraClient from parallelIce.cmdvel import CMDVel from parallelIce.extra import Extra @@ -47,6 +48,7 @@ def __init__(self, jdrc): """ #variables + self.frontalCamera = False #get clients self.__pose3d_client = jdrc.getPose3dClient("drone.Pose3D") @@ -64,6 +66,20 @@ def close(self): self.__navdata_client.stop() self.__pose3d_client.stop() + def run_once(self,f): + def wrapper(*args, **kwargs): + if not wrapper.has_run: + wrapper.has_run = True + return f(*args, **kwargs) + + wrapper.has_run = False + return wrapper + + + def toggleCam(self): + self.frontalCamera = True + self.__extra_client.toggleCam() + def detect_object(self, color): """ @@ -73,6 +89,9 @@ def detect_object(self, color): @return: size and center of the object detected in the frame """ + + if not self.frontalCamera: + self.toggleCam() # define the lower and upper boundaries of the basic colors GREEN_RANGE = ((29, 86, 6), (64, 255, 255)) RED_RANGE = ((139, 0, 0), (255, 160, 122)) diff --git a/src/tools/scratch2jderobot/src/scratch2jderobot/test_cat_mouse_2.py b/src/tools/scratch2jderobot/src/scratch2jderobot/test_cat_mouse_2.py new file mode 100755 index 000000000..9709ea433 --- /dev/null +++ b/src/tools/scratch2jderobot/src/scratch2jderobot/test_cat_mouse_2.py @@ -0,0 +1,80 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import time +import config +import sys +import comm +import os +import yaml + +from drone import Drone +from robot import Robot + +def execute(robot): + try: + robot.take_off() + while True: + mylist = [] + mylist.insert(0, robot.detect_object("red")) + size = mylist[0][0] + x = mylist[0][1] + y = mylist[0][2] + if size > 0: + if size > 700: + robot.move("back", 2) + else: + robot.move("forward", 2) + + if x > 165: + robot.turn("right", 2) + else: + robot.turn("left", 2) + + if y > 110: + robot.move("down", 1) + else: + robot.move("up", 1) + + else: + robot.stop() + robot.turn("left", 2) + + + except KeyboardInterrupt: + raise + +if __name__ == '__main__': + if len(sys.argv) == 2: + path = os.getcwd() + open_path = path[:path.rfind('src')] + 'cfg/' + filename = sys.argv[1] + + else: + sys.exit("ERROR: Example:python my_generated_script.py cfgfile.yml") + + # loading the ICE and ROS parameters + cfg = config.load(open_path + filename) + stream = open(open_path + filename, "r") + yml_file = yaml.load(stream) + + for section in yml_file: + if section == 'drone': + #starting comm + jdrc = comm.init(cfg,'drone') + + # creating the object + robot = Drone(jdrc) + + break + elif section == 'robot': + #starting comm + jdrc = comm.init(cfg,'robot') + + # creating the object + robot = Robot(jdrc) + + break + # executing the scratch program + execute(robot) + diff --git a/src/tools/scratch2jderobot/src/scratch2jderobot/test_drone_blocks_4.py b/src/tools/scratch2jderobot/src/scratch2jderobot/test_drone_blocks_4.py index 6133a8673..11e59ac83 100755 --- a/src/tools/scratch2jderobot/src/scratch2jderobot/test_drone_blocks_4.py +++ b/src/tools/scratch2jderobot/src/scratch2jderobot/test_drone_blocks_4.py @@ -10,7 +10,6 @@ from drone import Drone from robot import Robot -from mylist import MyList def execute(robot): try: @@ -38,7 +37,6 @@ def execute(robot): raise if __name__ == '__main__': - mylist=MyList() if len(sys.argv) == 2: path = os.getcwd() open_path = path[:path.rfind('src')] + 'cfg/' diff --git a/src/tools/scratch2jderobot/src/scratch2jderobot/test_robot_blocks_1.py b/src/tools/scratch2jderobot/src/scratch2jderobot/test_robot_blocks_1.py index ff53cc197..c547be8eb 100755 --- a/src/tools/scratch2jderobot/src/scratch2jderobot/test_robot_blocks_1.py +++ b/src/tools/scratch2jderobot/src/scratch2jderobot/test_robot_blocks_1.py @@ -10,6 +10,7 @@ from drone import Drone from robot import Robot + def execute(robot): try: robot.move("forward") From 0aa74acda946801ab18a7cbef64e166bd8462996 Mon Sep 17 00:00:00 2001 From: Santiago Carrion Date: Wed, 14 Feb 2018 20:56:30 +0100 Subject: [PATCH 2/2] small fix --- .../scratch2jderobot/src/scratch2jderobot/drone.py | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/tools/scratch2jderobot/src/scratch2jderobot/drone.py b/src/tools/scratch2jderobot/src/scratch2jderobot/drone.py index 6f0ac9e59..13a04f7fe 100755 --- a/src/tools/scratch2jderobot/src/scratch2jderobot/drone.py +++ b/src/tools/scratch2jderobot/src/scratch2jderobot/drone.py @@ -66,16 +66,6 @@ def close(self): self.__navdata_client.stop() self.__pose3d_client.stop() - def run_once(self,f): - def wrapper(*args, **kwargs): - if not wrapper.has_run: - wrapper.has_run = True - return f(*args, **kwargs) - - wrapper.has_run = False - return wrapper - - def toggleCam(self): self.frontalCamera = True self.__extra_client.toggleCam()