37 #ifndef IKFAST_HEADER_COMMON
38 #define IKFAST_HEADER_COMMON
41 #define IKFAST_VERSION 62
74 virtual void GetSolution(T* solution,
const T* freevalues)
const = 0;
77 virtual void GetSolution(std::vector<T>& solution,
const std::vector<T>& freevalues)
const {
79 GetSolution(&solution.at(0), freevalues.size() > 0 ? &freevalues.at(0) : NULL);
86 virtual const std::vector<int>&
GetFree()
const = 0;
89 virtual const int GetDOF()
const = 0;
113 virtual void Clear() = 0;
117 template <
typename T>
131 typedef int* (*GetFreeParametersFn)();
137 typedef const char* (*GetIkFastVersionFn)();
141 typedef const char* (*GetKinematicsHashFn)();
148 template <
typename T>
157 virtual void GetSolution(T* solution,
const T* freevalues)
const {
158 for(std::size_t i = 0; i <
_vbasesol.size(); ++i) {
163 if( solution[i] > T(3.14159265358979) ) {
164 solution[i] -= T(6.28318530717959);
166 else if( solution[i] < T(-3.14159265358979) ) {
167 solution[i] += T(6.28318530717959);
173 virtual void GetSolution(std::vector<T>& solution,
const std::vector<T>& freevalues)
const {
174 solution.resize(
GetDOF());
175 GetSolution(&solution.at(0), freevalues.size() > 0 ? &freevalues.at(0) : NULL);
178 virtual const std::vector<int>&
GetFree()
const {
182 return static_cast<int>(
_vbasesol.size());
186 for(
size_t i = 0; i <
_vbasesol.size(); ++i) {
187 if(
_vbasesol[i].maxsolutions == (
unsigned char)-1) {
188 throw std::runtime_error(
"max solutions for joint not initialized");
192 throw std::runtime_error(
"index >= max solutions for joint");
195 throw std::runtime_error(
"2nd index >= max solutions for joint");
204 for(
int i = (
int)
_vbasesol.size()-1; i >= 0; --i) {
205 if(
_vbasesol[i].maxsolutions != (
unsigned char)-1 &&
_vbasesol[i].maxsolutions > 1 ) {
206 for(
size_t j = 0; j < v.size(); ++j) {
209 size_t orgsize=v.size();
210 if(
_vbasesol[i].indices[1] != (
unsigned char)-1 ) {
211 for(
size_t j = 0; j < orgsize; ++j) {
212 v.push_back(v[j]+
_vbasesol[i].indices[1]);
215 if(
_vbasesol[i].indices[0] != (
unsigned char)-1 ) {
216 for(
size_t j = 0; j < orgsize; ++j) {
229 template <
typename T>
243 throw std::runtime_error(
"GetSolution index is invalid");
245 typename std::list< IkSolution<T> >::const_iterator it =
_listsolutions.begin();
246 std::advance(it,index);
264 #endif // OPENRAVE_IKFAST_HEADER
267 #ifdef IKFAST_HAS_LIBRARY
270 #ifdef IKFAST_CLIBRARY
272 #define IKFAST_API extern "C" __declspec(dllexport)
274 #define IKFAST_API extern "C"
280 #ifdef IKFAST_NAMESPACE
281 namespace IKFAST_NAMESPACE {
285 typedef IKFAST_REAL IkReal;
287 typedef double IkReal;
302 IKFAST_API
void ComputeFk(
const IkReal* joints, IkReal* eetrans, IkReal* eerot);
305 IKFAST_API
int GetNumFreeParameters();
308 IKFAST_API
int* GetFreeParameters();
311 IKFAST_API
int GetNumJoints();
314 IKFAST_API
int GetIkRealSize();
317 IKFAST_API
const char* GetIkFastVersion();
320 IKFAST_API
int GetIkType();
323 IKFAST_API
const char* GetKinematicsHash();
325 #ifdef IKFAST_NAMESPACE
329 #endif // IKFAST_HAS_LIBRARY