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

[WIP]Feature/wbcc separate thread #380

Open
wants to merge 63 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
63 commits
Select commit Hold shift + click to select a range
75bff32
Preparing and starting to separate the wholeBodyControllerCore from c…
Beomyeong Aug 31, 2024
3a8b147
Still work in progress on separating wbccThread
Beomyeong Aug 31, 2024
8483b0d
Merge branch 'develop' into feature/wbcc-separate-thread
Beomyeong Sep 3, 2024
8f1d236
Merge branch 'develop' into feature/wbcc-separate-thread
Beomyeong Sep 12, 2024
cf89710
Merge branch 'develop' into feature/wbcc-separate-thread
Beomyeong Sep 12, 2024
e27e0c6
Adding some TODO List
Beomyeong Sep 12, 2024
6e4d0dc
Adding boolean parameter to check whether the wbccThread runs
Beomyeong Sep 13, 2024
f5085e4
Trying to adding wbccThread even don't include anything.
Beomyeong Sep 13, 2024
43a4147
Merge branch 'develop' into feature/wbcc-separate-thread
Beomyeong Sep 19, 2024
ca4eff6
Merge branch 'develop' into feature/wbcc-separate-thread
Beomyeong Sep 20, 2024
82aa1fb
Adding empty wholeBodyControllerCoreThread.
Beomyeong Sep 20, 2024
21ac3ba
Adding wbccJointDesiredOutputList into contextDataFactory
Beomyeong Sep 30, 2024
1811eca
Merge branch 'develop' into feature/wbcc-separate-thread
Beomyeong Sep 30, 2024
9a78482
Working on the moving the joint update from ControllerThread to Whole…
Beomyeong Sep 30, 2024
2326d70
Merge branch 'develop' into feature/wbcc-separate-thread
Beomyeong Sep 30, 2024
8281cf9
Merge branch 'develop' into feature/wbcc-separate-thread
Beomyeong Oct 1, 2024
19a3e8d
Fighting with making a new "wholeBodyControllerCoreThread".
Beomyeong Oct 1, 2024
bfc9026
Fighting with making a new "wholeBodyControllerCoreThread".
Beomyeong Oct 1, 2024
27e3520
Fighting with making a new "wholeBodyControllerCoreThread".
Beomyeong Oct 2, 2024
da13fdb
Adding a new Thread of "WholeBodyControllerCoreThread".
Beomyeong Oct 2, 2024
5c62049
minor working on
Beomyeong Oct 3, 2024
8cbb6d1
Merge branch 'develop' into feature/wbcc-separate-thread
Beomyeong Oct 3, 2024
a5a1134
Adding the ControllerCoreOutputDataHolder for sharing the result of t…
Beomyeong Oct 3, 2024
bb1f194
Merge branch 'develop' into feature/wbcc-separate-thread
Beomyeong Oct 3, 2024
78db979
Adding a humanoidRobotContextDataHolder into HumanoidRobotContextData…
Beomyeong Oct 4, 2024
16f72b8
Minor update for constructing humanoidRobotContextData.
Beomyeong Oct 4, 2024
9ede091
Merge branch 'develop' into feature/wbcc-separate-thread
Beomyeong Oct 4, 2024
2d358a7
Adding controllerCoreDataHolder into constructors.
Beomyeong Oct 4, 2024
241868d
Adding the method of returning wholebodycontrollercore to every state.
Beomyeong Oct 6, 2024
6a7d58b
Changing the type of calling controllercoreoutput method
Beomyeong Oct 7, 2024
46be899
Merge branch 'develop' into feature/wbcc-separate-thread
Beomyeong Oct 7, 2024
cd09c26
Adding updating locatcontext from controllertask
Beomyeong Oct 7, 2024
124ca0a
Fixing minor error.
Beomyeong Oct 7, 2024
284804a
Still being fixed.
Beomyeong Oct 7, 2024
4673b98
The desiredJointvalues are submitted through the controllerCoreOutput…
Beomyeong Oct 8, 2024
aea025c
Adding ControllerCoreCommand into contextData class
Beomyeong Oct 8, 2024
47b9969
Fixing the calling controllercorecommand type in the contextdata class
Beomyeong Oct 8, 2024
15f1056
Merge branch 'develop' into feature/wbcc-separate-thread
Beomyeong Oct 8, 2024
6216748
Adding the ControllerCoreCommandDataHolder into the HumanoidRobotCont…
Beomyeong Oct 9, 2024
23ad689
Fixing minor error in javadoc
Beomyeong Oct 9, 2024
8313250
Adding writing controllerCoreCommand into ControllerCoreCommandDataHo…
Beomyeong Oct 9, 2024
9ec3ccf
Adding the controllerCoreCommandDataHolder as an input for wholeBodyC…
Beomyeong Oct 9, 2024
45531bf
Merge branch 'develop' into feature/wbcc-separate-thread
Beomyeong Oct 9, 2024
683965b
Merge branch 'develop' into feature/wbcc-separate-thread
Beomyeong Oct 16, 2024
89c34ed
Adding the several values for the constructor of `HumanoidWholeBodyCo…
Beomyeong Oct 17, 2024
54b06bd
Merge branch 'develop' into feature/wbcc-separate-thread
Beomyeong Oct 17, 2024
7b61c58
Start to write the controllerCoreToolboxDataHolder
Beomyeong Oct 18, 2024
c1c1746
Merge branch 'develop' into feature/wbcc-separate-thread
Beomyeong Oct 18, 2024
ac00db2
Merge branch 'develop' into feature/wbcc-separate-thread
Beomyeong Oct 21, 2024
a12c472
Adding the getControllerCore method into HighLevelControllerState and…
Beomyeong Oct 21, 2024
81fc3ad
Adding the getControllerCore method into HighLevelControllerState and…
Beomyeong Oct 21, 2024
6fada6e
Adding notes to do work.
Beomyeong Oct 21, 2024
15680f2
Still working on
Beomyeong Oct 22, 2024
60fdaae
Adding exceptional case to set the controllerCoreMode to be InverseDy…
Beomyeong Oct 22, 2024
9c9534c
ControllerCore is constructed in the WholeBodyControllerCoreThread.
Beomyeong Oct 22, 2024
9cff310
Merge branch 'develop' into feature/wbcc-separate-thread
Beomyeong Oct 22, 2024
6493631
Adding the resolveControllerCoreOutputDataHolder into resolveHumanoid…
Beomyeong Oct 23, 2024
3a72b52
Fixing typo for ControllerCoreOutputDataHolder
Beomyeong Oct 23, 2024
900b133
Working on sending controllerCoreOutput from wholebodycontrollerthrea…
Beomyeong Oct 25, 2024
4a0ff8f
ControllerCoreOutput from the ControllerCoreThread is used for update…
Beomyeong Oct 25, 2024
c904021
Merge branch 'develop' into feature/wbcc-separate-thread
Beomyeong Oct 25, 2024
19ce72b
WholeBodyControllerCore does not run on the walkingcontrollerState in…
Beomyeong Oct 25, 2024
a2eff55
Merge branch 'develop' into feature/wbcc-separate-thread
Beomyeong Oct 25, 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
@@ -1,17 +1,14 @@
package us.ihmc.avatar;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Supplier;

import controller_msgs.msg.dds.ControllerCrashNotificationPacket;
import us.ihmc.avatar.drcRobot.DRCRobotModel;
import us.ihmc.avatar.initialSetup.RobotInitialSetup;
import us.ihmc.commonWalkingControlModules.barrierScheduler.context.HumanoidRobotContextData;
import us.ihmc.commonWalkingControlModules.barrierScheduler.context.HumanoidRobotContextDataFactory;
import us.ihmc.commonWalkingControlModules.barrierScheduler.context.HumanoidRobotContextJointData;
import us.ihmc.commonWalkingControlModules.barrierScheduler.context.HumanoidRobotContextTools;
import us.ihmc.commonWalkingControlModules.controllerCore.command.ControllerCoreCommandDataHolder;
import us.ihmc.commonWalkingControlModules.controllerCore.command.lowLevel.ControllerCoreOutputDataHolder;
import us.ihmc.commonWalkingControlModules.controllerCore.command.lowLevel.LowLevelOneDoFJointDesiredDataHolder;
import us.ihmc.commonWalkingControlModules.corruptors.FullRobotModelCorruptor;
import us.ihmc.commonWalkingControlModules.highLevelHumanoidControl.HumanoidHighLevelControllerManager;
Expand All @@ -20,7 +17,6 @@
import us.ihmc.commonWalkingControlModules.visualizer.InverseDynamicsMechanismReferenceFrameVisualizer;
import us.ihmc.commons.Conversions;
import us.ihmc.communication.HumanoidControllerAPI;
import us.ihmc.ros2.ROS2PublisherBasics;
import us.ihmc.communication.packets.ControllerCrashLocation;
import us.ihmc.communication.packets.MessageTools;
import us.ihmc.graphicsDescription.yoGraphics.YoGraphicsListRegistry;
Expand All @@ -34,6 +30,7 @@
import us.ihmc.robotics.sensors.ForceSensorDataHolder;
import us.ihmc.robotics.sensors.ForceSensorDataHolderReadOnly;
import us.ihmc.robotics.time.ExecutionTimer;
import us.ihmc.ros2.ROS2PublisherBasics;
import us.ihmc.ros2.RealtimeROS2Node;
import us.ihmc.scs2.definition.yoGraphic.YoGraphicDefinition;
import us.ihmc.scs2.definition.yoGraphic.YoGraphicGroupDefinition;
Expand All @@ -56,6 +53,11 @@
import us.ihmc.yoVariables.variable.YoDouble;
import us.ihmc.yoVariables.variable.YoLong;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Supplier;

public class AvatarControllerThread implements AvatarControllerThreadInterface
{
private static final boolean CREATE_DYNAMICALLY_CONSISTENT_NULLSPACE_EVALUATOR = false;
Expand Down Expand Up @@ -87,6 +89,7 @@ public class AvatarControllerThread implements AvatarControllerThreadInterface
private final HumanoidRobotContextData humanoidRobotContextData;

private final ExecutionTimer controllerThreadTimer;
private final boolean wbccThreadRun;

public AvatarControllerThread(String robotName,
DRCRobotModel robotModel,
Expand All @@ -97,9 +100,11 @@ public AvatarControllerThread(String robotName,
DRCOutputProcessor outputProcessor,
RealtimeROS2Node realtimeROS2Node,
double gravity,
boolean kinematicsSimulation)
boolean kinematicsSimulation,
boolean wbccThreadRun)
{
controllerFullRobotModel = robotModel.createFullRobotModel();
this.wbccThreadRun = wbccThreadRun;
if (robotInitialSetup != null)
{
robotInitialSetup.initializeFullRobotModel(controllerFullRobotModel);
Expand All @@ -110,13 +115,19 @@ public AvatarControllerThread(String robotName,
CenterOfMassDataHolder centerOfMassDataHolderForController = new CenterOfMassDataHolder();
CenterOfPressureDataHolder centerOfPressureDataHolderForEstimator = new CenterOfPressureDataHolder(controllerFullRobotModel);
LowLevelOneDoFJointDesiredDataHolder desiredJointDataHolder = new LowLevelOneDoFJointDesiredDataHolder(controllerFullRobotModel.getControllableOneDoFJoints());
LowLevelOneDoFJointDesiredDataHolder wholeBodyControllerCoreDesiredJointDataHolder = new LowLevelOneDoFJointDesiredDataHolder(controllerFullRobotModel.getControllableOneDoFJoints());
ControllerCoreOutputDataHolder controllerCoreOutPutDataHolder = new ControllerCoreOutputDataHolder(controllerFullRobotModel.getControllableOneDoFJoints());
ControllerCoreCommandDataHolder controllerCoreCommandDataHolder = new ControllerCoreCommandDataHolder();
RobotMotionStatusHolder robotMotionStatusHolder = new RobotMotionStatusHolder();
contextDataFactory.setForceSensorDataHolder(forceSensorDataHolderForController);
contextDataFactory.setCenterOfMassDataHolder(centerOfMassDataHolderForController);
contextDataFactory.setCenterOfPressureDataHolder(centerOfPressureDataHolderForEstimator);
contextDataFactory.setRobotMotionStatusHolder(robotMotionStatusHolder);
contextDataFactory.setJointDesiredOutputList(desiredJointDataHolder);
contextDataFactory.setWBCCJointDesiredOutputList(wholeBodyControllerCoreDesiredJointDataHolder);
contextDataFactory.setProcessedJointData(processedJointData);
contextDataFactory.setControllerCoreOutputDataHolder(controllerCoreOutPutDataHolder);
contextDataFactory.setControllerCoreCommandDataHolder(controllerCoreCommandDataHolder);
contextDataFactory.setSensorDataContext(new SensorDataContext(controllerFullRobotModel));
humanoidRobotContextData = contextDataFactory.createHumanoidRobotContextData();

Expand Down Expand Up @@ -149,7 +160,9 @@ public AvatarControllerThread(String robotName,
centerOfMassDataHolderForController,
centerOfPressureDataHolderForEstimator,
sensorInformation,
desiredJointDataHolder,
wholeBodyControllerCoreDesiredJointDataHolder,
controllerCoreOutPutDataHolder,
controllerCoreCommandDataHolder,
yoGraphicsListRegistry,
registry,
kinematicsSimulation,
Expand All @@ -161,12 +174,13 @@ public AvatarControllerThread(String robotName,

firstTick.set(true);
registry.addChild(robotController.getYoRegistry());
if (outputProcessor != null)
{
outputProcessor.setLowLevelControllerCoreOutput(processedJointData, desiredJointDataHolder);
outputProcessor.setForceSensorDataHolderForController(forceSensorDataHolderForController);
registry.addChild(outputProcessor.getControllerYoVariableRegistry());
}
//TODO looks like should be moved to "new" thread
// if (outputProcessor != null)
// {
// outputProcessor.setLowLevelControllerCoreOutput(processedJointData, desiredJointDataHolder);
// outputProcessor.setForceSensorDataHolderForController(forceSensorDataHolderForController);
// registry.addChild(outputProcessor.getControllerYoVariableRegistry());
// }

ParameterLoaderHelper.loadParameters(this, robotModel, registry);
}
Expand Down Expand Up @@ -224,7 +238,9 @@ private ModularRobotController createHighLevelController(FullHumanoidRobotModel
CenterOfMassDataHolderReadOnly centerOfMassDataHolderForController,
CenterOfPressureDataHolder centerOfPressureDataHolderForEstimator,
HumanoidRobotSensorInformation sensorInformation,
JointDesiredOutputListBasics lowLevelControllerOutput,
JointDesiredOutputListBasics wholeBodyControllerCoreOutput,
ControllerCoreOutputDataHolder controllerCoreOutPutDataHolder,
ControllerCoreCommandDataHolder controllerCoreCommandDataHolder,
YoGraphicsListRegistry yoGraphicsListRegistry,
YoRegistry registry,
boolean kinematicsSimulation,
Expand Down Expand Up @@ -256,7 +272,9 @@ private ModularRobotController createHighLevelController(FullHumanoidRobotModel
forceSensorDataHolderForController,
centerOfMassDataHolderForController,
centerOfPressureDataHolderForEstimator,
lowLevelControllerOutput,
wholeBodyControllerCoreOutput,
controllerCoreOutPutDataHolder,
controllerCoreCommandDataHolder,
jointsToIgnore);
scs2YoGraphicHolders.add(() -> robotController.getSCS2YoGraphics());

Expand Down Expand Up @@ -301,13 +319,20 @@ public void initialize()
firstTick.set(true);
humanoidRobotContextData.setControllerRan(false);
humanoidRobotContextData.setEstimatorRan(false);
humanoidRobotContextData.setWholeBodyControllerCoreRan(false);

LowLevelOneDoFJointDesiredDataHolder jointDesiredOutputList = humanoidRobotContextData.getJointDesiredOutputList();
//TODO this should be removed.
// New Thread (WBCCThread) will replace this action
// in the EsitmatorThread, the initialize method clear the jointDesiredOutputList. So, let it be here.

for (int i = 0; i < jointDesiredOutputList.getNumberOfJointsWithDesiredOutput(); i++)
// LowLevelOneDoFJointDesiredDataHolder jointDesiredOutputList = humanoidRobotContextData.getJointDesiredOutputList();
LowLevelOneDoFJointDesiredDataHolder wholeBodyControllerCoreOutPutList = humanoidRobotContextData.getWholeBodyControllerCoreDesiredOutPutList();

for (int i = 0; i < wholeBodyControllerCoreOutPutList.getNumberOfJointsWithDesiredOutput(); i++)
{
jointDesiredOutputList.getJointDesiredOutput(i).clear();
wholeBodyControllerCoreOutPutList.getJointDesiredOutput(i).clear();
}

}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,5 @@
package us.ihmc.avatar;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.function.BooleanSupplier;

import controller_msgs.msg.dds.ControllerCrashNotificationPacket;
import controller_msgs.msg.dds.RequestWristForceSensorCalibrationPacket;
import controller_msgs.msg.dds.RobotConfigurationData;
Expand All @@ -15,12 +8,13 @@
import us.ihmc.commonWalkingControlModules.barrierScheduler.context.HumanoidRobotContextData;
import us.ihmc.commonWalkingControlModules.barrierScheduler.context.HumanoidRobotContextDataFactory;
import us.ihmc.commonWalkingControlModules.barrierScheduler.context.HumanoidRobotContextJointData;
import us.ihmc.commonWalkingControlModules.controllerCore.command.ControllerCoreCommandDataHolder;
import us.ihmc.commonWalkingControlModules.controllerCore.command.lowLevel.ControllerCoreOutputDataHolder;
import us.ihmc.commonWalkingControlModules.controllerCore.command.lowLevel.LowLevelOneDoFJointDesiredDataHolder;
import us.ihmc.commonWalkingControlModules.highLevelHumanoidControl.factories.ContactableBodiesFactory;
import us.ihmc.commons.Conversions;
import us.ihmc.communication.HumanoidControllerAPI;
import us.ihmc.communication.controllerAPI.ControllerAPI;
import us.ihmc.ros2.ROS2PublisherBasics;
import us.ihmc.concurrent.runtime.barrierScheduler.implicitContext.BarrierScheduler;
import us.ihmc.euclid.geometry.LineSegment2D;
import us.ihmc.euclid.transform.RigidBodyTransform;
Expand All @@ -34,11 +28,8 @@
import us.ihmc.robotics.robotSide.RobotSide;
import us.ihmc.robotics.robotSide.SegmentDependentList;
import us.ihmc.robotics.robotSide.SideDependentList;
import us.ihmc.robotics.sensors.CenterOfMassDataHolder;
import us.ihmc.robotics.sensors.ForceSensorDataHolder;
import us.ihmc.robotics.sensors.ForceSensorDataHolderReadOnly;
import us.ihmc.robotics.sensors.ForceSensorDefinition;
import us.ihmc.robotics.sensors.IMUDefinition;
import us.ihmc.robotics.sensors.*;
import us.ihmc.ros2.ROS2PublisherBasics;
import us.ihmc.ros2.ROS2Topic;
import us.ihmc.ros2.RealtimeROS2Node;
import us.ihmc.sensorProcessing.communication.producers.RobotConfigurationDataPublisher;
Expand Down Expand Up @@ -71,6 +62,13 @@
import us.ihmc.yoVariables.registry.YoRegistry;
import us.ihmc.yoVariables.variable.YoBoolean;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.function.BooleanSupplier;

public class AvatarEstimatorThreadFactory
{
private final YoRegistry estimatorRegistry = new YoRegistry("DRCEstimatorThread");
Expand Down Expand Up @@ -103,7 +101,7 @@ public class AvatarEstimatorThreadFactory
private final OptionalFactoryField<HumanoidRobotContextData> humanoidRobotContextDataField = new OptionalFactoryField<>("humanoidRobotContextData");
private final OptionalFactoryField<HumanoidRobotContextJointData> humanoidRobotContextJointDataField = new OptionalFactoryField<>("humanoidRobotContextJointData");
private final OptionalFactoryField<LowLevelOneDoFJointDesiredDataHolder> desiredJointDataHolderField = new OptionalFactoryField<>("desiredJointDataHolder");

private final OptionalFactoryField<LowLevelOneDoFJointDesiredDataHolder> wbccDesiredJointDataHolderField = new OptionalFactoryField<>("desiredJointDataHolder");
private final OptionalFactoryField<FloatingJointBasics> rootJointField = new OptionalFactoryField<>("rootJoint");
private final OptionalFactoryField<OneDoFJointBasics[]> oneDoFJointsField = new OptionalFactoryField<>("oneDoFJoints");
private final OptionalFactoryField<OneDoFJointBasics[]> controllableOneDoFJointsField = new OptionalFactoryField<>("controllableOneDoFJoints");
Expand All @@ -113,6 +111,8 @@ public class AvatarEstimatorThreadFactory
private final OptionalFactoryField<ForceSensorDataHolder> forceSensorDataHolderField = new OptionalFactoryField<>("forceSensorDataHolder");
private final OptionalFactoryField<CenterOfMassDataHolder> centerOfMassDataHolderField = new OptionalFactoryField<>("centerOfMassDataHolder");
private final OptionalFactoryField<ForceSensorDefinition[]> forceSensorDefinitionsField = new OptionalFactoryField<>("forceSensorDefinitionsField");
private final OptionalFactoryField<ControllerCoreOutputDataHolder> controllerCoreOutputDataHolderField = new OptionalFactoryField<>("wholeBodyControllerCoreDataHolder");
private final OptionalFactoryField<ControllerCoreCommandDataHolder> controllerCoreCommandDataHolderField = new OptionalFactoryField<>("controllerCoreCommandDataHolder");
private final OptionalFactoryField<IMUDefinition[]> imuDefinitionsField = new OptionalFactoryField<>("imuDefinitions");

private final OptionalFactoryField<ContactableBodiesFactory<RobotSide>> contactableBodiesFactoryField = new OptionalFactoryField<>("contactableBodiesFactory");
Expand Down Expand Up @@ -169,7 +169,6 @@ public void setGravity(double gravity)
* </ul>
*
* @param robotModel the robot model used to configure this factory.
* @param robotInitialSetup
*/
public void configureWithDRCRobotModel(DRCRobotModel robotModel)
{
Expand Down Expand Up @@ -589,6 +588,9 @@ public HumanoidRobotContextData getHumanoidRobotContextData()
contextDataFactory.setJointDesiredOutputList(getDesiredJointDataHolder());
contextDataFactory.setProcessedJointData(getHumanoidRobotContextJointData());
contextDataFactory.setSensorDataContext(getSensorDataContext());
contextDataFactory.setWBCCJointDesiredOutputList(getWBCCDesiredJointDataHolder());
contextDataFactory.setControllerCoreOutputDataHolder(getControllerCoreOutPutDataHolder());
contextDataFactory.setControllerCoreCommandDataHolder(getControllerCoreCommandDataHolder());
humanoidRobotContextDataField.set(contextDataFactory.createHumanoidRobotContextData());
}
return humanoidRobotContextDataField.get();
Expand All @@ -600,6 +602,24 @@ public LowLevelOneDoFJointDesiredDataHolder getDesiredJointDataHolder()
desiredJointDataHolderField.set(new LowLevelOneDoFJointDesiredDataHolder(getControllableOneDoFJoints()));
return desiredJointDataHolderField.get();
}
public LowLevelOneDoFJointDesiredDataHolder getWBCCDesiredJointDataHolder()
{
if (!wbccDesiredJointDataHolderField.hasValue())
wbccDesiredJointDataHolderField.set(new LowLevelOneDoFJointDesiredDataHolder(getControllableOneDoFJoints()));
return wbccDesiredJointDataHolderField.get();
}
public ControllerCoreOutputDataHolder getControllerCoreOutPutDataHolder()
{
if(!controllerCoreOutputDataHolderField.hasValue())
controllerCoreOutputDataHolderField.set(new ControllerCoreOutputDataHolder(getControllableOneDoFJoints()));
return controllerCoreOutputDataHolderField.get();
}
public ControllerCoreCommandDataHolder getControllerCoreCommandDataHolder()
{
if(!controllerCoreCommandDataHolderField.hasValue())
controllerCoreCommandDataHolderField.set(new ControllerCoreCommandDataHolder());
return controllerCoreCommandDataHolderField.get();
}

public RobotMotionStatusHolder getRobotMotionStatusFromController()
{
Expand Down
Loading
Loading