示例#1
0
 def _update_synchronous_sensor(self, frame, timestamp):
     while not self.next_data_expected_time or\
         (not self.queue.empty() or
          self.next_data_expected_time and
          self.next_data_expected_time < timestamp):
         while True:
             try:
                 carla_sensor_data = self.queue.get(timeout=1.0)
                 if carla_sensor_data.frame == frame:
                     rospy.logdebug("{}({}): process {}".format(
                         self.__class__.__name__, self.get_id(), frame))
                     self.publish_transform(
                         self.get_ros_transform(
                             trans.carla_transform_to_ros_transform(
                                 carla_sensor_data.transform)))
                     self.sensor_data_updated(carla_sensor_data)
                     return
                 elif carla_sensor_data.frame < frame:
                     rospy.logwarn(
                         "{}({}): skipping old frame {}, expected {}".
                         format(self.__class__.__name__, self.get_id(),
                                carla_sensor_data.frame, frame))
             except queue.Empty:
                 if not rospy.is_shutdown():
                     rospy.logwarn(
                         "{}({}): Expected Frame {} not received".format(
                             self.__class__.__name__, self.get_id(), frame))
                 return
示例#2
0
    def get_ros_transform(self,
                          transform=None,
                          frame_id=None,
                          child_frame_id=None):
        """
        Function to provide the current ROS transform

        :return: the ROS transfrom
        :rtype: geometry_msgs.msg.TransformStamped
        """
        tf_msg = TransformStamped()
        if frame_id:
            tf_msg.header = self.get_msg_header(frame_id)
        else:
            tf_msg.header = self.get_msg_header("map")
        if child_frame_id:
            tf_msg.child_frame_id = child_frame_id
        else:
            tf_msg.child_frame_id = self.get_prefix()
        if transform:
            tf_msg.transform = transform
        else:
            tf_msg.transform = trans.carla_transform_to_ros_transform(
                self.carla_actor.get_transform())
        return tf_msg
示例#3
0
    def get_current_ros_transform(self):
        """
        Function to provide the current ROS pose

        :return: the ROS pose of this actor
        :rtype: geometry_msgs.msg.Pose
        """
        return trans.carla_transform_to_ros_transform(
            self.carla_actor.get_transform())
示例#4
0
    def _callback_sensor_data(self, carla_sensor_data):
        """
        Callback function called whenever new sensor data is received

        :param carla_sensor_data: carla sensor data object
        :type carla_sensor_data: carla.SensorData
        """
        if not rospy.is_shutdown():
            if self.synchronous_mode:
                if self.sensor_tick_time:
                    self.next_data_expected_time = carla_sensor_data.timestamp + \
                        float(self.sensor_tick_time)
                self.queue.put(carla_sensor_data)
            else:
                self.publish_transform(self.get_ros_transform(
                    trans.carla_transform_to_ros_transform(carla_sensor_data.transform)))
                self.sensor_data_updated(carla_sensor_data)
示例#5
0
 def _update_synchronous_event_sensor(self, frame):
     while True:
         try:
             carla_sensor_data = self.queue.get(block=False)
             if carla_sensor_data.frame != frame:
                 rospy.logwarn("{}({}): Received event for frame {}"
                               " (expected {}). Process it anyways.".format(
                                   self.__class__.__name__, self.get_id(),
                                   carla_sensor_data.frame, frame))
             rospy.logdebug("{}({}): process {}".format(
                 self.__class__.__name__, self.get_id(), frame))
             self.publish_transform(
                 self.get_ros_transform(
                     trans.carla_transform_to_ros_transform(
                         carla_sensor_data.transform)))
             self.sensor_data_updated(carla_sensor_data)
         except queue.Empty:
             return