| Directory: | ./ |
|---|---|
| File: | include/hpp/affordance/operations.hh |
| Date: | 2025-05-07 12:06:29 |
| Exec | Total | Coverage | |
|---|---|---|---|
| Lines: | 13 | 14 | 92.9% |
| Branches: | 2 | 4 | 50.0% |
| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | // | ||
| 2 | // Copyright (c) 2016 CNRS | ||
| 3 | // Authors: Anna Seppala | ||
| 4 | // | ||
| 5 | // This file is part of hpp-affordance | ||
| 6 | // hpp-affordance is free software: you can redistribute it | ||
| 7 | // and/or modify it under the terms of the GNU Lesser General Public | ||
| 8 | // License as published by the Free Software Foundation, either version | ||
| 9 | // 3 of the License, or (at your option) any later version. | ||
| 10 | // | ||
| 11 | // hpp-affordance is distributed in the hope that it will be | ||
| 12 | // useful, but WITHOUT ANY WARRANTY; without even the implied warranty | ||
| 13 | // of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
| 14 | // General Lesser Public License for more details. You should have | ||
| 15 | // received a copy of the GNU Lesser General Public License along with | ||
| 16 | // hpp-affordance If not, see | ||
| 17 | // <http://www.gnu.org/licenses/>. | ||
| 18 | |||
| 19 | #ifndef HPP_AFFORDANCE_OPERATIONS_HH | ||
| 20 | #define HPP_AFFORDANCE_OPERATIONS_HH | ||
| 21 | |||
| 22 | #include <coal/data_types.h> | ||
| 23 | |||
| 24 | namespace hpp { | ||
| 25 | namespace affordance { | ||
| 26 | /// \addtogroup affordance | ||
| 27 | /// \{ | ||
| 28 | |||
| 29 | /// Base class for the data needed to determine affordances of different | ||
| 30 | /// types. For each affordance type, a child class inheriting OperationBase | ||
| 31 | /// will have to be created. | ||
| 32 | class OperationBase { | ||
| 33 | public: | ||
| 34 | /// If an OperationBase object is created without parameters, an | ||
| 35 | /// affordance type called "noAffordance" is created as default, | ||
| 36 | /// with certain default values for its member variables. This | ||
| 37 | /// constructor should not be used..! | ||
| 38 | OperationBase() | ||
| 39 | : zWorld_(0, 0, 1), | ||
| 40 | margin_(0.3), | ||
| 41 | neighbouringTriangleMargin_(0.3), | ||
| 42 | minArea_(0.05), | ||
| 43 | affordance_("noAffordance") {} | ||
| 44 | /// Constructor that allows for user-defined parameters. Default values are | ||
| 45 | /// given for parameters that are not defined by the user. \param margin | ||
| 46 | /// Margin needed for the evaluation of the requirement function \param | ||
| 47 | /// nbTriMargin Margin between two triangles tested for a single | ||
| 48 | /// affordance surface. If the angle between two triangles is greater | ||
| 49 | /// than the provided margin, the triangles cannot be part of the same | ||
| 50 | /// affordance surface. | ||
| 51 | /// \param minArea Minimum area needed for the formation of an affordance | ||
| 52 | /// object \param affordanceName The name of the affordance type | ||
| 53 | 10 | explicit OperationBase(const double margin = 0.3, | |
| 54 | const double nbTriMargin = 0.3, | ||
| 55 | const double minArea = 0.05, | ||
| 56 | const char* affordanceName = "noAffordance") | ||
| 57 | ✗ | : zWorld_(0, 0, 1), | |
| 58 | 10 | margin_(margin), | |
| 59 | 10 | neighbouringTriangleMargin_(nbTriMargin), | |
| 60 | 10 | minArea_(minArea), | |
| 61 |
1/2✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
|
10 | affordance_(affordanceName) {} |
| 62 | /// Fully virtual function that will determine whether or not a given | ||
| 63 | /// triangle normal fullfils the requirement of a child class. If yes, | ||
| 64 | /// the tested triangle forms part of a potential affordance. | ||
| 65 | /// \param normal Normal vector of the tested triangle. | ||
| 66 | virtual bool requirement(const coal::Vec3f& normal) = 0; | ||
| 67 | /// The orientation of the world z axis. Needed to find potential affordance | ||
| 68 | /// objects. | ||
| 69 | const coal::Vec3f zWorld_; | ||
| 70 | /// The error margin within which the requirement function must be fullfilled. | ||
| 71 | const double margin_; | ||
| 72 | /// The margin for the deviation of the normal of neighbouring triangles. | ||
| 73 | /// Used to determine affordance objects comprising more than one triangle. | ||
| 74 | const double neighbouringTriangleMargin_; | ||
| 75 | /// The minimum area required for an affordance object. The total area may | ||
| 76 | /// comprise multiple triangles. | ||
| 77 | const double minArea_; | ||
| 78 | /// Name of the affordance type for which te requirement exists. | ||
| 79 | const char* affordance_; | ||
| 80 | }; // class OperationBase | ||
| 81 | /// Class that contains the information needed to create affordance | ||
| 82 | /// objects of type Support. Inherits the OperationBase class. | ||
| 83 | class SupportOperation : public OperationBase { | ||
| 84 | public: | ||
| 85 | /// Constructor that takes in user-defined parameters | ||
| 86 | /// \param margin Margin needed for the evaluation of the requirement function | ||
| 87 | /// \param nbTriMargin Margin between two triangles tested for a single | ||
| 88 | /// affordance surface. If the angle between two triangles is greater | ||
| 89 | /// than the provided margin, the triangles cannot be part of the same | ||
| 90 | /// affordance surface. | ||
| 91 | /// \param minArea Minimum area needed for the formation of an affordance | ||
| 92 | /// object \param affordanceName The name of the affordance type | ||
| 93 | 5 | explicit SupportOperation(const double margin = 0.3, | |
| 94 | const double nbTriMargin = 0.3, | ||
| 95 | const double minArea = 0.05, | ||
| 96 | const char* affordanceName = "Support") | ||
| 97 | 5 | : OperationBase(margin, nbTriMargin, minArea, affordanceName) {} | |
| 98 | /// The implementation of the requirement function for Support affordances | ||
| 99 | /// overrides the virtual function in class OperationBase. | ||
| 100 | /// \param nromal Normal vector of the tested triangle. | ||
| 101 | 51 | bool requirement(const coal::Vec3f& normal) { | |
| 102 |
1/2✓ Branch 2 taken 51 times.
✗ Branch 3 not taken.
|
51 | return ((zWorld_ - normal).squaredNorm() < margin_); |
| 103 | } | ||
| 104 | }; // class SupportOperation | ||
| 105 | /// Class that contains the information needed to create affordance | ||
| 106 | /// objects of type Lean. Inherits the OperationBase class. | ||
| 107 | class LeanOperation : public OperationBase { | ||
| 108 | public: | ||
| 109 | /// Constructor that takes in user-defined parameters | ||
| 110 | /// \param margin Margin needed for the evaluation of the requirement function | ||
| 111 | /// \param nbTriMargin Margin between two triangles tested for a single | ||
| 112 | /// affordance surface. If the angle between two triangles is greater | ||
| 113 | /// than the provided margin, the triangles cannot be part of the same | ||
| 114 | /// affordance surface. | ||
| 115 | /// \param minArea Minimum area needed for the formation of an affordance | ||
| 116 | /// object \param affordanceName The name of the affordance type | ||
| 117 | 5 | explicit LeanOperation(const double margin = 0.3, | |
| 118 | const double nbTriMargin = 0.3, | ||
| 119 | const double minArea = 0.05, | ||
| 120 | const char* affordanceName = "Lean") | ||
| 121 | 5 | : OperationBase(margin, nbTriMargin, minArea, affordanceName) {} | |
| 122 | /// The implementation of the requirement function for Lean affordances | ||
| 123 | /// overrides the virtual function in class OperationBase. | ||
| 124 | /// \param nromal Normal vector of the tested triangle. | ||
| 125 | 37 | bool requirement(const coal::Vec3f& normal) { | |
| 126 | 37 | return (fabs(normal.dot(zWorld_)) < margin_); | |
| 127 | } | ||
| 128 | }; // class LeanOperation | ||
| 129 | |||
| 130 | /// Class that contains the information needed to create affordance | ||
| 131 | /// objects of type Lean. Inherits the OperationBase class. | ||
| 132 | class Support45Operation : public OperationBase { | ||
| 133 | public: | ||
| 134 | /// Constructor that takes in user-defined parameters | ||
| 135 | /// \param margin Margin needed for the evaluation of the requirement function | ||
| 136 | /// \param nbTriMargin Margin between two triangles tested for a single | ||
| 137 | /// affordance surface. If the angle between two triangles is greater | ||
| 138 | /// than the provided margin, the triangles cannot be part of the same | ||
| 139 | /// affordance surface. | ||
| 140 | /// \param minArea Minimum area needed for the formation of an affordance | ||
| 141 | /// object \param affordanceName The name of the affordance type | ||
| 142 | explicit Support45Operation(const double margin = 0.3, | ||
| 143 | const double nbTriMargin = 0.3, | ||
| 144 | const double minArea = 0.05, | ||
| 145 | const char* affordanceName = "Support45") | ||
| 146 | : OperationBase(margin, 0.05, minArea, affordanceName), | ||
| 147 | axis45_(coal::Vec3f(1. / sqrt(2.), 0, 1. / sqrt(2.))) {} | ||
| 148 | |||
| 149 | private: | ||
| 150 | const coal::Vec3f axis45_; | ||
| 151 | |||
| 152 | /// The implementation of the requirement function for Support45 affordances | ||
| 153 | /// overrides the virtual function in class OperationBase. | ||
| 154 | /// Test if the normal in oriented with 45° up +- margin | ||
| 155 | /// \param nromal Normal vector of the tested triangle. | ||
| 156 | bool requirement(const coal::Vec3f& normal) { | ||
| 157 | coal::Vec3f projectedNormal(0, 0, normal[2]); // project normal in x,z plan | ||
| 158 | projectedNormal[0] = sqrt(normal[0] * normal[0] + normal[1] * normal[1]); | ||
| 159 | return ((axis45_ - projectedNormal).squaredNorm() < margin_); | ||
| 160 | } | ||
| 161 | }; // class LeanOperation | ||
| 162 | |||
| 163 | /// \} | ||
| 164 | } // namespace affordance | ||
| 165 | } // namespace hpp | ||
| 166 | |||
| 167 | #endif // HPP_AFFORDANCE_OPERATIONS_HH | ||
| 168 |