45#define IKFAST_VERSION 61
82 virtual void GetSolution(T* solution,
const T* freevalues)
const = 0;
85 virtual void GetSolution(std::vector<T>& solution,
const std::vector<T>& freevalues)
const
88 GetSolution(&solution.at(0), freevalues.size() > 0 ? &freevalues.at(0) :
nullptr);
94 virtual const std::vector<int>&
GetFree()
const = 0;
153 typedef int* (*GetFreeParametersFn)();
159 typedef const char* (*GetIkFastVersionFn)();
163 typedef const char* (*GetKinematicsHashFn)();
182 for (std::size_t i = 0; i <
_vbasesol.size(); ++i)
189 if (solution[i] > T(3.14159265358979))
191 solution[i] -= T(6.28318530717959);
193 else if (solution[i] < T(-3.14159265358979))
195 solution[i] += T(6.28318530717959);
201 virtual void GetSolution(std::vector<T>& solution,
const std::vector<T>& freevalues)
const
203 solution.resize(
GetDOF());
204 GetSolution(&solution.at(0), freevalues.size() > 0 ? &freevalues.at(0) :
nullptr);
207 virtual const std::vector<int>&
GetFree()
const
213 return static_cast<int>(
_vbasesol.size());
218 for (
size_t i = 0; i <
_vbasesol.size(); ++i)
220 if (
_vbasesol[i].maxsolutions ==
static_cast<unsigned char>(-1))
222 throw std::runtime_error(
"max solutions for joint not initialized");
228 throw std::runtime_error(
"index >= max solutions for joint");
230 if (
_vbasesol[i].indices[1] !=
static_cast<unsigned char>(-1) &&
233 throw std::runtime_error(
"2nd index >= max solutions for joint");
243 for (
int i =
static_cast<int>(
_vbasesol.size()) - 1; i >= 0; --i)
245 if (
_vbasesol[i].maxsolutions !=
static_cast<unsigned char>(-1) &&
_vbasesol[i].maxsolutions > 1)
247 for (
size_t j = 0; j < v.size(); ++j)
251 size_t orgsize = v.size();
252 if (
_vbasesol[i].indices[1] !=
static_cast<unsigned char>(-1))
254 for (
size_t j = 0; j < orgsize; ++j)
256 v.push_back(v[j] +
_vbasesol[i].indices[1]);
259 if (
_vbasesol[i].indices[0] !=
static_cast<unsigned char>(-1))
261 for (
size_t j = 0; j < orgsize; ++j)
290 throw std::runtime_error(
"GetSolution index is invalid");
292 typename std::list<IkSolution<T> >::const_iterator it =
_listsolutions.begin();
293 std::advance(it, index);
313#ifdef IKFAST_HAS_LIBRARY
316#ifdef IKFAST_CLIBRARY
318#define IKFAST_API extern "C" __declspec(dllexport)
320#define IKFAST_API extern "C"
326#ifdef IKFAST_NAMESPACE
327namespace IKFAST_NAMESPACE
332typedef IKFAST_REAL IkReal;
334typedef double IkReal;
348IKFAST_API
bool ComputeIk(
const IkReal* eetrans,
const IkReal* eerot,
const IkReal* pfree,
352IKFAST_API
void ComputeFk(
const IkReal* joints, IkReal* eetrans, IkReal* eerot);
375#ifdef IKFAST_NAMESPACE
holds function pointers for all the exported functions of ikfast
const char *(* GetIkFastVersionFn)()
const char *(* GetKinematicsHashFn)()
GetIkFastVersionFn _GetIkFastVersion
GetFreeParametersFn _GetFreeParameters
int(* GetNumFreeParametersFn)()
void(* ComputeFkFn)(const T *, T *, T *)
GetIkRealSizeFn _GetIkRealSize
int *(* GetFreeParametersFn)()
virtual ~IkFastFunctions()
GetKinematicsHashFn _GetKinematicsHash
GetNumJointsFn _GetNumJoints
GetNumFreeParametersFn _GetNumFreeParameters
bool(* ComputeIkFn)(const T *, const T *, const T *, IkSolutionListBase< T > &)
holds the solution for a single dof
T foffset
joint value is fmul*sol[freeind]+foffset
unsigned char jointtype
joint type, 0x01 is revolute, 0x11 is slider
unsigned char maxsolutions
max possible indices, 0 if controlled by free index or a free joint itself
IkSingleDOFSolutionBase()
signed char freeind
if >= 0, mimics another joint
The discrete solutions are returned in this structure.
virtual const std::vector< int > & GetFree() const =0
Gets the indices of the configuration space that have to be preset before a full solution can be retu...
virtual void GetSolution(std::vector< T > &solution, const std::vector< T > &freevalues) const
std::vector version of GetSolution
virtual void GetSolution(T *solution, const T *freevalues) const =0
gets a concrete solution
virtual int GetDOF() const =0
the dof of the solution
virtual ~IkSolutionBase()
manages all the solutions
virtual ~IkSolutionListBase()
virtual size_t GetNumSolutions() const =0
returns the number of solutions stored
virtual const IkSolutionBase< T > & GetSolution(size_t index) const =0
returns the solution pointer
virtual void Clear()=0
clears all current solutions, note that any memory addresses returned from GetSolution will be invali...
virtual size_t AddSolution(const std::vector< IkSingleDOFSolutionBase< T > > &vinfos, const std::vector< int > &vfree)=0
add one solution and return its index for later retrieval
Default implementation of IkSolutionListBase.
std::list< IkSolution< T > > _listsolutions
virtual const IkSolutionBase< T > & GetSolution(size_t index) const
returns the solution pointer
virtual size_t AddSolution(const std::vector< IkSingleDOFSolutionBase< T > > &vinfos, const std::vector< int > &vfree)
add one solution and return its index for later retrieval
virtual size_t GetNumSolutions() const
returns the number of solutions stored
virtual void Clear()
clears all current solutions, note that any memory addresses returned from GetSolution will be invali...
Default implementation of IkSolutionBase.
virtual void Validate() const
virtual int GetDOF() const
the dof of the solution
virtual void GetSolutionIndices(std::vector< unsigned int > &v) const
virtual const std::vector< int > & GetFree() const
Gets the indices of the configuration space that have to be preset before a full solution can be retu...
IkSolution(const std::vector< IkSingleDOFSolutionBase< T > > &vinfos, const std::vector< int > &vfree)
std::vector< int > _vfree
virtual void GetSolution(std::vector< T > &solution, const std::vector< T > &freevalues) const
std::vector version of GetSolution
std::vector< IkSingleDOFSolutionBase< T > > _vbasesol
solution and their offsets if joints are mimicked
virtual void GetSolution(T *solution, const T *freevalues) const
gets a concrete solution
IKFAST_API int * GetFreeParameters()
IKFAST_API int GetNumJoints()
IKFAST_API const char * GetIkFastVersion()
IKFAST_API int GetIkRealSize()
IKFAST_API const char * GetKinematicsHash()
IKFAST_API int GetIkType()
IKFAST_API void ComputeFk(const IkReal *j, IkReal *eetrans, IkReal *eerot)
IKFAST_API bool ComputeIk(const IkReal *eetrans, const IkReal *eerot, const IkReal *pfree, IkSolutionListBase< IkReal > &solutions)
IKFAST_API int GetNumFreeParameters()