def __init__(self, base_topic, debugging_on):
        self.base_topic = base_topic

        self.debug = Debugger(debugging_on, debugging_on)

        self.odom_array = OdometryArray()
        self.odom_lock = threading.Lock()

        self.bridge = CvBridge()

        self.daov = rospy.get_param("~roomba_estimator_settings/%s_aov" %
                                    base_topic)

        self.tf_buffer = tf2_ros.Buffer()
        tf2_ros.TransformListener(self.tf_buffer)
        # Make sure at least one transform exists before starting
        self.tf_buffer.lookup_transform('map',
                                        'bottom_camera_rgb_optical_frame',
                                        rospy.Time(0), rospy.Duration(3.0))

        rospy.Subscriber("/{}/rgb/image_raw".format(base_topic), Image,
                         self.callback)
        rospy.Subscriber("/roombas", OdometryArray, self.roombas_callback)
        self.publisher = rospy.Publisher("/roombas",
                                         OdometryArray,
                                         queue_size=10)
예제 #2
0
    def _publish(self, time):
        SCORE_PUBLISH_THRESHOLD = 0.99

        out_msg = OdometryArray()
        for f in self._filters:
            if f['score'] < SCORE_PUBLISH_THRESHOLD:
                continue
            odom = f['filter'].get_state(time)
            self._debug_pub.publish(odom)
            out_msg.data.append(odom)
        self._pub.publish(out_msg)
 def _publish_empty(self):
     out_msg = OdometryArray()
     self._pub.publish(out_msg)
 def _publish(self, time):
     out_msg = OdometryArray()
     odom = self._filter.get_state(time)
     out_msg.data.append(odom)
     self._pub.publish(out_msg)
     self._debug_pub.publish(odom)
예제 #5
0
import tf2_ros as tf2

from geometry_msgs.msg import TransformStamped
from iarc7_msgs.msg import OdometryArray
from nav_msgs.msg import Odometry

if __name__ == '__main__':
    rospy.init_node('stupid_roomba')

    tf2_broadcaster = tf2.TransformBroadcaster()

    pub = rospy.Publisher('/roombas', OdometryArray, queue_size=10)

    vx = 0.33

    roomba_msg = OdometryArray()
    roomba = Odometry()
    roomba.header.frame_id = 'map'
    roomba.child_frame_id = 'roomba0/base_link'
    roomba.pose.pose.orientation.w = 1.0
    roomba.twist.twist.linear.x = vx
    roomba_msg.data.append(roomba)

    tf_msg = TransformStamped()
    tf_msg.header.frame_id = 'map'
    tf_msg.child_frame_id = 'roomba0/base_link'
    tf_msg.transform.rotation.w = 1.0

    start_time = rospy.Time.now()

    rate = rospy.Rate(30)
예제 #6
0
 def callback(_):
     msg = OdometryArray()
     roomba_pub.publish(msg)
예제 #7
0
def roomba_odom_callback(msg, topic, data={}):
    if not 'cur_odoms' in data:
        data['cur_odoms'] = {}
    data['cur_odoms'][topic] = msg

    if 'last_time' in data:
        earliest_publish_time = (data['last_time']
                               + rospy.Duration(1.0/max_roomba_output_freq))
        if earliest_publish_time > rospy.Time.now():
            return

    data['last_time'] = rospy.Time.now()

    odom_msg = OdometryArray()
    odom_msg.data = data['cur_odoms'].values()

    state_msg = RoombaStateStampedArray()

    for odom in odom_msg.data: 
        roomba_msg = RoombaStateStamped()
        roomba_msg.odom = odom
        roomba_msg.roomba_id = odom.child_frame_id

        roomba_id = odom.child_frame_id.split('/')[0]

        if roomba_id in roomba_states:
            state_data = roomba_states[roomba_id]
            roomba_msg.turning = state_data.data
            roomba_msg.moving_forward = not state_data.data

        state_msg.roombas.append(roomba_msg)

    if publish_ground_truth_roombas:
        roomba_pub.publish(odom_msg)
        roomba_publisher.publish(state_msg)

    if publish_noisy_roombas and last_drone_position is not None:
        observations = []
        for roomba_odom in data['cur_odoms'].values():
            roomba_msg = RoombaDetection()

            roomba_pos = np.array((roomba_odom.pose.pose.position.x,
                                   roomba_odom.pose.pose.position.y,
                                   roomba_odom.pose.pose.position.z))
            drone_pos = np.array((last_drone_position.x,
                                  last_drone_position.y,
                                  last_drone_position.z))
            dist = np.linalg.norm(roomba_pos - drone_pos)

            p = 1 / (1 + dist / noisy_roombas_d0)
            observed = np.random.random() <= p
            if observed:
                observed_pos = np.random.normal(
                        roomba_pos[:-1],
                        (dist * noisy_roombas_uncertainty_scale,
                         dist * noisy_roombas_uncertainty_scale))

                roomba_msg.pose.x = observed_pos[0]
                roomba_msg.pose.y = observed_pos[1]

                observed_theta = np.random.normal(
                        np.arctan2(roomba_odom.twist.twist.linear.y,
                                 roomba_odom.twist.twist.linear.x),
                        1)

                roomba_msg.pose.theta = observed_theta % (2*np.pi)

                c = dist * noisy_roombas_uncertainty_scale

                observations.append(roomba_msg)

        out_msg = RoombaDetectionFrame()
        out_msg.header = msg.header
        for point in ((-1, 1),
                      (-1, -1),
                      (1, -1),
                      (1, 1)):
            new_point = Point32()
            new_point.x = point[0] * 10
            new_point.y = point[1] * 10
            out_msg.detection_region.points.append(new_point)
        out_msg.roombas = observations
        roomba_noisy_pub.publish(out_msg)