27#include <VirtualRobot/VirtualRobot.h>
39#include <armarx/control/interface/ConfigurableNJointControllerInterface.h>
41#include <armarx/control/njoint_controller/joint_space/aron/WholeBodyTrajectoryControllerConfig.aron.generated.h>
46 class SensorValueHolonomicPlatformWithAbsolutePosition;
47 class ControlTarget1DoFActuatorVelocity;
48 class ControlTarget1DoFActuatorPosition;
49 class SensorValue1DoFActuatorPosition;
62 whole_body_trajectory_controller::arondto::TrajectoryPoint;
66 Trajectory(
const std::vector<TrajectoryPoint>& traj) : trajectory_(traj)
73 return trajectory_.front();
94 std::optional<TrajectoryPoint>
104 return trajectory_.front();
109 return trajectory_.back();
124 {
return lhs.timestampMicroSeconds < val; };
127 std::lower_bound(trajectory_.begin(), trajectory_.end(), relativeTimeUS, compareFn);
130 if (it == trajectory_.begin())
135 const auto itBefore = std::prev(it);
138 const double f =
static_cast<double>(relativeTimeUS - itBefore->timestampMicroSeconds) /
139 (it->timestampMicroSeconds - itBefore->timestampMicroSeconds);
142 const auto linearInterpolate = [](
const std::vector<double>& a,
143 const std::vector<double>& b,
144 const double f) -> std::vector<double>
151 const std::size_t n = a.size();
153 std::vector<double>
c(n);
155 for (std::size_t i = 0; i < n; i++)
157 c.at(i) = (1 - f) * a.at(i) + f * b.at(i);
170 tp.jointValues = linearInterpolate(itBefore->jointValues, it->jointValues, f);
171 tp.jointValuesPlatform =
172 linearInterpolate(itBefore->jointValuesPlatform, it->jointValuesPlatform, f);
174 linearInterpolate(itBefore->handJointValues, it->handJointValues, f);
177 linearInterpolate(itBefore->jointVelocities, it->jointVelocities, f);
178 tp.jointVelocitiesPlatform = linearInterpolate(
179 itBefore->jointVelocitiesPlatform, it->jointVelocitiesPlatform, f);
198 return {.min = trajectory_.front().timestampMicroSeconds + startTimestampUS_.value(),
199 .max = trajectory_.back().timestampMicroSeconds + startTimestampUS_.value()};
204 const std::vector<armarx::control::njoint_controller::joint_space::
205 whole_body_trajectory_controller::arondto::TrajectoryPoint>
208 std::optional<std::int64_t> startTimestampUS_;
234 const NJointControllerConfigPtr& config,
238 std::string
getClassName(
const Ice::Current& iceCurrent = Ice::emptyCurrent)
const override;
240 void rtRun(
const IceUtil::Time& sensorValuesTimestamp,
241 const IceUtil::Time& timeSinceLastIteration)
override;
261 struct ControlTargets
264 std::vector<ControlTarget1DoFActuatorVelocity*> jointTargets;
265 std::vector<ControlTarget1DoFActuatorPosition*> handTargets;
269 std::vector<const SensorValue1DoFActuatorPosition*> jointSensorValues_;
272 std::optional<Trajectory> trajectory_;
279 std::optional<MultiDimPIDController> pidArm_;
281 std::vector<std::string> jointNames_;
282 std::vector<std::string> fingerJointNames_;
285 VirtualRobot::RobotNodePtr rtTcpNode_;
288 VirtualRobot::RobotNodePtr publishTcpNode_;
294 std::vector<DebugData> whatever_;
295 std::atomic_bool whateverFlag_ =
true;
SensorValueGlobalRobotPose SensorValueType
NJointControllerWithTripleBuffer(const Target &initialCommands=Target())
A simple triple buffer for lockfree comunication between a single writer and a single reader.
void onPublish(const SensorAndControl &, const DebugDrawerInterfacePrx &, const DebugObserverInterfacePrx &) override
virtual void onDisconnectNJointController()
Controller(const RobotUnitPtr &robotUnit, const NJointControllerConfigPtr &config, const VirtualRobot::RobotPtr &robot)
void rtRun(const IceUtil::Time &sensorValuesTimestamp, const IceUtil::Time &timeSinceLastIteration) override
TODO make protected and use attorneys.
void updateConfig(const ConfigurableNJointControllerBaseT::AronConfigT &configData) override
std::string getClassName(const Ice::Current &iceCurrent=Ice::emptyCurrent) const override
void rtPreActivateController() override
This function is called before the controller is activated.
armarx::control::njoint_controller::joint_space:: whole_body_trajectory_controller::arondto::TrajectoryPoint TrajectoryPoint
void setStartTime(const TimestampUS ×tamp)
std::optional< TrajectoryPoint > at(const TimestampUS ×tamp)
bool isValid(const TimestampUS ×tamp) const
Trajectory(const std::vector< TrajectoryPoint > &traj)
const TrajectoryPoint & initialPoint() const
TimeInterval timeBounds() const
#define ARMARX_CHECK_LESS_EQUAL(lhs, rhs)
This macro evaluates whether lhs is less or equal (<=) rhs and if it turns out to be false it will th...
#define ARMARX_CHECK_GREATER_EQUAL(lhs, rhs)
This macro evaluates whether lhs is greater or equal (>=) rhs and if it turns out to be false it will...
#define ARMARX_CHECK_NOT_NULL(ptr)
This macro evaluates whether ptr is not null and if it turns out to be false it will throw an Express...
#define ARMARX_CHECK_EQUAL(lhs, rhs)
This macro evaluates whether lhs is equal (==) rhs and if it turns out to be false it will throw an E...
#define ARMARX_WARNING
The logging level for unexpected behaviour, but not a serious problem.
std::shared_ptr< class Robot > RobotPtr
This file is part of ArmarX.
This file offers overloads of toIce() and fromIce() functions for STL container types.
::IceInternal::ProxyHandle<::IceProxy::armarx::DebugObserverInterface > DebugObserverInterfacePrx
MultiDimPIDControllerTemplate<> MultiDimPIDController
std::vector< T > max(const std::vector< T > &v1, const std::vector< T > &v2)
IceUtil::Handle< class RobotUnit > RobotUnitPtr
::IceInternal::ProxyHandle<::IceProxy::armarx::DebugDrawerInterface > DebugDrawerInterfacePrx
detail::ControlThreadOutputBufferEntry SensorAndControl
std::vector< T > min(const std::vector< T > &v1, const std::vector< T > &v2)
bool isWithin(const TimestampUS timestamp) const
std::vector< float > jointPosDiff
Eigen::Isometry3f currentPlatformPose
Eigen::Isometry3f currentTcpPose
std::int64_t localTimestamp
arondto::TrajectoryPoint targetState