Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #ifndef KDL_Jacobian_H
00028 #define KDL_Jacobian_H
00029
00030 #include <kdl/traits.h>
00031 #include <assert.h>
00032 #include <bitset>
00033 #include <vector>
00034
00035 #define MAXNROFDERIV 31
00036
00037 typedef std::bitset<MAXNROFDERIV> JacobianBitset;
00038
00064 template <typename T>
00065 class Expr {
00066 public:
00067 typedef typename T::exprType exprType;
00071 typedef typename T::derivType derivType;
00072
00076 typedef typename T::valueType valueType;
00077
00081 T elem;
00082 public:
00086 Expr(const T& _elem):elem(_elem) {}
00087 };
00088
00089
00090
00104 template <typename T>
00105 class Jacobian {
00106 public:
00107
00108 typedef T exprType;
00109 typedef typename Traits<T>::valueType valueType;
00110
00114 typedef typename Traits<T>::derivType derivType;
00115 private:
00116 valueType val;
00117 std::vector<derivType> der;
00118 int size;
00119 JacobianBitset hasderiv;
00120 public:
00127 explicit Jacobian(int _size=0):
00128 val(),
00129 der(_size),
00130 size(_size),
00131 hasderiv() {
00132 assert(_size < MAXNROFDERIV);
00133 }
00134
00135 void resize(int _size) {
00136 size=_size;
00137 hasderiv = JacobianBitset();
00138 der.resize(_size);
00139 assert(_size < MAXNROFDERIV);
00140 }
00141
00142
00143
00149 Jacobian(const Jacobian<T>& arg):
00150 val(arg.val),
00151 der(arg.size),
00152 size(arg.size),
00153 hasderiv(arg.hasderiv)
00154 {
00155 for (int i=0;i<size;++i) der[i]=arg.der[i];
00156 }
00157
00164 Jacobian(const valueType& arg):val(arg),der(0),size(0),hasderiv() {
00165 }
00166
00170 ~Jacobian() {
00171 }
00172
00180 derivType deriv(int i) const{
00181 assert((0<=i)&&(i<size));
00182 assert(hasderiv[i]);
00183 return der[i];
00184 }
00185
00199 derivType& deriv(int i) {
00200 assert((0<=i)&&(i<size));
00201 hasderiv[i]=true;
00202 return der[i];
00203 }
00204
00211 valueType& value(){
00212 return val;
00213 }
00214
00221 valueType value() const {
00222 return val;
00223 }
00224
00225
00229 int nrOfDeriv() const {
00230 return size;
00231 }
00232
00237 bool hasDeriv(int i) const {
00238 return hasderiv[i];
00239 }
00240
00244 bool hasDerivs() const {
00245 return hasderiv.any();
00246 }
00247
00248
00254 JacobianBitset getDerivs() const {
00255 return hasderiv;
00256 }
00257
00264 void setDeriv(int i,bool s=true) {
00265 assert(!( (!s) && (size==0) ));
00266 hasderiv[i] = s;
00267 }
00268
00279 template <class A>
00280 Jacobian<T>& operator=(const Expr<A>& e) {
00281 const A& expr = e.elem;
00282 hasderiv = expr.getDerivs();
00283 if (hasderiv.any()) {
00284 assert(expr.nrOfDeriv()==nrOfDeriv());
00285 for (int i=0;i<size;++i)
00286 if (hasderiv[i]) {
00287 der[i] = expr.deriv(i);
00288 }
00289 }
00290
00291
00292
00293 val = expr.value();
00294 return *this;
00295 }
00296
00297
00304 Jacobian<T>& operator=(const Jacobian<T>& expr) {
00305 hasderiv = expr.hasderiv;
00306 if (hasderiv.any()) {
00307 assert(expr.nrOfDeriv()==nrOfDeriv());
00308 for (int i=0;i<size;++i)
00309 if (hasderiv[i]) {
00310 der[i] = expr.deriv(i);
00311 }
00312 }
00313 val = expr.value();
00314 return *this;
00315 }
00316
00323 Jacobian<T>& operator=(const T& expr) {
00324 val = expr;
00325 hasderiv.reset();
00326 return *this;
00327 }
00328 };
00329
00330
00331
00337 template <typename T>
00338 class Cnst {
00339 public:
00340 typedef T exprType;
00341 typedef typename Traits<T>::valueType valueType;
00342
00346 typedef typename Traits<T>::derivType derivType;
00347 private:
00348 valueType val;
00349 public:
00350
00351
00352
00353
00354
00355
00356
00361 derivType deriv(int i) const{
00362 assert(false);
00363 return derivType();
00364 }
00365
00370 derivType& deriv(int i) {
00371 assert(false);
00372 return derivType();
00373 }
00374
00381 valueType& value(){
00382 return val;
00383 }
00384
00391 valueType value() const {
00392 return val;
00393 }
00394
00395
00399 int nrOfDeriv() const {
00400 return 0;
00401 }
00402
00407 bool hasDeriv(int i) const {
00408 return false;
00409 }
00410
00414 bool hasDerivs() const {
00415 return false;
00416 }
00417
00418
00424 JacobianBitset getDerivs() const {
00425 return JacobianBitset(0);
00426 }
00427
00433 void setDeriv(int i,bool s=true) {
00434 assert(false);
00435 }
00436
00437
00444 Cnst<T>& operator=(const T& expr) {
00445 val = expr;
00446 return *this;
00447 }
00448 };
00449
00450
00451
00452
00453
00454
00455
00456
00457
00458 #endif //KDL_Jacobian
00459