Skip to content

Commit ebcadb2

Browse files
authored
Merge branch 'develop' into feature/update_standing
2 parents 5dffbc5 + 62c0e7a commit ebcadb2

File tree

220 files changed

+8861
-1500
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

220 files changed

+8861
-1500
lines changed

ihmc-avatar-interfaces/src/main/java/us/ihmc/avatar/wholeBodyHardwareControl/AvatarMultiThreadingFactory.java

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@ public class AvatarMultiThreadingFactory
6969
private static final double GRAVITY = -9.81;
7070
public static final boolean RUN_AUTO_DIAGNOSTIC = false;
7171
private static final int ROS2_PRIORITY = 25;
72+
private static final int JVM_STATISTICS_PRIORITY = 5;
73+
7274

7375
private final YoRegistry rootRegistry;
7476

@@ -116,7 +118,6 @@ public class AvatarMultiThreadingFactory
116118
private final boolean useRealtimeThreads;
117119
private final boolean useMultiThreading;
118120
private final YoVariableServer yoVariableServer;
119-
private JVMStatisticsGenerator jvmStatisticsGenerator;
120121

121122
public AvatarMultiThreadingFactory(DRCRobotModel robotModel,
122123
FullHumanoidRobotModel fullRobotModel,
@@ -225,6 +226,17 @@ public AvatarMultiThreadingManager buildThreadsAndThreadingManager()
225226
if (ikStreamingThread.hasValue())
226227
yoVariableServer.addRegistry(ikStreamingThread.get().getYoVariableRegistry(), ikStreamingThread.get().getSCS1YoGraphicsListRegistry());
227228

229+
230+
// Setup JVM statistics
231+
PeriodicThreadSchedulerFactory jvmSchedulerFactory;
232+
if (useRealtimeThreads)
233+
jvmSchedulerFactory = new PeriodicRealtimeThreadSchedulerFactory(new PriorityParameters(JVM_STATISTICS_PRIORITY));
234+
else
235+
jvmSchedulerFactory = new PeriodicNonRealtimeThreadSchedulerFactory();
236+
237+
JVMStatisticsGenerator jvmStatisticsGenerator = new JVMStatisticsGenerator(yoVariableServer, jvmSchedulerFactory);
238+
jvmStatisticsGenerator.addVariablesToStatisticsGenerator(yoVariableServer);
239+
228240
// Create threading manager
229241
threadingManager.set(new AvatarMultiThreadingManager(robotModel.getSimpleRobotName().toLowerCase(),
230242
robotModel,
@@ -245,6 +257,7 @@ public AvatarMultiThreadingManager buildThreadsAndThreadingManager()
245257
useRealtimeThreads,
246258
useMultiThreading,
247259
yoVariableServer,
260+
jvmStatisticsGenerator,
248261
rootRegistry));
249262

250263
// Set up the block to prevent execution whenever there is no new state message.
@@ -257,11 +270,15 @@ public AvatarMultiThreadingManager buildThreadsAndThreadingManager()
257270
builders.add(new RegistrySendBufferBuilder(rootRegistry, null));
258271
builders.add(new RegistrySendBufferBuilder(controllerThread.get().getYoVariableRegistry(), null, controllerThread.get().getSCS2YoGraphics()));
259272
if (stepGeneratorThread.hasValue())
273+
{
260274
builders.add(new RegistrySendBufferBuilder(stepGeneratorThread.get().getYoVariableRegistry(), null, stepGeneratorThread.get().getSCS2YoGraphics()));
275+
}
261276
if (ikStreamingThread.hasValue())
277+
{
262278
builders.add(new RegistrySendBufferBuilder(ikStreamingThread.get().getYoVariableRegistry(), null, ikStreamingThread.get().getSCS2YoGraphics()));
263-
if (jvmStatisticsGenerator != null)
264-
builders.add(new RegistrySendBufferBuilder(jvmStatisticsGenerator.getYoRegistry(), null));
279+
}
280+
281+
builders.add(new RegistrySendBufferBuilder(jvmStatisticsGenerator.getYoRegistry(), null));
265282

266283
// Logging locally on the robot
267284
IntraprocessYoVariableLogger intraprocessYoVariableLogger = new IntraprocessYoVariableLogger(getClass().getSimpleName(),
@@ -581,11 +598,6 @@ public void addSmoothTransitionState(String transitionName, HighLevelControllerN
581598
controllerFactory.addCustomSmoothTransitionControlState(transitionName, transitionStateEnum, currentControlStateEnum, nextControlStateEnum);
582599
}
583600

584-
public void addJVMStatisticsForLoggingLocally(JVMStatisticsGenerator jvmStatisticsGenerator)
585-
{
586-
this.jvmStatisticsGenerator = jvmStatisticsGenerator;
587-
}
588-
589601
public void setLogLocally(boolean logLocally)
590602
{
591603
this.logLocally = logLocally;

ihmc-avatar-interfaces/src/main/java/us/ihmc/avatar/wholeBodyHardwareControl/AvatarMultiThreadingManager.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import us.ihmc.avatar.factory.HumanoidRobotControlTask;
99
import us.ihmc.avatar.factory.SingleThreadedRobotController;
1010
import us.ihmc.avatar.networkProcessor.kinematicsStreamingToolboxModule.IKStreamingRTPluginFactory;
11+
import us.ihmc.avatar.networkProcessor.kinematicsStreamingToolboxModule.IKStreamingRTPluginFactory.IKStreamingRTThread;
1112
import us.ihmc.commonWalkingControlModules.barrierScheduler.context.HumanoidRobotContextData;
1213
import us.ihmc.commons.Conversions;
1314
import us.ihmc.commons.exception.DefaultExceptionHandler;
@@ -20,6 +21,7 @@
2021
import us.ihmc.realtime.PeriodicParameters;
2122
import us.ihmc.realtime.RealtimeThread;
2223
import us.ihmc.robotDataLogger.YoVariableServer;
24+
import us.ihmc.robotDataVisualizer.logger.JVMStatisticsGenerator;
2325
import us.ihmc.robotModels.FullHumanoidRobotModel;
2426
import us.ihmc.ros2.RealtimeROS2Node;
2527
import us.ihmc.scs2.definition.yoGraphic.YoGraphicGroupDefinition;
@@ -45,6 +47,7 @@
4547
public class AvatarMultiThreadingManager
4648
{
4749
private final YoRegistry registry = new YoRegistry(getClass().getSimpleName());
50+
private final JVMStatisticsGenerator jvmStatisticsGenerator;
4851
private final YoRegistry rootRegistry;
4952
private final YoVariableServer yoVariableServer;
5053

@@ -114,14 +117,15 @@ public AvatarMultiThreadingManager(String prefix,
114117
AvatarEstimatorThread estimatorThread,
115118
AvatarControllerThread controllerThread,
116119
AvatarStepGeneratorThread stepGeneratorThread,
117-
IKStreamingRTPluginFactory.IKStreamingRTThread ikStreamingThread,
120+
IKStreamingRTThread ikStreamingThread,
118121
AvatarAffinityInterface affinity,
119122
double masterThreadDt,
120123
MonotonicTime period,
121124
TimestampProvider monotonicTimeProvider,
122125
boolean useRealtimeThreads,
123126
boolean useMultiThreading,
124127
YoVariableServer yoVariableServer,
128+
JVMStatisticsGenerator jvmStatisticsGenerator,
125129
YoRegistry rootRegistry)
126130
{
127131
this.estimatorROS2Node = estimatorROS2Node;
@@ -135,6 +139,7 @@ public AvatarMultiThreadingManager(String prefix,
135139
this.monotonicTimeProvider = monotonicTimeProvider;
136140
this.useRealtimeThreads = useRealtimeThreads;
137141
this.useMultiThreading = useMultiThreading;
142+
this.jvmStatisticsGenerator = jvmStatisticsGenerator;
138143
this.rootRegistry = rootRegistry;
139144
this.yoVariableServer = yoVariableServer;
140145

@@ -329,6 +334,7 @@ public void start()
329334
estimatorROS2Node.spin();
330335
controllerROS2Node.spin();
331336
hardwareCommunicationInterface.start();
337+
jvmStatisticsGenerator.start();
332338
if (useRealtimeThreads)
333339
{
334340
running = true;
@@ -354,6 +360,7 @@ public void stop()
354360
estimatorROS2Node.stopSpinning();
355361
controllerROS2Node.stopSpinning();
356362
hardwareCommunicationInterface.stop();
363+
jvmStatisticsGenerator.stop();
357364
}
358365

359366
public void destroy()

ihmc-high-level-behaviors/src/libgdx/java/us/ihmc/rdx/behaviorTree/RDXAvailableBehaviorTreeDirectory.java

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -125,19 +125,27 @@ public void renderImGuiWidgets(RDXBehaviorTreeNode<?, ?> relativeNode, BehaviorT
125125
{
126126
if (ImGui.isMouseClicked(ImGuiMouseButton.Left))
127127
{
128-
RDXBehaviorTreeNode<?, ?> loadedNode = behaviorTree.getFileLoader().loadFromFile(indexedTreeFile.getTreeFile(), topologyOperationQueue);
128+
RDXBehaviorTreeRootNode rootNode;
129+
if (relativeNode == null) // Automatically add a root node if there isn't one
130+
rootNode = (RDXBehaviorTreeRootNode) behaviorTree.getNodeBuilder().createRootNode(behaviorTree.getAndIncrementNextID());
131+
else
132+
rootNode = behaviorTree.getRootNode();
133+
134+
RDXBehaviorTreeNode<?, ?> loadedNode
135+
= behaviorTree.getFileLoader().loadFromFile(rootNode, indexedTreeFile.getTreeFile(), topologyOperationQueue);
129136

130137
if (loadedNode != null)
131138
{
132-
RDXBehaviorTreeNode<?, ?> nodeToInsert = loadedNode;
133-
134-
if (behaviorTree.getRootNode() == null) // Automatically add a root node if there isn't one
139+
RDXBehaviorTreeNode<?, ?> nodeToInsert;
140+
if (relativeNode == null) // Add as child of root node if we made one
141+
{
142+
nodeToInsert = rootNode;
143+
rootNode.getDefinition().modify();
144+
topologyOperationQueue.queueAppendChildModify(rootNode, loadedNode);
145+
}
146+
else
135147
{
136-
nodeToInsert = new RDXBehaviorTreeRootNode(behaviorTree.getAndIncrementNextID(),
137-
behaviorTree.getCRDTInfo(),
138-
behaviorTree.getSaveFileDirectory());
139-
nodeToInsert.getDefinition().modify();
140-
topologyOperationQueue.queueAppendChildModify(nodeToInsert, loadedNode);
148+
nodeToInsert = loadedNode;
141149
}
142150

143151
BehaviorTreeNodeInsertionDefinition<RDXBehaviorTreeNode<?, ?>> insertionDefinition

ihmc-high-level-behaviors/src/libgdx/java/us/ihmc/rdx/behaviorTree/RDXBehaviorTree.java

Lines changed: 39 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,9 @@
2828
import us.ihmc.robotics.referenceFrames.ReferenceFrameLibrary;
2929
import us.ihmc.tools.io.WorkspaceResourceDirectory;
3030

31-
public class RDXBehaviorTree extends BehaviorTree<RDXBehaviorTreeNode<?, ?>>
31+
public class RDXBehaviorTree extends BehaviorTree<RDXBehaviorTreeRootNode, RDXBehaviorTreeNode<?, ?>>
3232
{
3333
public static final RDXBehaviorTreeSettings SETTINGS = new RDXBehaviorTreeSettings();
34-
private RDXBehaviorTreeRootNode rootNode;
3534
/**
3635
* Useful for accessing nodes by ID instead of searching.
3736
* Also, sometimes, the tree will be disassembled and this is used in putting it
@@ -40,12 +39,12 @@ public class RDXBehaviorTree extends BehaviorTree<RDXBehaviorTreeNode<?, ?>>
4039
private transient final TLongObjectMap<RDXBehaviorTreeNode<?, ?>> idToNodeMap = new TLongObjectHashMap<>();
4140
private final RDXPanel panel = new RDXPanel("Behavior Tree", this::renderImGuiWidgets, false, true);
4241
private final ImGuiUniqueLabelMap labels = new ImGuiUniqueLabelMap(getClass());
43-
private final RDXBehaviorTreeFileMenu fileMenu;
4442
private final RDXBehaviorTreeNodeCreationMenu nodeCreationMenu;
4543
private final RDXBehaviorTreeWidgetsVerticalLayout treeWidgetsVerticalLayout;
4644
private boolean anyNodeSelected;
4745
private RDXBehaviorTreeNode<?, ?> selectedNode;
4846
private boolean draggingDivider;
47+
private boolean shouldSave = false;
4948

5049
public RDXBehaviorTree(WorkspaceResourceDirectory treeFilesDirectory,
5150
DRCRobotModel robotModel,
@@ -59,14 +58,8 @@ public RDXBehaviorTree(WorkspaceResourceDirectory treeFilesDirectory,
5958
super(ROS2ActorDesignation.OPERATOR,
6059
peerClockEstimator,
6160
treeFilesDirectory,
62-
new RDXBehaviorTreeNodeBuilder(robotModel,
63-
syncedRobot,
64-
selectionCollisionModel,
65-
baseUI,
66-
panel3D,
67-
referenceFrameLibrary));
68-
69-
fileMenu = new RDXBehaviorTreeFileMenu();
61+
new RDXBehaviorTreeNodeBuilder(robotModel, syncedRobot, referenceFrameLibrary, selectionCollisionModel, baseUI, panel3D));
62+
7063
nodeCreationMenu = new RDXBehaviorTreeNodeCreationMenu(this, treeFilesDirectory, referenceFrameLibrary);
7164
treeWidgetsVerticalLayout = new RDXBehaviorTreeWidgetsVerticalLayout(this);
7265
baseUI.getImGuiPanelManager().addPanel(panel);
@@ -153,8 +146,31 @@ public void renderImGuiWidgets()
153146

154147
protected void renderImGuiWidgetsPre()
155148
{
149+
shouldSave = false;
156150
ImGui.beginMenuBar();
157-
fileMenu.renderFileMenu(rootNode, nodeCreationMenu);
151+
if (ImGui.beginMenu(labels.get("File")))
152+
{
153+
if (rootNode == null)
154+
{
155+
if (ImGui.menuItem(labels.get("Refresh File List")))
156+
nodeCreationMenu.reindexDirectory();
157+
}
158+
else
159+
{
160+
if (ImGui.menuItem(labels.get("Save All"), "Ctrl + S"))
161+
{
162+
RDXBaseUI.pushNotification("Saving %s".formatted(rootNode.getDefinition().getName()));
163+
rootNode.getDefinition().saveToFile();
164+
}
165+
if (ImGui.menuItem(labels.get("Undo All Non-topological Changes")))
166+
{
167+
RDXBaseUI.pushNotification("Undoing all non-topological behavior tree changes");
168+
rootNode.getDefinition().undoAllNontopologicalChanges();
169+
}
170+
}
171+
172+
ImGui.endMenu();
173+
}
158174
if (ImGui.beginMenu(labels.get("View")))
159175
{
160176
if (rootNode != null)
@@ -186,12 +202,15 @@ protected void renderImGuiWidgetsPost()
186202
selectedNode = node;
187203
});
188204

205+
shouldSave |= ImGui.isWindowHovered() && ImGui.getIO().getKeyCtrl() && ImGui.isKeyPressed('S');
206+
189207
float remainingHeight = ImGui.getContentRegionAvailY();
190208
float treeExplorerPercentage = SETTINGS.getTreeExplorerHeightPercentage();
191209
float treeExplorerHeight = anyNodeSelected ? remainingHeight * treeExplorerPercentage : remainingHeight;
192210

193211
ImGui.beginChild(labels.get("Tree Explorer Scroll Area"), 0.0f, treeExplorerHeight);
194212
treeWidgetsVerticalLayout.renderImGuiWidgets();
213+
shouldSave |= ImGui.isWindowHovered() && ImGui.getIO().getKeyCtrl() && ImGui.isKeyPressed('S');
195214
ImGui.endChild();
196215

197216
if (rootNode != null && anyNodeSelected) // It can become null above
@@ -216,22 +235,23 @@ protected void renderImGuiWidgetsPost()
216235

217236
ImGui.beginChild(labels.get("Node Settings Scroll Area"), 0.0f, ImGui.getContentRegionAvailY());
218237
renderSelectedNodeSettingsWidgets(rootNode);
238+
shouldSave |= ImGui.isWindowHovered() && ImGui.getIO().getKeyCtrl() && ImGui.isKeyPressed('S');
219239
ImGui.endChild();
220-
221-
if (ImGui.isWindowHovered() && ImGui.getIO().getKeyCtrl() && ImGui.isKeyPressed('S'))
222-
{
223-
RDXBaseUI.pushNotification("Saving %s".formatted(rootNode.getDefinition().getName()));
224-
rootNode.getDefinition().saveToFile();
225-
}
226240
}
227241
}
228242
else
229243
{
230-
nodeCreationMenu.renderImGuiWidgets(rootNode, BehaviorTreeNodeInsertionType.INSERT_ROOT);
244+
nodeCreationMenu.renderImGuiWidgets(null, BehaviorTreeNodeInsertionType.INSERT_ROOT);
231245
}
232246

233247
// Perform any modifications that were made via user interaction.
234248
modifyTreeTopology();
249+
250+
if (shouldSave)
251+
{
252+
RDXBaseUI.pushNotification("Saving %s".formatted(rootNode.getDefinition().getName()));
253+
rootNode.getDefinition().saveToFile();
254+
}
235255
}
236256

237257
private void renderSelectedNodeSettingsWidgets(RDXBehaviorTreeNode<?, ?> node)
@@ -302,18 +322,6 @@ public void destroy()
302322
RDXBaseUI.getInstance().getPrimary3DPanel().removeImGui3DViewInputProcessor(this);
303323
}
304324

305-
@Override
306-
public void setRootNode(RDXBehaviorTreeNode<?, ?> rootNode)
307-
{
308-
this.rootNode = (RDXBehaviorTreeRootNode) rootNode;
309-
}
310-
311-
@Override
312-
public RDXBehaviorTreeRootNode getRootNode()
313-
{
314-
return rootNode;
315-
}
316-
317325
public RDXBehaviorTreeNodeCreationMenu getNodeCreationMenu()
318326
{
319327
return nodeCreationMenu;

ihmc-high-level-behaviors/src/libgdx/java/us/ihmc/rdx/behaviorTree/RDXBehaviorTreeFileMenu.java

Lines changed: 0 additions & 41 deletions
This file was deleted.

0 commit comments

Comments
 (0)