Beispiel #1
0
    def get_plot_phi_d(self,
                       ground_truth=None,
                       bgcolor=dtu.ColorConstants.RGB_DUCKIETOWN_YELLOW):
        figure_args = dict(facecolor=dtu.matplotlib_01_from_rgb(bgcolor))
        a = CreateImageFromPylab(dpi=120, figure_args=figure_args)

        gh = self.grid_helper
        with a as pylab:
            grid_helper_plot_field(gh, self.belief, pylab)
            grid_helper_annotate_axes(gh, pylab)

            estimate = self.get_estimate()
            if ground_truth is not None:
                ground_truth_location = \
                    self._localization_template.coords_from_pose(ground_truth)
                grid_helper_mark_point(gh,
                                       pylab,
                                       ground_truth_location,
                                       color='green',
                                       markersize=4)
            grid_helper_mark_point(gh,
                                   pylab,
                                   estimate,
                                   color='magenta',
                                   markersize=10)

            s = ''
            s += "status = %s" % self.get_status()
            for name, spec in zip(gh._names, gh._specs):
                convert = lambda x: '%.2f %s' % (convert_unit(
                    x, spec.units, spec.units_display), spec.units_display)
                s += '\n'
                s += "\nest %s = %s" % (name, convert(estimate[name]))
                if ground_truth is not None:
                    s += "\ntrue %s = %s" % (
                        name, convert(ground_truth_location[name]))
                    err = np.abs(ground_truth_location[name] - estimate[name])
                    s += '\nabs err = %s' % (convert(err))
                    cell = spec.resolution
                    percent = 100.0 / cell * err
                    s += '\nrel err = %.1f %% of cell' % (percent)
                    s += '\n true = green dot'

            s += '\n'
            s += "\nentropy = %.4f" % self.get_entropy()
            s += "\nmax = %.4f" % self.belief.max()
            s += "\nmin = %.4f" % self.belief.min()

            pylab.annotate(s, xy=(0.7, 0.45), xycoords='figure fraction')
            grid_helper_set_axes(gh, pylab)

        return a.get_bgr()
Beispiel #2
0
def _do_plot(s1, d1, s2, d2):
    bgcolor = dtu.ColorConstants.RGB_DUCKIETOWN_YELLOW
    dpi = 100
    figure_args = dict(facecolor=dtu.matplotlib_01_from_rgb(bgcolor))
    a = dtu.CreateImageFromPylab(dpi=dpi, figure_args=figure_args)

    with a as pylab:
        data_x = convert_unit(d1['data'], s1.units, s1.units_display)
        data_y = convert_unit(d2['data'], s2.units, s2.units_display)

        pylab.plot(data_x, data_y, '.')

        ylabel = '%s [%s]' % (s2.label, s2.units_display)
        pylab.ylabel(ylabel, color=s2.color)
        xlabel = '%s [%s]' % (s1.label, s1.units_display)
        pylab.xlabel(xlabel, color=s1.color)
        pylab.tick_params('y', colors=s2.color)
        pylab.ylim(s2.min, s2.max)
        pylab.xlim(s1.min, s1.max)

    bgr = a.get_bgr()
    return bgr
Beispiel #3
0
def plot_map_and_segments(sm,
                          tinfo,
                          segments,
                          dpi=120,
                          ground_truth=None,
                          bgcolor=dtu.ColorConstants.RGB_DUCKIETOWN_YELLOW):
    """ Returns a BGR image """
    figure_args = dict(facecolor=dtu.matplotlib_01_from_rgb(bgcolor))
    a = dtu.CreateImageFromPylab(dpi=dpi, figure_args=figure_args)

    with a as pylab:
        _plot_map_segments(sm, pylab, FRAME_GLOBAL)
        _plot_detected_segments(tinfo, segments, pylab)

        # draw arrow
        L = 0.1

        if ground_truth is not None:
            (x, y), _ = dtu.geo.translation_angle_from_SE2(ground_truth)
            x1, y1, _ = np.dot(ground_truth, [L, 0, 1])
            pylab.plot(x, y, 'co', markersize=12)
            pylab.plot([x, x1], [y, y1], 'c-', linewidth=4)

        w1 = tinfo.transform_point(np.array([0, 0, 0]),
                                   frame1=FRAME_AXLE,
                                   frame2=FRAME_GLOBAL)
        w2 = tinfo.transform_point(np.array([L, 0, 0]),
                                   frame1=FRAME_AXLE,
                                   frame2=FRAME_GLOBAL)

        pylab.plot([w1[0], w2[0]], [w1[1], w2[1]], 'm-')
        pylab.plot(w1[0], w1[1], 'mo', markersize=6)

        pylab.axis('equal')

    return a.get_bgr()
