LocalizationRemoteGui.cpp
Go to the documentation of this file.
2 
3 #include <cmath>
4 #include <mutex>
5 
9 
13 #include <ArmarXGui/interface/RemoteGuiInterface.h>
15 
17 {
18 
19  LocalizationRemoteGui::LocalizationRemoteGui(const RemoteGuiInterfacePrx& remoteGui,
21  remoteGui(remoteGui),
22  runningTask(new RunningTask<LocalizationRemoteGui>(this, &LocalizationRemoteGui::run)),
23  callee(callee)
24  {
25  createRemoteGuiTab();
26 
27  tab = RemoteGui::TabProxy(remoteGui, REMOTE_GUI_TAB_MAME);
28 
29  runningTask->start();
30  }
31 
33  {
34  if (runningTask->isRunning())
35  {
36  runningTask->stop();
37  }
38  }
39 
40  void
41  LocalizationRemoteGui::createRemoteGuiTab()
42  {
44 
45  ARMARX_CHECK_NOT_NULL(remoteGui); // createRemoteGui() has to be called first
46 
47  {
48  guiTab.localizationCorrection.group.setLabel("Localization correction");
49 
50  const float posMax = 10'000;
51  guiTab.localizationCorrection.x.setName("x");
52  guiTab.localizationCorrection.x.setRange(-posMax, posMax);
53  guiTab.localizationCorrection.x.setDecimals(0);
54  guiTab.localizationCorrection.x.setSteps(int(posMax / 10));
55  guiTab.localizationCorrection.x.setValue(0.F);
56 
57  guiTab.localizationCorrection.y.setName("y");
58  guiTab.localizationCorrection.y.setRange(-posMax, posMax);
59  guiTab.localizationCorrection.y.setDecimals(0);
60  guiTab.localizationCorrection.y.setSteps(int(posMax / 10));
61  guiTab.localizationCorrection.y.setValue(0.F);
62 
63  const float angleMax = M_PIf32;
64 
65  guiTab.localizationCorrection.yaw.setName("yaw");
66  guiTab.localizationCorrection.yaw.setRange(-angleMax, angleMax);
67  // guiTab.localizationCorrection.yaw.setDecimals(2);
68  guiTab.localizationCorrection.yaw.setSteps(360);
69  guiTab.localizationCorrection.yaw.setValue(0.F);
70 
71  guiTab.controlGroup.applyButton.setLabel("Apply");
72 
73  armarx::RemoteGui::Client::GridLayout grid;
74  int row = 10;
75  {
76 
77  grid.add(guiTab.localizationCorrection.x, {row, 1});
78  ++row;
79 
80  grid.add(guiTab.localizationCorrection.y, {row, 1});
81  ++row;
82 
83  grid.add(guiTab.localizationCorrection.yaw, {row, 1});
84  ++row;
85 
86  grid.add(guiTab.controlGroup.applyButton, {row, 1});
87  ++row;
88  }
89 
90  armarx::RemoteGui::Client::VBoxLayout root = {grid,
91  armarx::RemoteGui::Client::VSpacer()};
92  guiTab.localizationCorrection.group.addChild(root);
93  }
94 
95  guiTab.hbox.addChild(guiTab.localizationCorrection.group);
96 
97  guiTab.create(REMOTE_GUI_TAB_MAME, remoteGui, guiTab.hbox);
98 
99  // boxLayout.addChild(line);
100  // remoteGui->createTab(REMOTE_GUI_TAB_MAME, guiTab.hbox);
101  }
102 
103  void
104  LocalizationRemoteGui::run()
105  {
106  constexpr int kCycleDurationMs = 100;
107 
108  CycleUtil c(kCycleDurationMs);
109  while (!runningTask->isStopped())
110  {
111  {
112 
113  {
114  std::lock_guard g{mtx};
115 
116  ARMARX_TRACE;
117  tab.receiveUpdates();
118  guiTab.receiveUpdates();
119  }
120 
121  ARMARX_TRACE;
122  handleEvents(tab);
123 
124  {
125  std::lock_guard g{mtx};
126 
127  ARMARX_TRACE;
128  tab.sendUpdates();
129  guiTab.sendUpdates();
130  }
131  }
132 
133  c.waitForCycleDuration();
134  }
135  }
136 
137  void
138  LocalizationRemoteGui::handleEvents(RemoteGui::TabProxy& tab)
139  {
140  ARMARX_TRACE;
141 
142  std::lock_guard g{handleEventsMtx};
143 
144  const Eigen::Vector3f correction{guiTab.localizationCorrection.x.getValue(),
145  guiTab.localizationCorrection.y.getValue(),
146  guiTab.localizationCorrection.yaw.getValue()};
147  // ARMARX_INFO << correction;
148 
149  const Eigen::Vector3f diff = correction - localizationCorrection;
150 
151  // check if values have changed
152  if ((diff.cwiseAbs().array() > 0.01F).any())
153  {
154  localizationCorrection = correction;
155 
156  const Eigen::Isometry3f trafo =
157  Eigen::Translation3f(Eigen::Vector3f{correction.x(), correction.y(), 0.F}) *
158  Eigen::Isometry3f(Eigen::AngleAxisf(correction.z(), Eigen::Vector3f::UnitZ()));
159  // ARMARX_INFO << "Localization correction";
160  callee.onLocalizationCorrection(trafo);
161  }
162 
163  if (guiTab.controlGroup.applyButton.wasClicked())
164  {
165  ARMARX_TRACE;
166  callee.onApplyLocalizationCorrection();
167  }
168  }
169 
170  void
171  LocalizationRemoteGui::shutdown()
172  {
173  // std::lock_guard g{mtx};
174 
175  if (!runningTask->isStopped())
176  {
177  runningTask->stop();
178  }
179 
180  ARMARX_DEBUG << "Removing tab: " << REMOTE_GUI_TAB_MAME;
181  remoteGui->removeTab(REMOTE_GUI_TAB_MAME);
182  }
183 
184  void
185  LocalizationRemoteGui::enable()
186  {
187  ARMARX_TRACE;
188 
189  // std::lock_guard g{mtx};
190  tab.internalSetDisabled(guiTab.controlGroup.applyButton.getName(), false);
191  }
192 
193  void
194  LocalizationRemoteGui::disable()
195  {
196  ARMARX_TRACE;
197 
198  // std::unique_lock g{mtx};
199 
200  // it might happen, that this function is triggered from handleEvents
201  // std::unique_lock ul{handleEventsMtx};
202  // ul.try_lock();
203 
204  tab.internalSetDisabled(guiTab.controlGroup.applyButton.getName(), true);
205  }
206 
207  void
208  LocalizationRemoteGui::reset()
209  {
210  ARMARX_TRACE;
211 
212  // std::lock_guard g{mtx};
213 
214  guiTab.localizationCorrection.x.setValue(0.F);
215  guiTab.localizationCorrection.y.setValue(0.F);
216  guiTab.localizationCorrection.yaw.setValue(0.F);
217 
218  tab.sendUpdates();
219  guiTab.sendUpdates();
220  }
221 
222 } // namespace armarx::localization_and_mapping::components::cartographer_localization_and_mapping
StaticWidgets.h
armarx::localization_and_mapping::components::cartographer_localization_and_mapping::LocalizationRemoteGui::LocalizationRemoteGui
LocalizationRemoteGui(const RemoteGuiInterfacePrx &remoteGui, LocalizationRemoteGuiCallee &callee)
Definition: LocalizationRemoteGui.cpp:19
armarx::localization_and_mapping::components::cartographer_localization_and_mapping::LocalizationRemoteGui
Definition: LocalizationRemoteGui.h:47
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
trace.h
ParameterMapping.h
IntegerWidgets.h
armarx::RunningTask
Definition: ArmarXMultipleObjectsScheduler.h:36
armarx::RemoteGui::TabProxy
Definition: WidgetProxy.h:17
ARMARX_TRACE
#define ARMARX_TRACE
Definition: trace.h:77
LayoutWidgets.h
WidgetProxy.h
LocalizationRemoteGui.h
armarx::localization_and_mapping::components::cartographer_localization_and_mapping::LocalizationRemoteGui::~LocalizationRemoteGui
~LocalizationRemoteGui()
Definition: LocalizationRemoteGui.cpp:32
CycleUtil.h
armarx::localization_and_mapping::components::cartographer_localization_and_mapping::LocalizationRemoteGuiCallee
Definition: LocalizationRemoteGui.h:38
armarx::localization_and_mapping::components::cartographer_localization_and_mapping
Definition: Component.cpp:109