robot_manager.py
Go to the documentation of this file.
00001 #!/usr/bin/env python
00002 #
00003 # License: BSD
00004 #   https://raw.github.com/robotics-in-concert/concert_services/license/LICENSE
00005 #
00006 ##############################################################################
00007 # About
00008 ##############################################################################
00009 
00010 # Base class that defines the API of a robot-specific module needs to
00011 # be defined. This robot specific module will be used by GazeboRobotManager to
00012 # spawn and kill robots in gazebo.
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: # Communication failed
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         # flips tf and clock by default
00074         rules.append(Rule(ConnectionType.PUBLISHER, '/clock', None))
00075         rules.append(Rule(ConnectionType.PUBLISHER, '/tf', None))
00076         return rules


concert_service_gazebo
Author(s): Daniel Stonier, Piyush Khandelwal
autogenerated on Thu Jun 6 2019 21:35:16