Beispiel #4
0
def plot_phi_d_diagram_bgr(lane_filter, belief, phi, d, dpi=120,
                           bgcolor=dtu.ColorConstants.RGB_DUCKIETOWN_YELLOW,
                           other_phi=None, other_d=None):
    """ Returns a BGR image """

    figure_args = dict(facecolor=dtu.matplotlib_01_from_rgb(bgcolor))
    a = dtu.CreateImageFromPylab(dpi=dpi, figure_args=figure_args)

    with a as pylab:
        f_d = lambda x: 100 * x
        f_phi = np.rad2deg
        # Where are the lanes?
        lane_width = lane_filter.lanewidth
        d_max = lane_filter.d_max
        d_min = lane_filter.d_min
        phi_max = lane_filter.phi_max
        phi_min = lane_filter.phi_min
        delta_d = lane_filter.delta_d
        delta_phi = lane_filter.delta_phi

        # note transpose
        belief = belief.copy()
        zeros = belief == 0

        belief[zeros] = np.nan

        belief_image = scale(belief, min_value=0)

        x = f_d(lane_filter.d_pcolor)
        y = f_phi(lane_filter.phi_pcolor)

        z = belief_image[:, :, 0]  # just R component
        z = ma.masked_array(z, zeros)

        pylab.pcolor(x, y, np.ones(z.shape), cmap='Pastel1')

        pylab.pcolor(x, y, z, cmap='gray')

        if other_phi is not None:
            for _phi, _d in zip(other_phi, other_d):

                pylab.plot(f_d(_d), f_phi(_phi), 'go', markersize=15,
                           markeredgecolor='none',
                           markeredgewidth=3,
                           markerfacecolor='blue')

        pylab.plot(f_d(d), f_phi(phi), 'go', markersize=20,
                   markeredgecolor='magenta',
                   markeredgewidth=3,
                   markerfacecolor='none')

        pylab.plot(f_d(d), f_phi(phi), 'o', markersize=2,
                   markeredgecolor='none',
                   markeredgewidth=0,
                   markerfacecolor='magenta')

        W = f_d(lane_width / 2)
        width_white = f_d(lane_filter.linewidth_white)
        width_yellow = f_d(lane_filter.linewidth_yellow)

        pylab.plot([-W, -W], [f_phi(phi_min), f_phi(phi_max)], 'k-')
        pylab.plot([-W - width_white, -W - width_white], [f_phi(phi_min), f_phi(phi_max)], 'k-')
        pylab.plot([0, 0], [f_phi(phi_min), f_phi(phi_max)], 'k-')
        pylab.plot([+W, +W], [f_phi(phi_min), f_phi(phi_max)], 'y-')
        pylab.plot([+W + width_yellow, +W + width_yellow], [f_phi(phi_min), f_phi(phi_max)], 'y-')
        s = ''
        s += "status = %s" % lane_filter.getStatus()
        s += "\nphi = %.1f deg" % f_phi(phi)
        s += "\nd = %.1f cm" % f_d(d)
        s += "\nentropy = %.4f" % lane_filter.get_entropy()
        s += "\nmax = %.4f" % belief.max()
        s += "\nmin = %.4f" % belief.min()

        if other_phi is not None:
            s += '\n Other answers:'
            for _phi, _d in zip(other_phi, other_d):
                s += "\nphi = %.1f deg" % f_phi(_phi)
                s += "\nd = %.1f cm" % f_d(_d)

        y = f_phi(phi_max) - 10
        args = dict(rotation=-90, color='white')
        annotate = True
        if annotate:
            pylab.annotate(s, xy=(0.7, 0.35), xycoords='figure fraction')
            pylab.annotate("in middle of right lane", xy=(0, y), **args)
            pylab.annotate("on right white tape", xy=(-W, y), **args)
            pylab.annotate("on left yellow tape", xy=(+W, y), **args)
            pylab.annotate("in other lane", xy=(+W * 1.3, y), **args)

        pylab.axis([f_d(d_min), f_d(d_max), f_phi(phi_min), f_phi(phi_max)])

        pylab.ylabel('phi: orientation (deg); cell = %.1f deg' % f_phi(delta_phi))
        pylab.xlabel('d: distance from center line (cm); cell = %.1f cm' % f_d(delta_d))

    return a.get_bgr()
