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
42
43namespace armarx
44{
46 using MotionPlanningTaskPtr = IceInternal::Handle<MotionPlanningTask>;
48
53
59
61 virtual public MotionPlanningTaskBase,
62 virtual public MotionPlanningTaskCI
63 {
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
107 registerAtIceAdapter(Ice::ObjectAdapterPtr& adapter, const Ice::Identity ident)
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 */
152 Ice::Long planningTime = 0;
153 /**
154 * The refining time in microseconds
155 */
156 Ice::Long refiningTime = 0;
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
265 registerAtIceAdapter(Ice::ObjectAdapterPtr& adapter, const Ice::Identity ident) override
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
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.
VectorXf getStart(const Ice::Current &=Ice::emptyCurrent) const override
Ice::Long getMaximalPlanningTimeInSeconds(const Ice::Current &=Ice::emptyCurrent) const override
VectorXf getGoal(const Ice::Current &=Ice::emptyCurrent) const override
MotionPlanningTaskWithDefaultMembers(const VectorXf &startCfg, const VectorXf &goalCfg, const CSpaceBasePtr &cspace, Ice::Float dcdStep, Ice::Long maximalPlanningTimeInSeconds, const std::string &taskName)
ctor
float getDcdStep(const Ice::Current &=Ice::emptyCurrent) const override
CSpaceBasePtr getCSpace(const Ice::Current &=Ice::emptyCurrent) const override
void addTaskStatusCallback(std::function< void(TaskStatus::Status)> cb)
bool setTaskStatus(TaskStatus::Status newTaskStatus, const Ice::Current &=Ice::emptyCurrent) override
virtual void registerAtIceAdapter(Ice::ObjectAdapterPtr &adapter, const Ice::Identity ident)
~MotionPlanningTask() override=default
Ice::Long getRunningTime(const Ice::Current &) const override
MotionPlanningTaskBasePrx & getProxy()
std::string getTaskName(const Ice::Current &=Ice::emptyCurrent) const override
TaskStatus::Status getTaskStatus(const Ice::Current &=Ice::emptyCurrent) const override
Ice::Long getPlanningTime(const Ice::Current &) const override
virtual void postEnqueueing()
Called by the planning server after the task was enqueued.
Ice::Long refiningTime
The refining time in microseconds.
Ice::Long getRefiningTime(const Ice::Current &) const override
Ice::Long planningTime
The planning time in microseconds.
void postEnqueueing() override
Called by the planning server after the task was enqueued.
CSpaceBasePtr getCSpace(const Ice::Current &=Ice::emptyCurrent) const override
PostprocessingMotionPlanningTask(const MotionPlanningTaskBasePtr &previousStep, const std::string &taskName)
void registerAtIceAdapter(Ice::ObjectAdapterPtr &adapter, const Ice::Identity ident) override
The RemoteHandle class wrapps a ClientSideRemoteHandleControlBlock and can be used just as a Ice prox...
#define ARMARX_CHECK_EXPRESSION(expression)
This macro evaluates the expression and if it turns out to be false it will throw an ExpressionExcept...
::IceInternal::Handle<::Ice::ObjectAdapter > ObjectAdapterPtr
Definition IceManager.h:52
This file offers overloads of toIce() and fromIce() functions for STL container types.
IceInternal::Handle< PostprocessingMotionPlanningTask > PostprocessingMotionPlanningTaskPtr
IceInternal::Handle< MotionPlanningTask > MotionPlanningTaskPtr
IceInternal::Handle< MotionPlanningTaskWithDefaultMembers > MotionPlanningTaskWithDefaultMembersPtr
RemoteHandle< MotionPlanningTaskControlInterfacePrx > PostprocessingMotionPlanningTaskHandle
RemoteHandle< MotionPlanningTaskControlInterfacePrx > MotionPlanningTaskHandle