| Directory: | ./ |
|---|---|
| File: | src/matrix/operator.cpp |
| Date: | 2025-05-13 12:28:21 |
| Exec | Total | Coverage | |
|---|---|---|---|
| Lines: | 3 | 63 | 4.8% |
| Branches: | 3 | 126 | 2.4% |
| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | /* | ||
| 2 | * Copyright 2010, | ||
| 3 | * François Bleibel, | ||
| 4 | * Olivier Stasse, | ||
| 5 | * Nicolas Mansard | ||
| 6 | * Joseph Mirabel | ||
| 7 | * | ||
| 8 | * CNRS/AIST | ||
| 9 | * | ||
| 10 | */ | ||
| 11 | |||
| 12 | #include "operator.hh" | ||
| 13 | |||
| 14 | namespace dg = ::dynamicgraph; | ||
| 15 | |||
| 16 | /* ---------------------------------------------------------------------------*/ | ||
| 17 | /* ------- GENERIC HELPERS -------------------------------------------------- */ | ||
| 18 | /* ---------------------------------------------------------------------------*/ | ||
| 19 | |||
| 20 | #define REGISTER_UNARY_OP(OpType, name) \ | ||
| 21 | template <> \ | ||
| 22 | const std::string UnaryOp<OpType>::CLASS_NAME = std::string(#name); \ | ||
| 23 | Entity *regFunction_##name(const std::string &objname) { \ | ||
| 24 | return new UnaryOp<OpType>(objname); \ | ||
| 25 | } \ | ||
| 26 | EntityRegisterer regObj_##name(std::string(#name), ®Function_##name) | ||
| 27 | |||
| 28 | /* ---------------------------------------------------------------------------*/ | ||
| 29 | /* ---------------------------------------------------------------------------*/ | ||
| 30 | /* ---------------------------------------------------------------------------*/ | ||
| 31 | |||
| 32 | namespace dynamicgraph { | ||
| 33 | namespace sot { | ||
| 34 | |||
| 35 | /* ---------------------------------------------------------------------- */ | ||
| 36 | /* --- ALGEBRA SELECTORS ------------------------------------------------ */ | ||
| 37 | /* ---------------------------------------------------------------------- */ | ||
| 38 |
1/2✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
|
1 | REGISTER_UNARY_OP(VectorSelecter, Selec_of_vector); |
| 39 |
1/2✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
|
1 | REGISTER_UNARY_OP(VectorComponent, Component_of_vector); |
| 40 |
1/2✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
|
1 | REGISTER_UNARY_OP(MatrixSelector, Selec_of_matrix); |
| 41 | ✗ | REGISTER_UNARY_OP(MatrixColumnSelector, Selec_column_of_matrix); | |
| 42 | ✗ | REGISTER_UNARY_OP(MatrixTranspose, MatrixTranspose); | |
| 43 | ✗ | REGISTER_UNARY_OP(Diagonalizer, MatrixDiagonal); | |
| 44 | |||
| 45 | /* ---------------------------------------------------------------------- */ | ||
| 46 | /* --- INVERSION -------------------------------------------------------- */ | ||
| 47 | /* ---------------------------------------------------------------------- */ | ||
| 48 | |||
| 49 | ✗ | REGISTER_UNARY_OP(Inverser<Matrix>, Inverse_of_matrix); | |
| 50 | ✗ | REGISTER_UNARY_OP(Inverser<MatrixHomogeneous>, Inverse_of_matrixHomo); | |
| 51 | ✗ | REGISTER_UNARY_OP(Inverser<MatrixTwist>, Inverse_of_matrixtwist); | |
| 52 | ✗ | REGISTER_UNARY_OP(Normalize, Norm_of_vector); | |
| 53 | ✗ | REGISTER_UNARY_OP(InverserRotation, Inverse_of_matrixrotation); | |
| 54 | ✗ | REGISTER_UNARY_OP(InverserQuaternion, Inverse_of_unitquat); | |
| 55 | |||
| 56 | /* ----------------------------------------------------------------------- */ | ||
| 57 | /* --- SE3/SO3 conversions ----------------------------------------------- */ | ||
| 58 | /* ----------------------------------------------------------------------- */ | ||
| 59 | |||
| 60 | ✗ | REGISTER_UNARY_OP(MatrixHomoToPoseUTheta, MatrixHomoToPoseUTheta); | |
| 61 | ✗ | REGISTER_UNARY_OP(MatrixHomoToSE3Vector, MatrixHomoToSE3Vector); | |
| 62 | ✗ | REGISTER_UNARY_OP(SE3VectorToMatrixHomo, SE3VectorToMatrixHomo); | |
| 63 | ✗ | REGISTER_UNARY_OP(SkewSymToVector, SkewSymToVector); | |
| 64 | ✗ | REGISTER_UNARY_OP(PoseUThetaToMatrixHomo, PoseUThetaToMatrixHomo); | |
| 65 | ✗ | REGISTER_UNARY_OP(MatrixHomoToPoseQuaternion, MatrixHomoToPoseQuaternion); | |
| 66 | ✗ | REGISTER_UNARY_OP(PoseQuaternionToMatrixHomo, PoseQuaternionToMatrixHomo); | |
| 67 | ✗ | REGISTER_UNARY_OP(MatrixHomoToPoseRollPitchYaw, MatrixHomoToPoseRollPitchYaw); | |
| 68 | ✗ | REGISTER_UNARY_OP(PoseRollPitchYawToMatrixHomo, PoseRollPitchYawToMatrixHomo); | |
| 69 | ✗ | REGISTER_UNARY_OP(PoseRollPitchYawToPoseUTheta, PoseRollPitchYawToPoseUTheta); | |
| 70 | ✗ | REGISTER_UNARY_OP(HomoToMatrix, HomoToMatrix); | |
| 71 | ✗ | REGISTER_UNARY_OP(MatrixToHomo, MatrixToHomo); | |
| 72 | ✗ | REGISTER_UNARY_OP(HomoToTwist, HomoToTwist); | |
| 73 | ✗ | REGISTER_UNARY_OP(HomoToRotation, HomoToRotation); | |
| 74 | ✗ | REGISTER_UNARY_OP(MatrixHomoToPose, MatrixHomoToPose); | |
| 75 | ✗ | REGISTER_UNARY_OP(RPYToMatrix, RPYToMatrix); | |
| 76 | ✗ | REGISTER_UNARY_OP(MatrixToRPY, MatrixToRPY); | |
| 77 | ✗ | REGISTER_UNARY_OP(RPYToQuaternion, RPYToQuaternion); | |
| 78 | ✗ | REGISTER_UNARY_OP(QuaternionToRPY, QuaternionToRPY); | |
| 79 | ✗ | REGISTER_UNARY_OP(QuaternionToMatrix, QuaternionToMatrix); | |
| 80 | ✗ | REGISTER_UNARY_OP(MatrixToQuaternion, MatrixToQuaternion); | |
| 81 | ✗ | REGISTER_UNARY_OP(MatrixToUTheta, MatrixToUTheta); | |
| 82 | ✗ | REGISTER_UNARY_OP(UThetaToQuaternion, UThetaToQuaternion); | |
| 83 | |||
| 84 | /* ---------------------------------------------------------------------------*/ | ||
| 85 | /* ---------------------------------------------------------------------------*/ | ||
| 86 | /* ---------------------------------------------------------------------------*/ | ||
| 87 | |||
| 88 | #define REGISTER_BINARY_OP(OpType, name) \ | ||
| 89 | template <> \ | ||
| 90 | const std::string BinaryOp<OpType>::CLASS_NAME = std::string(#name); \ | ||
| 91 | Entity *regFunction_##name(const std::string &objname) { \ | ||
| 92 | return new BinaryOp<OpType>(objname); \ | ||
| 93 | } \ | ||
| 94 | EntityRegisterer regObj_##name(std::string(#name), ®Function_##name) | ||
| 95 | |||
| 96 | /* --- MULTIPLICATION --------------------------------------------------- */ | ||
| 97 | |||
| 98 | ✗ | REGISTER_BINARY_OP(Multiplier_double_vector, Multiply_double_vector); | |
| 99 | ✗ | REGISTER_BINARY_OP(Multiplier_matrix_vector, Multiply_matrix_vector); | |
| 100 | ✗ | REGISTER_BINARY_OP(Multiplier_matrixHomo_vector, Multiply_matrixHomo_vector); | |
| 101 | ✗ | REGISTER_BINARY_OP(Multiplier_matrixTwist_vector, Multiply_matrixTwist_vector); | |
| 102 | |||
| 103 | /* --- SUBSTRACTION ----------------------------------------------------- */ | ||
| 104 | ✗ | REGISTER_BINARY_OP(Substraction<dynamicgraph::Matrix>, Substract_of_matrix); | |
| 105 | ✗ | REGISTER_BINARY_OP(Substraction<dynamicgraph::Vector>, Substract_of_vector); | |
| 106 | ✗ | REGISTER_BINARY_OP(Substraction<double>, Substract_of_double); | |
| 107 | |||
| 108 | /* --- STACK ------------------------------------------------------------ */ | ||
| 109 | ✗ | REGISTER_BINARY_OP(VectorStack, Stack_of_vector); | |
| 110 | |||
| 111 | /* ---------------------------------------------------------------------- */ | ||
| 112 | |||
| 113 | ✗ | REGISTER_BINARY_OP(Composer, Compose_R_and_T); | |
| 114 | |||
| 115 | /* --- CONVOLUTION PRODUCT ---------------------------------------------- */ | ||
| 116 | ✗ | REGISTER_BINARY_OP(ConvolutionTemporal, ConvolutionTemporal); | |
| 117 | |||
| 118 | /* --- BOOLEAN REDUCTION ------------------------------------------------ */ | ||
| 119 | ✗ | REGISTER_BINARY_OP(Comparison<double>, CompareDouble); | |
| 120 | ✗ | REGISTER_BINARY_OP(MatrixComparison<Vector>, CompareVector); | |
| 121 | |||
| 122 | ✗ | REGISTER_BINARY_OP(WeightedAdder<dynamicgraph::Matrix>, WeightAdd_of_matrix); | |
| 123 | ✗ | REGISTER_BINARY_OP(WeightedAdder<dynamicgraph::Vector>, WeightAdd_of_vector); | |
| 124 | ✗ | REGISTER_BINARY_OP(WeightedAdder<double>, WeightAdd_of_double); | |
| 125 | |||
| 126 | #define REGISTER_VARIADIC_OP(OpType, name) \ | ||
| 127 | template <> \ | ||
| 128 | const std::string VariadicOp<OpType>::CLASS_NAME = std::string(#name); \ | ||
| 129 | Entity *regFunction_##name(const std::string &objname) { \ | ||
| 130 | return new VariadicOp<OpType>(objname); \ | ||
| 131 | } \ | ||
| 132 | EntityRegisterer regObj_##name(std::string(#name), ®Function_##name) | ||
| 133 | |||
| 134 | /* --- VectorMix ------------------------------------------------------------ */ | ||
| 135 | ✗ | REGISTER_VARIADIC_OP(VectorMix, Mix_of_vector); | |
| 136 | |||
| 137 | /* --- ADDITION --------------------------------------------------------- */ | ||
| 138 | ✗ | REGISTER_VARIADIC_OP(AdderVariadic<Matrix>, Add_of_matrix); | |
| 139 | ✗ | REGISTER_VARIADIC_OP(AdderVariadic<Vector>, Add_of_vector); | |
| 140 | ✗ | REGISTER_VARIADIC_OP(AdderVariadic<double>, Add_of_double); | |
| 141 | |||
| 142 | /* --- MULTIPLICATION --------------------------------------------------- */ | ||
| 143 | ✗ | REGISTER_VARIADIC_OP(Multiplier<Matrix>, Multiply_of_matrix); | |
| 144 | ✗ | REGISTER_VARIADIC_OP(Multiplier<Vector>, Multiply_of_vector); | |
| 145 | ✗ | REGISTER_VARIADIC_OP(Multiplier<MatrixRotation>, Multiply_of_matrixrotation); | |
| 146 | ✗ | REGISTER_VARIADIC_OP(Multiplier<MatrixHomogeneous>, Multiply_of_matrixHomo); | |
| 147 | ✗ | REGISTER_VARIADIC_OP(Multiplier<MatrixTwist>, Multiply_of_matrixtwist); | |
| 148 | ✗ | REGISTER_VARIADIC_OP(Multiplier<VectorQuaternion>, Multiply_of_quaternion); | |
| 149 | ✗ | REGISTER_VARIADIC_OP(Multiplier<double>, Multiply_of_double); | |
| 150 | |||
| 151 | /* --- BOOLEAN --------------------------------------------------------- */ | ||
| 152 | ✗ | REGISTER_VARIADIC_OP(BoolOp<0>, And); | |
| 153 | ✗ | REGISTER_VARIADIC_OP(BoolOp<1>, Or); | |
| 154 | |||
| 155 | } // namespace sot | ||
| 156 | } // namespace dynamicgraph | ||
| 157 | |||
| 158 | /* --- TODO ------------------------------------------------------------------*/ | ||
| 159 | // The following commented lines are sot-v1 entities that are still waiting | ||
| 160 | // for conversion. Help yourself! | ||
| 161 | |||
| 162 | // /* -------------------------------------------------------------------------- | ||
| 163 | // */ | ||
| 164 | |||
| 165 | // struct WeightedDirection | ||
| 166 | // { | ||
| 167 | // public: | ||
| 168 | // void operator()( const dynamicgraph::Vector& v1,const dynamicgraph::Vector& | ||
| 169 | // v2,dynamicgraph::Vector& res ) const | ||
| 170 | // { | ||
| 171 | // const double norm1 = v1.norm(); | ||
| 172 | // const double norm2 = v2.norm(); | ||
| 173 | // res=v2; res*=norm1; | ||
| 174 | // res*= (1/norm2); | ||
| 175 | // } | ||
| 176 | // }; | ||
| 177 | // typedef BinaryOp< Vector,Vector,Vector,WeightedDirection > weightdir; | ||
| 178 | // SOT_FACTORY_TEMPLATE_ENTITY_PLUGIN_ExE_E(weightdir,vector,weight_dir,"WeightDir") | ||
| 179 | |||
| 180 | // /* -------------------------------------------------------------------------- | ||
| 181 | // */ | ||
| 182 | |||
| 183 | // struct Nullificator | ||
| 184 | // { | ||
| 185 | // public: | ||
| 186 | // void operator()( const dynamicgraph::Vector& v1,const dynamicgraph::Vector& | ||
| 187 | // v2,dynamicgraph::Vector& res ) const | ||
| 188 | // { | ||
| 189 | // const unsigned int s = std::max( v1.size(),v2.size() ); | ||
| 190 | // res.resize(s); | ||
| 191 | // for( unsigned int i=0;i<s;++i ) | ||
| 192 | // { | ||
| 193 | // if( v1(i)>v2(i) ) res(i)=v1(i)-v2(i); | ||
| 194 | // else if( v1(i)<-v2(i) ) res(i)=v1(i)+v2(i); | ||
| 195 | // else res(i)=0; | ||
| 196 | // } | ||
| 197 | // } | ||
| 198 | // }; | ||
| 199 | // typedef BinaryOp< Vector,Vector,Vector,Nullificator > vectNil; | ||
| 200 | // SOT_FACTORY_TEMPLATE_ENTITY_PLUGIN_ExE_E(vectNil,vector,vectnil_,"Nullificator") | ||
| 201 | |||
| 202 | // /* -------------------------------------------------------------------------- | ||
| 203 | // */ | ||
| 204 | |||
| 205 | // struct VirtualSpring | ||
| 206 | // { | ||
| 207 | // public: | ||
| 208 | // double spring; | ||
| 209 | |||
| 210 | // void operator()( const dynamicgraph::Vector& pos,const | ||
| 211 | // dynamicgraph::Vector& ref,dynamicgraph::Vector& res ) const | ||
| 212 | // { | ||
| 213 | // double norm = ref.norm(); | ||
| 214 | // double dist = ref.scalarProduct(pos) / (norm*norm); | ||
| 215 | |||
| 216 | // res.resize( ref.size() ); | ||
| 217 | // res = ref; res *= dist; res -= pos; | ||
| 218 | // res *= spring; | ||
| 219 | // } | ||
| 220 | // }; | ||
| 221 | // typedef BinaryOp< Vector,Vector,Vector,VirtualSpring > virtspring; | ||
| 222 | // SOT_FACTORY_TEMPLATE_ENTITY_PLUGIN_ExE_E_CMD | ||
| 223 | // (virtspring,vector,virtspring_, | ||
| 224 | // "VirtualSpring" | ||
| 225 | // ,else if( cmdLine=="spring" ){ CMDARGS_INOUT(op.spring); } | ||
| 226 | // ,"VirtualSpring<pos,ref> compute the virtual force of a spring attache " | ||
| 227 | // "to the reference line <ref>. The eq is: k.(<ref|pos>/<ref|ref>.ref-pos)" | ||
| 228 | // "Params:\n - spring: get/set the spring factor.") | ||
| 229 |