Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
62d84d3
Begin FP integration.
calvertdw Nov 13, 2025
d1d7ffe
Include FoundationPose detections in behavior scene.
calvertdw Nov 14, 2025
e50fec0
Get foundationpose on jetson testbed talking to the behavior UI locally.
calvertdw Nov 14, 2025
ccccd5b
Let Claude Agent go crazy implementing spatial mapping.
calvertdw Nov 15, 2025
f6a7b6e
Fix edge case in isNextForExecution calculation.
calvertdw Nov 16, 2025
7522784
Fix out of bound index exception.
calvertdw Nov 16, 2025
83bbf30
Add fields to scene action node.
calvertdw Nov 17, 2025
253170c
WIP setting up fields in scene action node.
calvertdw Nov 17, 2025
6c98255
Completed draft of new scene action node fields.
calvertdw Nov 18, 2025
81a4d75
Make new scene action fields settable and filter for FoundationPose d…
calvertdw Nov 18, 2025
3a1db1d
Prevent can't execute errors from printing unless we are actually try…
calvertdw Nov 19, 2025
a543317
Fix up scene action node and add debug info.
calvertdw Nov 19, 2025
35c12ca
Fix drag and drop bug.
calvertdw Nov 19, 2025
aeb39bb
Throttle low quality arm solve rendering.
calvertdw Nov 19, 2025
abc6d68
Avoid duplicate log messages in test UI.
calvertdw Nov 19, 2025
a234e44
Add always fail and succeed condition node types and iron out bugs in…
calvertdw Nov 19, 2025
a25de4a
Reimplement proximity check to be more general.
calvertdw Nov 20, 2025
1f31708
Completely rewrite sequence and fallback execution with concurrency l…
calvertdw Nov 20, 2025
c1c92f7
Draw fallback boundary.
calvertdw Nov 20, 2025
20862cb
Iron out fallback logic. Center circle.
calvertdw Nov 21, 2025
ae47adb
Improve logic.
calvertdw Nov 21, 2025
10d2a6c
Add note.
calvertdw Nov 21, 2025
6a13e6d
Setup additional ability hand action reactivity options.
calvertdw Nov 22, 2025
9c4585a
Implement experimental robustness for ability hand action.
calvertdw Nov 23, 2025
e05ad77
Remove concurrency rank.
calvertdw Nov 23, 2025
0eae846
Fix scene action executor.
Nov 24, 2025
145637f
Switch to ability hand position control mode.
calvertdw Nov 25, 2025
d5f0d5a
Update grip UI.
calvertdw Nov 26, 2025
610caaa
Set desired position to hand's goal position instead of current position
TomaszTB Nov 26, 2025
43483dc
Update grips.
calvertdw Nov 26, 2025
c7e9f74
Fix Ability Hand slider issue
TomaszTB Nov 26, 2025
81310b5
Bring back isItemActive and executeVelToPos check
TomaszTB Nov 26, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
package us.ihmc.communication.crdt;

import us.ihmc.idl.IDLSequence;

