1 #include <dart/common/Console.hpp>
9 extern template class KinematicSimulationJointCommandExecutor<
12 extern template class KinematicSimulationJointCommandExecutor<
15 extern template class KinematicSimulationJointCommandExecutor<
19 template <ExecutorType T>
22 ::dart::dynamics::MetaSkeletonPtr metaskeleton)
32 template <ExecutorType T>
35 std::vector<::dart::dynamics::DegreeOfFreedom*> dofs)
44 template <ExecutorType T>
45 KinematicSimulationJointCommandExecutor<
46 T>::~KinematicSimulationJointCommandExecutor()
49 std::lock_guard<std::mutex> lock(mMutex);
55 mPromise->set_exception(
56 std::make_exception_ptr(std::runtime_error(
"Command canceled.")));
63 template <ExecutorType T>
65 const std::vector<double>& command,
66 const std::chrono::duration<double>& timeout,
67 const std::chrono::system_clock::time_point& timepoint)
69 auto promise = std::promise<int>();
71 if (command.size() != this->mDofs.size())
73 promise.set_exception(std::make_exception_ptr(
74 std::runtime_error(
"DOF of command does not match DOF of joints.")));
75 return promise.get_future();
78 std::lock_guard<std::mutex> lock(mMutex);
84 mPromise->set_exception(
85 std::make_exception_ptr(std::runtime_error(
"Command canceled.")));
88 mPromise.reset(
new std::promise<int>());
92 mExecutionStartTime = timepoint;
96 mStartPosition.clear();
97 for (std::size_t i = 0; i < this->mDofs.size(); ++i)
99 auto dof = this->mDofs[i];
100 mStartPosition.push_back(dof->getPosition());
105 dtwarn <<
"[KinematicSimulationEffortExecutor::execute] No Dynamics; "
106 <<
"executor will mimic velocity behavior.\n";
109 for (std::size_t i = 0; i < this->mDofs.size(); ++i)
111 auto dof = this->mDofs[i];
112 dof->setVelocity(command[i]);
119 for (std::size_t i = 0; i < this->mDofs.size(); ++i)
121 auto dof = this->mDofs[i];
122 if (mTimeout.count() > 0.0)
124 dof->setVelocity((command[i] - mStartPosition[i]) / timeout.count());
133 mPromise->set_exception(std::make_exception_ptr(
134 std::logic_error(
"Executor not implemented")));
138 return mPromise->get_future();
142 template <ExecutorType T>
144 const std::chrono::system_clock::time_point& timepoint)
146 std::lock_guard<std::mutex> lock(mMutex);
151 const auto timeSinceBeginning = timepoint - mExecutionStartTime;
152 const auto executionTime
153 = std::chrono::duration<double>(timeSinceBeginning).count();
157 if (executionTime < 0)
165 for (
size_t i = 0; i < this->mDofs.size(); ++i)
167 auto dof = this->mDofs[i];
168 dof->setPosition(mStartPosition[i] + executionTime * mCommand[i]);
176 = (mTimeout.count() == 0) ? 1.0 : executionTime / mTimeout.count();
178 if (interpTime > 1.0)
183 for (
size_t i = 0; i < this->mDofs.size(); ++i)
185 auto dof = this->mDofs[i];
187 = (1.0 - interpTime) * mStartPosition[i] + interpTime * mCommand[i];
188 dof->setPosition(pose);
194 throw std::logic_error(
195 "Other KinematicSimulationExecutors not implemented.");
199 if (mTimeout.count() > 0.0 && executionTime >= mTimeout.count())
203 mPromise->set_value(0);
208 template <ExecutorType T>
211 std::lock_guard<std::mutex> lock(mMutex);
217 mPromise->set_exception(
218 std::make_exception_ptr(std::runtime_error(
"Command canceled.")));
222 dtwarn <<
"[KinematicSimulationJointCommandExecutor::cancel] Attempting to "
223 <<
"cancel command, but no command in progress.\n";