示例#1
0
void setup_renderer_navigator(Viewer *viewer, int priority) 
{
    RendererNavigator *self = 
        (RendererNavigator*) calloc(1, sizeof(RendererNavigator));    

    Renderer *renderer = &self->renderer;

    renderer->draw = my_draw;
    renderer->destroy = my_free;
    renderer->name = "Navigator";
    renderer->enabled = 1;
    renderer->user = self;

    self->lc = globals_get_lcm();
    self->ctrans = globals_get_ctrans();
    self->rndf = globals_get_rndf ();
    self->config = globals_get_config ();
    self->viewer = viewer;
    self->nav = NULL;
    
    lcmtypes_navigator_plan_t_subscribe(self->lc, "NAVIGATOR_PLAN",
            on_navigator_plan, self);

    viewer_add_renderer(viewer, renderer, priority);
}
示例#2
0
static Renderer *_new (Viewer *viewer)
{
    RendererCamThumb *self = 
        (RendererCamThumb*) calloc (1, sizeof (RendererCamThumb));
    self->viewer = viewer;
    self->renderer.draw = cam_thumb_draw;
    self->renderer.destroy = cam_thumb_free;
    self->renderer.name = "Camera";
    self->renderer.user = self;
    self->renderer.enabled = 1;

    self->ctrans = globals_get_ctrans();
    self->lc = globals_get_lcm (NULL);

    self->renderer.widget = gtk_vbox_new (FALSE, 0);
    gtk_widget_show (self->renderer.widget);

    self->cam_handlers = g_hash_table_new_full (g_str_hash, g_str_equal,
            NULL, (GDestroyNotify) cam_renderer_destroy);
    self->config = globals_get_config ();

    char **cam_names = config_get_subkeys (self->config, "cameras");
    for (int i=0; cam_names[i]; i++) {
        char channel[80];
        if (0 == config_util_get_camera_thumbnail_channel (self->config,
                    cam_names[i], channel, sizeof (channel))) {
            lcmtypes_image_t_subscribe (self->lc, channel, on_image, self);
        }
    }
    g_strfreev (cam_names);

    g_signal_connect (G_OBJECT (viewer), "load-preferences", 
            G_CALLBACK (on_load_preferences), self);
    g_signal_connect (G_OBJECT (viewer), "save-preferences",
            G_CALLBACK (on_save_preferences), self);

    return &self->renderer;
}
示例#3
0
void setup_renderer_car(Viewer *viewer, int render_priority)
{
    RendererCar *self = (RendererCar*) calloc (1, sizeof (RendererCar));

    Renderer *renderer = &self->renderer;

    renderer->draw = car_draw;
    renderer->destroy = car_free;

    renderer->widget = gtk_vbox_new(FALSE, 0);
    renderer->name = RENDERER_NAME;
    renderer->user = self;
    renderer->enabled = 1;

    EventHandler *ehandler = &self->ehandler;
    ehandler->name = RENDERER_NAME;
    ehandler->enabled = 1;
    ehandler->pick_query = pick_query;
    ehandler->key_press = key_press;
    ehandler->hover_query = pick_query;
    ehandler->mouse_press = mouse_press;
    ehandler->mouse_release = mouse_release;
    ehandler->mouse_motion = mouse_motion;
    ehandler->user = self;

    self->viewer = viewer;
    self->lc = globals_get_lcm ();
    self->config = globals_get_config ();

    self->pw = GTKU_PARAM_WIDGET(gtku_param_widget_new());
    self->ctrans = globals_get_ctrans ();
    self->path = gu_ptr_circular_new (MAX_POSES, free_path_element, NULL);

    gtk_box_pack_start(GTK_BOX(renderer->widget), GTK_WIDGET(self->pw), TRUE, 
            TRUE, 0);

    gtku_param_widget_add_booleans (self->pw, 0, PARAM_FOLLOW_POS, 1, NULL);
    gtku_param_widget_add_booleans (self->pw, 0, PARAM_FOLLOW_YAW, 0, NULL);

    char * model;
    char path[256];
    if (config_get_str (self->config, "renderer_car.chassis_model",
                &model) == 0) {
        snprintf (path, sizeof (path), "%s/%s", MESH_MODEL_PATH, model);
        self->chassis_model = rwx_model_create (path);
    }
    if (config_get_str (self->config, "renderer_car.wheel_model",
                &model) == 0) {
        snprintf (path, sizeof (path), "%s/%s", MESH_MODEL_PATH, model);
        self->wheel_model = rwx_model_create (path);
    }

    if (self->chassis_model)
        gtku_param_widget_add_booleans (self->pw, 0, PARAM_NAME_BLING, 1,
                NULL);
    if (self->wheel_model)
        gtku_param_widget_add_booleans (self->pw, 0, PARAM_NAME_WHEELS, 1,
                NULL);
 
    self->max_draw_poses = 1000;
    gtku_param_widget_add_int (self->pw, PARAM_MAXPOSES, 
            GTKU_PARAM_WIDGET_SLIDER, 0, MAX_POSES, 100, self->max_draw_poses);
 
    GtkWidget *find_button = gtk_button_new_with_label("Find");
    gtk_box_pack_start(GTK_BOX(renderer->widget), find_button, FALSE, FALSE, 0);
    g_signal_connect(G_OBJECT(find_button), "clicked", 
            G_CALLBACK (on_find_button), self);

    GtkWidget *clear_button = gtk_button_new_with_label("Clear path");
    gtk_box_pack_start(GTK_BOX(renderer->widget), clear_button, FALSE, FALSE, 
            0);
    g_signal_connect(G_OBJECT(clear_button), "clicked", 
            G_CALLBACK (on_clear_button), self);

    gtk_widget_show_all(renderer->widget);

    g_signal_connect (G_OBJECT (self->pw), "changed", 
                      G_CALLBACK (on_param_widget_changed), self);
    on_param_widget_changed(self->pw, "", self);

    ctrans_subscribe (self->ctrans, pose_listener, self);

#ifdef USE_CANDECODE
    self->can = can_decode_new (self->lc);
    can_decode_subscribe (self->can, CAN_MSG_WHEELSPEEDS, on_wheelspeeds, self);
    can_decode_subscribe (self->can, CAN_MSG_STEERING_WHEEL,
            on_steering, self);
    can_decode_subscribe (self->can, CAN_MSG_SUSPENSION_HEIGHT,
            on_suspension, self);
#endif

    viewer_add_renderer(viewer, &self->renderer, render_priority);
    viewer_add_event_handler(viewer, &self->ehandler, render_priority);

    self->footprint = config_util_get_vehicle_footprint (self->config);
    assert (self->footprint);

    g_signal_connect (G_OBJECT (viewer), "load-preferences", 
            G_CALLBACK (on_load_preferences), self);
    g_signal_connect (G_OBJECT (viewer), "save-preferences",
            G_CALLBACK (on_save_preferences), self);
}
示例#4
0
void setup_renderer_car(Viewer *viewer, int render_priority)
{
    RendererCar *self = (RendererCar*) calloc (1, sizeof (RendererCar));

    Renderer *renderer = &self->renderer;

    renderer->draw = car_draw;
    renderer->destroy = car_free;

    renderer->widget = gtk_vbox_new(FALSE, 0);
    renderer->name = RENDERER_NAME;
    renderer->user = self;
    renderer->enabled = 1;

    EventHandler *ehandler = &self->ehandler;
    ehandler->name = RENDERER_NAME;
    ehandler->enabled = 1;
    ehandler->pick_query = pick_query;
    ehandler->key_press = key_press;
    ehandler->hover_query = pick_query;
    ehandler->mouse_press = mouse_press;
    ehandler->mouse_release = mouse_release;
    ehandler->mouse_motion = mouse_motion;
    ehandler->user = self;

    self->viewer = viewer;
    self->lcm = globals_get_lcm ();
    self->config = globals_get_config ();

    self->pw = BOT_GTK_PARAM_WIDGET(bot_gtk_param_widget_new());
    self->atrans = globals_get_atrans ();
    self->path = bot_ptr_circular_new (MAX_POSES, free_path_element, NULL);

    gtk_box_pack_start(GTK_BOX(renderer->widget), GTK_WIDGET(self->pw), TRUE, 
            TRUE, 0);

    bot_gtk_param_widget_add_booleans (self->pw, 0, PARAM_FOLLOW_POS, 1, NULL);
    bot_gtk_param_widget_add_booleans (self->pw, 0, PARAM_FOLLOW_YAW, 0, NULL);

    char * model;
    char path[256];
    if (bot_conf_get_str (self->config, "renderer_car.chassis_model",
                &model) == 0) {
        snprintf (path, sizeof (path), "%s/%s", MODELS_DIR, model);
        self->chassis_model = rwx_model_create (path);
    }
    if (bot_conf_get_str (self->config, "renderer_car.wheel_model",
                &model) == 0) {
        snprintf (path, sizeof (path), "%s/%s", MODELS_DIR, model);
        self->wheel_model = rwx_model_create (path);
    }

    if (self->chassis_model)
        bot_gtk_param_widget_add_booleans (self->pw, 0, PARAM_NAME_BLING, 1,
                NULL);
    if (self->wheel_model)
        bot_gtk_param_widget_add_booleans (self->pw, 0, PARAM_NAME_WHEELS, 1,
                NULL);
 
    self->max_draw_poses = 1000;
    bot_gtk_param_widget_add_int (self->pw, PARAM_MAXPOSES, 
            BOT_GTK_PARAM_WIDGET_SLIDER, 0, MAX_POSES, 100, self->max_draw_poses);
 
    GtkWidget *find_button = gtk_button_new_with_label("Find");
    gtk_box_pack_start(GTK_BOX(renderer->widget), find_button, FALSE, FALSE, 0);
    g_signal_connect(G_OBJECT(find_button), "clicked", 
            G_CALLBACK (on_find_button), self);

    GtkWidget *clear_button = gtk_button_new_with_label("Clear path");
    gtk_box_pack_start(GTK_BOX(renderer->widget), clear_button, FALSE, FALSE, 
            0);
    g_signal_connect(G_OBJECT(clear_button), "clicked", 
            G_CALLBACK (on_clear_button), self);

    gtk_widget_show_all(renderer->widget);

    g_signal_connect (G_OBJECT (self->pw), "changed", 
                      G_CALLBACK (on_param_widget_changed), self);
    on_param_widget_changed(self->pw, "", self);

    botlcm_pose_t_subscribe(self->lcm, "POSE", on_pose, self);


    viewer_add_renderer(viewer, &self->renderer, render_priority);
    viewer_add_event_handler(viewer, &self->ehandler, render_priority);

    self->footprint = pointlist2d_new (4);
    fbconf_get_vehicle_footprint (self->config, 
            (double*)self->footprint->points);

    g_signal_connect (G_OBJECT (viewer), "load-preferences", 
            G_CALLBACK (on_load_preferences), self);
    g_signal_connect (G_OBJECT (viewer), "save-preferences",
            G_CALLBACK (on_save_preferences), self);
}
Renderer *renderer_scrolling_plots_new (Viewer *viewer)
{
    RendererScrollingPlots *self = 
        (RendererScrollingPlots*) calloc (1, sizeof (RendererScrollingPlots));
    self->viewer = viewer;
    self->renderer.draw = scrolling_plots_draw;
    self->renderer.destroy = scrolling_plots_free;
    self->renderer.name = "Scrolling Plots";
    self->renderer.user = self;
    self->renderer.enabled = 1;

    self->renderer.widget = gtk_alignment_new (0, 0.5, 1.0, 0);
    self->atrans = globals_get_atrans();

    self->lcm = globals_get_lcm ();

    self->pw = BOT_GTK_PARAM_WIDGET (bot_gtk_param_widget_new ());
    gtk_container_add (GTK_CONTAINER (self->renderer.widget), 
            GTK_WIDGET(self->pw));
    gtk_widget_show (GTK_WIDGET (self->pw));

    bot_gtk_param_widget_add_int (self->pw, PARAM_NAME_SIZE,
            BOT_GTK_PARAM_WIDGET_SLIDER, 50, 800, 10, 150);
    bot_gtk_param_widget_add_double (self->pw, PARAM_NAME_GRAPH_TIMESPAN, 
            BOT_GTK_PARAM_WIDGET_SLIDER, 1, 20, 0.5, 5);
    bot_gtk_param_widget_add_booleans (self->pw, 
            BOT_GTK_PARAM_WIDGET_TOGGLE_BUTTON, PARAM_NAME_FREEZE, 0, NULL);
    bot_gtk_param_widget_add_booleans (self->pw, 0,
                                       PARAM_NAME_RENDER_NAVIGATOR_ROTATION, 1, 
                                       PARAM_NAME_RENDER_NAVIGATOR_TRANSLATION, 1, 
                                       NULL);
    bot_gtk_param_widget_add_booleans (self->pw, 0,
                                       PARAM_NAME_RENDER_ENCODER_LEFT, 1,
                                       PARAM_NAME_RENDER_ENCODER_RIGHT, 1, NULL);
    bot_gtk_param_widget_add_booleans (self->pw, 0, 
            PARAM_NAME_SHOW_LEGEND, 0, NULL);

    g_signal_connect (G_OBJECT (self->pw), "changed", 
            G_CALLBACK (on_param_widget_changed), self);

    
    BotConf *config = globals_get_config ();
    self->encoder_left_scale = 1.0;//bot_conf_get_double_or_fail (config, "calibration.encoders.WHEEL_LEFT.scale");
    self->encoder_right_scale = 1.0;//bot_conf_get_double_or_fail (config, "calibration.encoders.WHEEL_RIGHT.scale");
    globals_release_config (config);

    self->encoder_left_last = 0;
    self->encoder_right_last = 0;

    // navigator rotation
    self->navigator_rotation_plot = bot_gl_scrollplot2d_new ();
    bot_gl_scrollplot2d_set_title        (self->navigator_rotation_plot, "Nav. Rot. Speed");
    bot_gl_scrollplot2d_set_text_color   (self->navigator_rotation_plot, 0.7, 0.7, 0.7, 1);
    bot_gl_scrollplot2d_set_bgcolor      (self->navigator_rotation_plot, 0.1, 0.1, 0.1, 0.7);
    bot_gl_scrollplot2d_set_border_color (self->navigator_rotation_plot, 1, 1, 1, 0.7);
    bot_gl_scrollplot2d_set_ylim    (self->navigator_rotation_plot, -.5, .5);
    bot_gl_scrollplot2d_add_plot    (self->navigator_rotation_plot, "control", 1000);
    bot_gl_scrollplot2d_set_color   (self->navigator_rotation_plot, "control", 0.7, 0, 0.7, 1);

    bot_gl_scrollplot2d_add_plot    (self->navigator_rotation_plot, "status", 1000);
    bot_gl_scrollplot2d_set_color   (self->navigator_rotation_plot, "status", 0, 0, 1, 1);

    //bot_gl_scrollplot2d_add_plot    (self->navigator_rotation_plot, "2500", 1000);
    //bot_gl_scrollplot2d_set_color   (self->navigator_rotation_plot, "2500", 0.8, 0.8, 0.8, 0.5);


    self->navigator_translation_plot = bot_gl_scrollplot2d_new ();
    bot_gl_scrollplot2d_set_title        (self->navigator_translation_plot, "Nav. Trans. Speed");
    bot_gl_scrollplot2d_set_text_color   (self->navigator_translation_plot, 0.7, 0.7, 0.7, 1);
    bot_gl_scrollplot2d_set_bgcolor      (self->navigator_translation_plot, 0.1, 0.1, 0.1, 0.7);
    bot_gl_scrollplot2d_set_border_color (self->navigator_translation_plot, 1, 1, 1, 0.7);
    bot_gl_scrollplot2d_set_ylim    (self->navigator_translation_plot, 0, 2.0);
    bot_gl_scrollplot2d_add_plot    (self->navigator_translation_plot, "control", 1000);
    bot_gl_scrollplot2d_set_color   (self->navigator_translation_plot, "control", 0.7, 0, 0.7, 1);

    bot_gl_scrollplot2d_add_plot    (self->navigator_translation_plot, "status", 1000);
    bot_gl_scrollplot2d_set_color   (self->navigator_translation_plot, "status", 0, 0, 1, 1);

    // left wheel encoder plot
    self->encoder_left_plot = bot_gl_scrollplot2d_new ();
    bot_gl_scrollplot2d_set_title        (self->encoder_left_plot, "Left Encoder");
    bot_gl_scrollplot2d_set_text_color   (self->encoder_left_plot, 0.7, 0.7, 0.7, 1);
    bot_gl_scrollplot2d_set_border_color (self->encoder_left_plot, 1, 1, 1, 0.7);
    bot_gl_scrollplot2d_set_bgcolor (self->encoder_left_plot, 0.1, 0.1, 0.1, 0.7);
    bot_gl_scrollplot2d_set_ylim    (self->encoder_left_plot, 0, 2.0);

    bot_gl_scrollplot2d_add_plot    (self->encoder_left_plot, "actual", 1000);
    bot_gl_scrollplot2d_set_color   (self->encoder_left_plot, "actual", 0.7, 0, 0.7, 1);

    bot_gl_scrollplot2d_add_plot    (self->encoder_left_plot, "0", 1000);
    bot_gl_scrollplot2d_set_color   (self->encoder_left_plot, "0", 0.8, 0.8, 0.8, 0.5);

    // right wheel encoder plot
    self->encoder_right_plot = bot_gl_scrollplot2d_new ();
    bot_gl_scrollplot2d_set_title        (self->encoder_right_plot, "Right Encoder");
    bot_gl_scrollplot2d_set_text_color   (self->encoder_right_plot, 0.7, 0.7, 0.7, 1);
    bot_gl_scrollplot2d_set_border_color (self->encoder_right_plot, 1, 1, 1, 0.7);
    bot_gl_scrollplot2d_set_bgcolor (self->encoder_right_plot, 0.1, 0.1, 0.1, 0.7);
    bot_gl_scrollplot2d_set_ylim    (self->encoder_right_plot, 0, 2.0);

    bot_gl_scrollplot2d_add_plot    (self->encoder_right_plot, "actual", 1000);
    bot_gl_scrollplot2d_set_color   (self->encoder_right_plot, "actual", 0.7, 0, 0.7, 1);

    bot_gl_scrollplot2d_add_plot    (self->encoder_right_plot, "0", 1000);
    bot_gl_scrollplot2d_set_color   (self->encoder_right_plot, "0", 0.8, 0.8, 0.8, 0.5);

    // legends?
    BotGlScrollPlot2dLegendLocation legloc = BOT_GL_SCROLLPLOT2D_HIDDEN;
    if (bot_gtk_param_widget_get_bool (self->pw, PARAM_NAME_SHOW_LEGEND)) {
        legloc = BOT_GL_SCROLLPLOT2D_TOP_RIGHT;
    }
    bot_gl_scrollplot2d_set_show_legend (self->navigator_rotation_plot, legloc);
    bot_gl_scrollplot2d_set_show_legend (self->navigator_translation_plot, legloc);

    // subscribe to LC messages
    fblcm_motion_cmd_t_subscribe (self->lcm, "MOTION_CMD", on_motion_cmd, self);
    
    //arlcm_encoder_t_subscribe (self->lcm, "WHEEL_LEFT", on_encoders, self);
    //arlcm_encoder_t_subscribe (self->lcm, "WHEEL_RIGHT", on_encoders, self);

    // periodically pull pose data from ATrans
    //g_timeout_add (30, get_speed_update, self);

    return &self->renderer;
}