37 #ifndef IKFAST_HEADER_COMMON 38 #define IKFAST_HEADER_COMMON 41 #define IKFAST_VERSION 61 47 class IkSingleDOFSolutionBase
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 {
78 solution.resize(GetDOF());
79 GetSolution(&solution.at(0), freevalues.size() > 0 ? &freevalues.at(0) : NULL);
85 virtual const std::vector<int>& GetFree()
const = 0;
88 virtual const int GetDOF()
const = 0;
109 virtual size_t GetNumSolutions()
const = 0;
112 virtual void Clear() = 0;
116 template <
typename T>
120 IkFastFunctions() : _ComputeIk(NULL), _ComputeFk(NULL), _GetNumFreeParameters(NULL), _GetFreeParameters(NULL), _GetNumJoints(NULL), _GetIkRealSize(NULL), _GetIkFastVersion(NULL), _GetIkType(NULL), _GetKinematicsHash(NULL) {
125 ComputeIkFn _ComputeIk;
126 typedef void (*ComputeFkFn)(
const T*, T*, T*);
127 ComputeFkFn _ComputeFk;
128 typedef int (*GetNumFreeParametersFn)();
129 GetNumFreeParametersFn _GetNumFreeParameters;
130 typedef int* (*GetFreeParametersFn)();
131 GetFreeParametersFn _GetFreeParameters;
132 typedef int (*GetNumJointsFn)();
133 GetNumJointsFn _GetNumJoints;
134 typedef int (*GetIkRealSizeFn)();
135 GetIkRealSizeFn _GetIkRealSize;
136 typedef const char* (*GetIkFastVersionFn)();
137 GetIkFastVersionFn _GetIkFastVersion;
138 typedef int (*GetIkTypeFn)();
139 GetIkTypeFn _GetIkType;
140 typedef const char* (*GetKinematicsHashFn)();
141 GetKinematicsHashFn _GetKinematicsHash;
147 template <
typename T>
156 virtual void GetSolution(T* solution,
const T* freevalues)
const {
157 for(std::size_t i = 0; i < _vbasesol.size(); ++i) {
159 solution[i] = _vbasesol[i].foffset;
161 solution[i] = freevalues[_vbasesol[i].freeind]*_vbasesol[i].fmul + _vbasesol[i].foffset;
162 if( solution[i] > T(3.14159265358979) ) {
163 solution[i] -= T(6.28318530717959);
165 else if( solution[i] < T(-3.14159265358979) ) {
166 solution[i] += T(6.28318530717959);
172 virtual void GetSolution(std::vector<T>& solution,
const std::vector<T>& freevalues)
const {
173 solution.resize(GetDOF());
174 GetSolution(&solution.at(0), freevalues.size() > 0 ? &freevalues.at(0) : NULL);
177 virtual const std::vector<int>&
GetFree()
const {
181 return static_cast<int>(_vbasesol.size());
185 for(
size_t i = 0; i < _vbasesol.size(); ++i) {
187 throw std::runtime_error(
"max solutions for joint not initialized");
191 throw std::runtime_error(
"index >= max solutions for joint");
193 if( _vbasesol[i].
indices[1] != (
unsigned char)-1 && _vbasesol[i].
indices[1] >= _vbasesol[i].maxsolutions ) {
194 throw std::runtime_error(
"2nd index >= max solutions for joint");
203 for(
int i = (
int)_vbasesol.size()-1; i >= 0; --i) {
204 if( _vbasesol[i].
maxsolutions != (
unsigned char)-1 && _vbasesol[i].maxsolutions > 1 ) {
205 for(
size_t j = 0; j < v.size(); ++j) {
206 v[j] *= _vbasesol[i].maxsolutions;
208 size_t orgsize=v.size();
209 if( _vbasesol[i].
indices[1] != (
unsigned char)-1 ) {
210 for(
size_t j = 0; j < orgsize; ++j) {
211 v.push_back(v[j]+_vbasesol[i].
indices[1]);
214 if( _vbasesol[i].
indices[0] != (
unsigned char)-1 ) {
215 for(
size_t j = 0; j < orgsize; ++j) {
216 v[j] += _vbasesol[i].indices[0];
223 std::vector< IkSingleDOFSolutionBase<T> > _vbasesol;
224 std::vector<int> _vfree;
228 template <
typename T>
234 size_t index = _listsolutions.size();
241 if( index >= _listsolutions.size() ) {
242 throw std::runtime_error(
"GetSolution index is invalid");
244 typename std::list< IkSolution<T> >::const_iterator it = _listsolutions.begin();
245 std::advance(it,index);
250 return _listsolutions.size();
254 _listsolutions.clear();
258 std::list< IkSolution<T> > _listsolutions;
263 #endif // OPENRAVE_IKFAST_HEADER 266 #ifdef IKFAST_HAS_LIBRARY 269 #ifdef IKFAST_CLIBRARY 271 #define IKFAST_API extern "C" __declspec(dllexport) 273 #define IKFAST_API extern "C" 279 #ifdef IKFAST_NAMESPACE 280 namespace IKFAST_NAMESPACE {
284 typedef IKFAST_REAL IkReal;
286 typedef double IkReal;
301 IKFAST_API
void ComputeFk(
const IkReal* joints, IkReal* eetrans, IkReal* eerot);
324 #ifdef IKFAST_NAMESPACE 328 #endif // IKFAST_HAS_LIBRARY
virtual void GetSolution(std::vector< T > &solution, const std::vector< T > &freevalues) const
std::vector version of GetSolution
unsigned char indices[5]
unique index of the solution used to keep track on what part it came from. sometimes a solution can b...
virtual ~IkFastFunctions()
holds function pointers for all the exported functions of ikfast
unsigned char maxsolutions
max possible indices, 0 if controlled by free index or a free joint itself
virtual const IkSolutionBase< T > & GetSolution(size_t index) const
returns the solution pointer
virtual void GetSolution(T *solution, const T *freevalues) const
gets a concrete solution
holds the solution for a single dof
signed char freeind
if >= 0, mimics another joint
The discrete solutions are returned in this structure.
virtual void GetSolutionIndices(std::vector< unsigned int > &v) const
virtual void Clear()
clears all current solutions, note that any memory addresses returned from GetSolution will be invali...
IKFAST_API int GetNumFreeParameters()
IKFAST_API const char * GetIkFastVersion()
IKFAST_API const char * GetKinematicsHash()
Default implementation of IkSolutionBase.
IKFAST_API bool ComputeIk(const IkReal *eetrans, const IkReal *eerot, const IkReal *pfree, IkSolutionListBase< IkReal > &solutions)
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...
virtual void Validate() const
virtual ~IkSolutionBase()
IKFAST_API int * GetFreeParameters()
T foffset
joint value is fmul*sol[freeind]+foffset
Default implementation of IkSolutionListBase.
virtual ~IkSolutionListBase()
virtual void GetSolution(std::vector< T > &solution, const std::vector< T > &freevalues) const
std::vector version of GetSolution
IKFAST_API int GetIkType()
IKFAST_API int GetNumJoints()
IkSingleDOFSolutionBase()
manages all the solutions
virtual size_t GetNumSolutions() const
returns the number of solutions stored
virtual const int GetDOF() const
the dof of the solution
unsigned char jointtype
joint type, 0x01 is revolute, 0x11 is slider
IKFAST_API int GetIkRealSize()
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
IKFAST_API void ComputeFk(const IkReal *j, IkReal *eetrans, IkReal *eerot)
IkSolution(const std::vector< IkSingleDOFSolutionBase< T > > &vinfos, const std::vector< int > &vfree)