Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 import rospy
00015 import rocon_python_utils
00016 import gazebo_msgs.srv as gazebo_srvs
00017 from gateway_msgs.msg import Rule, ConnectionType
00018 from .utils import reformat_position_vector, generate_spawn_robot_launch_script, start_roslaunch_process
00019
00020 class RobotManager(object):
00021
00022 __slots__ = ['_robot_type', '_launch', '_world_namespace', '_processes', '_srv', '_flip_rules']
00023
00024 def __init__(self, robot_type, world_namespace):
00025 self._robot_type = robot_type['name']
00026 self._flip_rules = robot_type['flip_rule']
00027 self._launch = rocon_python_utils.ros.find_resource_from_string(robot_type['launch'])
00028 self._world_namespace = world_namespace
00029 self._processes = {}
00030 self._srv = {}
00031
00032 self._setup_gazebo_api()
00033
00034 def _setup_gazebo_api(self):
00035 delete_model_srv_name = self._world_namespace + '/delete_model'
00036 rospy.wait_for_service(delete_model_srv_name)
00037
00038 self._srv['delete_model'] = rospy.ServiceProxy(delete_model_srv_name, gazebo_srvs.DeleteModel)
00039
00040 def spawn_robot(self, name, position_vector, args=None):
00041 location = reformat_position_vector(position_vector)
00042 launch_script = generate_spawn_robot_launch_script(name, location, self._world_namespace, self._launch, args)
00043 self._processes[name] = start_roslaunch_process(launch_script)
00044
00045 def delete_robot(self, name):
00046 delete_model_srv_req = gazebo_srvs.DeleteModelRequest(name)
00047 try:
00048 self._processes[name].terminate()
00049 self._srv['delete_model'](delete_model_srv_req)
00050 except rospy.ServiceException:
00051 rospy.logerr('GazeboRobotManager : unable to delete model %s' % name)
00052
00053 def get_flip_rule_list(self, name):
00054 """
00055 Returns flip rules of given robot type
00056 """
00057 rules = []
00058
00059 flip = {}
00060 flip['pub'] = ConnectionType.PUBLISHER
00061 flip['sub'] = ConnectionType.SUBSCRIBER
00062 flip['srv'] = ConnectionType.SERVICE
00063
00064 for key, typ in flip.items():
00065 if key in self._flip_rules:
00066 for topic in self._flip_rules[key]:
00067 if topic.startswith('/'):
00068 r = Rule(typ, topic, None)
00069 else:
00070 r = Rule(typ, name + '/' + topic, None)
00071 rules.append(r)
00072
00073
00074 rules.append(Rule(ConnectionType.PUBLISHER, '/clock', None))
00075 rules.append(Rule(ConnectionType.PUBLISHER, '/tf', None))
00076 return rules