From c9cb0ac44d3f009532a697d0bd7775d25991fed4 Mon Sep 17 00:00:00 2001 From: pal <you@example.com> Date: Wed, 15 Jul 2020 00:02:24 +0200 Subject: [PATCH] Publisher of board_state and token detected --- CMakeLists.txt | 8 +- launch/board_state.launch | 24 +++ msg/{StrList.msg => BoardMsg.msg} | 0 msg/TokenMsg.msg | 4 + package.xml | 4 +- setup.py | 6 + sounds/beep.mp3 | Bin 0 -> 30269 bytes sounds/pair.ogg | Bin 0 -> 17645 bytes src/board_state/__init__.py | 0 src/board_state/main.py | 318 ++++++++++++++++++++++++++++++ 10 files changed, 358 insertions(+), 6 deletions(-) create mode 100644 launch/board_state.launch rename msg/{StrList.msg => BoardMsg.msg} (100%) create mode 100644 msg/TokenMsg.msg create mode 100644 setup.py create mode 100644 sounds/beep.mp3 create mode 100644 sounds/pair.ogg create mode 100644 src/board_state/__init__.py create mode 100755 src/board_state/main.py diff --git a/CMakeLists.txt b/CMakeLists.txt index c34b007..b0b539b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 2.8.3) -project(board_status) +project(board_state) ## Compile as C++11, supported in ROS Kinetic and newer # add_compile_options(-std=c++11) @@ -21,7 +21,7 @@ find_package(catkin REQUIRED COMPONENTS ## Uncomment this if the package has a setup.py. This macro ensures ## modules and global scripts declared therein get installed ## See http://ros.org/doc/api/catkin/html/user_guide/setup_dot_py.html -# catkin_python_setup() +catkin_python_setup() ################################################ ## Declare ROS messages, services and actions ## @@ -50,8 +50,8 @@ find_package(catkin REQUIRED COMPONENTS ## Generate messages in the 'msg' folder add_message_files( FILES - StrList.msg -# Message2.msg + TokenMsg.msg + BoardMsg.msg ) ## Generate services in the 'srv' folder diff --git a/launch/board_state.launch b/launch/board_state.launch new file mode 100644 index 0000000..0acf3fa --- /dev/null +++ b/launch/board_state.launch @@ -0,0 +1,24 @@ +<launch> + <node pkg="board_state" type="main.py" name="board_state" output="screen"/> + + <!-- Initial tokens locations --> + <rosparam param="initial_board"> + {'1': '0', "2": '0', "3": '0', "4": '0', "5": '0', + "6": '0', "7": '0', "8": '0', "9": '0', "10": '0', + "11": '1', "12": '2', "13": '3', "14": '4', "15": '5', + "16": '6', "17": '7', "18": '8', "19": '9', "20": '10'} + </rosparam> + + + + <rosparam param="tokens_number"> + [ '111', '158', '183','192', '253','328', '376', '394', '449','463', '475', '486','517', '744', '819'] + </rosparam> + + <rosparam param="rfid_id"> + 3581181951 3306978559 894864895 2247134207 1439793151 3315042303 1972340735 2768466943 2509992703 2777051135 4117136895 3852242175 88436991 2504166399 356806911 +</rosparam> + + + +</launch> diff --git a/msg/StrList.msg b/msg/BoardMsg.msg similarity index 100% rename from msg/StrList.msg rename to msg/BoardMsg.msg diff --git a/msg/TokenMsg.msg b/msg/TokenMsg.msg new file mode 100644 index 0000000..2daae82 --- /dev/null +++ b/msg/TokenMsg.msg @@ -0,0 +1,4 @@ +string[] detected_token +bool picked +bool placed +bool moved_back diff --git a/package.xml b/package.xml index a7288bb..d5735f1 100644 --- a/package.xml +++ b/package.xml @@ -1,8 +1,8 @@ <?xml version="1.0"?> <package format="2"> - <name>board_status</name> + <name>board_state</name> <version>0.0.0</version> - <description>The board_status package</description> + <description>The board_state package</description> <!-- One maintainer tag required, multiple allowed, one person per tag --> <!-- Example: --> diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..95d8db3 --- /dev/null +++ b/setup.py @@ -0,0 +1,6 @@ +from distutils.core import setup +from catkin_pkg.python_setup import generate_distutils_setup + +d = generate_distutils_setup(packages=['board_state'], package_dir={'':'src'}) + +setup(**d) diff --git a/sounds/beep.mp3 b/sounds/beep.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..51e0670aeaa0c0cc200a66abe99ce6241125dac6 GIT binary patch literal 30269 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 literal 0 HcmV?d00001 diff --git a/sounds/pair.ogg b/sounds/pair.ogg new file mode 100644 index 0000000000000000000000000000000000000000..4a592345fe829e49ce97137424b1ae7eb8f755cb GIT binary patch literal 17645 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 literal 0 HcmV?d00001 diff --git a/src/board_state/__init__.py b/src/board_state/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/board_state/main.py b/src/board_state/main.py new file mode 100755 index 0000000..f616afb --- /dev/null +++ b/src/board_state/main.py @@ -0,0 +1,318 @@ +#!/usr/bin/python +import os +#This is necessary to import code that is not rosbased in the main.py +path = os.path.abspath(__file__) +dir_path = os.path.dirname(path) +parent_dir_of_file = os.path.dirname(dir_path) +parent_parent_dir_of_file = os.path.dirname(parent_dir_of_file) + + +#ros import +import time +import rospy +from std_msgs.msg import String, Int8 +import pygame + + +from iri_rfid_board_scanner.msg import BoardIds +from board_state.msg import TokenMsg +from board_state.msg import BoardMsg + +class BoardGame(): + def __init__(self): + rospy.init_node('big_hero', anonymous=True) + # subscriber for getting info from the board + rospy.Subscriber("/rfid_board_scanner/board_ids", BoardIds, self.get_electro_board_callback) + + self.electro_board = list() + self.electro_board_with_tokens = dict() + self.current_board = dict() + self.initial_board = dict() + self.placed_token = (0,0,0) + self.picked_token = (0,0) + + #getting the ids from the rfids sensors + self.ids = list(map(int, rospy.get_param('/rfid_id').split())) + self.ids = [ int(self.ids[i]) for i in range(len(self.ids))] + + #get the numbers for playing the game + self.tokens = rospy.get_param('tokens_number') + #coupling ids with numbers + self.electro_board_from_ids_to_tokens = self.convert_electro_board_ids_to_tokens(self.ids, self.tokens) + + def play_sound(self, file_path, sleep): + ''' + play a sound using pygame + ''' + pygame.mixer.init() + # pygame.mixer.music.load(parent_dir_of_file+'/sounds/wrong_move_trim.mp3') + pygame.mixer.music.load(parent_parent_dir_of_file + file_path) + pygame.mixer.music.play(0) + time.sleep(sleep) + + def get_tokens_id(self): + ''' + get the tokens id from the board + ''' + return self.tokens + + def get_initial_board(self): + ''' + get initial board status + ''' + return self.initial_board.copy() + + #get value from the topic + def get_electro_board_ids(self): + ''' + get the ids from the board, these ids need to be converted to the id on the top of the token + ''' + return self.electro_board + + #topic subscriber + def get_electro_board_callback(self, msg): + '''callback from the topic subscriber''' + self.electro_board = (msg.id) + + def get_electro_board(self): + '''get the board with the correct ids on the top''' + return self.get_tokens_by_ids(self.electro_board_from_ids_to_tokens, self.electro_board) + + def convert_electro_board_ids_to_tokens(self, ids, tokens): + ''' + :param ids: + :param tokens: + :return: this method creates a dic where the ids are the keys and the values are the tokens + ''' + from_ids_to_tokens = dict() + for i in range(len(ids)): + from_ids_to_tokens[ids[i]] = tokens[i] + return from_ids_to_tokens + + def get_tokens_by_ids(self, from_ids_to_tokens_dict, msg): + ''' + :param electro_board: + :param msg: + :return: given a dictionary where key is the id and value is the token change the msg according (0 empty !0 a token id) + ''' + for i in range(len(msg)): + if msg[i] == 0: + # i+1 because the id start + self.electro_board_with_tokens[i+1] = '0' + else: + self.electro_board_with_tokens[i+1] = from_ids_to_tokens_dict.get(msg[i]) + return self.electro_board_with_tokens + + def get_token_location_from_board_state(self, previous_board, token): + ''' + :param: token + :return: the location of the token given as input + ''' + for key, val in previous_board.items(): + if val == token: + return key + + def detect_grasped_token(self, previous_board, current_board): + ''' + this function detects if a token has been picked + Args: + previous_board: the status of the board at time t-1 + current_board: the status of the board at time t + ''' + + picked_token = None + for k in current_board.keys(): + if current_board.get(k) == '0' and previous_board.get(k) != current_board.get(k): + # if the location now is empty check where it was before + token_id = previous_board.get(k) + location = k + picked_token = (str(token_id), str(location)) + return picked_token + + def detect_placed_token(self, picked_token, current_board): + ''' + this function detects when token has been placed on the board + Args: + picked_token: the token the user has picked + current_board: the status of the board at time t + ''' + token_id, loc_from = picked_token + move_it_back = False + placed_token = () + for key, val in current_board.items(): + if token_id == val and str(key) != loc_from: + loc_to = key + print("placed in a different location") + placed_token = (str(token_id), str(loc_from), str(loc_to)) + elif token_id == val and str(key) == loc_from: + loc_to = key + print("placed in the same location") + placed_token = (str(token_id), str(loc_from), str(loc_to)) + move_it_back = True + return placed_token, move_it_back + + def detect_move(self, previous_board, current_board): + ''' + this function detects if a token has moved from loc_from to loc_to + Args: + previous_board: the status of the board at time t-1 + current_board: the status of the board at time t + ''' + + move = () + new_location = 0 + for x1 in previous_board.keys(): + z = current_board.get(x1) == previous_board.get(x1) + if not z: + #print('location', x1) + if (current_board.get(x1))!='0': + token = (current_board.get(x1)) + #check where the token is in the new configuration + prev_location = self.get_token_location_from_board_state(previous_board, token) + for key, value in current_board.items(): + if token == value and prev_location !=key: + new_location = key + move = (token, prev_location, new_location) + return move + + def get_current_board(self): + '''get the current board status''' + self.current_board = self.get_electro_board() + return self.current_board.copy() + + def update_board(self, token_id, location): + ''' + update the current board given a token and a location + Args + token_id: the number + location: its location + Return: + a board with the token token_id in location location + ''' + if type(token_id)!=str: + token_id = str(token_id) + + + for loc, token in self.current_board.items(): + if token == (token_id): + self.current_board[loc] = '0' + + for key in self.current_board.keys(): + if location == key: + self.current_board[key] = token_id + + + +def wait_for_subscribers(publisher): + wait_rate = rospy.Rate(20) + while not publisher.get_num_connections(): + wait_rate.sleep() + + +def main(): + board_game = BoardGame() + ############################################################### + rospy.init_node('big_hero', anonymous=True) + pub_move = rospy.Publisher('detected_move', TokenMsg, queue_size=10) + pub_board_status = rospy.Publisher('board_status', BoardMsg, queue_size=10) + rate = rospy.Rate(10) # 10hz + event_counter = 0 + #this is necessary in order to give the time to the board to start publishing + rospy.sleep(2) + + #initialise the publisher and the board + wait_for_subscribers(pub_move) + msg_move = TokenMsg() + msg_move.detected_token = [] + msg_move.picked = False + msg_move.placed = False + msg_move.moved_back = False + pub_move.publish(msg_move) + + wait_for_subscribers(pub_board_status) + + initial_board = board_game.get_current_board() + current_board = initial_board + msg_board = BoardMsg() + msg_board.data = current_board.values() + pub_board_status.publish(msg_board) + + token_picked = False + while not rospy.is_shutdown(): + detected_board = board_game.get_current_board() + msg_board.data = detected_board.values() + pub_board_status.publish(msg_board) + + + #check if a token has been picked + picked_token = board_game.detect_grasped_token(current_board, detected_board) + + #if a token has been picked + if (picked_token)!=None: + print("current ", current_board) + print("detected ", detected_board) + print("grasped token:", picked_token) + + #prepare the message and publish it + msg_move.detected_token = picked_token + msg_move.picked = True + #detected_board.values() + board_game.play_sound("/sounds/pull-out.ogg", 0.2) + pub_move.publish(msg_move) + event_counter += 1 + rate.sleep() + current_board = board_game.get_current_board() + msg_board.data = current_board.values() + pub_board_status.publish(msg_board) + board_game.picked_token = picked_token + #print("token {}, from {}, to {}".format(detected_action[1], detected_action[2], detected_action[3])) + print("***********************************") + print("Picked token " + str(msg_move.detected_token)) + print("Picked "+ str(msg_move.picked)) + print("Placed " + str(msg_move.placed)) + print("Moved back " + str(msg_move.moved_back)) + print("***********************************") + token_picked = True + + #check when a picked token is going to be placed by the user + elif (token_picked): + placed_token, moved_back = board_game.detect_placed_token(board_game.picked_token, detected_board) + if len(placed_token)>0: + board_game.play_sound("/sounds/pull-out.ogg", 0.2) + msg_move.detected_token = placed_token + msg_move.picked = False + msg_move.placed = True + msg_move.moved_back = moved_back + pub_move.publish(msg_move) + event_counter += 1 + rate.sleep() + current_board = board_game.get_current_board() + msg_board.data = current_board.values() + pub_board_status.publish(msg_board) + board_game.placed_token = placed_token + token_picked = False + print("***********************************") + print("Picked token " + str(msg_move.detected_token)) + print("Picked " + str(msg_move.picked)) + print("Placed " + str(msg_move.placed)) + print("Moved back " + str(msg_move.moved_back)) + print("***********************************") + else: + msg_move.detected_token = [] + msg_move.picked = False + msg_move.placed = False + msg_move.moved_back = False + + +if __name__ == '__main__': + try: + main() + except rospy.ROSInterruptException: + pass + + + + + + + -- GitLab