/**
* Represents an enum array that can be modified by both the
* robot and the operator.
* <p>
* Warning: With this type, the data should not be continuously modified
* tick after tick, as that will mean the value is essentially never
* synced properly to the other side.
*/
public class CRDTBidirectionalEnumArray<T extends Enum<T>> extends CRDTBidirectionalMutableField<T[]>
{
public CRDTBidirectionalEnumArray(LatestTimestampModifiable latestTimestampModifiable, T[] initialArray)
{
super(latestTimestampModifiable, initialArray);
}

public T getValueReadOnly(int index)
{
return getValueInternal()[index];
}

public void setValue(int index, T value)
{
if (getValueReadOnly(index) != value)
getValueAndModify()[index] = value;
}

public int getLength()
{
return getValueInternal().length;
}

public void toMessage(IDLSequence.Byte messageArray)
{
T[] values = getValueInternal();
messageArray.resetQuick();
for (int i = 0; i < Math.min(getLength(), messageArray.size()); i++)
{
messageArray.add(values[i] == null ? -1 : (byte) values[i].ordinal());
}
}

public void toMessage(byte[] messageArray)
{
T[] values = getValueInternal();
for (int i = 0; i < Math.min(getLength(), messageArray.length); i++)
{
messageArray[i] = values[i] == null ? -1 : (byte) values[i].ordinal();
}
}

public void fromMessage(IDLSequence.Byte messageArray, T[] enumValues)
{
if (isModificationIncoming())
{
T[] values = getValueInternal();
for (int i = 0; i < Math.min(getLength(), messageArray.size()); i++)
{
values[i] = messageArray.get(i) == -1 ? null : enumValues[messageArray.get(i)];
}
}
}

public void fromMessage(byte[] messageArray, T[] enumValues)
{
if (isModificationIncoming())
{
T[] values = getValueInternal();
for (int i = 0; i < Math.min(getLength(), messageArray.length); i++)
{
values[i] = messageArray[i] == -1 ? null : enumValues[messageArray[i]];
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
package us.ihmc.communication.crdt;

import us.ihmc.idl.IDLSequence;

import java.util.ArrayList;
import java.util.List;

/**
* Represents an enum List that can be modified by both the
* robot and the operator.
* <p>
* Warning: With this type, the data should not be continuously modified
* tick after tick, as that will mean the value is essentially never
* synced properly to the other side.
*/
public class CRDTBidirectionalEnumList<T extends Enum<T>> extends CRDTBidirectionalMutableField<List<T>>
{
public CRDTBidirectionalEnumList(LatestTimestampModifiable latestTimestampModifiable)
{
super(latestTimestampModifiable, new ArrayList<>());
}

public T getValueReadOnly(int index)
{
return getValueInternal().get(index);
}

public void setValue(int index, T value)
{
if (getValueReadOnly(index) != value)
getValueAndModify().set(index, value);
}

public void add(T value)
{
getValueAndModify().add(value);
}

public void remove(int index)
{
getValueAndModify().remove(index);
}

public void clear()
{
getValueAndModify().clear();
}

public int getSize()
{
return getValueInternal().size();
}

public void toMessage(IDLSequence.Byte messageArray)
{
List<T> values = getValueInternal();
messageArray.resetQuick();
for (int i = 0; i < getSize(); i++)
{
messageArray.add(values.get(i) == null ? -1 : (byte) values.get(i).ordinal());
}
}

public void toMessage(byte[] messageArray)
{
List<T> values = getValueInternal();
for (int i = 0; i < Math.min(getSize(), messageArray.length); i++)
{
messageArray[i] = values.get(i) == null ? -1 : (byte) values.get(i).ordinal();
}
}

public void fromMessage(IDLSequence.Byte messageArray, T[] enumValues)
{
if (isModificationIncoming())
{
getValueInternal().clear();
for (int i = 0; i < messageArray.size(); i++)
{
getValueInternal().add(messageArray.get(i) == -1 ? null : enumValues[messageArray.get(i)]);
}
}
}

public void fromMessage(byte[] messageArray, T[] enumValues)
{
if (isModificationIncoming())
{
getValueInternal().clear();
for (int i = 0; i < messageArray.length; i++)
{
getValueInternal().add(messageArray[i] == -1 ? null : enumValues[messageArray[i]]);
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
package us.ihmc.communication.crdt;

import gnu.trove.list.array.TIntArrayList;
import us.ihmc.idl.IDLSequence.Byte;
import us.ihmc.idl.IDLSequence.Integer;

/**
* Represents an integer List that can be modified by both the
* robot and the operator.
* <p>
* Warning: With this type, the data should not be continuously modified
* tick after tick, as that will mean the value is essentially never
* synced properly to the other side.
*/
public class CRDTBidirectionalIntegerList extends CRDTBidirectionalMutableField<TIntArrayList>
{
public CRDTBidirectionalIntegerList(LatestTimestampModifiable latestTimestampModifiable)
{
super(latestTimestampModifiable, new TIntArrayList());
}

public int getValueReadOnly(int index)
{
return getValueInternal().get(index);
}

public void setValue(int index, int value)
{
if (getValueReadOnly(index) != value)
getValueAndModify().set(index, value);
}

public void add(int value)
{
getValueAndModify().add(value);
}

public void remove(int index)
{
getValueAndModify().removeAt(index);
}

public void clear()
{
getValueAndModify().clear();
}

public int getSize()
{
return getValueInternal().size();
}

public void toMessage(int[] messageArray)
{
getValueInternal().toArray(messageArray, 0, Math.min(getSize(), messageArray.length));
}

public void toMessage(Integer message)
{
message.clear();
for (int i = 0; i < getSize(); ++i)
message.add(getValueReadOnly(i));
}

public void toMessage(Byte message)
{
message.resetQuick();
for (int i = 0; i < getSize(); ++i)
message.add((byte) getValueReadOnly(i));
}

public void fromMessage(int[] messageArray)
{
if (isModificationIncoming())
{
getValueInternal().clear();
getValueInternal().add(messageArray);
}
}

public void fromMessage(Integer message)
{
if (isModificationIncoming())
{
getValueInternal().clear();
for (int i = 0; i < message.size(); ++i)
getValueInternal().add(message.get(i));
}
}

public void fromMessage(Byte message)
{
if (isModificationIncoming())
{
getValueInternal().clear();
for (int i = 0; i < message.size(); ++i)
getValueInternal().add(message.get(i));
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
package us.ihmc.communication.crdt;

import us.ihmc.idl.IDLSequence.StringBuilderHolder;

import java.util.ArrayList;
import java.util.List;

/**
* Represents a String List that can be modified by both the
* robot and the operator.
* <p>
* Warning: With this type, the data should not be continuously modified
* tick after tick, as that will mean the value is essentially never
* synced properly to the other side.
*/
public class CRDTBidirectionalStringList extends CRDTBidirectionalMutableField<List<String>>
{
public CRDTBidirectionalStringList(LatestTimestampModifiable latestTimestampModifiable)
{
super(latestTimestampModifiable, new ArrayList<>());
}

public String getValueReadOnly(int index)
{
return getValueInternal().get(index);
}

public void setValue(int index, String value)
{
if (!getValueReadOnly(index).equals(value))
getValueAndModify().set(index, value);
}

public void add(String value)
{
getValueAndModify().add(value);
}

public void remove(int index)
{
getValueAndModify().remove(index);
}

public void clear()
{
getValueAndModify().clear();
}

public int getSize()
{
return getValueInternal().size();
}

public void toMessage(StringBuilder[] messageArray)
{
for (int i = 0; i < getSize() && i < messageArray.length; ++i)
{
messageArray[i] = new StringBuilder(getValueReadOnly(i));
}
}

public void toMessage(StringBuilderHolder message)
{
message.clear();
for (int i = 0; i < getSize(); ++i)
{
message.add(getValueReadOnly(i));
}
}

public void fromMessage(StringBuilder[] messageArray)
{
if (isModificationIncoming())
{
getValueInternal().clear();
for (int i = 0; i < messageArray.length; ++i)
{
getValueInternal().add(messageArray[i].toString());
}
}
}

public void fromMessage(StringBuilderHolder message)
{
if (isModificationIncoming())
{
getValueInternal().clear();
for (int i = 0; i < message.size(); ++i)
{
getValueInternal().add(message.getString(i));
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,18 @@ public RigidBodyTransformReadOnly getValueReadOnly()
return getValueInternal();
}

/** Prefer this method in the case you need to call it every tick, as it no-ops in the case the value is the same. */
public void setValue(RigidBodyTransformReadOnly value, double epsilon)
{
// rotation and translation must be checked separately to handle pose-transform comparison case
// translation must use epsilonEquals because it can be vector vs. point
if (!(getValueInternal().getRotation().geometricallyEquals(value.getRotation(), epsilon)
&& getValueInternal().getTranslation().epsilonEquals(value.getTranslation(), epsilon)))
{
accessValue().set(value);
}
}

public void toMessage(Pose3D poseMessage)
{
poseMessage.set(getValueReadOnly());
Expand Down
Loading
Loading