Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 package org.ros.android.android_tutorial_map_viewer;
00018
00019 import com.google.common.base.Preconditions;
00020 import com.google.common.collect.Lists;
00021
00022 import android.os.Bundle;
00023 import android.view.View;
00024 import android.view.Window;
00025 import android.view.WindowManager;
00026 import android.widget.Toast;
00027 import android.widget.ToggleButton;
00028
00029 import org.ros.address.InetAddressFactory;
00030 import org.ros.android.RosActivity;
00031 import org.ros.android.view.visualization.VisualizationView;
00032 import org.ros.android.view.visualization.layer.CameraControlLayer;
00033 import org.ros.android.view.visualization.layer.CameraControlListener;
00034 import org.ros.android.view.visualization.layer.LaserScanLayer;
00035 import org.ros.android.view.visualization.layer.Layer;
00036 import org.ros.android.view.visualization.layer.OccupancyGridLayer;
00037 import org.ros.android.view.visualization.layer.RobotLayer;
00038 import org.ros.node.NodeConfiguration;
00039 import org.ros.node.NodeMainExecutor;
00040 import org.ros.time.NtpTimeProvider;
00041
00042 import java.util.concurrent.TimeUnit;
00043
00044 public class MainActivity extends RosActivity {
00045
00046 private static final String MAP_FRAME = "map";
00047 private static final String ROBOT_FRAME = "base_link";
00048
00049 private final SystemCommands systemCommands;
00050
00051 private VisualizationView visualizationView;
00052 private ToggleButton followMeToggleButton;
00053 private CameraControlLayer cameraControlLayer;
00054
00055 public MainActivity() {
00056 super("Map Viewer", "Map Viewer");
00057 systemCommands = new SystemCommands();
00058 }
00059
00060 @Override
00061 public void onCreate(Bundle savedInstanceState) {
00062 super.onCreate(savedInstanceState);
00063 requestWindowFeature(Window.FEATURE_NO_TITLE);
00064 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
00065 WindowManager.LayoutParams.FLAG_FULLSCREEN);
00066 setContentView(R.layout.main);
00067 visualizationView = (VisualizationView) findViewById(R.id.visualization);
00068 cameraControlLayer = new CameraControlLayer();
00069 visualizationView.onCreate(Lists.<Layer>newArrayList(cameraControlLayer,
00070 new OccupancyGridLayer("map"), new LaserScanLayer("scan"), new RobotLayer(ROBOT_FRAME)));
00071 followMeToggleButton = (ToggleButton) findViewById(R.id.follow_me_toggle_button);
00072 enableFollowMe();
00073 }
00074
00075 @Override
00076 protected void init(NodeMainExecutor nodeMainExecutor) {
00077 visualizationView.init(nodeMainExecutor);
00078 cameraControlLayer.addListener(new CameraControlListener() {
00079 @Override
00080 public void onZoom(float focusX, float focusY, float factor) {
00081 disableFollowMe();
00082 }
00083
00084 @Override
00085 public void onTranslate(float distanceX, float distanceY) {
00086 disableFollowMe();
00087 }
00088
00089 @Override
00090 public void onRotate(float focusX, float focusY, double deltaAngle) {
00091 disableFollowMe();
00092 }
00093
00094 @Override
00095 public void onDoubleTap(float x, float y) {
00096 }
00097 });
00098 NodeConfiguration nodeConfiguration =
00099 NodeConfiguration.newPublic(InetAddressFactory.newNonLoopback().getHostAddress(),
00100 getMasterUri());
00101 NtpTimeProvider ntpTimeProvider =
00102 new NtpTimeProvider(InetAddressFactory.newFromHostString("192.168.0.1"),
00103 nodeMainExecutor.getScheduledExecutorService());
00104 ntpTimeProvider.startPeriodicUpdates(1, TimeUnit.MINUTES);
00105 nodeConfiguration.setTimeProvider(ntpTimeProvider);
00106 nodeMainExecutor.execute(visualizationView, nodeConfiguration);
00107 nodeMainExecutor.execute(systemCommands, nodeConfiguration);
00108 }
00109
00110 public void onClearMapButtonClicked(View view) {
00111 toast("Clearing map...");
00112 systemCommands.reset();
00113 enableFollowMe();
00114 }
00115
00116 public void onSaveMapButtonClicked(View view) {
00117 toast("Saving map...");
00118 systemCommands.saveGeotiff();
00119 }
00120
00121 private void toast(final String text) {
00122 runOnUiThread(new Runnable() {
00123 @Override
00124 public void run() {
00125 Toast toast = Toast.makeText(MainActivity.this, text, Toast.LENGTH_SHORT);
00126 toast.show();
00127 }
00128 });
00129 }
00130
00131 public void onFollowMeToggleButtonClicked(View view) {
00132 boolean on = ((ToggleButton) view).isChecked();
00133 if (on) {
00134 enableFollowMe();
00135 } else {
00136 disableFollowMe();
00137 }
00138 }
00139
00140 private void enableFollowMe() {
00141 Preconditions.checkNotNull(visualizationView);
00142 Preconditions.checkNotNull(followMeToggleButton);
00143 runOnUiThread(new Runnable() {
00144 @Override
00145 public void run() {
00146 visualizationView.getCamera().jumpToFrame(ROBOT_FRAME);
00147 followMeToggleButton.setChecked(true);
00148 }
00149 });
00150 }
00151
00152 private void disableFollowMe() {
00153 Preconditions.checkNotNull(visualizationView);
00154 Preconditions.checkNotNull(followMeToggleButton);
00155 runOnUiThread(new Runnable() {
00156 @Override
00157 public void run() {
00158 visualizationView.getCamera().setFrame(MAP_FRAME);
00159 followMeToggleButton.setChecked(false);
00160 }
00161 });
00162 }
00163 }