Commit 4f6fe74a authored by Guilhem Saurel's avatar Guilhem Saurel
Browse files

format

parent def36930
......@@ -8,4 +8,3 @@
</center>
</body>
</head>
......@@ -4,4 +4,3 @@
<LINK HREF="package.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY>
......@@ -45,8 +45,8 @@ a:link {
color:#0066CC
}
a:hover, a:active {
text-decoration: underline;
a:hover, a:active {
text-decoration: underline;
color: #3C9A35;
}
......@@ -57,7 +57,7 @@ a:visited {
}
DIV.memitem
{
{
spacing: 10px;
width:100%;
background:#FFFFFF;
......@@ -70,7 +70,7 @@ DIV.memitem
}
DIV.memproto
{
{
width:100%;
background:#F0F0F0;
font-size:100%;
......@@ -82,7 +82,7 @@ DIV.memproto
}
DIV.memdoc
{
{
padding: 10px;
width:100%;
font-size:100%;
......@@ -189,7 +189,7 @@ DIV.nav
}
DIV.groupHeader
{
{
padding-top: 30px;
padding-bottom: 20px;
background : none;
......@@ -214,23 +214,23 @@ DIV.fragment
-moz-border-radius: 8px 8px 8px 8px;
}
.directory p
{
margin: 0px;
white-space: nowrap;
.directory p
{
margin: 0px;
white-space: nowrap;
font-family: 'Lucida Grande','Lucida Sans Unicode',Verdana,Sans-Serif;
font-size: 10pt;
font-weight: normal;
}
.directory h3
{
.directory h3
{
font-family: 'Lucida Grande','Lucida Sans Unicode',Verdana,Sans-Serif;
margin: 0px;
margin-top: 1em;
margin: 0px;
margin-top: 1em;
padding-bottom: 20px;
font-size: 12pt;
font-size: 12pt;
font-variant: small-caps;
text-align: center;
}
......@@ -240,4 +240,3 @@ DIV.fragment
text-decoration: none;
color:#0066CC
}
......@@ -23,8 +23,8 @@ ABBREVIATE_BRIEF = "The $name class" \
ALWAYS_DETAILED_SEC = YES
INLINE_INHERITED_MEMB = NO
FULL_PATH_NAMES = NO
STRIP_FROM_PATH =
STRIP_FROM_INC_PATH =
STRIP_FROM_PATH =
STRIP_FROM_INC_PATH =
SHORT_NAMES = NO
JAVADOC_AUTOBRIEF = YES
MULTILINE_CPP_IS_BRIEF = NO
......@@ -49,7 +49,7 @@ SORT_MEMBER_DOCS = YES
SORT_BRIEF_DOCS = NO
SORT_BY_SCOPE_NAME = NO
MAX_INITIALIZER_LINES = 30
FILE_VERSION_FILTER =
FILE_VERSION_FILTER =
#---------------------------------------------------------------------------
# configuration options related to warning and progress messages
#---------------------------------------------------------------------------
......@@ -59,18 +59,18 @@ WARN_IF_UNDOCUMENTED = YES
WARN_IF_DOC_ERROR = YES
WARN_NO_PARAMDOC = NO
WARN_FORMAT = "$file:$line: $text"
WARN_LOGFILE =
WARN_LOGFILE =
#---------------------------------------------------------------------------
# configuration options related to the input files
#---------------------------------------------------------------------------
RECURSIVE = YES
EXCLUDE =
EXCLUDE =
EXCLUDE_SYMLINKS = NO
EXAMPLE_PATH =
EXAMPLE_PATH =
EXAMPLE_PATTERNS = *
EXAMPLE_RECURSIVE = NO
INPUT_FILTER =
FILTER_PATTERNS =
INPUT_FILTER =
FILTER_PATTERNS =
FILTER_SOURCE_FILES = NO
#---------------------------------------------------------------------------
# configuration options related to source browsing
......@@ -80,7 +80,7 @@ FILTER_SOURCE_FILES = NO
#---------------------------------------------------------------------------
ALPHABETICAL_INDEX = NO
COLS_IN_ALPHA_INDEX = 5
IGNORE_PREFIX =
IGNORE_PREFIX =
#---------------------------------------------------------------------------
# configuration options related to the HTML output
#---------------------------------------------------------------------------
......@@ -88,8 +88,8 @@ GENERATE_HTML = YES
HTML_FILE_EXTENSION = .html
HTML_ALIGN_MEMBERS = YES
GENERATE_HTMLHELP = NO
CHM_FILE =
HHC_LOCATION =
CHM_FILE =
HHC_LOCATION =
GENERATE_CHI = NO
BINARY_TOC = NO
TOC_EXPAND = YES
......@@ -105,8 +105,8 @@ LATEX_CMD_NAME = latex
MAKEINDEX_CMD_NAME = makeindex
COMPACT_LATEX = NO
PAPER_TYPE = a4wide
EXTRA_PACKAGES =
LATEX_HEADER =
EXTRA_PACKAGES =
LATEX_HEADER =
PDF_HYPERLINKS = NO
USE_PDFLATEX = NO
LATEX_BATCHMODE = NO
......@@ -118,8 +118,8 @@ FORMULA_FONTSIZE = 16
RTF_OUTPUT = rtf
COMPACT_RTF = NO
RTF_HYPERLINKS = NO
RTF_STYLESHEET_FILE =
RTF_EXTENSIONS_FILE =
RTF_STYLESHEET_FILE =
RTF_EXTENSIONS_FILE =
#---------------------------------------------------------------------------
# configuration options related to the man page output
#---------------------------------------------------------------------------
......@@ -130,8 +130,8 @@ MAN_LINKS = NO
# configuration options related to the XML output
#---------------------------------------------------------------------------
XML_OUTPUT = xml
XML_SCHEMA =
XML_DTD =
XML_SCHEMA =
XML_DTD =
XML_PROGRAMLISTING = YES
#---------------------------------------------------------------------------
# configuration options for the AutoGen Definitions output
......@@ -142,20 +142,20 @@ GENERATE_AUTOGEN_DEF = NO
#---------------------------------------------------------------------------
PERLMOD_LATEX = NO
PERLMOD_PRETTY = YES
PERLMOD_MAKEVAR_PREFIX =
PERLMOD_MAKEVAR_PREFIX =
#---------------------------------------------------------------------------
# Configuration options related to the preprocessor
# Configuration options related to the preprocessor
#---------------------------------------------------------------------------
ENABLE_PREPROCESSING = YES
MACRO_EXPANSION = YES
EXPAND_ONLY_PREDEF = YES
SEARCH_INCLUDES = YES
INCLUDE_PATH =
INCLUDE_FILE_PATTERNS =
EXPAND_AS_DEFINED =
INCLUDE_PATH =
INCLUDE_FILE_PATTERNS =
EXPAND_AS_DEFINED =
SKIP_FUNCTION_MACROS = YES
#---------------------------------------------------------------------------
# Configuration::additions related to external references
# Configuration::additions related to external references
#---------------------------------------------------------------------------
TAGFILES = \
${DYNAMIC_GRAPH_PYTHON_DOCDIR}/html/dynamic-graph-python.doxytag=${DYNAMIC_GRAPH_PYTHON_DOCDIR}/html \
......@@ -165,10 +165,10 @@ ALLEXTERNALS = NO
EXTERNAL_GROUPS = YES
PERL_PATH = /usr/bin/perl
#---------------------------------------------------------------------------
# Configuration options related to the dot tool
# Configuration options related to the dot tool
#---------------------------------------------------------------------------
#---------------------------------------------------------------------------
# Configuration::additions related to the search engine
# Configuration::additions related to the search engine
#---------------------------------------------------------------------------
SEARCHENGINE = NO
......@@ -197,7 +197,7 @@ GENERATE_TODOLIST = YES
GENERATE_TESTLIST = NO
GENERATE_BUGLIST = NO
GENERATE_DEPRECATEDLIST= YES
ENABLED_SECTIONS =
ENABLED_SECTIONS =
SHOW_USED_FILES = NO
SHOW_DIRECTORIES = NO
#---------------------------------------------------------------------------
......@@ -207,7 +207,7 @@ SHOW_DIRECTORIES = NO
# configuration options related to the input files
#---------------------------------------------------------------------------
FILE_PATTERNS = *.hh *.idl
EXCLUDE_PATTERNS =
EXCLUDE_PATTERNS =
INPUT = ${${PROJECT_NAME}_SOURCE_DIR}/include \
${CMAKE_CURRENT_SOURCE_DIR}/additionalDoc
......@@ -261,13 +261,13 @@ GENERATE_AUTOGEN_DEF = NO
#---------------------------------------------------------------------------
GENERATE_PERLMOD = NO
#---------------------------------------------------------------------------
# Configuration options related to the preprocessor
# Configuration options related to the preprocessor
#---------------------------------------------------------------------------
#---------------------------------------------------------------------------
# Configuration::additions related to external references
# Configuration::additions related to external references
#---------------------------------------------------------------------------
#---------------------------------------------------------------------------
# Configuration options related to the dot tool
# Configuration options related to the dot tool
#---------------------------------------------------------------------------
CLASS_DIAGRAMS = YES
HIDE_UNDOC_RELATIONS = YES
......@@ -283,8 +283,8 @@ CALL_GRAPH = NO
GRAPHICAL_HIERARCHY = YES
DIRECTORY_GRAPH = YES
DOT_IMAGE_FORMAT = png
DOT_PATH =
DOTFILE_DIRS =
DOT_PATH =
DOTFILE_DIRS =
MAX_DOT_GRAPH_DEPTH = 1000
DOT_TRANSPARENT = NO
DOT_MULTI_TARGETS = YES
......
......@@ -11,7 +11,8 @@ As an example, we review below class dynamicgraph::tutorial::InvertedPendulum.
\section dg_tutorial_inverted_pendulum_cxx_interface Interface
The interface is defined in file <c>include/dynamic-graph/tutorial/inverted-pendulum.hh</c>.
The interface is defined in file
<c>include/dynamic-graph/tutorial/inverted-pendulum.hh</c>.
First, we include
\li the header defining Entity class and
......@@ -20,8 +21,8 @@ First, we include
\code
#include <dynamic-graph/entity.h>
#include <dynamic-graph/signal-ptr.h>
#include <dynamic-graph/linear-algebra.h>
#include <dynamic-graph/signal-ptr.h>
\endcode
Then in namespace <c>dynamicgraph::tutorial</c> we define class InvertedPendulum
......@@ -108,14 +109,16 @@ First, we include headers defining
\subsection dg_tutorial_inverted_pendulum_cxx_implementation_headers Headers
\code
#include <dynamic-graph/factory.h>
#include <dynamic-graph/command-setter.h>
#include <dynamic-graph/command-getter.h>
#include "dynamic-graph/tutorial/inverted-pendulum.hh"
#include <dynamic-graph/command-setter.h>
#include <dynamic-graph/factory.h>
#include "command-increment.hh"
#include "dynamic-graph/tutorial/inverted-pendulum.hh"
\endcode
\subsection dg_tutorial_inverted_pendulum_cxx_implementation_entity_registration Entity registration
\subsection dg_tutorial_inverted_pendulum_cxx_implementation_entity_registration
Entity registration
The second step consists in
\li registering our new class into the entity factory and
......@@ -130,7 +133,8 @@ using a macro defined in <c>dynamic-graph/factory.h</c>:
\li the name of the type of the corresponding python class. It is highly
recommended to use the same name for both.
\subsection dg_tutorial_inverted_pendulum_cxx_implementation_constructor Constructor
\subsection dg_tutorial_inverted_pendulum_cxx_implementation_constructor
Constructor
Then we define the class constructor
\li passing the instance name to Entity class constructor,
......@@ -160,10 +164,9 @@ We set input and output signal as constant with a given value
\endcode
The following lines of code define and register commands into the entity.
A \ref dynamicgraph::command::Command "command" is created by calling a constructor with
\li a string: the name of the command,
\li a pointer to a newly created command and
\li a string documenting the command:
A \ref dynamicgraph::command::Command "command" is created by calling a
constructor with \li a string: the name of the command, \li a pointer to a newly
created command and \li a string documenting the command:
\code
std::string docstring;
......@@ -180,10 +183,12 @@ A \ref dynamicgraph::command::Command "command" is created by calling a construc
\endcode
In this example, command::Increment is a command specific to our class
InvertedPendulum. This new command is explained in page \ref dg_tutorial_inverted_pendulum_command.
InvertedPendulum. This new command is explained in page \ref
dg_tutorial_inverted_pendulum_command.
Setter and getter commands are available through classes templated by the type of entity using the command and the type
of the parameter. Be aware that only a prespecified set of types are supported for commands, see class
Setter and getter commands are available through classes templated by the type
of entity using the command and the type of the parameter. Be aware that only a
prespecified set of types are supported for commands, see class
dynamicgraph::command::Value. \code docstring =
"\n"
" Set cart mass\n"
......@@ -203,18 +208,22 @@ dynamicgraph::command::Value. \code docstring =
\note
It is important to notice that
\li commands passed to method Entity::addCommand will be destroyed automatically by Entity class destructor. The user
should therefore not destroy them, \li commands should be defined and registered in the class constructor. Commands
\li commands passed to method Entity::addCommand will be destroyed automatically
by Entity class destructor. The user should therefore not destroy them, \li
commands should be defined and registered in the class constructor. Commands
defined later on will not be reachable by python bindings.
\subsection dg_tutorial_inverted_pendulum_cxx_implementation_newtypes Registering new types: advanced feature
\subsection dg_tutorial_inverted_pendulum_cxx_implementation_newtypes
Registering new types: advanced feature
Signals are templated by the type of data they convey. In this example, we hae defined our own class of vectors
InvertedPendulum::Vector. In order to be able to create signals with this type, we need to register the new type: \code
Signals are templated by the type of data they convey. In this example, we hae
defined our own class of vectors InvertedPendulum::Vector. In order to be able
to create signals with this type, we need to register the new type: \code
dynamicgraph::DefaultCastRegisterer<InvertedPendulum::Vector> IPVectorCast;
\endcode
\note
The new type should implement operator<< and operator>> in order to store variables in streams.
The new type should implement operator<< and operator>> in order to store
variables in streams.
*/
......@@ -23,11 +23,12 @@ We first define the new class by deriving dynamicgraph::command::Command:
The constructor takes
\li a reference to a InvertedPendulum and calls parent class,
\li a vector a types specifying the number and types of input arguments of the command and
\li a string documenting the command.
In this case, there is only one argument of type <c>double</c>. Note the use of <c>boost::assign::list_of</c> to build
a vector in one command line: \code Increment(InvertedPendulum& entity, const std::string& docstring) : Command(entity,
boost::assign::list_of(Value::DOUBLE), docstring)
\li a vector a types specifying the number and types of input arguments of the
command and \li a string documenting the command. In this case, there is only
one argument of type <c>double</c>. Note the use of
<c>boost::assign::list_of</c> to build a vector in one command line: \code
Increment(InvertedPendulum& entity, const std::string& docstring) :
Command(entity, boost::assign::list_of(Value::DOUBLE), docstring)
{
}
\endcode
......
......@@ -3,15 +3,16 @@
\section dg_tutorial_inverted_pendulum_python_intro Introduction
Generating python bindings for new Entity classes is straightforward. We only need to add the following lines into file
<c>src/CMakeLists.txt</c>:
Generating python bindings for new Entity classes is straightforward. We only
need to add the following lines into file <c>src/CMakeLists.txt</c>:
<code>
DYNAMIC_GRAPH_PYTHON_MODULE("tutorial" ${LIBRARY_NAME} wrap)
</code>
This will create and install a python module called <c>dynamic_graph.tutorial</c>, linked with library
<c>${LIBRARY_NAME} (libdynamic-graph-tutorial.so)</c>. When importing this module, two new python classes deriving from
<c>Entity</c> are created: \li InvertedPendulum, and \li FeedbackController. \sa <c>src/simu.py</c> for an example
python script.
This will create and install a python module called
<c>dynamic_graph.tutorial</c>, linked with library <c>${LIBRARY_NAME}
(libdynamic-graph-tutorial.so)</c>. When importing this module, two new python
classes deriving from <c>Entity</c> are created: \li InvertedPendulum, and \li
FeedbackController. \sa <c>src/simu.py</c> for an example python script.
*/
......@@ -3,10 +3,11 @@
\section intro_dg_tutorial Introduction
This tutorial implements a simple application of the dynamic-graph package with two entities represented by the
following classes: \li dynamicgraph::tutorial::InvertedPendulum: that implements the dynamics of a pendulum on a cart
and \li dynamicgraph::tutorial::FeedbackController: that implements a closed-loop control loop that stabilizes the
pendulum.
This tutorial implements a simple application of the dynamic-graph package with
two entities represented by the following classes: \li
dynamicgraph::tutorial::InvertedPendulum: that implements the dynamics of a
pendulum on a cart and \li dynamicgraph::tutorial::FeedbackController: that
implements a closed-loop control loop that stabilizes the pendulum.
\section dg_tutorial_inverted_pendulum_ Prerequisite
......@@ -17,9 +18,10 @@ This tutorial requires prior installation of packages:
\section dg_tutorial_inverted_pendulum_overview Overview
This tutorial show:
\li how to \ref dg_tutorial_inverted_pendulum_cxx "create a new entity" with signals and commands,
\li how to \ref dg_tutorial_inverted_pendulum_python "build a python module" to create and control this entity in a
python interpreter.
\li how to \ref dg_tutorial_inverted_pendulum_cxx "create a new entity" with
signals and commands, \li how to \ref dg_tutorial_inverted_pendulum_python
"build a python module" to create and control this entity in a python
interpreter.
*/
......@@ -8,9 +8,9 @@
#define DG_TUTORIAL_FEEDBACK_CONTROLLER_HH
#include <dynamic-graph/entity.h>
#include <dynamic-graph/linear-algebra.h>
#include <dynamic-graph/signal-ptr.h>
#include <dynamic-graph/signal-time-dependent.h>
#include <dynamic-graph/linear-algebra.h>
namespace dynamicgraph {
namespace tutorial {
......
......@@ -10,8 +10,8 @@
#define DG_TUTORIAL_INVERTED_PENDULUM_HH
#include <dynamic-graph/entity.h>
#include <dynamic-graph/signal-ptr.h>
#include <dynamic-graph/linear-algebra.h>
#include <dynamic-graph/signal-ptr.h>
namespace dynamicgraph {
namespace tutorial {
......@@ -23,9 +23,9 @@ namespace tutorial {
The equation of motion is:
\f{eqnarray*}{
\left ( M + m \right ) \ddot x - m l \ddot \theta \cos \theta + m l \dot \theta^2 \sin \theta &=& F\\
m l (-g \sin \theta - \ddot x \cos \theta + l \ddot \theta) &=& 0
\f}
\left ( M + m \right ) \ddot x - m l \ddot \theta \cos \theta + m l \dot
\theta^2 \sin \theta &=& F\\ m l (-g \sin \theta - \ddot x \cos \theta + l
\ddot \theta) &=& 0 \f}
where
\li the state is a vector of dimension 4
......@@ -82,7 +82,9 @@ class InvertedPendulum : public Entity {
virtual const std::string& getClassName(void) const { return CLASS_NAME; }
/// Header documentation of the python class
virtual std::string getDocString() const { return "Classical inverted pendulum dynamic model\n"; }
virtual std::string getDocString() const {
return "Classical inverted pendulum dynamic model\n";
}
/// Integrate equation of motion over time step given as input
void incr(double inTimeStep);
......@@ -153,7 +155,8 @@ class InvertedPendulum : public Entity {
/**
\brief Compute the evolution of the state of the pendulum
*/
::dynamicgraph::Vector computeDynamics(const ::dynamicgraph::Vector& inState, const double& inControl,
::dynamicgraph::Vector computeDynamics(const ::dynamicgraph::Vector& inState,
const double& inControl,
double inTimeStep);
};
} // namespace tutorial
......
......@@ -14,10 +14,10 @@ def build_graph():
b = dgt.FeedbackController("K")
# plug signals
stateOut = a.signal('state')
forceIn = a.signal('force')
stateIn = b.signal('state')
forceOut = b.signal('force')
stateOut = a.signal("state")
forceIn = a.signal("force")
stateIn = b.signal("state")
forceOut = b.signal("force")
dg.plug(stateOut, stateIn)
dg.plug(forceOut, forceIn)
......@@ -29,7 +29,9 @@ def build_graph():
s.value = np.array((0.0, 0.1, 0.0, 0.0))
gain = np.array((0.0, 27.0, 0.001, 0.001))
b.setGain(gain, )
b.setGain(
gain,
)
return s, f, a
......@@ -72,5 +74,5 @@ def play(nbSteps):
pl.show()
if __name__ == '__main__':
if __name__ == "__main__":
play(100)
......@@ -4,10 +4,12 @@
* Florent Lamiraux
*/
#include <dynamic-graph/factory.h>
#include <dynamic-graph/command-setter.h>
#include <dynamic-graph/command-getter.h>
#include "dynamic-graph/tutorial/feedback-controller.hh"
#include <dynamic-graph/command-getter.h>
#include <dynamic-graph/command-setter.h>
#include <dynamic-graph/factory.h>
#include "constant.hh"
using namespace dynamicgraph;
......@@ -20,8 +22,10 @@ DYNAMICGRAPH_FACTORY_ENTITY_PLUGIN(FeedbackController, "FeedbackController");
FeedbackController::FeedbackController(const std::string& inName)
: Entity(inName),
stateSIN(NULL, "FeedbackController(" + inName + ")::input(vector)::state"),
forceSOUT(stateSIN, "FeedbackController(" + inName + ")::output(double)::force"),
stateSIN(NULL,
"FeedbackController(" + inName + ")::input(vector)::state"),
forceSOUT(stateSIN,
"FeedbackController(" + inName + ")::output(double)::force"),
gain_(Matrix(4, 1)) {
// Register signals into the entity.
signalRegistration(stateSIN);
......@@ -38,7 +42,8 @@ FeedbackController::FeedbackController(const std::string& inName)
boost::function2<double&, double&, const int&> ftest =
boost::bind(&FeedbackController::computeForceFeedback, this, _1, _2);
forceSOUT.setFunction(boost::bind(&FeedbackController::computeForceFeedback, this, _1, _2));
forceSOUT.setFunction(
boost::bind(&FeedbackController::computeForceFeedback, this, _1, _2));
std::string docstring;
// setGain
docstring =
......@@ -46,8 +51,9 @@ FeedbackController::FeedbackController(const std::string& inName)
" Set gain of controller\n"
" takes a tuple of 4 floating point numbers as input\n"
"\n";
addCommand(std::string("setGain"), new ::dynamicgraph::command::Setter<FeedbackController, Matrix>(
*this, &FeedbackController::setGain, docstring));
addCommand(std::string("setGain"),
new ::dynamicgraph::command::Setter<FeedbackController, Matrix>(
*this, &FeedbackController::setGain, docstring));
// getGain
docstring =
......@@ -55,17 +61,20 @@ FeedbackController::FeedbackController(const std::string& inName)
" Get gain of controller\n"
" return a tuple of 4 floating point numbers\n"
"\n";
addCommand(std::string("getGain"), new ::dynamicgraph::command::Getter<FeedbackController, Matrix>(
*this, &FeedbackController::getGain, docstring));
addCommand(std::string("getGain"),
new ::dynamicgraph::command::Getter<FeedbackController, Matrix>(
*this, &FeedbackController::getGain, docstring));
}
FeedbackController::~FeedbackController() {}
double& FeedbackController::computeForceFeedback(double& force, const int& inTime) {
double& FeedbackController::computeForceFeedback(double& force,
const int& inTime) {
const Vector& state = stateSIN(inTime);
if (state.size() != 4)
throw dynamicgraph::ExceptionSignal(dynamicgraph::ExceptionSignal::GENERIC, "state signal size is ",
throw dynamicgraph::ExceptionSignal(dynamicgraph::ExceptionSignal::GENERIC,
"state signal size is ",
"%d, should be 4.", state.size());
Vector v(-gain_ * state);
force = v(0);
......
......@@ -4,13 +4,15 @@
* Florent Lamiraux
*/
#include "dynamic-graph/tutorial/inverted-pendulum.hh"
#include <dynamic-graph/command-getter.h>
#include <dynamic-graph/command-setter.h>
#include <dynamic-graph/factory.h>
#include <boost/format.hpp>
#include <boost/numeric/ublas/io.hpp>
#include <dynamic-graph/factory.h>
#include <dynamic-graph/command-setter.h>
#include <dynamic-graph/command-getter.h>
#include "dynamic-graph/tutorial/inverted-pendulum.hh"
#include "command-increment.hh"
#include "constant.hh"
......@@ -60,55 +62,64 @@ InvertedPendulum::InvertedPendulum(const std::string& inName)
"\n"
" Set cart mass\n"
"\n";
addCommand(std::string("setCartMass"), new ::dynamicgraph::command::Setter<InvertedPendulum,<