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); }
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; }
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); }
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; }