RobotHeadMovement.cpp
Go to the documentation of this file.
1 #include "RobotHeadMovement.h"
2 
6 
8 {
9 
10  void
12  const std::string& prefix)
13  {
14  defs->optional(
16  prefix + "checkHeadVelocity",
17  "If true, check whether the head is moving and discard updates in the meantime.");
18  defs->optional(maxJointVelocity,
19  prefix + "maxJointVelocity",
20  "If a head joint's velocity is higher, the head is considered moving.");
21  defs->optional(discardIntervalAfterMoveMS,
22  prefix + "discardIntervalAfterMoveMS",
23  "For how long new updates are ignored after moving the head.");
24  }
25 
26  void
28  {
30  {
31  for (const std::string& jointName : jointNames)
32  {
33  std::string error = "";
34  try
35  {
36  DatafieldRefBasePtr datafield = kinematicUnitObserver->getDatafieldRefByName(
37  jointVelocitiesChannelName, jointName);
38  DatafieldRefPtr casted = DatafieldRefPtr::dynamicCast(datafield);
39  if (casted)
40  {
41  jointVelocitiesDatafields.push_back(casted);
42  }
43  }
44  catch (const InvalidDatafieldException& e)
45  {
46  error = e.what();
47  }
48  catch (const InvalidChannelException& e)
49  {
50  error = e.what();
51  }
52  if (error.size() > 0)
53  {
54  ARMARX_WARNING << "Could not get datafield for joint '" << jointName
55  << "' in channel '" << jointVelocitiesChannelName << "': \n "
56  << error;
57  }
58  }
59  }
60  else
61  {
62  ARMARX_INFO << "Cannot fetch joint velocity datafields because there is no kinematic "
63  "unit observer.";
64  }
65  }
66 
67  bool
69  {
71  {
72  if (df)
73  {
74  float jointVelocity = df->getFloat();
75  // ARMARX_IMPORTANT << "Is " << df->datafieldName << " " << VAROUT(std::abs(jointVelocity)) << " > " << VAROUT(maxJointVelocity) << "?";
76  if (std::abs(jointVelocity) > maxJointVelocity)
77  {
78  return true;
79  }
80  }
81  }
82  return false;
83  }
84 
85  void
86  RobotHeadMovement::movementStarts(long discardIntervalMs)
87  {
88  return movementStarts(Duration::MilliSeconds(discardIntervalMs));
89  }
90 
91  void
93  {
94  discardUpdatesUntil = DateTime::Now() + discardInterval;
95  }
96 
97  void
98  RobotHeadMovement::movementStops(long discardIntervalMs)
99  {
100  return movementStops(Duration::MilliSeconds(discardIntervalMs));
101  }
102 
103  void
105  {
106  if (discardInterval.toMilliSeconds() < 0)
107  {
108  // Stop discarding.
110  }
111  else
112  {
113  // Basically the same as starting.
114  discardUpdatesUntil = DateTime::Now() + discardInterval;
115  }
116  }
117 
118  objpose::SignalHeadMovementOutput
119  RobotHeadMovement::signalHeadMovement(const objpose::SignalHeadMovementInput& input)
120  {
121  objpose::SignalHeadMovementOutput output;
122  switch (input.action)
123  {
124  case objpose::HeadMovementAction::HeadMovementAction_Starting:
125  this->movementStarts(input.discardUpdatesIntervalMilliSeconds < 0
126  ? this->discardIntervalAfterMoveMS
127  : input.discardUpdatesIntervalMilliSeconds);
128  break;
129  case objpose::HeadMovementAction::HeadMovementAction_Stopping:
130  this->movementStops(input.discardUpdatesIntervalMilliSeconds);
131  break;
132  default:
133  ARMARX_UNEXPECTED_ENUM_VALUE(objpose::HeadMovementAction, input.action);
134  break;
135  }
136  output.discardUpdatesUntilMilliSeconds =
138  return output;
139  }
140 
143  {
144  Discard discard;
145  if (checkHeadVelocity)
146  {
147  if (isMoving())
148  {
150  // ARMARX_IMPORTANT << "Ignoring pose update because robot head is moving! until " << discardUpdatesUntil;
151  discard.all = true;
152  }
153  else if (DateTime::Now() < discardUpdatesUntil)
154  {
155  discard.all = true;
156  // ARMARX_IMPORTANT << "Ignoring pose update because robot head has moved until: " << discardUpdatesUntil;
157  }
158  else
159  {
161  }
162  }
163  return discard;
164  }
165 
166  void
168  {
169  using namespace armarx::RemoteGui::Client;
170 
172  {
173  float max = 10.0;
176  maxJointVelocity.setSteps(int(100 * max)); // = 0.01 steps
178  }
179  {
180  int max = 10 * 1000;
183  }
184 
185  GridLayout grid;
186  int row = 0;
187  grid.add(Label("Check Head Motion"), {row, 0}).add(checkHeadVelocity, {row, 1});
188  row++;
189  grid.add(Label("Max Joint Velocity"), {row, 0}).add(maxJointVelocity, {row, 1});
190  row++;
191  grid.add(Label("Discard Interval after Move [ms]"), {row, 0})
192  .add(discardIntervalAfterMoveMS, {row, 1});
193  row++;
194 
195  group.setLabel("Robot Head Movement");
196  group.addChild(grid);
197  }
198 
199  void
201  {
205  }
206 
207 } // namespace armarx::armem::server::obj::instance
armarx::RemoteGui::Client::IntSpinBox::setValue
void setValue(int newValue)
Definition: Widgets.cpp:59
armarx::RemoteGui::Client::FloatSpinBox::getValue
float getValue() const
Definition: Widgets.cpp:352
armarx::RemoteGui::Client::ContainerWidget::addChild
void addChild(Widget const &child)
Definition: Widgets.cpp:95
ARMARX_UNEXPECTED_ENUM_VALUE
#define ARMARX_UNEXPECTED_ENUM_VALUE(EnumType, value)
Throw an UnexpectedEnumValueException.
Definition: UnexpectedEnumValueException.h:58
armarx::armem::server::obj::instance::RobotHeadMovement::getDiscard
Discard getDiscard()
Definition: RobotHeadMovement.cpp:142
armarx::armem::server::obj::instance::RobotHeadMovement::discardUpdatesUntil
DateTime discardUpdatesUntil
Definition: RobotHeadMovement.h:61
armarx::armem::server::obj::instance::RobotHeadMovement::RemoteGui::setup
void setup(const RobotHeadMovement &rhm)
Definition: RobotHeadMovement.cpp:167
armarx::armem::server::obj::instance::RobotHeadMovement::RemoteGui::maxJointVelocity
armarx::RemoteGui::Client::FloatSpinBox maxJointVelocity
Definition: RobotHeadMovement.h:70
armarx::core::time::DateTime::Now
static DateTime Now()
Definition: DateTime.cpp:51
armarx::armem::server::obj::instance::RobotHeadMovement::maxJointVelocity
float maxJointVelocity
Definition: RobotHeadMovement.h:56
armarx::RemoteGui::Client::GridLayout::add
GridLayout & add(Widget const &child, Pos pos, Span span=Span{1, 1})
Definition: Widgets.cpp:438
armarx::RemoteGui::Client::FloatSpinBox::setValue
void setValue(float newValue)
Definition: Widgets.cpp:358
armarx::max
std::vector< T > max(const std::vector< T > &v1, const std::vector< T > &v2)
Definition: VectorHelpers.h:297
armarx::RemoteGui::Client::FloatSpinBox::setRange
void setRange(float min, float max)
Definition: Widgets.cpp:330
armarx::armem::server::obj::instance::RobotHeadMovement::kinematicUnitObserver
KinematicUnitObserverInterfacePrx kinematicUnitObserver
Definition: RobotHeadMovement.h:59
armarx::armem::server::obj::instance::RobotHeadMovement::Discard::all
bool all
Definition: RobotHeadMovement.h:45
armarx::armem::server::obj::instance::RobotHeadMovement::movementStops
void movementStops(long discardIntervalMs)
Definition: RobotHeadMovement.cpp:98
armarx::armem::server::obj::instance::RobotHeadMovement::fetchDatafields
void fetchDatafields()
Definition: RobotHeadMovement.cpp:27
UnexpectedEnumValueException.h
armarx::armem::server::obj::instance::RobotHeadMovement::jointNames
std::vector< std::string > jointNames
Definition: RobotHeadMovement.h:55
armarx::armem::server::obj::instance::RobotHeadMovement::defineProperties
void defineProperties(armarx::PropertyDefinitionsPtr defs, const std::string &prefix="head.")
Definition: RobotHeadMovement.cpp:11
armarx::armem::server::obj::instance
Definition: ArticulatedObjectVisu.cpp:16
armarx::armem::server::obj::instance::RobotHeadMovement::RemoteGui::group
armarx::RemoteGui::Client::GroupBox group
Definition: RobotHeadMovement.h:67
armarx::armem::server::obj::instance::RobotHeadMovement::RemoteGui::update
void update(RobotHeadMovement &rhm)
Definition: RobotHeadMovement.cpp:200
IceInternal::Handle< DatafieldRef >
armarx::armem::server::obj::instance::RobotHeadMovement::movementStarts
void movementStarts(long discardIntervalMs)
Definition: RobotHeadMovement.cpp:86
armarx::RemoteGui::Client::CheckBox::getValue
bool getValue() const
Definition: Widgets.cpp:246
visionx::voxelgrid::Label
uint32_t Label
Type of an object label.
Definition: types.h:6
armarx::RemoteGui::Client::GridLayout
Definition: Widgets.h:186
armarx::abs
std::vector< T > abs(const std::vector< T > &v)
Definition: VectorHelpers.h:281
armarx::armem::server::obj::instance::RobotHeadMovement::RemoteGui::discardIntervalAfterMoveMS
armarx::RemoteGui::Client::IntSpinBox discardIntervalAfterMoveMS
Definition: RobotHeadMovement.h:71
armarx::aron::input
ReaderT::InputType & input
Definition: rw.h:12
armarx::armem::server::obj::instance::RobotHeadMovement::Discard
Definition: RobotHeadMovement.h:42
armarx::exceptions::local::InvalidChannelException
Definition: InvalidChannelException.h:33
armarx::RemoteGui::Client::FloatSpinBox::setDecimals
void setDecimals(int decimals)
Definition: Widgets.cpp:345
armarx::RemoteGui::Client::FloatSpinBox::setSteps
void setSteps(int steps)
Definition: Widgets.cpp:338
armarx::RemoteGui::Client::GroupBox::setLabel
void setLabel(std::string const &text)
Definition: Widgets.cpp:420
armarx::armem::server::obj::instance::RobotHeadMovement::isMoving
bool isMoving() const
Definition: RobotHeadMovement.cpp:68
armarx::core::time::DateTime::toMilliSecondsSinceEpoch
std::int64_t toMilliSecondsSinceEpoch() const
Definition: DateTime.cpp:93
armarx::armem::server::obj::instance::RobotHeadMovement::Discard::updatesUntil
std::optional< DateTime > updatesUntil
Definition: RobotHeadMovement.h:44
armarx::armem::server::obj::instance::RobotHeadMovement
Definition: RobotHeadMovement.h:25
TimeUtil.h
ARMARX_INFO
#define ARMARX_INFO
Definition: Logging.h:181
PropertyDefinitionContainer.h
armarx::RemoteGui::Client::CheckBox::setValue
void setValue(bool newValue)
Definition: Widgets.cpp:252
armarx::RemoteGui::Client::IntSpinBox::setRange
void setRange(int min, int max)
Definition: Widgets.cpp:51
IceUtil::Handle< class PropertyDefinitionContainer >
RobotHeadMovement.h
armarx::armem::server::obj::instance::RobotHeadMovement::discardIntervalAfterMoveMS
int discardIntervalAfterMoveMS
Definition: RobotHeadMovement.h:57
armarx::core::time::Duration
Represents a duration.
Definition: Duration.h:16
armarx::RemoteGui::Client::IntSpinBox::getValue
int getValue() const
Definition: Widgets.cpp:71
armarx::core::time::Duration::toMilliSeconds
std::int64_t toMilliSeconds() const
Returns the amount of milliseconds.
Definition: Duration.cpp:60
armarx::armem::server::obj::instance::RobotHeadMovement::signalHeadMovement
objpose::SignalHeadMovementOutput signalHeadMovement(const objpose::SignalHeadMovementInput &input)
Definition: RobotHeadMovement.cpp:119
armarx::armem::server::obj::instance::RobotHeadMovement::RemoteGui::checkHeadVelocity
armarx::RemoteGui::Client::CheckBox checkHeadVelocity
Definition: RobotHeadMovement.h:69
armarx::armem::server::obj::instance::RobotHeadMovement::checkHeadVelocity
bool checkHeadVelocity
Definition: RobotHeadMovement.h:52
ARMARX_WARNING
#define ARMARX_WARNING
Definition: Logging.h:193
armarx::armem::server::obj::instance::RobotHeadMovement::jointVelocitiesDatafields
std::vector< DatafieldRefPtr > jointVelocitiesDatafields
Definition: RobotHeadMovement.h:60
armarx::armem::server::obj::instance::RobotHeadMovement::jointVelocitiesChannelName
std::string jointVelocitiesChannelName
Definition: RobotHeadMovement.h:54
armarx::RemoteGui::Client
Definition: EigenWidgets.cpp:8
armarx::core::time::DateTime::Invalid
static DateTime Invalid()
Definition: DateTime.cpp:57
armarx::core::time::Duration::MilliSeconds
static Duration MilliSeconds(std::int64_t milliSeconds)
Constructs a duration in milliseconds.
Definition: Duration.cpp:48