GazeController.cpp
Go to the documentation of this file.
1 
2 #include "GazeController.h"
3 
4 #include <VirtualRobot/Nodes/RobotNode.h>
5 #include <VirtualRobot/Robot.h>
6 #include <VirtualRobot/RobotNodeSet.h>
7 
9 #include <ArmarXCore/interface/observers/VariantBase.h>
10 
14 #include <RobotAPI/components/units/RobotUnit/RobotUnit.h> // FIXME avoid this
17 
20 #include <armarx/view_selection/gaze_controller/atan2/aron/ControllerConfig.aron.generated.h>
22 
24 {
25 
28 
30  const NJointControllerConfigPtr& config,
32  {
33  ARMARX_RT_LOGF("Creating gaze controller");
34  // config
35  ConfigPtrT cfg = ConfigPtrT::dynamicCast(config);
37  // ARMARX_CHECK_EXPRESSION(!cfg->nodeSetName.empty());
38 
39  ARMARX_CHECK_EXPRESSION(robotUnit);
40 
41  const armarx::view_selection::gaze_controller::atan2::arondto::Config configData =
42  arondto::Config::FromAron(cfg->config);
43 
44  // robot
45  ARMARX_RT_LOGF("Setting up nodes");
46  {
47  _rtRobot = useSynchronizedRtRobot();
48  _rtRobot->setThreadsafe(false);
49 
50  ARMARX_CHECK_NOT_NULL(_rtRobot);
51  _rtCameraNode = _rtRobot->getRobotNode(configData.params.cameraNodeName);
52  _rtPitchNode = _rtRobot->getRobotNode(configData.params.pitchNodeName);
53  _rtYawNode = _rtRobot->getRobotNode(configData.params.yawNodeName);
54  // _rtTorsoNode = _rtRobot->getRobotNode(_config->torsoNodeName);
55  ARMARX_CHECK_NOT_NULL(_rtCameraNode);
56  ARMARX_CHECK_NOT_NULL(_rtPitchNode);
57  ARMARX_CHECK_NOT_NULL(_rtYawNode);
58  // ARMARX_CHECK_NOT_NULL(_rtTorsoNode);
59  // joint positions to be controlled
60  _rtPitchCtrlTarget = useControlTarget<armarx::ControlTarget1DoFActuatorPosition>(
61  configData.params.pitchNodeName, ControlModes::Position1DoF);
62  ARMARX_CHECK_NOT_NULL(_rtPitchCtrlTarget);
63  //_rtPitchCtrlPos = &(_pitchCtrlTarget->position);
64  _rtYawCtrlTarget = useControlTarget<armarx::ControlTarget1DoFActuatorPosition>(
65  configData.params.yawNodeName, ControlModes::Position1DoF);
66  ARMARX_CHECK_NOT_NULL(_rtYawCtrlTarget);
67  //_rtYawCtrlPos = &(yawCtrlTarget->position);
68  }
69 
70  ARMARX_RT_LOGF("Nodes set up successfully");
71  }
72 
74 
75  void
77  const Ice::Current& /*iceCurrent*/)
78  {
79  // ARMARX_VERBOSE << "Controller::updateConfig";
80 
81  auto updateConfigDto = arondto::Config::FromAron(dto);
82 
83  Config config;
84  fromAron(updateConfigDto, config);
85 
86  setControlStruct(config);
87  }
88 
89  void
91  {
92  }
93 
94  void
96  {
97  }
98 
99  std::string
100  GazeController::getClassName(const Ice::Current&) const
101  {
103  }
104 
105  void
106  GazeController::rtRun(const IceUtil::Time& /*sensorValuesTimestamp*/,
107  const IceUtil::Time& /*timeSinceLastIteration*/)
108  {
109  const float currentYawAngle = _rtYawNode->getJointValue();
110  const float currentPitchAngle = _rtPitchNode->getJointValue();
111  const float h = _rtCameraNode->getPositionInRootFrame().z();
112 
113  // report debugging variables
114  _publishCurrentYawAngle = currentYawAngle;
115  _publishCurrentPitchAngle = currentPitchAngle;
116 
117  // if target is not set, use default joint values
118  if (not rtGetControlStruct().target.has_value())
119  {
120  // report debugging variables
121  _publishTargetYawAngle = 0;
122  _publishTargetPitchAngle = 0;
123 
124  // update control positions
125  _rtYawCtrlTarget->position = 0;
126  _rtPitchCtrlTarget->position = 0;
127  return;
128  }
129 
130  auto target = rtGetControlStruct().target->position;
131  if (target.frame.empty())
132  {
133  target.frame = GlobalFrame;
134  }
135 
136 
137  const Eigen::Vector3f targetPoint = target.toRootEigen(_rtRobot);
138 
139  float targetYawAngle = -std::atan2(targetPoint.x(), targetPoint.y());
140  float targetPitchAngle = std::atan2(h - targetPoint.z(), targetPoint.y());
141 
142  // check reachability
143  const bool targetReachable = _rtYawNode->checkJointLimits(targetYawAngle) &&
144  _rtPitchNode->checkJointLimits(targetPitchAngle);
145  if (not targetReachable)
146  {
147  // limit joint ranges to avoid damage
148  targetYawAngle = std::clamp(
149  targetYawAngle, _rtYawNode->getJointLimitLow(), _rtYawNode->getJointLimitHigh());
150  targetPitchAngle = std::clamp(targetPitchAngle,
151  _rtPitchNode->getJointLimitLow(),
152  _rtPitchNode->getJointLimitHigh());
153  }
154 
155  // report debugging variables
156  _publishTargetYawAngle = targetYawAngle;
157  _publishTargetPitchAngle = targetPitchAngle;
158 
159  // update control positions
160  _rtYawCtrlTarget->position = targetYawAngle;
161  _rtPitchCtrlTarget->position = targetPitchAngle;
162  }
163 
164  void
166  {
167  }
168 
169  void
171  {
172  }
173 
174  void
177  const DebugObserverInterfacePrx& debugObserver)
178  {
179 
180  const float currentPitchAngle = _publishCurrentPitchAngle;
181  const float currentYawAngle = _publishCurrentYawAngle;
182  const float targetPitchAngle = _publishTargetPitchAngle;
183  const float targetYawAngle = _publishTargetYawAngle;
184 
185  StringVariantBaseMap datafields;
186  datafields["currentPitchAngle"] = new Variant(currentPitchAngle);
187  datafields["currentYawAngle"] = new Variant(currentYawAngle);
188  datafields["targetPitchAngle"] = new Variant(targetPitchAngle);
189  datafields["targetYawAngle"] = new Variant(targetYawAngle);
190  if (_tripRt2NonRt.updateReadBuffer())
191  {
193  // this->publishTarget(target);
194  }
195  debugObserver->setDebugChannel(getInstanceName(), datafields);
196  }
197 
199  GazeController::getConfig(const ::Ice::Current&)
200  {
201  ARMARX_ERROR << "NYI";
202  return nullptr;
203  }
204 } // namespace armarx::view_selection::gaze_controller::atan2
armarx::Variant
The Variant class is described here: Variants.
Definition: Variant.h:223
ARMARX_RT_LOGF
#define ARMARX_RT_LOGF(...)
Definition: ControlThreadOutputBuffer.h:285
armarx::view_selection::gaze_controller::atan2::GazeController::rtPostDeactivateController
void rtPostDeactivateController() override
This function is called after the controller is deactivated.
Definition: GazeController.cpp:170
armarx::view_selection::common::ControllerType::GazeControllerAtan2
@ GazeControllerAtan2
armarx::NJointControllerBase::getInstanceName
std::string getInstanceName(const Ice::Current &=Ice::emptyCurrent) const final override
Definition: NJointControllerBase.h:804
armarx::NJointControllerRegistration
Definition: NJointControllerRegistry.h:74
armarx::NJointControllerBase::useSynchronizedRtRobot
const VirtualRobot::RobotPtr & useSynchronizedRtRobot(bool updateCollisionModel=false)
Requests a VirtualRobot for use in rtRun *.
Definition: NJointController.cpp:293
armarx::NJointControllerWithTripleBuffer< Config >::rtGetControlStruct
const Config & rtGetControlStruct() const
Definition: NJointControllerWithTripleBuffer.h:32
armarx::StringVariantBaseMap
std::map< std::string, VariantBasePtr > StringVariantBaseMap
Definition: ManagedIceObject.h:110
RobotUnit.h
aron_conversions.h
ARMARX_CHECK_NOT_NULL
#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...
Definition: ExpressionException.h:206
armarx::GlobalFrame
const std::string GlobalFrame
Definition: FramedPose.h:65
boost::target
Vertex target(const detail::edge_base< Directed, Vertex > &e, const PCG &)
Definition: point_cloud_graph.h:668
GazeController.h
controller_types.h
armarx::NJointControllerBase::ConfigPtrT
NJointControllerConfigPtr ConfigPtrT
Definition: NJointControllerBase.h:587
armarx::view_selection::gaze_targets::GazeTarget
Business Object (BO) class of GazeTarget.
Definition: GazeTarget.h:39
armarx::view_selection::gaze_controller::atan2::GazeController::getClassName
std::string getClassName(const Ice::Current &=Ice::emptyCurrent) const override
Definition: GazeController.cpp:100
clamp
double clamp(double x, double a, double b)
Definition: point.hpp:136
IceInternal::Handle
Definition: forward_declarations.h:8
armarx::detail::ControlThreadOutputBufferEntry
Definition: ControlThreadOutputBuffer.h:182
armarx::view_selection::gaze_controller::atan2::GazeController::GazeController
GazeController(RobotUnitPtr robotUnit, const NJointControllerConfigPtr &config, const VirtualRobot::RobotPtr &robot)
Definition: GazeController.cpp:29
armarx::view_selection::gaze_controller::atan2
This file is part of ArmarX.
Definition: aron_conversions.cpp:28
armarx::view_selection::gaze_controller::atan2::GazeController::rtPreActivateController
void rtPreActivateController() override
This function is called before the controller is activated.
Definition: GazeController.cpp:165
armarx::view_selection::common::ControllerTypeNames
const simox::meta::EnumNames< ControllerType > ControllerTypeNames
Definition: controller_types.h:19
FramedPose.h
ControlModes.h
armarx::view_selection::gaze_controller::atan2::GazeController::updateConfig
void updateConfig(const ::armarx::aron::data::dto::DictPtr &dto, const Ice::Current &iceCurrent=Ice::emptyCurrent) override
Definition: GazeController.cpp:76
armarx::TripleBuffer::getReadBuffer
const T & getReadBuffer() const
Definition: TripleBuffer.h:108
ControlTarget1DoFActuator.h
armarx::view_selection::gaze_controller::atan2::Config
Definition: GazeController.h:54
ARMARX_ERROR
#define ARMARX_ERROR
Definition: Logging.h:196
armarx::armem::Time
armarx::core::time::DateTime Time
Definition: forward_declarations.h:13
armarx::view_selection::gaze_controller::atan2::GazeController::onConnectNJointController
void onConnectNJointController() override
Definition: GazeController.cpp:95
armarx::view_selection::gaze_controller::atan2::GazeController::~GazeController
~GazeController() override
armarx::aron::data::DictPtr
std::shared_ptr< Dict > DictPtr
Definition: Dict.h:41
armarx::view_selection::gaze_controller::atan2::fromAron
void fromAron(const arondto::Config &dto, Config &bo)
Definition: aron_conversions.cpp:34
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::NJointControllerWithTripleBuffer< Config >::setControlStruct
void setControlStruct(const Config &newStruct)
Definition: NJointControllerWithTripleBuffer.h:60
IceUtil::Handle< class RobotUnit >
armarx::view_selection::gaze_controller::atan2::GazeController::getConfig
::armarx::aron::data::dto::DictPtr getConfig(const ::Ice::Current &=::Ice::emptyCurrent) override
Definition: GazeController.cpp:199
IceInternal::ProxyHandle<::IceProxy::armarx::DebugDrawerInterface >
armarx::view_selection::gaze_controller::atan2::GazeController::onInitNJointController
void onInitNJointController() override
Definition: GazeController.cpp:90
ControlThreadOutputBuffer.h
Logging.h
armarx::view_selection::gaze_controller::atan2::GazeController::onPublish
void onPublish(const SensorAndControl &, const DebugDrawerInterfacePrx &, const DebugObserverInterfacePrx &) override
Definition: GazeController.cpp:175
armarx::view_selection::gaze_controller::atan2::GazeController::rtRun
void rtRun(const IceUtil::Time &sensorValuesTimestamp, const IceUtil::Time &timeSinceLastIteration) override
TODO make protected and use attorneys.
Definition: GazeController.cpp:106
NJointControllerRegistry.h
aron_conversions.h
armarx::view_selection::gaze_controller::atan2::RegistrationControllerGazeController
const armarx::NJointControllerRegistration< GazeController > RegistrationControllerGazeController(common::ControllerTypeNames.to_name(common::ControllerType::GazeControllerAtan2))
VirtualRobot::RobotPtr
std::shared_ptr< class Robot > RobotPtr
Definition: Bus.h:19
armarx::TripleBuffer::updateReadBuffer
bool updateReadBuffer() const
Swaps in the hidden buffer if it contains new data.
Definition: TripleBuffer.h:143