PlatformLocalTrajectoryController.cpp
Go to the documentation of this file.
2 
3 #include <string>
4 
5 #include <Ice/Current.h>
6 #include <IceUtil/Time.h>
7 
8 #include <VirtualRobot/VirtualRobot.h>
9 
14 #include <ArmarXCore/interface/core/ManagedIceObjectDefinitions.h>
15 #include <ArmarXCore/interface/observers/ObserverInterface.h>
16 #include <ArmarXCore/interface/observers/VariantBase.h>
17 #include <ArmarXCore/interface/serialization/Eigen/Eigen_fdi.h>
19 
25 #include <RobotAPI/interface/units/RobotUnit/NJointController.h>
26 #include <RobotAPI/interface/visualization/DebugDrawerInterface.h>
27 
28 #include <armarx/control/interface/ConfigurableNJointControllerInterface.h> // IWYU pragma: keep
30 #include <armarx/navigation/platform_controller/aron/PlatformLocalTrajectoryControllerConfig.aron.generated.h>
32 
34 {
35  const NJointControllerRegistration<Controller> Registration(
37 
39  const NJointControllerConfigPtr& config,
41  {
42  ARMARX_IMPORTANT << "Creating "
43  << common::ControllerTypeNames.to_name(
45  // config
46  ConfigPtrT cfg = ConfigPtrT::dynamicCast(config);
48  // ARMARX_CHECK_EXPRESSION(!cfg->nodeSetName.empty());
49 
50  ARMARX_CHECK_EXPRESSION(robotUnit);
51 
52  const auto robot = useSynchronizedRtRobot();
53 
54  platformTarget = useControlTarget(robotUnit->getRobotPlatformName(),
55  ControlModes::HolonomicPlatformVelocity)
57  ARMARX_CHECK_EXPRESSION(platformTarget)
58  << "The actuator " << robotUnit->getRobotPlatformName() << " has no control mode "
59  << ControlModes::HolonomicPlatformVelocity;
60 
61  const auto configData = ::armarx::fromAron<arondto::Config, Config>(cfg->config);
62  const auto trajectoryFollowingControllerParams = configData.params;
63 
65  configBuffer_updateConfigToAdditionalTask.reinitAllBuffers(configData);
66  configBuffer_updateConfigToOnPublish.reinitAllBuffers(configData);
67 
68  trajectoryFollowingController.emplace(trajectoryFollowingControllerParams);
69 
70  ARMARX_INFO << "Init done.";
71  }
72 
73  std::string
74  Controller::getClassName(const Ice::Current& iceCurrent) const
75  {
78  }
79 
80  void
81  Controller::rtRun(const IceUtil::Time& sensorValuesTimestamp,
82  const IceUtil::Time& timeSinceLastIteration)
83  {
85 
86  // update control devices
87  platformTarget->velocityX = rtGetControlStruct().linear.x();
88  platformTarget->velocityY = rtGetControlStruct().linear.y();
89  platformTarget->velocityRotation = rtGetControlStruct().angular;
90 
91  // read data (for non-rt)
92  robotStateBuffer_rtToAdditionalTask.getWriteBuffer().global_T_robot.matrix() =
93  rtGetRobot()->getGlobalPose();
94  robotStateBuffer_rtToAdditionalTask.commitWrite();
95  }
96 
97  void
99  const Ice::Current& iceCurrent)
100  {
101  ARMARX_IMPORTANT << "Controller::updateConfig";
102 
103  // TODO maybe update pid controller
104 
105  const auto updateConfig = ::armarx::fromAron<arondto::Config, Config>(dto);
106 
107  configBuffer_updateConfigToAdditionalTask.getWriteBuffer() = updateConfig;
108  configBuffer_updateConfigToAdditionalTask.commitWrite();
109 
110  configBuffer_updateConfigToOnPublish.getWriteBuffer() = updateConfig;
111  configBuffer_updateConfigToOnPublish.commitWrite();
112 
113  ARMARX_INFO << "Trajectory with " << updateConfig.targets.trajectory.points().size();
114 
115  ARMARX_IMPORTANT << "done Controller::updateConfig";
116  }
117 
118  void
120  {
121  ARMARX_CHECK(trajectoryFollowingController.has_value());
122 
123  const auto& configBuffer =
124  configBuffer_updateConfigToAdditionalTask.getUpToDateReadBuffer();
125 
126  // if trajectory is empty, set velocity to 0
127  if (configBuffer.targets.trajectory.points().empty())
128  {
129  ARMARX_INFO << deactivateSpam(1) << "Trajectory is empty!";
130 
131  filteredTwist.reset();
132 
133  getWriterControlStruct().reset();
135  return;
136  }
137 
138  // update controller
139  const auto result = trajectoryFollowingController->control(
140  configBuffer.targets.trajectory,
141  robotStateBuffer_rtToAdditionalTask.getUpToDateReadBuffer().global_T_robot);
142 
143  // low-pass filter
144  {
145  const float alpha = configBuffer.params.alpha;
146  filteredTwist.linear =
147  alpha * filteredTwist.linear + (1. - alpha) * result.twist.linear.head<2>();
148  filteredTwist.angular =
149  alpha * filteredTwist.angular + (1. - alpha) * result.twist.angular.z();
150  }
151 
152  // store result
153  getWriterControlStruct() = filteredTwist;
155 
156  // store results (onPublish)
157  targetBuffer_additionalTaskToOnPublish.getWriteBuffer() = filteredTwist;
158  targetBuffer_additionalTaskToOnPublish.commitWrite();
159  }
160 
161  void
163  const DebugDrawerInterfacePrx& debugDrawer,
164  const DebugObserverInterfacePrx& debugObservers)
165  {
166  StringVariantBaseMap datafields;
167 
168  const auto& targets = targetBuffer_additionalTaskToOnPublish.getUpToDateReadBuffer();
169 
170  datafields["vx"] = new Variant(targets.linear.x());
171  datafields["vy"] = new Variant(targets.linear.y());
172  datafields["vyaw"] = new Variant(targets.angular);
173  datafields["trajectory_points"] =
174  new Variant(configBuffer_updateConfigToOnPublish.getUpToDateReadBuffer()
175  .targets.trajectory.points()
176  .size());
177 
178  debugObservers->setDebugChannel(
180  datafields);
181  }
182 
183  void
185  {
186  runTask("PlatformTrajectoryControllerAdditionalTask",
187  [&]
188  {
189  CycleUtil c(10);
190  getObjectScheduler()->waitForObjectStateMinimum(eManagedIceObjectStarted);
191  ARMARX_IMPORTANT << "Create a new thread alone PlatformTrajectory controller";
192  while (getState() == eManagedIceObjectStarted)
193  {
194  if (isControllerActive() and rtReady.load())
195  {
196  ARMARX_VERBOSE << "additional task";
197  additionalTask();
198  }
199  c.waitForCycleDuration();
200  }
201  });
202 
203  ARMARX_INFO << "PlatformTrajectoryVelocityController::onInitNJointController";
204  }
205 
206  void
208  {
209  // additionalTask() is not executed. Thus, we can access lastTwist without mutex.
210  filteredTwist.reset();
211 
212  robotStateBuffer_rtToAdditionalTask.getWriteBuffer().global_T_robot.matrix() =
213  rtGetRobot()->getGlobalPose();
214  robotStateBuffer_rtToAdditionalTask.commitWrite();
215 
216  rtReady.store(true);
217  }
218 
219  void
221  {
222  rtReady.store(false);
223  }
224 
225  Controller::~Controller() = default;
226 
228  Controller::getConfig(const ::Ice::Current&)
229  {
230  ARMARX_ERROR << "NYI";
231  return nullptr;
232  }
233 } // namespace armarx::navigation::platform_controller::platform_local_trajectory
armarx::NJointControllerWithTripleBuffer< Target >::reinitTripleBuffer
void reinitTripleBuffer(const Target &initial)
Definition: NJointControllerWithTripleBuffer.h:68
armarx::ControlTargetHolonomicPlatformVelocity
Brief description of class ControlTargetHolonomicPlatformVelocity.
Definition: ControlTargetHolonomicPlatformVelocity.h:38
armarx::ControlTargetBase::asA
const T * asA() const
Definition: ControlTargetBase.h:76
armarx::Variant
The Variant class is described here: Variants.
Definition: Variant.h:223
ARMARX_VERBOSE
#define ARMARX_VERBOSE
Definition: Logging.h:187
armarx::targets
Brief description of class targets.
Definition: targets.h:38
armarx::TripleBuffer::getWriteBuffer
T & getWriteBuffer()
Definition: TripleBuffer.h:92
armarx::NJointControllerBase::useSynchronizedRtRobot
const VirtualRobot::RobotPtr & useSynchronizedRtRobot(bool updateCollisionModel=false)
Requests a VirtualRobot for use in rtRun *.
Definition: NJointController.cpp:293
armarx::NJointControllerWithTripleBuffer< Target >::rtGetControlStruct
const Target & rtGetControlStruct() const
Definition: NJointControllerWithTripleBuffer.h:32
armarx::StringVariantBaseMap
std::map< std::string, VariantBasePtr > StringVariantBaseMap
Definition: ManagedIceObject.h:110
ARMARX_IMPORTANT
#define ARMARX_IMPORTANT
Definition: Logging.h:190
NJointControllerBase.h
controller_types.h
armarx::navigation::platform_controller::platform_local_trajectory::Controller::rtPostDeactivateController
void rtPostDeactivateController() override
This function is called after the controller is deactivated.
Definition: PlatformLocalTrajectoryController.cpp:220
RobotUnit.h
armarx::TripleBuffer::commitWrite
void commitWrite()
Definition: TripleBuffer.h:163
armarx::navigation::platform_controller::platform_local_trajectory::Twist2D::linear
Eigen::Vector2f linear
Definition: PlatformLocalTrajectoryController.h:73
armarx::NJointControllerBase::useControlTarget
ControlTargetBase * useControlTarget(const std::string &deviceName, const std::string &controlMode)
Declares to calculate the ControlTarget for the given ControlDevice in the given ControlMode when rtR...
Definition: NJointController.cpp:410
armarx::CycleUtil
This util class helps with keeping a cycle time during a control cycle.
Definition: CycleUtil.h:40
armarx::ManagedIceObject::getState
int getState() const
Retrieve current state of the ManagedIceObject.
Definition: ManagedIceObject.cpp:769
PlatformLocalTrajectoryController.h
c
constexpr T c
Definition: UnscentedKalmanFilterTest.cpp:46
armarx::NJointControllerBase::ConfigPtrT
NJointControllerConfigPtr ConfigPtrT
Definition: NJointControllerBase.h:587
armarx::navigation::common::ControllerType::PlatformLocalTrajectory
@ PlatformLocalTrajectory
armarx::NJointControllerWithTripleBuffer< Target >::getWriterControlStruct
Target & getWriterControlStruct()
Definition: NJointControllerWithTripleBuffer.h:54
armarx::ControlTargetHolonomicPlatformVelocity::velocityRotation
float velocityRotation
Definition: ControlTargetHolonomicPlatformVelocity.h:43
ARMARX_CHECK
#define ARMARX_CHECK(expression)
Shortcut for ARMARX_CHECK_EXPRESSION.
Definition: ExpressionException.h:82
armarx::navigation::platform_controller::platform_local_trajectory::Controller::onInitNJointController
void onInitNJointController() override
Definition: PlatformLocalTrajectoryController.cpp:184
IceInternal::Handle
Definition: forward_declarations.h:8
armarx::NJointControllerBase::rtGetRobot
const VirtualRobot::RobotPtr & rtGetRobot()
TODO make protected and use attorneys.
Definition: NJointControllerBase.h:846
armarx::detail::ControlThreadOutputBufferEntry
Definition: ControlThreadOutputBuffer.h:182
armarx::NJointControllerBase::isControllerActive
bool isControllerActive(const Ice::Current &=Ice::emptyCurrent) const final override
Definition: NJointControllerBase.h:778
armarx::NJointControllerBase::runTask
void runTask(const std::string &taskName, Task &&task)
Executes a given task in a separate thread from the Application ThreadPool.
Definition: NJointControllerBase.h:754
ControlModes.h
armarx::NJointControllerWithTripleBuffer< Target >::rtUpdateControlStruct
bool rtUpdateControlStruct()
Definition: NJointControllerWithTripleBuffer.h:38
armarx::navigation::platform_controller::platform_local_trajectory::Controller::additionalTask
void additionalTask()
Definition: PlatformLocalTrajectoryController.cpp:119
armarx::navigation::platform_controller::platform_local_trajectory::Controller::onPublish
void onPublish(const SensorAndControl &sac, const DebugDrawerInterfacePrx &debugDrawer, const DebugObserverInterfacePrx &debugObservers) override
Definition: PlatformLocalTrajectoryController.cpp:162
aron_conversions.h
armarx::NJointControllerWithTripleBuffer< Target >::writeControlStruct
void writeControlStruct()
Definition: NJointControllerWithTripleBuffer.h:44
ArmarXObjectScheduler.h
armarx::navigation::platform_controller::platform_local_trajectory::Controller::updateConfig
void updateConfig(const ::armarx::aron::data::dto::DictPtr &dto, const Ice::Current &iceCurrent=Ice::emptyCurrent) override
Definition: PlatformLocalTrajectoryController.cpp:98
armarx::navigation::platform_controller::platform_local_trajectory::Controller::getClassName
std::string getClassName(const Ice::Current &iceCurrent=Ice::emptyCurrent) const override
Definition: PlatformLocalTrajectoryController.cpp:74
ARMARX_ERROR
#define ARMARX_ERROR
Definition: Logging.h:196
armarx::ControlTargetHolonomicPlatformVelocity::velocityX
float velocityX
Definition: ControlTargetHolonomicPlatformVelocity.h:41
armarx::armem::Time
armarx::core::time::DateTime Time
Definition: forward_declarations.h:13
armarx::ControlTargetHolonomicPlatformVelocity::velocityY
float velocityY
Definition: ControlTargetHolonomicPlatformVelocity.h:42
armarx::navigation::platform_controller::platform_local_trajectory::Twist2D::reset
void reset()
Definition: PlatformLocalTrajectoryController.h:77
CycleUtil.h
ExpressionException.h
armarx::navigation::platform_controller::platform_local_trajectory::Controller::rtPreActivateController
void rtPreActivateController() override
This function is called before the controller is activated.
Definition: PlatformLocalTrajectoryController.cpp:207
armarx::navigation::platform_controller::platform_local_trajectory::Controller::rtRun
void rtRun(const IceUtil::Time &sensorValuesTimestamp, const IceUtil::Time &timeSinceLastIteration) override
TODO make protected and use attorneys.
Definition: PlatformLocalTrajectoryController.cpp:81
armarx::aron::data::DictPtr
std::shared_ptr< Dict > DictPtr
Definition: Dict.h:41
ControlTargetHolonomicPlatformVelocity.h
ARMARX_CHECK_EXPRESSION
#define ARMARX_CHECK_EXPRESSION(expression)
This macro evaluates the expression and if it turns out to be false it will throw an ExpressionExcept...
Definition: ExpressionException.h:73
armarx::navigation::common::ControllerTypeNames
const simox::meta::EnumNames< ControllerType > ControllerTypeNames
Definition: controller_types.h:17
ARMARX_INFO
#define ARMARX_INFO
Definition: Logging.h:181
armarx::navigation::platform_controller::platform_local_trajectory::Controller::~Controller
~Controller() override
IceUtil::Handle< class RobotUnit >
IceInternal::ProxyHandle<::IceProxy::armarx::DebugDrawerInterface >
armarx::navigation::platform_controller::platform_local_trajectory::Twist2D::angular
float angular
Definition: PlatformLocalTrajectoryController.h:74
armarx::navigation::platform_controller::platform_local_trajectory::Registration
const NJointControllerRegistration< Controller > Registration(common::ControllerTypeNames.to_name(common::ControllerType::PlatformLocalTrajectory))
armarx::Logging::deactivateSpam
SpamFilterDataPtr deactivateSpam(float deactivationDurationSec=10.0f, const std::string &identifier="", bool deactivate=true) const
disables the logging for the current line for the given amount of seconds.
Definition: Logging.cpp:99
Logging.h
armarx::navigation::platform_controller::platform_local_trajectory::Controller::getConfig
::armarx::aron::data::dto::DictPtr getConfig(const ::Ice::Current &=::Ice::emptyCurrent) override
Definition: PlatformLocalTrajectoryController.cpp:228
armarx::TripleBuffer::getUpToDateReadBuffer
const T & getUpToDateReadBuffer() const
Definition: TripleBuffer.h:116
Variant.h
armarx::TripleBuffer::reinitAllBuffers
std::enable_if< std::is_copy_constructible< U >::value >::type reinitAllBuffers(const T &init)
Definition: TripleBuffer.h:171
NJointControllerRegistry.h
armarx::ManagedIceObject::getObjectScheduler
ArmarXObjectSchedulerPtr getObjectScheduler() const
Definition: ManagedIceObject.cpp:776
VirtualRobot::RobotPtr
std::shared_ptr< class Robot > RobotPtr
Definition: Bus.h:19
armarx::navigation::platform_controller::platform_local_trajectory::Controller::Controller
Controller(const RobotUnitPtr &robotUnit, const NJointControllerConfigPtr &config, const VirtualRobot::RobotPtr &)
Definition: PlatformLocalTrajectoryController.cpp:38
armarx::navigation::platform_controller::platform_local_trajectory
Definition: aron_conversions.cpp:53