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>
17#include <ArmarXCore/interface/serialization/Eigen/Eigen_fdi.h>
25#include <RobotAPI/interface/units/RobotUnit/NJointController.h>
26#include <RobotAPI/interface/visualization/DebugDrawerInterface.h>
28#include <armarx/control/interface/ConfigurableNJointControllerInterface.h>
31#include <armarx/navigation/platform_controller/aron/PlatformLocalTrajectoryControllerConfig.aron.generated.h>
40 const NJointControllerConfigPtr& config,
47 ConfigPtrT cfg = ConfigPtrT::dynamicCast(config);
56 ControlModes::HolonomicPlatformVelocity)
59 <<
"The actuator " << robotUnit->getRobotPlatformName() <<
" has no control mode "
60 << ControlModes::HolonomicPlatformVelocity;
63 const auto trajectoryFollowingControllerParams = configData.params;
66 configBuffer_updateConfigToAdditionalTask.reinitAllBuffers(configData);
67 configBuffer_updateConfigToOnPublish.reinitAllBuffers(configData);
69 trajectoryFollowingController.emplace(trajectoryFollowingControllerParams);
83 const IceUtil::Time& timeSinceLastIteration)
93 robotStateBuffer_rtToAdditionalTask.getWriteBuffer().global_T_robot.matrix() =
95 robotStateBuffer_rtToAdditionalTask.commitWrite();
100 const Ice::Current& iceCurrent)
108 configBuffer_updateConfigToAdditionalTask.getWriteBuffer() =
updateConfig;
109 configBuffer_updateConfigToAdditionalTask.commitWrite();
111 configBuffer_updateConfigToOnPublish.getWriteBuffer() =
updateConfig;
112 configBuffer_updateConfigToOnPublish.commitWrite();
122 ARMARX_CHECK(trajectoryFollowingController.has_value());
124 const auto& configBuffer =
125 configBuffer_updateConfigToAdditionalTask.getUpToDateReadBuffer();
128 if (configBuffer.targets.trajectory.points().empty())
132 filteredTwist.reset();
144 trajectoryFollowingController->updateParams(configBuffer.params);
148 configBuffer.targets.trajectory,
149 robotStateBuffer_rtToAdditionalTask.getUpToDateReadBuffer().global_T_robot);
153 const float alpha = configBuffer.params.alpha;
154 filteredTwist.linear =
155 alpha * filteredTwist.linear + (1. - alpha) * result.
twist.
linear.head<2>();
156 filteredTwist.angular =
157 alpha * filteredTwist.angular + (1. - alpha) * result.
twist.
angular.z();
163 writeBuffer.twistRaw = result.
twist;
164 writeBuffer.twistCommanded = filteredTwist;
165 writeBuffer.result = result;
171 auto& writeBuffer = targetBuffer_additionalTaskToOnPublish.getWriteBuffer();
172 writeBuffer.twistRaw = result.
twist;
173 writeBuffer.twistCommanded = filteredTwist;
174 writeBuffer.result = result;
176 targetBuffer_additionalTaskToOnPublish.commitWrite();
186 const auto&
targets = targetBuffer_additionalTaskToOnPublish.getUpToDateReadBuffer();
188 datafields[
"vx"] =
new Variant(
targets.twistCommanded.linear.x());
189 datafields[
"vy"] =
new Variant(
targets.twistCommanded.linear.y());
190 datafields[
"v_linear"] =
new Variant(
targets.twistCommanded.linear.norm());
195 datafields[
"v_linear_raw"] =
new Variant(
targets.twistRaw.linear.norm());
196 datafields[
"vyaw_raw"] =
new Variant(
targets.twistRaw.angular.z());
200 if(not configBuffer_updateConfigToOnPublish.getUpToDateReadBuffer().targets.trajectory.points().empty())
202 datafields[
"dt_front"] =
new Variant((
armarx::Clock::Now() - configBuffer_updateConfigToOnPublish.getUpToDateReadBuffer().targets.trajectory.points().front().timestamp).toSecondsDouble());
205 datafields[
"trajectory_points"] =
206 new Variant(configBuffer_updateConfigToOnPublish.getUpToDateReadBuffer()
207 .targets.trajectory.points()
210 debugObservers->setDebugChannel(
218 runTask(
"PlatformTrajectoryControllerAdditionalTask",
223 ARMARX_IMPORTANT <<
"Create a new thread alone PlatformTrajectory controller";
224 while (
getState() == eManagedIceObjectStarted)
231 c.waitForCycleDuration();
235 ARMARX_INFO <<
"PlatformTrajectoryVelocityController::onInitNJointController";
242 filteredTwist.reset();
244 robotStateBuffer_rtToAdditionalTask.getWriteBuffer().global_T_robot.matrix() =
246 robotStateBuffer_rtToAdditionalTask.commitWrite();
254 rtReady.store(
false);
static DateTime Now()
Current time on the virtual clock.
This util class helps with keeping a cycle time during a control cycle.
ArmarXObjectSchedulerPtr getObjectScheduler() const
int getState() const
Retrieve current state of the ManagedIceObject.
bool isControllerActive(const Ice::Current &=Ice::emptyCurrent) const final override
void runTask(const std::string &taskName, Task &&task)
Executes a given task in a separate thread from the Application ThreadPool.
const VirtualRobot::RobotPtr & useSynchronizedRtRobot(bool updateCollisionModel=false)
Requests a VirtualRobot for use in rtRun *.
const VirtualRobot::RobotPtr & rtGetRobot()
TODO make protected and use attorneys.
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...
const Target & rtGetControlStruct() const
void writeControlStruct()
bool rtUpdateControlStruct()
Target & getWriterControlStruct()
void reinitTripleBuffer(const Target &initial)
The Variant class is described here: Variants.
Brief description of class targets.
#define ARMARX_CHECK_EXPRESSION(expression)
This macro evaluates the expression and if it turns out to be false it will throw an ExpressionExcept...
#define ARMARX_CHECK(expression)
Shortcut for ARMARX_CHECK_EXPRESSION.
#define ARMARX_INFO
The normal logging level.
#define ARMARX_IMPORTANT
The logging level for always important information, but expected behaviour (in contrast to ARMARX_WAR...
#define ARMARX_ERROR
The logging level for unexpected behaviour, that must be fixed.
#define ARMARX_VERBOSE
The logging level for verbose information.
std::shared_ptr< class Robot > RobotPtr
::IceInternal::Handle< Dict > DictPtr
const simox::meta::EnumNames< ControllerType > ControllerTypeNames
@ PlatformLocalTrajectory
::IceInternal::ProxyHandle<::IceProxy::armarx::DebugObserverInterface > DebugObserverInterfacePrx
std::map< std::string, VariantBasePtr > StringVariantBaseMap
void fromAron(const arondto::PackagePath &dto, PackageFileLocation &bo)
IceUtil::Handle< class RobotUnit > RobotUnitPtr
::IceInternal::ProxyHandle<::IceProxy::armarx::DebugDrawerInterface > DebugDrawerInterfacePrx
detail::ControlThreadOutputBufferEntry SensorAndControl