Beispiel #5
0
def do_plot(bag_in, prefix_in, bag_out, prefix_out, signals, plot_name):

    topic2messages = defaultdict(lambda: dict(timestamp=[], data=[]))

    topics = []
    for signal_spec in signals:
        dtu.check_isinstance(signal_spec, PlotSignalSpec)
        topic_fqn = prefix_in + signal_spec.topic
        topics.append(topic_fqn)

    for _j, mp in enumerate(bag_in.read_messages_plus(topics=topics)):
        data = interpret_ros(mp.msg)
        topic2messages[mp.topic]['data'].append(data)
        topic2messages[mp.topic]['timestamp'].append(
            mp.time_from_physical_log_start)

    for signal_spec in signals:

        topic_fqn = prefix_in + signal_spec.topic
        if not topic_fqn in topic2messages:
            msg = 'Could not found any value for topic %r.' % topic_fqn
            raise ValueError(msg)

    bgcolor = dtu.ColorConstants.RGB_DUCKIETOWN_YELLOW
    dpi = 100
    figure_args = dict(facecolor=dtu.matplotlib_01_from_rgb(bgcolor))
    a = dtu.CreateImageFromPylab(dpi=dpi, figure_args=figure_args)

    use_legend = len(signals) >= 3
    # todo: check same units

    with a as pylab:
        axes = []
        _fig, ax0 = pylab.subplots()
        ax0.set_xlabel('time (s)')
        axes.append(ax0)
        if use_legend:
            for i in range(len(signals) - 1):
                axes.append(ax0)
        else:
            for i in range(len(signals) - 1):
                axes.append(ax0.twinx())

        for i, signal_spec in enumerate(signals):
            ax = axes[i]

            topic_fqn = prefix_in + signal_spec.topic
            recorded = topic2messages[topic_fqn]
            data = np.array(recorded['data'])
            t = np.array(recorded['timestamp'])

            color = signal_spec.color
            markersize = 5

            data_converted = convert_unit(data, signal_spec.units,
                                          signal_spec.units_display)

            ax.plot(t,
                    data_converted,
                    'o',
                    color=color,
                    label=signal_spec.label,
                    markersize=markersize,
                    clip_on=False)

            if not use_legend:
                label = '%s [%s]' % (signal_spec.label,
                                     signal_spec.units_display)
                ax.set_ylabel(label, color=signal_spec.color)
                ax.tick_params('y', colors=color)

            ax.set_ylim(signal_spec.min, signal_spec.max)

            outward_offset = 20
            ax.xaxis.set_tick_params(direction='out')
            ax.yaxis.set_tick_params(direction='out')
            ax.spines['left'].set_position(('outward', outward_offset))
            ax.spines['top'].set_color('none')  # don't draw spine
            ax.spines['bottom'].set_position(('outward', outward_offset))
            ax.spines['right'].set_position(('outward', outward_offset))

            pos = {0: 'left', 1: 'right', 2: 'right'}[i]
            ax.spines[pos].set_color(color)

            ax.xaxis.set_ticks_position('bottom')

        if use_legend:
            label = '[%s]' % (signal_spec.units_display)
            ax.set_ylabel(label)

            pylab.legend()

    bgr = a.get_bgr()
    plot_name = plot_name.replace('/', '')
    # output_filename = os.path.join('tmp', plot_name +'.png')
    # dtu.write_bgr_as_jpg(bgr, output_filename)

    t_inf = rospy.Time.from_sec(bag_in.get_end_time())  # @UndefinedVariable
    omsg = dtu.d8_compressed_image_from_cv_image(bgr, timestamp=t_inf)
    otopic = prefix_out + '/' + plot_name
    bag_out.write(otopic, omsg, t=t_inf)