Author: Robert Krug robert.krug@oru.se
The library provides computation of Independent Contact Regions (ICR) on discretized object models represented by triangular meshes provided in the Wavefront .obj file format. Single- and Multi-Point contact models are possible. The icrcpp library is available under the GNU General Public License.
General Concept
The central object of the library is the Grasp, which is tied to a previously loaded target object. A Grasp contains a list of Finger-pointers. A Finger holds a pointer to an Object Wrench Space and a pointer to a list of patches. OWS and patches are precomputed when the Finger's parent grasp is initialized. A separate OWS is computed for each finger with a different contact model, a separate list of patches is computed for each finger with a different inclusion rule. Fingers with the same contact model/inclusion rule hold pointers to the same OWS/patch list. The inclusion rule determines which vertices of the target object's mesh are eligible for inclusion in a patch centered around a given center-point. In case of the single-point contact model, each patch only contains its respective center-point.The class SearchZones requires a force-closure prototype grasp for creation. After computing the search zones for the given prototype grasp, these search zones and the grasp are used in the constructor for objects of type IndependentContactRegions. All objects and functions share the namespace ICR.
The basic program flow is as follows:
- Create an ICR::ObjectLoader
- Load a target object in form of a Wavefront .obj file
- Create a ICR::Grasp
- Initialize the Grasp with a set of proper ICR::FingerParameters, center-point indices and the loaded object
- Create ICR::SearchZones utilizing the prototype grasp
- Compute the search zones given the parameters of a task wrench space
- Create an ICR::IndependentContactRegions object utilizing the previously created search zones and grasp
- Compute the independent contact regions
See also the provided example in /icrcpp/examples/src/example.cpp.
ToDo
- Add a member function computeFullICR() to ICR::IndependentContactRegions. This function should check all contact points for icr-inclusion instead of applying breadth-first exploration from the initial center-points as ICR::IndependentContactRegions::computeICR does. This would allow transferring ICR::SearchZones and synthesizing regions on novel objects. Another possibility would be to randomly explore points on an unknown object until one point is found eligible for inclusion in a region. Then the BFS scheme could start from this point for the respective region.
- In the ICR::ObjectLoader class, implement the callbacks allowing to read .obj files with texture information. Right now, program execution is stopped by an attempt to load an .obj file containing textures.
- Maybe ICR::Grasp::computeGWS should not be called in ICR::Grasp::init, but separately. Transferring existing ICR::SearchZones to a novel object also requires creation of a new Grasp having this novel object as parent, because new Object Wrench Spaces and Patch lists are needed. However, calculating the GWS for this grasp is superfluous and could be avoided by disconnecting the GWS calculation from the initialization of the grasp and thus increase computational efficiency.