LookDirection.cpp
Go to the documentation of this file.
1 #include "LookDirection.h"
2 
3 #include <Eigen/Core>
4 #include <Eigen/Geometry>
5 
7 
11 
13 {
14 
16  direction::state::StateModFn* stateModFn,
17  armarx::skills::SkillDescription skillDescription) :
18  Base(skillDescription), srv_(services), stateModFn(stateModFn)
19  {
20  }
21 
22  void
24  {
25  srv_.emplace(srv);
26  }
27 
29  LookDirection::init(const Base::SpecializedInitInput& in)
30  {
31  ARMARX_INFO << "LookDirection:init";
32  gazeTarget.emplace(); // populate optional
33  const std::string frame = in.parameters.frame;
34  const std::string agent = in.parameters.agent;
35 
36  // Read current direction of this skill from memory
37  const auto previousTarget = srv_->viewSelectionClient.readGazeTarget("LookDirection");
38  const Eigen::Vector3f directionRead = previousTarget.position.toEigen();
39  direction::state::Type state = direction::state::from(directionRead);
40 
41  // Update state
42  state = stateModFn(state);
43  const Eigen::Vector3f targetPosition = direction::state::generateTargetPosition(state);
44 
45  const FramedPosition targetPos{targetPosition, frame, agent};
47  in.parameters.priority};
49  const gaze_targets::GazeTarget target{
50  "LookDirection", targetPos, priority, duration, false};
51  gazeTarget.emplace(target);
52 
53  return ::armarx::skills::Skill::InitResult{
54  .status = ::armarx::skills::TerminatedSkillStatus::Succeeded};
55  }
56 
58  LookDirection::main(const Base::SpecializedMainInput& in)
59  {
60  ARMARX_CHECK(gazeTarget.has_value());
61 
62  ARMARX_INFO << "Committing gaze target " << gazeTarget.value();
63  srv_->viewSelectionClient.commitGazeTarget(gazeTarget.value());
64 
65  return ::armarx::skills::Skill::MainResult{
66  .status = ::armarx::skills::TerminatedSkillStatus::Succeeded};
67  }
68 
69  void
70  LookDirection::onStopRequested()
71  {
72  if (gazeTarget.has_value())
73  {
74  srv_->viewSelectionClient.commitGazeTarget(gazeTarget.value());
75  }
76  }
77 
79  LookDirection::generateDefaultSkillDescription(std::string name, std::string directionText)
80  {
81  ParamType defaultParameters;
82  defaultParameters.frame = "root";
83  defaultParameters.agent = "Armar7";
84  defaultParameters.priority = 1;
86  .skillId = armarx::skills::SkillID{.skillName = std::move(name)},
87  .description = "Let the robot look " + directionText +
88  ". Multiple directions can be combined but stacking the same direction "
89  "does not move the head further.",
90  .rootProfileDefaults = defaultParameters.toAron(),
92  .parametersType = Params::ToAronType(),
93  };
94  }
95 
96  LookUp::LookUp(const Context& services) :
97  /* very strange problem here: The SpecializedSkill base class is constructed before LookDirection.
98  * This is a problem, because usually the default constructor would be called, which is deleted.
99  * Therefore, we need to call it twice with the correct parameter. */
100  armarx::skills::SimpleSpecializedSkill<
101  arondto::LookDirectionParams>::SimpleSpecializedSkill(DefaultSkillDescription()),
102  LookDirection(services, direction::state::up, DefaultSkillDescription())
103  {
104  }
105 
108  {
110  }
111 
112  LookDown::LookDown(const Context& services) :
113  /* very strange problem here: The SpecializedSkill base class is constructed before LookDirection.
114  * This is a problem, because usually the default constructor would be called, which is deleted.
115  * Therefore, we need to call it twice with the correct parameter. */
116  armarx::skills::SimpleSpecializedSkill<
117  arondto::LookDirectionParams>::SimpleSpecializedSkill(DefaultSkillDescription()),
118  LookDirection(services, direction::state::down, DefaultSkillDescription())
119  {
120  }
121 
123  /* very strange problem here: The SpecializedSkill base class is constructed before LookDirection.
124  * This is a problem, because usually the default constructor would be called, which is deleted.
125  * Therefore, we need to call it twice with the correct parameter. */
126  armarx::skills::SimpleSpecializedSkill<
127  arondto::LookDirectionParams>::SimpleSpecializedSkill(DefaultSkillDescription()),
128  LookDirection(services, direction::state::downstraight, DefaultSkillDescription())
129  {
130  }
131 
134  {
136  }
137 
140  {
142  "downstraight");
143  }
144 
145  LookLeft::LookLeft(const Context& services) :
146  /* very strange problem here: The SpecializedSkill base class is constructed before LookDirection.
147  * This is a problem, because usually the default constructor would be called, which is deleted.
148  * Therefore, we need to call it twice with the correct parameter. */
149  armarx::skills::SimpleSpecializedSkill<
150  arondto::LookDirectionParams>::SimpleSpecializedSkill(DefaultSkillDescription()),
151  LookDirection(services, direction::state::left, DefaultSkillDescription())
152  {
153  }
154 
157  {
159  }
160 
161  LookRight::LookRight(const Context& services) :
162  /* very strange problem here: The SpecializedSkill base class is constructed before LookDirection.
163  * This is a problem, because usually the default constructor would be called, which is deleted.
164  * Therefore, we need to call it twice with the correct parameter. */
165  armarx::skills::SimpleSpecializedSkill<
166  arondto::LookDirectionParams>::SimpleSpecializedSkill(DefaultSkillDescription()),
167  LookDirection(services, direction::state::right, DefaultSkillDescription())
168  {
169  }
170 
173  {
175  }
176 
177  LookAhead::LookAhead(const Context& services) :
178  /* very strange problem here: The SpecializedSkill base class is constructed before LookDirection.
179  * This is a problem, because usually the default constructor would be called, which is deleted.
180  * Therefore, we need to call it twice with the correct parameter. */
181  armarx::skills::SimpleSpecializedSkill<
182  arondto::LookDirectionParams>::SimpleSpecializedSkill(DefaultSkillDescription()),
183  LookDirection(services, direction::state::center, DefaultSkillDescription())
184  {
185  }
186 
189  {
191  }
192 
194  direction::state::from(Eigen::Vector3f targetPosition)
195  {
196  state::Type state = state::Center;
197 
198  // Check for each direction separately and set State bit
199  float epsilon = 10.0;
200  if (std::abs(centerPosition.z() + DeltaUp.z() - targetPosition.z()) < epsilon)
201  state |= state::Up;
202  if (std::abs(centerPosition.z() + deltaDown.z() - targetPosition.z()) < epsilon)
203  state |= state::Down;
204  if (std::abs(centerPosition.x() + deltaLeft.x() - targetPosition.x()) < epsilon)
205  state |= state::Left;
206  if (std::abs(centerPosition.x() + deltaRight.x() - targetPosition.x()) < epsilon)
207  state |= state::Right;
208 
209  return state;
210  }
211 
212  Eigen::Vector3f
214  {
215  Eigen::Vector3f targetPosition = centerPosition;
216 
217  if ((state & state::Up) != 0)
218  targetPosition += DeltaUp;
219  if ((state & state::Down) != 0)
220  targetPosition += deltaDown;
221  if ((state & state::Left) != 0)
222  targetPosition += deltaLeft;
223  if ((state & state::Right) != 0)
224  targetPosition += deltaRight;
225  if ((state & state::Downstraight) != 0)
226  targetPosition = downstraightPosition;
227  ARMARX_INFO << "setting position to " << targetPosition;
228  ARMARX_INFO << "State is " << state;
229  return targetPosition;
230  }
231 
234  {
235  (void)previous; // Unused.
236  return state::Center;
237  }
238 
241  {
242  return (previous & ~state::Down) | state::Up;
243  }
244 
247  {
248  return (previous & ~state::Up) | state::Down;
249  }
250 
253  {
254  return (previous & ~state::Downstraight) | state::Downstraight;
255  }
256 
259  {
260  return (previous & ~state::Right) | state::Left;
261  }
262 
265  {
266  return (previous & ~state::Left) | state::Right;
267  }
268 
269 } // namespace armarx::view_selection::skills
armarx::view_selection::skills::direction::state::up
state::Type up(state::Type previous)
Definition: LookDirection.cpp:240
armarx::view_selection::skills
This file is part of ArmarX.
Definition: constants.cpp:25
armarx::view_selection::skills::direction::state::Right
constexpr std::uint8_t Right
Definition: LookDirection.h:54
armarx::view_selection::skills::direction::state::right
state::Type right(state::Type previous)
Definition: LookDirection.cpp:264
armarx::skills::SimpleSpecializedSkill< arondto::LookDirectionParams >::init
Skill::InitResult init() final
Definition: SimpleSpecializedSkill.h:62
armarx::view_selection::skills::direction::state::downstraight
state::Type downstraight(state::Type previous)
Definition: LookDirection.cpp:252
skills
This file is part of ArmarX.
armarx::view_selection::skills::direction::centerPosition
const Eigen::Vector3f centerPosition
Definition: LookDirection.h:33
armarx::skills::SimpleSpecializedSkill< arondto::LookDirectionParams >::ParamType
arondto::LookDirectionParams ParamType
Definition: SimpleSpecializedSkill.h:14
armarx::skills::SkillID::skillName
std::string skillName
Definition: SkillID.h:41
armarx::skills::SkillDescription
Definition: SkillDescription.h:17
armarx::view_selection::skills::LookRight::LookRight
LookRight(const Context &services)
Definition: LookDirection.cpp:161
armarx::view_selection::skills::LookDownstraight::DefaultSkillDescription
static armarx::skills::SkillDescription DefaultSkillDescription()
Definition: LookDirection.cpp:139
armarx::view_selection::skills::direction::state::Center
constexpr std::uint8_t Center
Definition: LookDirection.h:50
boost::target
Vertex target(const detail::edge_base< Directed, Vertex > &e, const PCG &)
Definition: point_cloud_graph.h:668
armarx::view_selection::skills::LookUp::DefaultSkillDescription
static armarx::skills::SkillDescription DefaultSkillDescription()
Definition: LookDirection.cpp:107
armarx::view_selection::skills::direction::state::Down
constexpr std::uint8_t Down
Definition: LookDirection.h:52
Duration.h
armarx::view_selection::skills::LookDirection::Context
Definition: LookDirection.h:89
armarx::view_selection::skills::direction::state::from
state::Type from(Eigen::Vector3f targetPosition)
Definition: LookDirection.cpp:194
armarx::view_selection::skills::LookDirection::LookDirection
LookDirection(const Context &services, direction::state::StateModFn *stateModFn, armarx::skills::SkillDescription skillDescription)
Definition: LookDirection.cpp:15
armarx::view_selection::skills::direction::state::StateModFn
state::Type(state::Type) StateModFn
Definition: LookDirection.h:57
armarx::view_selection::skills::direction::DeltaUp
const Eigen::Vector3f DeltaUp
Definition: LookDirection.h:35
armarx::view_selection::skills::constants::skill_names::LookDownstraight
const std::string LookDownstraight
Definition: constants.cpp:45
armarx::view_selection::skills::direction::state::generateTargetPosition
Eigen::Vector3f generateTargetPosition(state::Type state)
Definition: LookDirection.cpp:213
armarx::view_selection::skills::LookRight::DefaultSkillDescription
static armarx::skills::SkillDescription DefaultSkillDescription()
Definition: LookDirection.cpp:172
ARMARX_CHECK
#define ARMARX_CHECK(expression)
Shortcut for ARMARX_CHECK_EXPRESSION.
Definition: ExpressionException.h:82
armarx::view_selection::gaze_targets::AttentionType::TaskDriven
@ TaskDriven
Task-Driven attention has highest priority.
armarx::view_selection::skills::LookUp::LookUp
LookUp(const Context &services)
Definition: LookDirection.cpp:96
armarx::view_selection::skills::constants::skill_names::LookAhead
const std::string LookAhead
Definition: constants.cpp:48
armarx::core::time::Duration::Seconds
static Duration Seconds(std::int64_t seconds)
Constructs a duration in seconds.
Definition: Duration.cpp:72
armarx::view_selection::skills::LookDown::LookDown
LookDown(const Context &services)
Definition: LookDirection.cpp:112
armarx::abs
std::vector< T > abs(const std::vector< T > &v)
Definition: VectorHelpers.h:281
armarx::view_selection::skills::LookAhead::DefaultSkillDescription
static armarx::skills::SkillDescription DefaultSkillDescription()
Definition: LookDirection.cpp:188
armarx::view_selection::skills::direction::state::Downstraight
constexpr std::uint8_t Downstraight
Definition: LookDirection.h:55
armarx::FramedPosition
The FramedPosition class.
Definition: FramedPose.h:157
LookDirection.h
armarx::skills::SkillDescription::skillId
SkillID skillId
Definition: SkillDescription.h:19
armarx::skills::SimpleSpecializedSkill
Definition: SimpleSpecializedSkill.h:10
constants.h
armarx::view_selection::skills::LookDirection
Definition: LookDirection.h:82
armarx::view_selection::skills::direction::state::Up
constexpr std::uint8_t Up
Definition: LookDirection.h:51
armarx::view_selection::skills::LookLeft::DefaultSkillDescription
static armarx::skills::SkillDescription DefaultSkillDescription()
Definition: LookDirection.cpp:156
armarx::skills::Skill::MainResult
A result struct for th main method of a skill.
Definition: Skill.h:39
skill_ids.h
armarx::view_selection::skills::LookDown::DefaultSkillDescription
static armarx::skills::SkillDescription DefaultSkillDescription()
Definition: LookDirection.cpp:133
armarx::view_selection::skills::direction::state::Type
std::uint8_t Type
Definition: LookDirection.h:49
armarx::view_selection::skills::LookLeft::LookLeft
LookLeft(const Context &services)
Definition: LookDirection.cpp:145
armarx::view_selection::skills::direction::deltaRight
const Eigen::Vector3f deltaRight
Definition: LookDirection.h:38
armarx::view_selection::skills::direction::deltaDown
const Eigen::Vector3f deltaDown
Definition: LookDirection.h:36
armarx::view_selection::skills::constants::skill_names::LookDown
const std::string LookDown
Definition: constants.cpp:44
armarx::view_selection::skills::constants::skill_names::LookRight
const std::string LookRight
Definition: constants.cpp:47
armarx::view_selection::skills::constants::skill_names::LookUp
const std::string LookUp
Definition: constants.cpp:43
armarx::view_selection::skills::LookDirection::connect
void connect(const Context &srv)
Definition: LookDirection.cpp:23
ARMARX_INFO
#define ARMARX_INFO
Definition: Logging.h:181
armarx::view_selection::skills::LookDirection::generateDefaultSkillDescription
static armarx::skills::SkillDescription generateDefaultSkillDescription(std::string name, std::string directionText)
Definition: LookDirection.cpp:79
armarx::skills::SimpleSpecializedSkill< arondto::LookDirectionParams >::main
Skill::MainResult main() final
Definition: SimpleSpecializedSkill.h:71
armarx::view_selection::skills::direction::state::center
state::Type center(state::Type previous)
Definition: LookDirection.cpp:233
armarx::core::time::Duration
Represents a duration.
Definition: Duration.h:16
armarx::skills::Skill::InitResult
A result struct for skill initialization.
Definition: Skill.h:27
armarx::view_selection::skills::direction::downstraightPosition
const Eigen::Vector3f downstraightPosition
Definition: LookDirection.h:34
armarx::view_selection::skills::direction::state::down
state::Type down(state::Type previous)
Definition: LookDirection.cpp:246
armarx::view_selection::skills::LookDownstraight::LookDownstraight
LookDownstraight(const Context &services)
Definition: LookDirection.cpp:122
armarx::view_selection::skills::direction::state::left
state::Type left(state::Type previous)
Definition: LookDirection.cpp:258
GazeTarget.h
armarx::view_selection::gaze_targets::TargetPriority
The Priority of a GazeTarget.
Definition: TargetPriority.h:39
armarx::view_selection::skills::direction::deltaLeft
const Eigen::Vector3f deltaLeft
Definition: LookDirection.h:37
armarx::skills::SkillID
Definition: SkillID.h:14
Left
bool Left(const point2d &a, const point2d &b, const point2d &c)
Definition: gdiam.cpp:1570
armarx::view_selection::skills::LookAhead::LookAhead
LookAhead(const Context &services)
Definition: LookDirection.cpp:177
armarx
This file offers overloads of toIce() and fromIce() functions for STL container types.
Definition: ArmarXTimeserver.cpp:27
armarx::view_selection::skills::constants::skill_names::LookLeft
const std::string LookLeft
Definition: constants.cpp:46
armarx::core::time::Duration::MilliSeconds
static Duration MilliSeconds(std::int64_t milliSeconds)
Constructs a duration in milliseconds.
Definition: Duration.cpp:48