Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/onr demo #301

Draft
wants to merge 71 commits into
base: develop
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
71 commits
Select commit Hold shift + click to select a range
6c37106
Renamed package to be more general
TomaszTB Jul 11, 2024
b772d9b
Moved YOLO models to .ihmc folder
TomaszTB Jul 11, 2024
3f9d03b
Added utilities to help load YOLO models
TomaszTB Jul 11, 2024
6e9464f
Lots of YOLO changes
ds58 Jul 12, 2024
9981264
Multi yolo model fixes
ds58 Jul 12, 2024
0ce7688
rename door objects
Jul 12, 2024
ce15072
Merge branch 'develop' into feature/multiple-yolo-models
Jul 12, 2024
43d9d14
Add yolo text clamping
ds58 Jul 12, 2024
f54cf2c
Merge branch 'develop' into feature/multiple-yolo-models
Jul 13, 2024
c2691b2
adding trash can node
Jul 13, 2024
a03354b
adding detectable nodes for yolo detections and trashcan node.
Jul 13, 2024
9a51ffc
added all nodes checkpoints
Jul 13, 2024
c966716
added logic for tom
Jul 13, 2024
c19200d
finding tom
Jul 13, 2024
1dceff3
added exploration logic
Jul 14, 2024
645e6be
fixed foot pose description saveing
Jul 14, 2024
072cd3c
Merge branch 'develop' into feature/ONR-demo
ds58 Jul 15, 2024
a7c0570
Merge branch 'develop' into feature/multiple-yolo-models
ds58 Jul 15, 2024
a47c227
Multiple yolo model annotated image
ds58 Jul 15, 2024
5a3efc5
Merge branch 'feature/multiple-yolo-models' into feature/ONR-demo
ds58 Jul 15, 2024
6627f07
Start working on previewing footstep plans calculated by behavior node.
calvertdw Jul 12, 2024
559dbe1
Work on previewing footstep plan action planned footsteps.
calvertdw Jul 13, 2024
932fa59
Improve usability of footstep plan action.
calvertdw Jul 13, 2024
6ffe243
Copy the latest planned footsteps when switching to manual footsteps …
calvertdw Jul 13, 2024
e37fd85
Add parameters for initial stance side and use turn walk turn.
calvertdw Jul 14, 2024
a5f1550
Implement turn walk turn and initial stance side options.
calvertdw Jul 14, 2024
80f2190
Remove hardcoded parameters.
calvertdw Jul 14, 2024
3d2359e
Add JSON compatibility and render only relevant widgets.
calvertdw Jul 14, 2024
9f684e0
PredefinedRigidBodySceneNode hacks
ds58 Jul 15, 2024
c563b8c
Fixed bad parameter passing
TomaszTB Jul 15, 2024
15bfc4b
fixed logic exploration node and fixed find index execute after actio…
LuigiPenco93 Jul 15, 2024
18f128d
Make full footstep planner parameter set tunable per behavior footste…
calvertdw Jul 15, 2024
9db3ffa
update logic
LuigiPenco93 Jul 16, 2024
ba41cb3
dleete doors we don t wanna see
Jul 16, 2024
298d13e
added logic for trashcan
Jul 16, 2024
a897dfa
fixed logic trashcan pull door
Jul 16, 2024
2f5e374
Merge remote-tracking branch 'origin/feature/footstep-plan-action-par…
Jul 16, 2024
06275e4
fixed bugs
Jul 16, 2024
a1dad83
Only update and show the footstep plan preview when the action is nex…
calvertdw Jul 16, 2024
e152292
simplified pull handle
LuigiPenco93 Jul 16, 2024
a6c7154
Coactivate Footstep Planning in Behavior Action Node (#302)
calvertdw Jul 16, 2024
3e355fb
Remove the hand pose trajectory visualization that don't work very we…
calvertdw Jul 16, 2024
9c6d6a6
Declutter the behavior scene by showing the chest and pelvis previews…
calvertdw Jul 16, 2024
cdae3b1
remoev additions repeated nodes
Jul 16, 2024
345a111
Hotfix: Avoid recreating gizmo meshes when they aren't rendering.
calvertdw Jul 16, 2024
9a985f7
Add setAllowNewDoorNodes to SceneGraph
ds58 Jul 16, 2024
029e70c
added extra logic exploration
LuigiPenco93 Jul 16, 2024
818ffcf
avoid repeated special actions names
LuigiPenco93 Jul 16, 2024
27284ce
Having jointspace setpoints be continuous for hybrid taskspace mode. …
stephenmcc Jul 16, 2024
19fb4f4
Merge branch 'feature/rigid-body-control-jointspace-tracking' into fe…
Jul 16, 2024
4ff3197
Performance optimization: Avoid calling getStackTrace in DetachableRe…
calvertdw Jul 16, 2024
b926786
Allow for multiple YOLO models
ds58 Jul 16, 2024
6af2db0
Fixed concurrent modification exception occuring in PersistentDetecti…
TomaszTB Jul 16, 2024
7cf11fa
Fix disallowing door nodes and reallowing them.
Jul 16, 2024
9cf3fa9
Hide manually place footsteps most of the time.
Jul 16, 2024
4c5e20a
Redo blocking new detections logic.
Jul 16, 2024
520fdea
Fix compile error.
Jul 16, 2024
b8c3d97
Tune detection settings.
Jul 17, 2024
3269891
Remove duplicate scan check.
Jul 17, 2024
6266358
fixed tom logic
Jul 17, 2024
10cb1f5
added distance from trash can and tom
Jul 17, 2024
b7b3638
added disable door nodes during trashcan
Jul 17, 2024
c3c1830
completed logic exploration
Jul 17, 2024
b8f1046
Update currently detected for YOLONode.
calvertdw Jul 18, 2024
bd3d36a
scen graph changes
Jul 18, 2024
aca02e6
Fix behavior crash by separating planners.
calvertdw Jul 18, 2024
02abbca
perception changes
Jul 18, 2024
e3210b5
logic for getting cloer to door and yolo shacks
Jul 18, 2024
b2709f4
clear ndoes before push bar door
Jul 18, 2024
874860e
worked first time
Jul 18, 2024
f18cb4c
Disabling flex and second part of ballet
Jul 18, 2024
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
Expand Up @@ -64,6 +64,7 @@ public class RigidBodyControlManager implements SCS2YoGraphicHolder
private final RigidBodyLoadBearingControlState loadBearingControlState;
private final RigidBodyExternalWrenchManager externalWrenchManager;

private final RigidBodyJointControlHelper jointControlHelper;
private final double[] initialJointPositions;
private final FramePose3D homePose;

Expand Down Expand Up @@ -107,7 +108,7 @@ public RigidBodyControlManager(RigidBodyBasics bodyToControl,

initialJointPositions = new double[jointsToControl.length];

RigidBodyJointControlHelper jointControlHelper = new RigidBodyJointControlHelper(bodyName, jointsToControl, yoTime, controlDT, enableFunctionGenerators, parentRegistry);
jointControlHelper = new RigidBodyJointControlHelper(bodyName, jointsToControl, yoTime, controlDT, enableFunctionGenerators, parentRegistry);

jointspaceControlState = new RigidBodyJointspaceControlState(bodyName, jointsToControl, homeConfiguration, yoTime, jointControlHelper, registry);

Expand Down Expand Up @@ -605,16 +606,14 @@ public void resetJointIntegrators()

private void computeDesiredJointPositions(double[] desiredJointPositionsToPack)
{
if (stateMachine.getCurrentStateKey() == jointspaceControlState.getControlMode())
{
for (int i = 0; i < jointsToControl.length; i++)
desiredJointPositionsToPack[i] = jointspaceControlState.getJointDesiredPosition(i);
}
else if (loadBearingControlState != null && stateMachine.getCurrentStateKey() == loadBearingControlState.getControlMode()
&& loadBearingControlState.isJointspaceControlActive())
boolean isInJointspaceMode = stateMachine.getCurrentStateKey() == jointspaceControlState.getControlMode();
boolean isInTaskspaceHybridMode = stateMachine.getCurrentStateKey() == taskspaceControlState.getControlMode() && taskspaceControlState.isHybridModeActive();
boolean isInLoadbearingHybridMode = loadBearingControlState != null && stateMachine.getCurrentStateKey() == loadBearingControlState.getControlMode() && loadBearingControlState.isJointspaceControlActive();

if (isInJointspaceMode || isInTaskspaceHybridMode || isInLoadbearingHybridMode)
{
for (int i = 0; i < jointsToControl.length; i++)
desiredJointPositionsToPack[i] = loadBearingControlState.getJointDesiredPosition(i);
desiredJointPositionsToPack[i] = jointControlHelper.getJointDesiredPosition(i);
}
else
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import us.ihmc.commonWalkingControlModules.controlModules.ControllerCommandValidationTools;
import us.ihmc.commonWalkingControlModules.controllerCore.command.feedbackController.JointspaceFeedbackControlCommand;
import us.ihmc.commonWalkingControlModules.controllerCore.command.feedbackController.OneDoFJointFeedbackControlCommand;
import us.ihmc.commonWalkingControlModules.controllerCore.command.inverseDynamics.JointAccelerationIntegrationCommand;
import us.ihmc.commons.Conversions;
import us.ihmc.commons.lists.RecyclingArrayDeque;
import us.ihmc.communication.packets.ExecutionMode;
Expand All @@ -17,6 +18,10 @@
import us.ihmc.robotics.math.functionGenerator.YoFunctionGeneratorNew;
import us.ihmc.robotics.math.trajectories.generators.MultipleWaypointsTrajectoryGenerator;
import us.ihmc.robotics.math.trajectories.trajectorypoints.OneDoFTrajectoryPoint;
import us.ihmc.sensorProcessing.outputData.JointDesiredOutput;
import us.ihmc.sensorProcessing.outputData.JointDesiredOutputList;
import us.ihmc.sensorProcessing.outputData.JointDesiredOutputListReadOnly;
import us.ihmc.yoVariables.parameters.BooleanParameter;
import us.ihmc.yoVariables.providers.DoubleProvider;
import us.ihmc.yoVariables.registry.YoRegistry;
import us.ihmc.yoVariables.variable.YoBoolean;
Expand Down Expand Up @@ -77,9 +82,12 @@ public class RigidBodyJointControlHelper

private final OneDoFTrajectoryPoint lastPointAdded = new OneDoFTrajectoryPoint();
private final JointspaceFeedbackControlCommand feedbackControlCommand = new JointspaceFeedbackControlCommand();
private final JointDesiredOutputList jointDesiredOutputList;
private final JointAccelerationIntegrationCommand accelerationIntegrationCommand = new JointAccelerationIntegrationCommand();

private final OneDoFJointBasics[] joints;
private final int numberOfJoints;
private final BooleanParameter[] bypassAccelerationIntegration;

private final DoubleProvider time;

Expand All @@ -88,6 +96,7 @@ public RigidBodyJointControlHelper(String bodyName, OneDoFJointBasics[] jointsTo
warningPrefix = shortName + " for " + bodyName + ": ";
registry = new YoRegistry(bodyName + shortName);
trajectoryDone = new YoBoolean(shortName + "Done", registry);
this.bypassAccelerationIntegration = new BooleanParameter[jointsToControl.length];

this.time = time;
this.joints = jointsToControl;
Expand All @@ -98,6 +107,7 @@ public RigidBodyJointControlHelper(String bodyName, OneDoFJointBasics[] jointsTo
hasGains = new YoBoolean(prefix + "HasGains", registry);
usingWeightFromMessage = new YoBoolean(prefix + "UsingWeightFromMessage", registry);
functionGeneratorErrorCalculator = enableFunctionGenerators ? new FunctionGeneratorErrorCalculator(bodyName, controlDT, registry) : null;
jointDesiredOutputList = new JointDesiredOutputList(jointsToControl);

for (int jointIdx = 0; jointIdx < jointsToControl.length; jointIdx++)
{
Expand Down Expand Up @@ -126,6 +136,8 @@ public RigidBodyJointControlHelper(String bodyName, OneDoFJointBasics[] jointsTo
int jointIdxFinal = jointIdx;
functionGeneratorErrorCalculator.addTrajectorySignal(functionGenerators.get(jointIdx), () -> getJointDesiredPosition(jointIdxFinal), jointsToControl[jointIdx]);
}

bypassAccelerationIntegration[jointIdx] = new BooleanParameter(jointsToControl[jointIdx].getName() + "BypassAccelerationIntegration", registry);
}

streamTimestampOffset = new YoDouble(prefix + "StreamTimestampOffset", registry);
Expand Down Expand Up @@ -484,6 +496,38 @@ public boolean handleTrajectoryCommand(JointspaceTrajectoryCommand command, doub
return true;
}

public JointDesiredOutputListReadOnly getJointDesiredData()
{
boolean bypassAccelerationIntegration = false;
jointDesiredOutputList.clear();

for (int jointIdx = 0; jointIdx < jointDesiredOutputList.getNumberOfJointsWithDesiredOutput(); jointIdx++)
{
if (this.bypassAccelerationIntegration[jointIdx].getValue())
{
bypassAccelerationIntegration = true;
JointDesiredOutput lowLevelJointData = jointDesiredOutputList.getJointDesiredOutput(jointIdx);
lowLevelJointData.setDesiredPosition(getJointDesiredPosition(jointIdx));
lowLevelJointData.setDesiredVelocity(getJointDesiredVelocity(jointIdx));
}
}

return bypassAccelerationIntegration ? jointDesiredOutputList : null;
}

public JointAccelerationIntegrationCommand getAccelerationIntegrationCommand()
{
accelerationIntegrationCommand.clear();

for (int jointIdx = 0; jointIdx < jointDesiredOutputList.getNumberOfJointsWithDesiredOutput(); jointIdx++)
{
accelerationIntegrationCommand.addJointToComputeDesiredPositionFor(joints[jointIdx])
.setDisableAccelerationIntegration(bypassAccelerationIntegration[jointIdx].getValue());
}

return accelerationIntegrationCommand;
}

public void queuePointsAtTimeWithZeroVelocity(double time, double[] jointPositions)
{
for (int jointIdx = 0; jointIdx < numberOfJoints; jointIdx++)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,10 +60,6 @@ public class RigidBodyJointspaceControlState extends RigidBodyControlState

private final int numberOfJoints;
private final double[] jointsHomeConfiguration;
private final JointDesiredOutputList jointDesiredOutputList;

private final BooleanParameter[] bypassAccelerationIntegration;
private final JointAccelerationIntegrationCommand accelerationIntegrationCommand = new JointAccelerationIntegrationCommand();

public RigidBodyJointspaceControlState(String bodyName,
OneDoFJointBasics[] jointsToControl,
Expand All @@ -75,14 +71,7 @@ public RigidBodyJointspaceControlState(String bodyName,
super(RigidBodyControlMode.JOINTSPACE, bodyName, yoTime, parentRegistry);
this.jointControlHelper = jointControlHelper;
this.jointsToControl = jointsToControl;
this.bypassAccelerationIntegration = new BooleanParameter[jointsToControl.length];

for (int i = 0; i < jointsToControl.length; i++)
{
bypassAccelerationIntegration[i] = new BooleanParameter(jointsToControl[i].getName() + "BypassAccelerationIntegration", parentRegistry);
}

jointDesiredOutputList = new JointDesiredOutputList(jointsToControl);

numberOfJoints = jointsToControl.length;
jointsHomeConfiguration = new double[numberOfJoints];
Expand Down Expand Up @@ -112,20 +101,7 @@ public void setDefaultWeight(DoubleProvider weight)
@Override
public JointDesiredOutputListReadOnly getJointDesiredData()
{
boolean bypassAccelerationIntegration = false;

for (int jointIdx = 0; jointIdx < jointDesiredOutputList.getNumberOfJointsWithDesiredOutput(); jointIdx++)
{
if (this.bypassAccelerationIntegration[jointIdx].getValue())
{
bypassAccelerationIntegration = true;
JointDesiredOutput lowLevelJointData = jointDesiredOutputList.getJointDesiredOutput(jointIdx);
lowLevelJointData.setDesiredPosition(getJointDesiredPosition(jointIdx));
lowLevelJointData.setDesiredVelocity(getJointDesiredVelocity(jointIdx));
}
}

return bypassAccelerationIntegration ? jointDesiredOutputList : null;
return jointControlHelper.getJointDesiredData();
}

public void setGains(Map<String, PIDGainsReadOnly> jointspaceHighLevelGains)
Expand Down Expand Up @@ -255,15 +231,7 @@ public void onExit(double timeInState)
@Override
public InverseDynamicsCommand<?> getInverseDynamicsCommand()
{
accelerationIntegrationCommand.clear();

for (int jointIdx = 0; jointIdx < jointDesiredOutputList.getNumberOfJointsWithDesiredOutput(); jointIdx++)
{
accelerationIntegrationCommand.addJointToComputeDesiredPositionFor(jointsToControl[jointIdx])
.setDisableAccelerationIntegration(bypassAccelerationIntegration[jointIdx].getValue());
}

return accelerationIntegrationCommand;
return jointControlHelper.getAccelerationIntegrationCommand();
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import us.ihmc.commonWalkingControlModules.controlModules.TaskspaceTrajectoryStatusMessageHelper;
import us.ihmc.commonWalkingControlModules.controllerCore.command.feedbackController.FeedbackControlCommand;
import us.ihmc.commonWalkingControlModules.controllerCore.command.feedbackController.FeedbackControlCommandList;
import us.ihmc.commonWalkingControlModules.controllerCore.command.inverseDynamics.InverseDynamicsCommand;
import us.ihmc.communication.packets.ExecutionMode;
import us.ihmc.euclid.referenceFrame.ReferenceFrame;
import us.ihmc.euclid.referenceFrame.interfaces.FramePose3DReadOnly;
Expand All @@ -15,6 +16,7 @@
import us.ihmc.mecano.multiBodySystem.interfaces.RigidBodyBasics;
import us.ihmc.robotics.controllers.pidGains.PID3DGainsReadOnly;
import us.ihmc.scs2.definition.yoGraphic.YoGraphicDefinition;
import us.ihmc.sensorProcessing.outputData.JointDesiredOutputListReadOnly;
import us.ihmc.yoVariables.parameters.BooleanParameter;
import us.ihmc.yoVariables.registry.YoRegistry;
import us.ihmc.yoVariables.variable.YoBoolean;
Expand Down Expand Up @@ -212,6 +214,32 @@ public FeedbackControlCommand<?> getFeedbackControlCommand()
return orientationHelper.getFeedbackControlCommand();
}

@Override
public JointDesiredOutputListReadOnly getJointDesiredData()
{
if (hybridModeActive.getValue())
{
return jointControlHelper.getJointDesiredData();
}
else
{
return null;
}
}

@Override
public InverseDynamicsCommand<?> getInverseDynamicsCommand()
{
if (hybridModeActive.getValue())
{
return jointControlHelper.getAccelerationIntegrationCommand();
}
else
{
return null;
}
}

public FrameQuaternionReadOnly getDesiredOrientation()
{
return orientationHelper.getFeedbackControlCommand().getReferenceOrientation();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import us.ihmc.commonWalkingControlModules.controllerCore.command.feedbackController.OrientationFeedbackControlCommand;
import us.ihmc.commonWalkingControlModules.controllerCore.command.feedbackController.PointFeedbackControlCommand;
import us.ihmc.commonWalkingControlModules.controllerCore.command.feedbackController.SpatialFeedbackControlCommand;
import us.ihmc.commonWalkingControlModules.controllerCore.command.inverseDynamics.InverseDynamicsCommand;
import us.ihmc.commonWalkingControlModules.controllerCore.command.inverseDynamics.SpatialAccelerationCommand;
import us.ihmc.communication.packets.ExecutionMode;
import us.ihmc.euclid.referenceFrame.FrameQuaternion;
Expand All @@ -23,6 +24,7 @@
import us.ihmc.robotics.controllers.pidGains.PID3DGainsReadOnly;
import us.ihmc.scs2.definition.yoGraphic.YoGraphicDefinition;
import us.ihmc.scs2.definition.yoGraphic.YoGraphicGroupDefinition;
import us.ihmc.sensorProcessing.outputData.JointDesiredOutputListReadOnly;
import us.ihmc.yoVariables.parameters.BooleanParameter;
import us.ihmc.yoVariables.registry.YoRegistry;
import us.ihmc.yoVariables.variable.YoBoolean;
Expand Down Expand Up @@ -363,6 +365,32 @@ public FeedbackControlCommand<?> createFeedbackControlTemplate()
return feedbackControlCommandList;
}

@Override
public JointDesiredOutputListReadOnly getJointDesiredData()
{
if (hybridModeActive.getValue())
{
return jointControlHelper.getJointDesiredData();
}
else
{
return null;
}
}

@Override
public InverseDynamicsCommand<?> getInverseDynamicsCommand()
{
if (hybridModeActive.getValue())
{
return jointControlHelper.getAccelerationIntegrationCommand();
}
else
{
return null;
}
}

@Override
public double getLastTrajectoryPointTime()
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@
import us.ihmc.robotics.stateMachine.factories.StateMachineFactory;
import us.ihmc.robotics.time.ExecutionTimer;
import us.ihmc.scs2.definition.yoGraphic.YoGraphicDefinition;
import us.ihmc.sensorProcessing.outputData.JointDesiredOutputListReadOnly;
import us.ihmc.yoVariables.parameters.DoubleParameter;
import us.ihmc.yoVariables.providers.DoubleProvider;
import us.ihmc.yoVariables.registry.YoRegistry;
Expand Down Expand Up @@ -977,9 +978,10 @@ private void submitControllerCoreCommands(WalkingState currentState)
controllerCoreCommand.addFeedbackControlCommand(bodyManager.getFeedbackControlCommand());
controllerCoreCommand.addInverseDynamicsCommand(bodyManager.getInverseDynamicsCommand());

if (bodyManager.getJointDesiredData() != null)
JointDesiredOutputListReadOnly jointDesiredData = bodyManager.getJointDesiredData();
if (jointDesiredData != null)
{
controllerCoreCommand.completeLowLevelJointData(bodyManager.getJointDesiredData());
controllerCoreCommand.completeLowLevelJointData(jointDesiredData);
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package us.ihmc.communication.crdt;

import behavior_msgs.msg.dds.FootstepPlanActionFootstepDefinitionMessage;
import us.ihmc.commons.lists.RecyclingArrayList;
import us.ihmc.communication.ros2.ROS2ActorDesignation;
import us.ihmc.euclid.geometry.interfaces.Pose3DReadOnly;
import us.ihmc.idl.IDLSequence;
import us.ihmc.robotics.robotSide.RobotSide;

/**
* Represents a list of footsteps that should only be modified by one actor type
* and read-only for the others. The internal writeable instance is kept protected
* from unchecked modifications.
*/
public class CRDTStatusFootstepList extends CRDTStatusMutableField<RecyclingArrayList<FootstepPlanActionFootstepDefinitionMessage>>
{
public CRDTStatusFootstepList(ROS2ActorDesignation sideThatCanModify, CRDTInfo crdtInfo)
{
super(sideThatCanModify, crdtInfo, () -> new RecyclingArrayList<>(FootstepPlanActionFootstepDefinitionMessage::new));
}

public Pose3DReadOnly getPoseReadOnly(int index)
{
return getValueInternal().get(index).getSolePose();
}

public RobotSide getSide(int index)
{
return RobotSide.fromByte(getValueInternal().get(index).getRobotSide());
}

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

public void toMessage(IDLSequence.Object<FootstepPlanActionFootstepDefinitionMessage> message)
{
message.clear();

for (FootstepPlanActionFootstepDefinitionMessage footstep : getValueInternal())
{
message.add().set(footstep);
}
}

public void fromMessage(IDLSequence.Object<FootstepPlanActionFootstepDefinitionMessage> message)
{
if (isModificationDisallowed()) // Ignore updates if we are the only side that can modify
{
getValueInternal().clear();

for (FootstepPlanActionFootstepDefinitionMessage footstep : message)
{
getValueInternal().add().set(footstep);
}
}
}
}
Loading