From 2697fa49989c52159bb2e059e3b658f494e98c18 Mon Sep 17 00:00:00 2001 From: Florent Lamiraux <florent@laas.fr> Date: Thu, 9 Aug 2012 16:12:33 +0200 Subject: [PATCH] Move signals errordotSIN and errordotSOUT up to class FeatureAbstract. errordotSOUT callback computeErrorDot copies components of input signal errordotSIN of reference feature defined by selectionSIN flag to output signal errordotSOUT. This was previously performed by FeatureGeneric. Remove calls to withErrorDot, result is always true. --- doc/pictures/feature.fig | 138 ++++++++++++++------------- doc/pictures/feature.png | Bin 13124 -> 13278 bytes include/sot/core/feature-abstract.hh | 54 +++++------ include/sot/core/feature-generic.hh | 5 - src/feature/feature-abstract.cpp | 40 +++++++- src/feature/feature-generic.cpp | 37 ------- src/task/task.cpp | 20 +--- 7 files changed, 137 insertions(+), 157 deletions(-) diff --git a/doc/pictures/feature.fig b/doc/pictures/feature.fig index 8df1036a..30af0c3a 100644 --- a/doc/pictures/feature.fig +++ b/doc/pictures/feature.fig @@ -7,104 +7,108 @@ A4 Single -2 1200 2 -6 910 413 4728 1522 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 - 1 1 1.00 59.15 118.32 - 999 991 1797 991 +6 6120 6030 12690 8145 2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1797 413 3797 413 3797 1522 1797 1522 1797 413 + 8930 6070 12665 6070 12665 8145 8930 8145 8930 6070 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 - 1 1 1.00 59.15 118.32 - 3797 1389 4595 1389 + 1 1 1.00 110.67 221.33 + 7470 6485 8930 6485 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 - 1 1 1.00 59.15 118.32 - 3797 1035 4595 1035 + 1 1 1.00 110.67 221.33 + 6357 7149 8930 7149 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 - 1 1 1.00 59.15 118.32 - 3797 679 4595 679 -4 1 0 50 -1 2 13 0.0000 4 150 1470 2775 1035 FeatureAbstract\001 -4 2 0 50 -1 0 11 0.0000 4 135 690 1664 900 selection\001 -4 0 0 50 -1 0 11 0.0000 4 135 765 3885 1301 dimension\001 -4 0 0 50 -1 0 11 0.0000 4 180 630 3885 945 jacobian\001 -4 0 0 50 -1 0 11 0.0000 4 90 360 3885 591 error\001 + 1 1 1.00 110.67 221.33 + 6357 7896 8930 7896 +4 2 0 50 -1 0 22 0.0000 4 255 2520 8681 6983 articularJacobian\001 +4 2 0 50 -1 0 22 0.0000 4 330 1230 8681 7730 jacobian\001 +4 2 0 50 -1 0 22 0.0000 4 330 1170 8681 6319 position\001 +4 1 0 50 -1 2 26 0.0000 4 300 2940 10756 6651 FeaturePoint6d\001 -6 -6 540 4905 7380 7020 -6 540 4950 7380 6795 -6 540 5535 2115 6075 -6 630 5535 1845 5850 -4 2 0 50 -1 0 22 0.0000 4 255 1170 1823 5813 errordot\001 +6 8910 3735 10485 4275 +6 9000 3735 10215 4050 +4 2 0 50 -1 0 22 0.0000 4 255 1170 10193 4013 errordot\001 -6 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 1 1 1.00 110.67 221.33 - 578 5979 2072 5979 + 8948 4179 10442 4179 -6 -6 5805 4995 7380 5535 -6 5895 4995 7110 5310 -4 2 0 50 -1 0 22 0.0000 4 255 1170 7088 5273 errordot\001 +6 3600 3285 5175 3825 +6 3690 3285 4905 3600 +4 2 0 50 -1 0 22 0.0000 4 255 1170 4883 3563 errordot\001 -6 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 1 1 1.00 110.67 221.33 - 5843 5439 7337 5439 + 3638 3729 5132 3729 -6 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 - 1 1 1.00 110.67 221.33 - 578 5315 2072 5315 +6 540 6300 2115 6795 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 1 1 1.00 110.67 221.33 578 6726 2072 6726 -4 2 0 50 -1 0 22 0.0000 4 180 705 1823 5149 error\001 4 2 0 50 -1 0 22 0.0000 4 330 1230 1823 6560 jacobian\001 -4 1 0 50 -1 2 26 0.0000 4 300 2955 3898 5481 FeatureGeneric\001 -4 0 0 50 -1 0 18 0.0000 4 195 1335 2487 5951 errSOUT =\001 -4 0 0 50 -1 0 18 0.0000 4 195 2685 2487 6320 errorSIN - ref.errorSIN\001 -4 0 0 50 -1 0 18 0.0000 4 255 2205 2487 6726 jacSOUT = jacSIN\001 -6 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2072 4945 5807 4945 5807 7020 2072 7020 2072 4945 --6 -6 6120 6030 12690 8145 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 8930 6070 12665 6070 12665 8145 8930 8145 8930 6070 +6 540 5175 2115 5625 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 1 1 1.00 110.67 221.33 - 7470 6485 8930 6485 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 - 1 1 1.00 110.67 221.33 - 6357 7149 8930 7149 + 578 5540 2072 5540 +4 2 0 50 -1 0 22 0.0000 4 180 705 1823 5374 error\001 +-6 +6 945 495 1800 765 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 - 1 1 1.00 110.67 221.33 - 6357 7896 8930 7896 -4 2 0 50 -1 0 22 0.0000 4 255 2520 8681 6983 articularJacobian\001 -4 2 0 50 -1 0 22 0.0000 4 330 1230 8681 7730 jacobian\001 -4 2 0 50 -1 0 22 0.0000 4 330 1170 8681 6319 position\001 -4 1 0 50 -1 2 26 0.0000 4 300 2940 10756 6651 FeaturePoint6d\001 + 1 1 1.00 59.15 118.32 + 999 721 1797 721 +4 2 0 50 -1 0 11 0.0000 4 135 690 1664 630 selection\001 -6 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 3 0 0 1.00 110.67 221.33 - 3234 1522 3234 2435 5226 2435 + 3234 1522 3234 1935 5226 1935 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 - 1 1 1.00 110.67 221.33 - 3732 3348 5226 3348 + 0 0 1.00 110.67 221.33 + 3825 4950 6471 4344 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 0 0 1.00 110.67 221.33 + 10710 6075 7965 4344 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2072 4945 5807 4945 5807 7020 2072 7020 2072 4945 2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 5226 2269 8961 2269 8961 4344 5226 4344 5226 2269 + 5175 1665 8961 1665 8961 4344 5175 4344 5175 1665 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 1 1 1.00 110.67 221.33 - 8961 4095 10455 4095 + 3732 2700 5226 2700 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 1 1 1.00 110.67 221.33 - 8961 3431 10455 3431 + 8961 3510 10455 3510 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 1 1 1.00 110.67 221.33 - 8961 2767 10455 2767 + 8961 2846 10455 2846 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 - 0 0 1.00 110.67 221.33 - 3825 4950 6471 4344 + 1 1 1.00 110.67 221.33 + 8961 2182 10455 2182 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1797 413 3797 413 3797 1522 1797 1522 1797 413 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 - 0 0 1.00 110.67 221.33 - 10710 6075 7965 4344 -4 1 0 50 -1 2 26 0.0000 4 300 3105 7052 3431 FeatureAbstract\001 -4 2 0 50 -1 0 22 0.0000 4 255 1305 4977 3182 selection\001 -4 0 0 50 -1 0 22 0.0000 4 255 1545 9127 3929 dimension\001 -4 0 0 50 -1 0 22 0.0000 4 330 1230 9127 3265 jacobian\001 -4 0 0 50 -1 0 22 0.0000 4 180 705 9127 2601 error\001 -4 2 0 50 -1 0 22 0.0000 4 255 1365 4977 2186 reference\001 + 1 1 1.00 59.15 118.32 + 3797 1389 4595 1389 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 59.15 118.32 + 3797 1035 4595 1035 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 59.15 118.32 + 3797 679 4595 679 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 59.15 118.32 + 999 1306 1797 1306 +4 1 0 50 -1 2 26 0.0000 4 300 2955 3898 5481 FeatureGeneric\001 +4 0 0 50 -1 0 18 0.0000 4 195 1335 2487 5951 errSOUT =\001 +4 0 0 50 -1 0 18 0.0000 4 195 2685 2487 6320 errorSIN - ref.errorSIN\001 +4 0 0 50 -1 0 18 0.0000 4 255 2205 2487 6726 jacSOUT = jacSIN\001 +4 1 0 50 -1 2 26 0.0000 4 300 3105 7052 2340 FeatureAbstract\001 +4 2 0 50 -1 0 22 0.0000 4 255 1365 4977 1845 reference\001 +4 2 0 50 -1 0 22 0.0000 4 255 1305 4977 2475 selection\001 +4 0 0 50 -1 0 22 0.0000 4 255 1545 9127 3344 dimension\001 +4 0 0 50 -1 0 22 0.0000 4 330 1230 9127 2680 jacobian\001 +4 0 0 50 -1 0 22 0.0000 4 180 705 9127 2016 error\001 +4 1 0 50 -1 2 13 0.0000 4 150 1470 2775 1035 FeatureAbstract\001 +4 0 0 50 -1 0 11 0.0000 4 135 765 3885 1301 dimension\001 +4 0 0 50 -1 0 11 0.0000 4 180 630 3885 945 jacobian\001 +4 0 0 50 -1 0 11 0.0000 4 90 360 3885 591 error\001 +4 2 0 50 -1 0 11 0.0000 4 135 600 1664 1215 errordot\001 diff --git a/doc/pictures/feature.png b/doc/pictures/feature.png index 6f41967f51581ab486f974ce255191acde0a3072..21b13466b421d61c051270ffaecd02446328040f 100644 GIT binary patch delta 10192 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 Zl^=v+{?ZBmQBq%oFFpAB^QJfB{{y^VK|lZi delta 9804 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 UDR2_O%*c8c2bR9%cfa_50Jo{9Q~&?~ diff --git a/include/sot/core/feature-abstract.hh b/include/sot/core/feature-abstract.hh index 2cc1b842..7d2e0e7d 100644 --- a/include/sot/core/feature-abstract.hh +++ b/include/sot/core/feature-abstract.hh @@ -35,6 +35,7 @@ namespace ml = maal::boost; #include <dynamic-graph/entity.h> #include <sot/core/pool.hh> #include "sot/core/api.hh" +#include "sot/core/deprecated.hh" /* STD */ #include <string> @@ -66,29 +67,6 @@ namespace dynamicgraph { evolution of the feature with respect to time: \f$\frac{\partial f}{\partial t}\f$. - \par Time derivative of the error - - Some Feature types provide as output signal the derivative of the - error of the feature (<c>errordotSOUT</c>). The value is computed by - method computeErrorDot. In this case, these feature types should - \li have attribute - \code - dg::SignalTimeDependent< ml::Vector,int > errordotSOUT; - \endcode - \li implement method - \code - virtual bool withErrorDot() const { return true; } - \endcode - \li implement method - \code - virtual SignalTimeDependent<ml::Vector,int>& getErrorDot() - { - return errordotSOUT; - } - \endcode - - See dynamicgraph::sot::FeatureGeneric for an example. - \image html pictures/feature.png "Feature diagram: Feature types derive from FeatureAbstract. Each feature has a reference of the same type and compute an error by comparing errorSIN signals from itself and from the reference." width=15cm */ class SOT_CORE_EXPORT FeatureAbstract @@ -162,6 +140,12 @@ namespace dynamicgraph { */ virtual ml::Matrix& computeJacobian( ml::Matrix& res,int time ) = 0; + /// Callback for signal errordotSOUT + /// + /// Copy components of the input signal errordotSIN defined by selection + /// flag selectionSIN. + virtual ml::Vector& computeErrorDot (ml::Vector& res,int time); + /*! @} */ /* --- SIGNALS ------------------------------------------------------------ */ @@ -178,6 +162,10 @@ namespace dynamicgraph { be used for computing error, activation and Jacobian, then the vector to specify is \f$ [ 0 1 0] \f$.*/ SignalPtr< Flags,int > selectionSIN; + + /// Derivative of the reference value. + SignalPtr< ml::Vector,int > errordotSIN; + /*! @} */ /*! \name Output signals: @@ -187,6 +175,9 @@ namespace dynamicgraph { the current value : \f$ {\bf s}^*(t) - {\bf s}(t)\f$ */ SignalTimeDependent<ml::Vector,int> errorSOUT; + /// Derivative of the reference value. + SignalTimeDependent< ml::Vector,int > errordotSOUT; + /*! \brief This signal returns the Jacobian of the current value according to the robot state: \f$ J(t) = \frac{\delta{\bf s}^*(t)}{\delta {\bf q}(t)}\f$ */ SignalTimeDependent<ml::Matrix,int> jacobianSOUT; @@ -198,8 +189,14 @@ namespace dynamicgraph { virtual std::ostream & writeGraph(std::ostream & os) const; /// Return true for children that provide the errordot output signal - virtual bool withErrorDot( void ) const { return false; } - virtual SignalTimeDependent<ml::Vector,int>& getErrorDot( void ) {throw;} + virtual bool withErrorDot( void ) const SOT_CORE_DEPRECATED + { + return true; + } + virtual SignalTimeDependent<ml::Vector,int>& getErrorDot() + { + return errordotSOUT; + } /*! @} */ @@ -286,13 +283,6 @@ namespace dynamicgraph { /* To force a ; */bool NO_REFERENCE /* END OF define DECLARE_REFERENCE_FUNCTIONS */ -#define WITH_ERRORDOT \ - virtual bool withErrorDot() const { return true; } \ - virtual SignalTimeDependent<ml::Vector,int>& getErrorDot() { return errordotSOUT; } \ - dg::SignalTimeDependent< ml::Vector,int > errordotSOUT; \ - virtual ml::Vector& computeErrorDot( ml::Vector& res,int time ) - - } // namespace sot } // namespace dynamicgraph diff --git a/include/sot/core/feature-generic.hh b/include/sot/core/feature-generic.hh index 540b11fb..c2afbe15 100644 --- a/include/sot/core/feature-generic.hh +++ b/include/sot/core/feature-generic.hh @@ -87,9 +87,6 @@ class SOTFEATUREGENERIC_EXPORT FeatureGeneric /*! \brief Input for the error. */ dg::SignalPtr< ml::Vector,int > errorSIN; - /*! \brief Input for the errordot. */ - dg::SignalPtr< ml::Vector,int > errordotSIN; - /*! \brief Input for the Jacobian. */ dg::SignalPtr< ml::Matrix,int > jacobianSIN; @@ -126,8 +123,6 @@ class SOTFEATUREGENERIC_EXPORT FeatureGeneric /*! \brief Compute the Jacobian of the value according to the robot state.. */ virtual ml::Matrix& computeJacobian( ml::Matrix& res,int time ); - WITH_ERRORDOT; - /*! @} */ /*! \brief Display the information related to this generic implementation. */ diff --git a/src/feature/feature-abstract.cpp b/src/feature/feature-abstract.cpp index 372f1c9f..06d86c55 100644 --- a/src/feature/feature-abstract.cpp +++ b/src/feature/feature-abstract.cpp @@ -20,10 +20,12 @@ #include <sot/core/feature-abstract.hh> #include <sot/core/pool.hh> +#include "sot/core/debug.hh" +#include "sot/core/exception-feature.hh" #include <dynamic-graph/all-commands.h> using namespace dynamicgraph::sot; -namespace dg = dynamicgraph; +using dynamicgraph::sot::ExceptionFeature; const std::string FeatureAbstract::CLASS_NAME = "FeatureAbstract"; @@ -33,6 +35,7 @@ FeatureAbstract:: FeatureAbstract( const std::string& name ) :Entity(name) ,selectionSIN(NULL,"sotFeatureAbstract("+name+")::input(flag)::selec") + ,errordotSIN (NULL,"sotFeatureAbstract("+name+")::input(vector)::errordotIN" ) ,errorSOUT( boost::bind(&FeatureAbstract::computeError,this,_1,_2), selectionSIN, "sotFeatureAbstract("+name+")::output(vector)::error" ) @@ -42,6 +45,9 @@ FeatureAbstract( const std::string& name ) ,dimensionSOUT( boost::bind(&FeatureAbstract::getDimension,this,_1,_2), selectionSIN, "sotFeatureAbstract("+name+")::output(uint)::dim" ) + ,errordotSOUT (boost::bind(&FeatureAbstract::computeErrorDot,this,_1,_2), + selectionSIN << errordotSIN, + "sotFeatureAbstract("+name+")::output(vector)::errordot" ) { selectionSIN = true; signalRegistration( selectionSIN @@ -97,3 +103,35 @@ getReferenceByName() const { if( isReferenceSet() ) return getReferenceAbstract()->getName(); else return "none"; } + +ml::Vector& FeatureAbstract:: +computeErrorDot( ml::Vector& res,int time ) +{ + const Flags &fl = selectionSIN.access(time); + const unsigned int & dim = dimensionSOUT(time); + + unsigned int curr = 0; + res.resize( dim ); + + sotDEBUG(25) << "Dim = " << dim << std::endl; + + if( isReferenceSet () && getReferenceAbstract ()->errordotSIN.isPluged ()) + { + const ml::Vector& errdotDes = getReferenceAbstract ()->errordotSIN(time); + sotDEBUG(15) << "Err* = " << errdotDes; + if( errdotDes.size()<dim ) + { SOT_THROW ExceptionFeature( ExceptionFeature::UNCOMPATIBLE_SIZE, + "Error: dimension uncompatible with des->errorIN size." + " (while considering feature <%s>).",getName().c_str() ); } + + for( unsigned int i=0;i<errdotDes.size();++i ) if( fl(i) ) + if( fl(i) ) res( curr++ ) = errdotDes(i); + } + else + { + for( unsigned int i=0;i<dim;++i ) + if( fl(i) ) res( curr++ ) = 0.0; + } + + return res; +} diff --git a/src/feature/feature-generic.cpp b/src/feature/feature-generic.cpp index 9b972775..ef5e8420 100644 --- a/src/feature/feature-generic.cpp +++ b/src/feature/feature-generic.cpp @@ -44,11 +44,7 @@ FeatureGeneric( const string& pointName ) : FeatureAbstract( pointName ) ,dimensionDefault(0) ,errorSIN( NULL,"sotFeatureGeneric("+name+")::input(vector)::errorIN" ) - ,errordotSIN( NULL,"sotFeatureGeneric("+name+")::input(vector)::errordotIN" ) ,jacobianSIN( NULL,"sotFeatureGeneric("+name+")::input(matrix)::jacobianIN" ) - ,errordotSOUT( boost::bind(&FeatureGeneric::computeErrorDot,this,_1,_2), - selectionSIN << errordotSIN, - "sotFeatureAbstract("+name+")::output(vector)::errordot" ) { jacobianSOUT.addDependency( jacobianSIN ); @@ -135,39 +131,6 @@ computeError( ml::Vector& res,int time ) } -ml::Vector& FeatureGeneric:: -computeErrorDot( ml::Vector& res,int time ) -{ - const Flags &fl = selectionSIN.access(time); - const unsigned int & dim = dimensionSOUT(time); - - unsigned int curr = 0; - res.resize( dim ); - - sotDEBUG(25) << "Dim = " << dim << endl; - - if( isReferenceSet() && getReference()->errordotSIN.isPluged()) - { - const ml::Vector& errdotDes = getReference()->errordotSIN(time); - sotDEBUG(15) << "Err* = " << errdotDes; - if( errdotDes.size()<dim ) - { SOT_THROW ExceptionFeature( ExceptionFeature::UNCOMPATIBLE_SIZE, - "Error: dimension uncompatible with des->errorIN size." - " (while considering feature <%s>).",getName().c_str() ); } - - for( unsigned int i=0;i<errdotDes.size();++i ) if( fl(i) ) - if( fl(i) ) res( curr++ ) = errdotDes(i); - } - else - { - for( unsigned int i=0;i<dim;++i ) - if( fl(i) ) res( curr++ ) = 0.0; - } - - return res; -} - - ml::Matrix& FeatureGeneric:: computeJacobian( ml::Matrix& res,int time ) { diff --git a/src/task/task.cpp b/src/task/task.cpp index 98edc36f..4bc8f302 100644 --- a/src/task/task.cpp +++ b/src/task/task.cpp @@ -110,8 +110,7 @@ addFeature( FeatureAbstract& s ) featureList.push_back(&s); jacobianSOUT.addDependency( s.jacobianSOUT ); errorSOUT.addDependency( s.errorSOUT ); - if( s.withErrorDot() ) - { errorTimeDerivativeSOUT.addDependency( s.getErrorDot() ); } + errorTimeDerivativeSOUT.addDependency (s.getErrorDot()); } void Task:: @@ -132,8 +131,7 @@ clearFeatureList( void ) FeatureAbstract & s = **iter; jacobianSOUT.removeDependency( s.jacobianSOUT ); errorSOUT.removeDependency( s.errorSOUT ); - if( s.withErrorDot() ) - { errorTimeDerivativeSOUT.removeDependency( s.getErrorDot() ); } + errorTimeDerivativeSOUT.removeDependency (s.getErrorDot()); } featureList.clear(); @@ -237,17 +235,9 @@ computeErrorTimeDerivative( ml::Vector & res, int time) { FeatureAbstract &feature = **iter; - if( feature.withErrorDot() ) - { - const ml::Vector& partialErrorDot = feature.getErrorDot()(time); - const int dim = partialErrorDot.size(); - for( int k=0;k<dim;++k ){ res(cursor++) = partialErrorDot(k); } - } - else - { - const int dim = feature.errorSOUT(time).size(); - for( int k=0;k<dim;++k ){ res(cursor++) = 0; } - } + const ml::Vector& partialErrorDot = feature.getErrorDot()(time); + const int dim = partialErrorDot.size(); + for( int k=0;k<dim;++k ){ res(cursor++) = partialErrorDot(k); } } return res; -- GitLab