Skip to content

Commit

Permalink
use MultiLineGraph to display joint history over time.
Browse files Browse the repository at this point in the history
  • Loading branch information
i-make-robots committed Nov 8, 2023
1 parent 96ba9dc commit b96382e
Show file tree
Hide file tree
Showing 5 changed files with 455 additions and 1,467 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import com.marginallyclever.robotoverlord.components.RobotComponent;
import com.marginallyclever.robotoverlord.swing.translator.Translator;
import com.marginallyclever.robotoverlord.systems.robot.robotarm.controlarmpanel.jogpanel.JogPanel;
import com.marginallyclever.robotoverlord.systems.robot.robotarm.controlarmpanel.jointhistorypanel.JointHistoryPanel;
import com.marginallyclever.robotoverlord.systems.robot.robotarm.controlarmpanel.presentationlayer.PresentationFactory;
import com.marginallyclever.robotoverlord.systems.robot.robotarm.controlarmpanel.presentationlayer.PresentationLayer;
import com.marginallyclever.robotoverlord.systems.robot.robotarm.controlarmpanel.programpanel.ProgramPanel;
Expand All @@ -18,6 +19,7 @@
*/
public class ControlArmPanel extends JPanel {
private final ProgramPanel programPanel;
private final JointHistoryPanel jointHistory;

private final JPanel presentationContainer = new JPanel(new BorderLayout());
private final JPanel presentationSelection = new JPanel(new BorderLayout());
Expand All @@ -41,12 +43,14 @@ public ControlArmPanel(RobotComponent robot, GCodePathComponent path) {

JogPanel jogPanel = new JogPanel(robot);
programPanel = new ProgramPanel(robot,path);
jointHistory = new JointHistoryPanel(robot);
setupPresentationContainer();

JTabbedPane pane = new JTabbedPane();
pane.addTab(Translator.get("RobotPanel.Jog"), jogPanel);
pane.addTab(Translator.get("RobotPanel.Program"), programPanel);
pane.addTab(Translator.get("RobotPanel.Connect"), presentationContainer);
pane.addTab(Translator.get("RobotPanel.History"), jointHistory);

this.setLayout(new BorderLayout());
this.add(pane, BorderLayout.CENTER);
Expand Down Expand Up @@ -168,15 +172,17 @@ public void closeConnection() {

public static void main(String[] args) {
Log.start();
JFrame frame = new JFrame("RobotArmInterface");
Translator.start();

try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch(Exception ignored) {}

JFrame frame = new JFrame(ControlArmPanel.class.getSimpleName());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new ControlArmPanel(new RobotComponent(),null));
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import com.marginallyclever.convenience.swing.Dial;
import com.marginallyclever.robotoverlord.components.RobotComponent;
import com.marginallyclever.robotoverlord.robots.Robot;
import com.marginallyclever.robotoverlord.swing.translator.Translator;

import javax.swing.*;
import java.awt.*;
Expand All @@ -26,11 +27,13 @@ public AngleDrivePanel(Robot robot) {

ButtonGroup buttonGroup = new ButtonGroup();
buttons = new JRadioButton[numJoints];
for(int i=0;i<numJoints;++i) {
robot.set(Robot.ACTIVE_JOINT,i);
buttons[i] = makeRadioButton(buttonGroup,(String)robot.get(Robot.JOINT_NAME));
if(numJoints>0) {
for (int i = 0; i < numJoints; ++i) {
robot.set(Robot.ACTIVE_JOINT, i);
buttons[i] = makeRadioButton(buttonGroup, (String) robot.get(Robot.JOINT_NAME));
}
buttons[0].setSelected(true);
}
buttons[0].setSelected(true);

dial.addActionListener((evt)-> onDialTurn(robot) );
dial.setPreferredSize(new Dimension(120,120));
Expand Down Expand Up @@ -97,6 +100,7 @@ private JRadioButton makeRadioButton(ButtonGroup group, String label) {

public static void main(String[] args) {
Log.start();
Translator.start();

try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,6 @@
* @since 2.5.0
*/
public class JogPanel extends JPanel {
@Serial
private static final long serialVersionUID = 1L;
private final Robot myRobot;
private final CartesianReportPanel eeReport, tcpReport;

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
package com.marginallyclever.robotoverlord.systems.robot.robotarm.controlarmpanel.jointhistorypanel;

import com.marginallyclever.convenience.swing.graph.MultiLineGraph;
import com.marginallyclever.convenience.swing.graph.GraphLine;
import com.marginallyclever.convenience.swing.graph.GraphModel;
import com.marginallyclever.robotoverlord.components.DHComponent;
import com.marginallyclever.robotoverlord.components.RobotComponent;

import javax.swing.*;
import javax.swing.border.BevelBorder;
import java.awt.*;
import java.awt.geom.Rectangle2D;

/**
* Displays a history of joint positions in a graph.
* @author Dan Royer
* @since 2.10.0
*/
public class JointHistoryPanel extends JPanel {
private final MultiLineGraph graph = new MultiLineGraph();
private double timeSpan = 60;

public JointHistoryPanel(RobotComponent robot) {
super(new BorderLayout());
JPanel graphPanel = createGraphComponent(robot);
JPanel scaleButtons = createScaleButtons();
this.add(scaleButtons,BorderLayout.NORTH);
this.add(graphPanel,BorderLayout.CENTER);
}

private JPanel createScaleButtons() {
JPanel scaleButtons = new JPanel(new FlowLayout(FlowLayout.LEFT));
JButton button10s = new JButton("10s");
button10s.addActionListener(e->setTimeSpan(10));
scaleButtons.add(button10s);
JButton button1m = new JButton("1m");
button1m.addActionListener(e->setTimeSpan(60));
scaleButtons.add(button1m);
JButton button10m = new JButton("10m");
button10m.addActionListener(e->setTimeSpan(60*10));
scaleButtons.add(button10m);
JButton button1h = new JButton("1h");
button1h.addActionListener(e->setTimeSpan(60*60));
scaleButtons.add(button1h);
return scaleButtons;
}

public void setTimeSpan(double timeSpan) {
this.timeSpan = timeSpan;
updateRange();
graph.repaint();
}

private JPanel createGraphComponent(RobotComponent robot) {
GraphModel graphModel = graph.getModel();

int bones = robot.getNumBones();
for(int i=0;i<bones;++i) {
DHComponent bone = robot.getBone(i);
GraphLine line = new GraphLine();
graphModel.addLine(bone.getEntity().getName(),line);
int finalI = i;
bone.theta.addPropertyChangeListener(evt -> {
double t = System.currentTimeMillis()*0.001;
double max = bone.getJointMax();
double min = bone.getJointMin();
double v = (double)evt.getNewValue();

line.addPoint(t, (v-min)/(max-min));
System.out.println("add "+ finalI +"="+evt.getNewValue());
// TODO remove oldest value if too many?
updateRange();
graph.repaint();
});
line.addPoint(System.currentTimeMillis()*0.001, bone.theta.get());
}

double t = System.currentTimeMillis()*0.001;
graph.setRange(new Rectangle2D.Double(t,t,0,1));
graph.assignQualitativeColors();
graph.setBorder(new BevelBorder(BevelBorder.LOWERED));

return graph;
}

private void updateRange() {
double t = System.currentTimeMillis()*0.001;
Rectangle2D.Double range = graph.getRange();
double min = Math.max( range.getMinX(), t-timeSpan);
range.setRect(min,0,timeSpan,1);
graph.setRange(range);
}
}
Loading

0 comments on commit b96382e

Please sign in to comment.