|
@@ -3,14 +3,14 @@ import java.awt.event.KeyEvent;
|
|
import java.awt.event.KeyListener;
|
|
import java.awt.event.KeyListener;
|
|
import java.awt.event.WindowEvent;
|
|
import java.awt.event.WindowEvent;
|
|
import java.awt.event.WindowListener;
|
|
import java.awt.event.WindowListener;
|
|
|
|
+import java.io.FileWriter;
|
|
|
|
+import java.io.IOException;
|
|
|
|
+import java.io.PrintWriter;
|
|
|
|
+import java.util.ArrayList;
|
|
|
|
|
|
-import javax.swing.ButtonGroup;
|
|
|
|
import javax.swing.JFrame;
|
|
import javax.swing.JFrame;
|
|
-import javax.swing.JMenu;
|
|
|
|
-import javax.swing.JMenuBar;
|
|
|
|
import javax.swing.JOptionPane;
|
|
import javax.swing.JOptionPane;
|
|
import javax.swing.JPanel;
|
|
import javax.swing.JPanel;
|
|
-import javax.swing.JRadioButtonMenuItem;
|
|
|
|
import javax.swing.JSplitPane;
|
|
import javax.swing.JSplitPane;
|
|
import javax.swing.SwingUtilities;
|
|
import javax.swing.SwingUtilities;
|
|
|
|
|
|
@@ -41,7 +41,6 @@ public class MainProgram extends JPanel implements KeyListener, WindowListener,
|
|
public MainProgram(LineMap map, Robot robot) {
|
|
public MainProgram(LineMap map, Robot robot) {
|
|
this.robot = robot;
|
|
this.robot = robot;
|
|
JFrame frame = new JFrame("Mapa MAC0318");
|
|
JFrame frame = new JFrame("Mapa MAC0318");
|
|
-
|
|
|
|
|
|
|
|
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
|
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
|
frame.setLayout(new BorderLayout());
|
|
frame.setLayout(new BorderLayout());
|
|
@@ -61,34 +60,25 @@ public class MainProgram extends JPanel implements KeyListener, WindowListener,
|
|
splitPane.setOneTouchExpandable(true);
|
|
splitPane.setOneTouchExpandable(true);
|
|
splitPane.setDividerLocation((int) (frame.getHeight() / 2));
|
|
splitPane.setDividerLocation((int) (frame.getHeight() / 2));
|
|
frame.add(splitPane);
|
|
frame.add(splitPane);
|
|
-
|
|
|
|
-
|
|
|
|
- boolean result = false;
|
|
|
|
- if (robot != null) {
|
|
|
|
- result = robot.connect();
|
|
|
|
- robot.scann(this);
|
|
|
|
- }
|
|
|
|
|
|
|
|
- if (result == false) {
|
|
|
|
- JOptionPane.showMessageDialog(null, "Não foi possível conectar ao robô");
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- showHelp();
|
|
|
|
|
|
+ showHelp();
|
|
}
|
|
}
|
|
|
|
|
|
private void showHelp() {
|
|
private void showHelp() {
|
|
String text = "1,2,3 - Change global map view\n";
|
|
String text = "1,2,3 - Change global map view\n";
|
|
- text += "s - Set Pose.\n";
|
|
|
|
- text += "l - Show global map trace.\n";
|
|
|
|
- text += "c - Clean global map.\n";
|
|
|
|
- text += "m - Enter robot movement.\n";
|
|
|
|
- text += "r - Enter robo rotation.\n";
|
|
|
|
- text += "a - Colect sonar data.\n";
|
|
|
|
- text += "z - Make sonar continuous scanner.\n";
|
|
|
|
- text += "g - Save global map image.\n";
|
|
|
|
- text += "h - Save scanner image.\n";
|
|
|
|
- text += "<arrows> - Move robot.\n";
|
|
|
|
- JOptionPane.showMessageDialog(null, text, "HELP", JOptionPane.PLAIN_MESSAGE);
|
|
|
|
|
|
+ text += "s - Set Pose.\n";
|
|
|
|
+ text += "l - Show global map trace.\n";
|
|
|
|
+ text += "c - Clean maps.\n";
|
|
|
|
+ text += "m - Enter robot movement.\n";
|
|
|
|
+ text += "r - Enter robo rotation.\n";
|
|
|
|
+ text += "a - Colect sonar data.\n";
|
|
|
|
+ text += "z - Make sonar continuous scanner.\n";
|
|
|
|
+ text += "i - Stop continuous scanner.\n";
|
|
|
|
+ text += "g - Save global map image.\n";
|
|
|
|
+ text += "f - Save scanner image.\n";
|
|
|
|
+ text += "<arrows> - Move robot.\n";
|
|
|
|
+ text += "h - help.\n";
|
|
|
|
+ JOptionPane.showMessageDialog(null, text, "HELP", JOptionPane.PLAIN_MESSAGE);
|
|
}
|
|
}
|
|
|
|
|
|
public void addPoint(Pose p) {
|
|
public void addPoint(Pose p) {
|
|
@@ -97,49 +87,155 @@ public class MainProgram extends JPanel implements KeyListener, WindowListener,
|
|
|
|
|
|
@Override
|
|
@Override
|
|
public void keyPressed(KeyEvent e) {
|
|
public void keyPressed(KeyEvent e) {
|
|
|
|
+
|
|
char input = e.getKeyChar();
|
|
char input = e.getKeyChar();
|
|
- if (input == '1')
|
|
|
|
|
|
+ switch (input) {
|
|
|
|
+ case '1':
|
|
imap.setVisual(0);
|
|
imap.setVisual(0);
|
|
- else if (input == '2')
|
|
|
|
|
|
+ break;
|
|
|
|
+ case '2':
|
|
imap.setVisual(1);
|
|
imap.setVisual(1);
|
|
- else if (input == '3')
|
|
|
|
|
|
+ break;
|
|
|
|
+ case '3':
|
|
imap.setVisual(2);
|
|
imap.setVisual(2);
|
|
- else if (input == 'l')
|
|
|
|
|
|
+ break;
|
|
|
|
+ case 'l':
|
|
imap.showLine();
|
|
imap.showLine();
|
|
- else if (input == 'g')
|
|
|
|
|
|
+ break;
|
|
|
|
+ case 'g':
|
|
imap.save();
|
|
imap.save();
|
|
- else if (input == 'c')
|
|
|
|
|
|
+ break;
|
|
|
|
+ case 'f':
|
|
|
|
+ scanner.save();
|
|
|
|
+ break;
|
|
|
|
+ case 'c':
|
|
imap.clean();
|
|
imap.clean();
|
|
- else if (input == 's')
|
|
|
|
|
|
+ scanner.clean();
|
|
|
|
+ break;
|
|
|
|
+ case 's':
|
|
setRobotPose();
|
|
setRobotPose();
|
|
-
|
|
|
|
|
|
+ break;
|
|
|
|
+ case 'm':
|
|
|
|
+ moveRobot();
|
|
|
|
+ break;
|
|
|
|
+ case 'r':
|
|
|
|
+ rotateRobot();
|
|
|
|
+ break;
|
|
|
|
+ case 'a':
|
|
|
|
+ colectSonar();
|
|
|
|
+ break;
|
|
|
|
+ case 'z':
|
|
|
|
+ robot.scann(this);
|
|
|
|
+ break;
|
|
|
|
+ case 'i':
|
|
|
|
+ robot.stopScann();
|
|
|
|
+ break;
|
|
|
|
+ case 'h':
|
|
|
|
+ showHelp();
|
|
|
|
+ break;
|
|
|
|
+ default:
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+
|
|
if (robot == null)
|
|
if (robot == null)
|
|
return;
|
|
return;
|
|
|
|
|
|
switch (e.getKeyCode()) {
|
|
switch (e.getKeyCode()) {
|
|
case KeyEvent.VK_UP:
|
|
case KeyEvent.VK_UP:
|
|
robot.moveForward();
|
|
robot.moveForward();
|
|
|
|
+ scanner.clean();
|
|
break;
|
|
break;
|
|
case KeyEvent.VK_DOWN:
|
|
case KeyEvent.VK_DOWN:
|
|
robot.moveBackward();
|
|
robot.moveBackward();
|
|
|
|
+ scanner.clean();
|
|
break;
|
|
break;
|
|
case KeyEvent.VK_LEFT:
|
|
case KeyEvent.VK_LEFT:
|
|
robot.moveLeft();
|
|
robot.moveLeft();
|
|
|
|
+ scanner.clean();
|
|
break;
|
|
break;
|
|
case KeyEvent.VK_RIGHT:
|
|
case KeyEvent.VK_RIGHT:
|
|
robot.moveRight();
|
|
robot.moveRight();
|
|
|
|
+ scanner.clean();
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ private void colectSonar() {
|
|
|
|
+ int interval;
|
|
|
|
+ try {
|
|
|
|
+ String rs = JOptionPane.showInputDialog("Interval (degress):");
|
|
|
|
+ interval = Integer.parseInt(rs);
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ ArrayList<DataPose> data = robot.scann(-90, 90, interval);
|
|
|
|
+
|
|
|
|
+ Integer name = new Integer((int) (Math.random() * 1000000));
|
|
|
|
+ String rand_name = name.toString() + ".txt";
|
|
|
|
+ FileWriter fileWriter;
|
|
|
|
+ try {
|
|
|
|
+ fileWriter = new FileWriter(rand_name);
|
|
|
|
+ } catch (IOException e) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ PrintWriter printWriter = new PrintWriter(fileWriter);
|
|
|
|
+ printWriter.print("x,y,headinng,sonar_ang,read,expected\n");
|
|
|
|
+ for (DataPose d : data) {
|
|
|
|
+ robotData(d);
|
|
|
|
+
|
|
|
|
+ double expected = smodel.expectedSonarRead(d.getPose(), d.getSensorAngle());
|
|
|
|
+ printWriter.print(d.getPose().getX() + ",");
|
|
|
|
+ printWriter.print(d.getPose().getY() + ",");
|
|
|
|
+ printWriter.print(d.getPose().getHeading() + ",");
|
|
|
|
+ printWriter.print(d.getSensorAngle() + ",");
|
|
|
|
+ printWriter.print(d.getDistance() + ",");
|
|
|
|
+ printWriter.print(expected + "\n");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ printWriter.close();
|
|
|
|
+ JOptionPane.showMessageDialog(null, "Reads saved in " + rand_name);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private void rotateRobot() {
|
|
|
|
+ try {
|
|
|
|
+ String rs = JOptionPane.showInputDialog("Enter rotation (degress-clockwise):");
|
|
|
|
+ double r = Double.parseDouble(rs);
|
|
|
|
+ robot.rotate(r);
|
|
|
|
+ scanner.clean();
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private void moveRobot() {
|
|
|
|
+ try {
|
|
|
|
+ String rs = JOptionPane.showInputDialog("Enter distance (cm):");
|
|
|
|
+ double r = Double.parseDouble(rs);
|
|
|
|
+ robot.move(r);
|
|
|
|
+ scanner.clean();
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
private void setRobotPose() {
|
|
private void setRobotPose() {
|
|
- String xs = JOptionPane.showInputDialog("Enter x (cm):");
|
|
|
|
- String ys = JOptionPane.showInputDialog("Enter y (cm):");
|
|
|
|
- String as = JOptionPane.showInputDialog("Enter heading (degress):");
|
|
|
|
- float x = Float.parseFloat(xs);
|
|
|
|
- float y = Float.parseFloat(ys);
|
|
|
|
- float a = Float.parseFloat(as);
|
|
|
|
- robot.setPose(x, y, a);
|
|
|
|
|
|
+ try {
|
|
|
|
+ String xs = JOptionPane.showInputDialog("Enter x (cm):");
|
|
|
|
+ if (xs.length() == 0)
|
|
|
|
+ return;
|
|
|
|
+ String ys = JOptionPane.showInputDialog("Enter y (cm):");
|
|
|
|
+ if (ys.length() == 0)
|
|
|
|
+ return;
|
|
|
|
+ String as = JOptionPane.showInputDialog("Enter heading (degress):");
|
|
|
|
+ if (as.length() == 0)
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ float x = Float.parseFloat(xs);
|
|
|
|
+ float y = Float.parseFloat(ys);
|
|
|
|
+ float a = Float.parseFloat(as);
|
|
|
|
+ robot.setPose(x, y, a);
|
|
|
|
+ scanner.setPose(new Pose(x, y, a));
|
|
|
|
+ scanner.clean();
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
@Override
|
|
@Override
|
|
@@ -194,9 +290,12 @@ public class MainProgram extends JPanel implements KeyListener, WindowListener,
|
|
public void robotData(DataPose data) {
|
|
public void robotData(DataPose data) {
|
|
// posicao do robo
|
|
// posicao do robo
|
|
Pose p = data.getPose();
|
|
Pose p = data.getPose();
|
|
-
|
|
|
|
|
|
+
|
|
imap.addPoint(p);
|
|
imap.addPoint(p);
|
|
- if (data.getDistance() == 255) return;
|
|
|
|
|
|
+ if (data.getDistance() == 255) {
|
|
|
|
+ scanner.setPose(p);
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
|
|
// ponto do ultrasonico
|
|
// ponto do ultrasonico
|
|
double sensor_ang = Math.toRadians(data.getSensorAngle() + p.getHeading());
|
|
double sensor_ang = Math.toRadians(data.getSensorAngle() + p.getHeading());
|
|
@@ -212,12 +311,19 @@ public class MainProgram extends JPanel implements KeyListener, WindowListener,
|
|
LineMap map = Map.makeMap();
|
|
LineMap map = Map.makeMap();
|
|
Robot robotv = new VirtualRobot(map);
|
|
Robot robotv = new VirtualRobot(map);
|
|
Robot robotbt = new BluetoothRobot(null);
|
|
Robot robotbt = new BluetoothRobot(null);
|
|
-
|
|
|
|
|
|
+
|
|
Object[] possibleValues = { robotv, robotbt };
|
|
Object[] possibleValues = { robotv, robotbt };
|
|
- Object robot = JOptionPane.showInputDialog(null,
|
|
|
|
- "Choose one", "Input",
|
|
|
|
- JOptionPane.PLAIN_MESSAGE, null,
|
|
|
|
- possibleValues, possibleValues[0]);
|
|
|
|
|
|
+ Object robot = JOptionPane.showInputDialog(null, "Choose one", "Input", JOptionPane.PLAIN_MESSAGE, null,
|
|
|
|
+ possibleValues, possibleValues[0]);
|
|
|
|
+
|
|
|
|
+ boolean result = false;
|
|
|
|
+ if (robot != null)
|
|
|
|
+ result = ((Robot) robot).connect();
|
|
|
|
+
|
|
|
|
+ if (result == false) {
|
|
|
|
+ JOptionPane.showMessageDialog(null, "Não foi possível conectar ao robô");
|
|
|
|
+ System.exit(ERROR);
|
|
|
|
+ }
|
|
|
|
|
|
SwingUtilities.invokeLater(new Runnable() {
|
|
SwingUtilities.invokeLater(new Runnable() {
|
|
public void run() {
|
|
public void run() {
|