MotionPlanningTask.h
Go to the documentation of this file.
1 /*
2  * This file is part of ArmarX.
3  *
4  * Copyright (C) 2011-2016, High Performance Humanoid Technologies (H2T), Karlsruhe Institute of Technology (KIT), all rights reserved.
5  *
6  * ArmarX is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation.
9  *
10  * ArmarX is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program. If not, see <http://www.gnu.org/licenses/>.
17  *
18  * @package RobotComponents
19  * @author Raphael Grimm ( raphael dot grimm at kit dot edu )
20  * @date 2015
21  * @copyright http://www.gnu.org/licenses/gpl.txt
22  * GNU General Public License
23  */
24 #pragma once
25 
26 #include <atomic>
27 #include <deque>
28 #include <functional>
29 
30 #include <Ice/ObjectAdapter.h>
31 
37 
38 #include <RobotComponents/interface/components/MotionPlanning/Tasks/MotionPlanningTask.h>
39 
40 #include "../MotionPlanningServer.h"
42 
43 namespace armarx
44 {
45  class MotionPlanningTask;
48 
53 
59 
61  virtual public MotionPlanningTaskBase,
62  virtual public MotionPlanningTaskCI
63  {
64  friend class MotionPlanningServer;
65 
66  public:
67  MotionPlanningTask() = default;
68 
69  ~MotionPlanningTask() override = default;
70 
71  /**
72  * @brief Called by the planning server after the task was enqueued.
73  * Override this function to prepare some work (e.g. setting the status from eNew to eQueued)
74  */
75  virtual void
77  {
78  setTaskStatus(TaskStatus::eQueued);
79  }
80 
81  virtual void
83  {
84  }
85 
86  virtual void
88  {
89  }
90 
91  MotionPlanningTaskBasePrx&
93  {
94  return selfProxy;
95  }
96 
97  bool setTaskStatus(TaskStatus::Status newTaskStatus,
98  const Ice::Current& = Ice::emptyCurrent) override;
99 
100  TaskStatus::Status
101  getTaskStatus(const Ice::Current& = Ice::emptyCurrent) const override
102  {
103  return taskStatus;
104  }
105 
106  virtual void
108  {
109  if (selfProxy)
110  {
111  throw std::logic_error{"Task already registered as: category: " +
112  selfProxy->ice_getIdentity().category +
113  ", name: " + selfProxy->ice_getIdentity().name};
114  }
115  selfProxy = MotionPlanningTaskBasePrx::uncheckedCast(adapter->add(this, ident));
116  }
117 
118  std::string
119  getTaskName(const Ice::Current& = Ice::emptyCurrent) const override
120  {
121  return taskName;
122  }
123 
124  void
125  addTaskStatusCallback(std::function<void(TaskStatus::Status)> cb)
126  {
127  taskStatusCallbacks.emplace_back(cb);
128  }
129 
130  Ice::Long
131  getPlanningTime(const Ice::Current&) const override
132  {
133  return planningTime;
134  }
135 
136  Ice::Long
137  getRefiningTime(const Ice::Current&) const override
138  {
139  return refiningTime;
140  }
141 
142  Ice::Long
143  getRunningTime(const Ice::Current&) const override
144  {
145  return planningTime + refiningTime;
146  }
147 
148  protected:
149  /**
150  * The planning time in microseconds
151  */
153  /**
154  * The refining time in microseconds
155  */
157 
158  private:
159  /**
160  * @brief A self proxy. (may be required for callbacks)
161  */
162  MotionPlanningTaskBasePrx selfProxy;
163  std::atomic<TaskStatus::Status> taskStatus{TaskStatus::eNew};
164  std::deque<std::function<void(TaskStatus::Status)>> taskStatusCallbacks;
165  };
166 
168  virtual public MotionPlanningTaskWithDefaultMembersBase,
169  virtual public MotionPlanningTask
170  {
171  public:
172  /**
173  * @brief ctor
174  * @param startCfg the start point
175  * @param cspace the planning cspace
176  * @param dcdStep the dcd step size
177  * @param maximalPlanningTimeInSeconds the maximal time in seconds
178  */
179  MotionPlanningTaskWithDefaultMembers(const VectorXf& startCfg,
180  const VectorXf& goalCfg,
181  const CSpaceBasePtr& cspace,
182  Ice::Float dcdStep,
183  Ice::Long maximalPlanningTimeInSeconds,
184  const std::string& taskName) :
185  MotionPlanningTaskBase(taskName),
186  MotionPlanningTaskWithDefaultMembersBase(taskName,
187  startCfg,
188  goalCfg,
189  cspace,
190  dcdStep,
191  maximalPlanningTimeInSeconds)
192  {
193  }
194 
195  /**
196  * @return The task's start configuration.
197  */
198  VectorXf
199  getStart(const Ice::Current& = Ice::emptyCurrent) const override
200  {
201  return startCfg;
202  }
203 
204  /**
205  * @return The task's start configuration.
206  */
207  VectorXf
208  getGoal(const Ice::Current& = Ice::emptyCurrent) const override
209  {
210  return goalCfg;
211  }
212 
213  /**
214  * @return The task's CSpace .
215  */
216  CSpaceBasePtr
217  getCSpace(const Ice::Current& = Ice::emptyCurrent) const override
218  {
219  return cspace;
220  }
221 
222  /**
223  * @return The task's .
224  */
225  float
226  getDcdStep(const Ice::Current& = Ice::emptyCurrent) const override
227  {
228  return dcdStep;
229  }
230 
231  /**
232  * @return The task's .
233  */
234  Ice::Long
235  getMaximalPlanningTimeInSeconds(const Ice::Current& = Ice::emptyCurrent) const override
236  {
237  return maximalPlanningTimeInSeconds;
238  }
239 
240  protected:
242  };
243 
245  virtual public MotionPlanningTask,
246  virtual public PostprocessingMotionPlanningTaskBase
247  {
248  public:
249  PostprocessingMotionPlanningTask(const MotionPlanningTaskBasePtr& previousStep,
250  const std::string& taskName) :
251  MotionPlanningTaskBase(taskName),
252  PostprocessingMotionPlanningTaskBase(taskName, previousStep)
253  {
254  ARMARX_CHECK_EXPRESSION(this->previousStep);
255  }
256 
257  CSpaceBasePtr
258  getCSpace(const Ice::Current& = Ice::emptyCurrent) const override
259  {
260  ARMARX_CHECK_EXPRESSION(previousStep->getCSpace());
261  return previousStep->getCSpace();
262  }
263 
264  void
266  {
268 
269  auto prev = MotionPlanningTaskPtr::dynamicCast(previousStep);
271 
272  Ice::Identity subIdent;
274  ident.category + ident.name, "PreviousStep_" + previousStep->ice_id());
275  prev->registerAtIceAdapter(adapter, subIdent);
276  }
277 
278  void
279  postEnqueueing() override
280  {
282  MotionPlanningTaskPtr::dynamicCast(previousStep)->postEnqueueing();
283  }
284 
285  protected:
287  };
288 } // namespace armarx
armarx::VariantType::Float
const VariantTypeId Float
Definition: Variant.h:919
armarx::MotionPlanningTask
Definition: MotionPlanningTask.h:60
armarx::MotionPlanningTask::addTaskStatusCallback
void addTaskStatusCallback(std::function< void(TaskStatus::Status)> cb)
Definition: MotionPlanningTask.h:125
armarx::MotionPlanningTaskWithDefaultMembers
Definition: MotionPlanningTask.h:167
armarx::MotionPlanningTaskWithDefaultMembers::getMaximalPlanningTimeInSeconds
Ice::Long getMaximalPlanningTimeInSeconds(const Ice::Current &=Ice::emptyCurrent) const override
Definition: MotionPlanningTask.h:235
armarx::MotionPlanningTask::getProxy
MotionPlanningTaskBasePrx & getProxy()
Definition: MotionPlanningTask.h:92
armarx::MotionPlanningTask::postEnqueueing
virtual void postEnqueueing()
Called by the planning server after the task was enqueued.
Definition: MotionPlanningTask.h:76
RemoteHandle.h
armarx::MotionPlanningTaskWithDefaultMembers::getDcdStep
float getDcdStep(const Ice::Current &=Ice::emptyCurrent) const override
Definition: MotionPlanningTask.h:226
armarx::MotionPlanningTask::getTaskStatus
TaskStatus::Status getTaskStatus(const Ice::Current &=Ice::emptyCurrent) const override
Definition: MotionPlanningTask.h:101
armarx::MotionPlanningServer
Definition: MotionPlanningServer.h:89
armarx::MotionPlanningTask::onRefiningDone
virtual void onRefiningDone()
Definition: MotionPlanningTask.h:87
armarx::PostprocessingMotionPlanningTask::getCSpace
CSpaceBasePtr getCSpace(const Ice::Current &=Ice::emptyCurrent) const override
Definition: MotionPlanningTask.h:258
armarx::MotionPlanningTask::registerAtIceAdapter
virtual void registerAtIceAdapter(Ice::ObjectAdapterPtr &adapter, const Ice::Identity ident)
Definition: MotionPlanningTask.h:107
armarx::MotionPlanningTask::getTaskName
std::string getTaskName(const Ice::Current &=Ice::emptyCurrent) const override
Definition: MotionPlanningTask.h:119
armarx::MotionPlanningTask::refiningTime
Ice::Long refiningTime
The refining time in microseconds.
Definition: MotionPlanningTask.h:156
IceInternal::Handle< MotionPlanningTask >
GfxTL::Identity
void Identity(MatrixXX< N, N, T > *a)
Definition: MatrixXX.h:570
armarx::PostprocessingMotionPlanningTask::PostprocessingMotionPlanningTask
PostprocessingMotionPlanningTask()=default
ManagedIceObject.h
armarx::PostprocessingMotionPlanningTask::postEnqueueing
void postEnqueueing() override
Called by the planning server after the task was enqueued.
Definition: MotionPlanningTask.h:279
armarx::MotionPlanningTaskPtr
IceInternal::Handle< MotionPlanningTask > MotionPlanningTaskPtr
Definition: MotionPlanningServer.h:45
armarx::MotionPlanningTaskWithDefaultMembers::MotionPlanningTaskWithDefaultMembers
MotionPlanningTaskWithDefaultMembers()=default
armarx::ManagedIceObject::generateSubObjectName
static std::string generateSubObjectName(const std::string &superObjectName, const std::string &subObjectName)
Generates a unique name for a sub object from a general name and unique name.
Definition: ManagedIceObject.cpp:119
armarx::VariantType::Long
const VariantTypeId Long
Definition: Variant.h:918
armarx::MotionPlanningTask::getRefiningTime
Ice::Long getRefiningTime(const Ice::Current &) const override
Definition: MotionPlanningTask.h:137
armarx::MotionPlanningTask::getPlanningTime
Ice::Long getPlanningTime(const Ice::Current &) const override
Definition: MotionPlanningTask.h:131
armarx::MotionPlanningTask::~MotionPlanningTask
~MotionPlanningTask() override=default
armarx::MotionPlanningTask::MotionPlanningTask
MotionPlanningTask()=default
armarx::MotionPlanningTaskWithDefaultMembers::MotionPlanningTaskWithDefaultMembers
MotionPlanningTaskWithDefaultMembers(const VectorXf &startCfg, const VectorXf &goalCfg, const CSpaceBasePtr &cspace, Ice::Float dcdStep, Ice::Long maximalPlanningTimeInSeconds, const std::string &taskName)
ctor
Definition: MotionPlanningTask.h:179
ExpressionException.h
armarx::MotionPlanningTaskWithDefaultMembers::getCSpace
CSpaceBasePtr getCSpace(const Ice::Current &=Ice::emptyCurrent) const override
Definition: MotionPlanningTask.h:217
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::MotionPlanningTaskCI
Definition: MotionPlanningTaskControlInterface.h:32
MotionPlanningTaskControlInterface.h
armarx::PostprocessingMotionPlanningTask
Definition: MotionPlanningTask.h:244
armarx::MotionPlanningTaskWithDefaultMembers::getGoal
VectorXf getGoal(const Ice::Current &=Ice::emptyCurrent) const override
Definition: MotionPlanningTask.h:208
armarx::MotionPlanningTask::setTaskStatus
bool setTaskStatus(TaskStatus::Status newTaskStatus, const Ice::Current &=Ice::emptyCurrent) override
Definition: MotionPlanningTask.cpp:32
armarx::MotionPlanningTaskWithDefaultMembers::getStart
VectorXf getStart(const Ice::Current &=Ice::emptyCurrent) const override
Definition: MotionPlanningTask.h:199
armarx::MotionPlanningTask::getRunningTime
Ice::Long getRunningTime(const Ice::Current &) const override
Definition: MotionPlanningTask.h:143
armarx::RemoteHandle
The RemoteHandle class wrapps a ClientSideRemoteHandleControlBlock and can be used just as a Ice prox...
Definition: RemoteHandle.h:46
armarx::PostprocessingMotionPlanningTask::PostprocessingMotionPlanningTask
PostprocessingMotionPlanningTask(const MotionPlanningTaskBasePtr &previousStep, const std::string &taskName)
Definition: MotionPlanningTask.h:249
Logging.h
AMDCallbackCollection.h
armarx::MotionPlanningTask::onPlanningDone
virtual void onPlanningDone()
Definition: MotionPlanningTask.h:82
armarx::MotionPlanningTask::planningTime
Ice::Long planningTime
The planning time in microseconds.
Definition: MotionPlanningTask.h:152
armarx
This file offers overloads of toIce() and fromIce() functions for STL container types.
Definition: ArmarXTimeserver.cpp:27
armarx::PostprocessingMotionPlanningTask::registerAtIceAdapter
void registerAtIceAdapter(Ice::ObjectAdapterPtr &adapter, const Ice::Identity ident) override
Definition: MotionPlanningTask.h:265