5 #include <Ice/Current.h>
6 #include <IceUtil/Time.h>
8 #include <VirtualRobot/VirtualRobot.h>
14 #include <ArmarXCore/interface/core/ManagedIceObjectDefinitions.h>
15 #include <ArmarXCore/interface/observers/ObserverInterface.h>
16 #include <ArmarXCore/interface/observers/VariantBase.h>
25 #include <RobotAPI/interface/units/RobotUnit/NJointController.h>
26 #include <RobotAPI/interface/visualization/DebugDrawerInterface.h>
28 #include <armarx/control/interface/ConfigurableNJointControllerInterface.h>
30 #include <armarx/navigation/platform_controller/aron/PlatformGlobalTrajectoryControllerConfig.aron.generated.h>
36 const NJointControllerRegistration<Controller>
Registration(
40 const NJointControllerConfigPtr& config,
47 ConfigPtrT cfg = ConfigPtrT::dynamicCast(config);
57 const std::string controlTargetName = robotUnit->getRobotPlatformName();
59 ARMARX_INFO <<
"Using control target " << controlTargetName;
60 auto* ct =
useControlTarget(controlTargetName, ControlModes::HolonomicPlatformVelocity);
66 <<
"The actuator " << controlTargetName <<
" has no control mode "
67 << ControlModes::HolonomicPlatformVelocity;
71 const auto configData = ::armarx::fromAron<arondto::Config, Config>(cfg->config);
72 const auto trajectoryFollowingControllerParams = configData.params;
78 trajectoryFollowingController.emplace(trajectoryFollowingControllerParams);
102 robotStateBuffer_rtToAdditionalTask.
getWriteBuffer().global_T_robot.matrix() =
109 const Ice::Current& iceCurrent)
113 const auto updateConfig = ::armarx::fromAron<arondto::Config, Config>(dto);
116 configBuffer_updateConfigToAdditionalTask.
commitWrite();
119 configBuffer_updateConfigToOnPublish.
commitWrite();
128 ARMARX_CHECK(trajectoryFollowingController.has_value());
130 const auto& configBuffer =
135 if (configBuffer.targets.trajectory.points().empty())
139 filteredTwist.
reset();
150 trajectoryFollowingController->updateTwistLimits(configBuffer.params.limits);
152 trajectoryFollowingController->control(
153 configBuffer.targets.trajectory,
158 const float alpha = configBuffer.params.alpha;
171 targetBuffer_additionalTaskToOnPublish.getWriteBuffer().target = filteredTwist;
172 targetBuffer_additionalTaskToOnPublish.getWriteBuffer().dropPointVelocity =
174 targetBuffer_additionalTaskToOnPublish.getWriteBuffer().currentOrientation =
176 targetBuffer_additionalTaskToOnPublish.getWriteBuffer().desiredOrientation =
178 targetBuffer_additionalTaskToOnPublish.getWriteBuffer().orientationError =
180 targetBuffer_additionalTaskToOnPublish.getWriteBuffer().positionError =
182 targetBuffer_additionalTaskToOnPublish.getWriteBuffer().isFinalSegment =
184 targetBuffer_additionalTaskToOnPublish.commitWrite();
194 const auto& debugStuff = targetBuffer_additionalTaskToOnPublish.getUpToDateReadBuffer();
198 datafields[
"vx"] =
new Variant(debugStuff.target.linear.x());
199 datafields[
"vy"] =
new Variant(debugStuff.target.linear.y());
200 datafields[
"v_linear"] =
new Variant(debugStuff.target.linear.norm());
201 datafields[
"vyaw"] =
new Variant(debugStuff.target.angular);
202 datafields[
"trajectory_points"] =
new Variant(config.targets.trajectory.points().size());
204 datafields[
"drop_point_velocity"] =
new Variant(debugStuff.dropPointVelocity);
206 datafields[
"orientationError"] =
new Variant(debugStuff.orientationError);
207 datafields[
"desiredOrientation"] =
new Variant(debugStuff.desiredOrientation);
208 datafields[
"currentOrientation"] =
new Variant(debugStuff.currentOrientation);
209 datafields[
"isFinalSegment"] =
new Variant(debugStuff.isFinalSegment);
211 datafields[
"positionError"] =
new Variant(debugStuff.positionError);
213 datafields[
"limitLinear"] =
new Variant(config.params.limits.linear);
214 datafields[
"limitAngular"] =
new Variant(config.params.limits.angular);
216 debugObservers->setDebugChannel(
225 ARMARX_INFO <<
"PlatformGlobalTrajectoryController::onInitNJointController";
228 "PlatformGlobalTrajectoryControllerAdditionalTask",
234 <<
"Create a new thread alone PlatformGlobalTrajectoryController controller";
235 while (
getState() == eManagedIceObjectStarted)
242 c.waitForCycleDuration();
246 ARMARX_INFO <<
"PlatformGlobalTrajectoryController::onInitNJointController done.";
253 filteredTwist.
reset();
255 robotStateBuffer_rtToAdditionalTask.
getWriteBuffer().global_T_robot.matrix() =
265 rtReady.store(
false);