Index: trunk/demos/CircleFollower/uav/src/CircleFollower.cpp
===================================================================
--- trunk/demos/CircleFollower/uav/src/CircleFollower.cpp	(revision 121)
+++ trunk/demos/CircleFollower/uav/src/CircleFollower.cpp	(revision 122)
@@ -39,24 +39,29 @@
 using namespace flair::meta;
 
-CircleFollower::CircleFollower(Uav* uav,TargetController *controller): UavStateMachine(uav,controller), behaviourMode(BehaviourMode_t::Default), vrpnLost(false) {
-    uav->SetupVRPNAutoIP(uav->ObjectName());
-
+CircleFollower::CircleFollower(TargetController *controller): UavStateMachine(controller), behaviourMode(BehaviourMode_t::Default), vrpnLost(false) {
+    Uav* uav=GetUav();
+		
+		VrpnClient* vrpnclient=new VrpnClient("vrpn", uav->GetDefaultVrpnAddress(),10000, 80);
+		uavVrpn = new MetaVrpnObject(uav->ObjectName());
+		getFrameworkManager()->AddDeviceToLog(uavVrpn);
+		uav->GetAhrs()->YawPlot()->AddCurve(uavVrpn->State()->Element(2),DataPlot::Green);
+																 
     startCircle=new PushButton(GetButtonsLayout()->NewRow(),"start_circle");
     stopCircle=new PushButton(GetButtonsLayout()->LastRowLastCol(),"stop_circle");
 
-    if(uav->GetVrpnClient()->UseXbee()==true) {
-        targetVrpn=new MetaVrpnObject(uav->GetVrpnClient(),"target",1);
+    if(vrpnclient->UseXbee()==true) {
+        targetVrpn=new MetaVrpnObject("target",1);
     } else {
-        targetVrpn=new MetaVrpnObject(uav->GetVrpnClient(),"target");
+        targetVrpn=new MetaVrpnObject("target");
     }
 
     getFrameworkManager()->AddDeviceToLog(targetVrpn);
 
-    circle=new TrajectoryGenerator2DCircle(uav->GetVrpnClient()->GetLayout()->NewRow(),"circle");
-    uav->GetVrpnObject()->xPlot()->AddCurve(circle->Matrix()->Element(0,0),DataPlot::Blue);
-    uav->GetVrpnObject()->yPlot()->AddCurve(circle->Matrix()->Element(0,1),DataPlot::Blue);
-    uav->GetVrpnObject()->VxPlot()->AddCurve(circle->Matrix()->Element(1,0),DataPlot::Blue);
-    uav->GetVrpnObject()->VyPlot()->AddCurve(circle->Matrix()->Element(1,1),DataPlot::Blue);
-    uav->GetVrpnObject()->XyPlot()->AddCurve(circle->Matrix()->Element(0,1),circle->Matrix()->Element(0,0),DataPlot::Blue,"circle");
+    circle=new TrajectoryGenerator2DCircle(vrpnclient->GetLayout()->NewRow(),"circle");
+    uavVrpn->xPlot()->AddCurve(circle->Matrix()->Element(0,0),DataPlot::Blue);
+    uavVrpn->yPlot()->AddCurve(circle->Matrix()->Element(0,1),DataPlot::Blue);
+    uavVrpn->VxPlot()->AddCurve(circle->Matrix()->Element(1,0),DataPlot::Blue);
+    uavVrpn->VyPlot()->AddCurve(circle->Matrix()->Element(1,1),DataPlot::Blue);
+    uavVrpn->XyPlot()->AddCurve(circle->Matrix()->Element(0,1),circle->Matrix()->Element(0,0),DataPlot::Blue,"circle");
 
     uX=new Pid(setupLawTab->At(1,0),"u_x");
@@ -79,5 +84,5 @@
     //get yaw from vrpn
     Euler vrpnEuler;
-    GetUav()->GetVrpnObject()->GetEuler(vrpnEuler);
+    uavVrpn->GetEuler(vrpnEuler);
 
     //get roll, pitch and w from imu
@@ -98,6 +103,6 @@
     Vector3D uav_pos,uav_vel;
 
-    GetUav()->GetVrpnObject()->GetPosition(uav_pos);
-    GetUav()->GetVrpnObject()->GetSpeed(uav_vel);
+    uavVrpn->GetPosition(uav_pos);
+    uavVrpn->GetSpeed(uav_vel);
     //z and dz must be in uav's frame
     z=-uav_pos.z;
@@ -131,6 +136,6 @@
     Vector2D uav_2Dpos,uav_2Dvel; // in VRPN coordinate system
 
-    GetUav()->GetVrpnObject()->GetPosition(uav_pos);
-    GetUav()->GetVrpnObject()->GetSpeed(uav_vel);
+    uavVrpn->GetPosition(uav_pos);
+    uavVrpn->GetSpeed(uav_vel);
 
     uav_pos.To2Dxy(uav_2Dpos);
@@ -195,5 +200,5 @@
             Land();
         }
-        if (!GetUav()->GetVrpnObject()->IsTracked(500)) {
+        if (!uavVrpn->IsTracked(500)) {
             Thread::Err("VRPN, uav lost\n");
             vrpnLost=true;
@@ -239,5 +244,5 @@
     circle->SetCenter(target_2Dpos);
 
-    GetUav()->GetVrpnObject()->GetPosition(uav_pos);
+    uavVrpn->GetPosition(uav_pos);
     uav_pos.To2Dxy(uav_2Dpos);
     circle->StartTraj(uav_2Dpos);
@@ -258,8 +263,8 @@
     Vector3D vrpn_pos;
 
-    GetUav()->GetVrpnObject()->GetEuler(vrpn_euler);
+    uavVrpn->GetEuler(vrpn_euler);
     yawHold=vrpn_euler.yaw;
 
-    GetUav()->GetVrpnObject()->GetPosition(vrpn_pos);
+    uavVrpn->GetPosition(vrpn_pos);
     vrpn_pos.To2Dxy(posHold);
 
Index: trunk/demos/CircleFollower/uav/src/CircleFollower.h
===================================================================
--- trunk/demos/CircleFollower/uav/src/CircleFollower.h	(revision 121)
+++ trunk/demos/CircleFollower/uav/src/CircleFollower.h	(revision 122)
@@ -34,5 +34,5 @@
 class CircleFollower : public flair::meta::UavStateMachine {
     public:
-        CircleFollower(flair::meta::Uav* uav,flair::sensor::TargetController *controller);
+        CircleFollower(flair::sensor::TargetController *controller);
         ~CircleFollower();
 
@@ -65,5 +65,5 @@
 
         flair::gui::PushButton *startCircle,*stopCircle;
-        flair::meta::MetaVrpnObject *targetVrpn;
+        flair::meta::MetaVrpnObject *targetVrpn,*uavVrpn;
         flair::filter::TrajectoryGenerator2DCircle *circle;
         flair::core::AhrsData *customReferenceOrientation,*customOrientation;
Index: trunk/demos/CircleFollower/uav/src/main.cpp
===================================================================
--- trunk/demos/CircleFollower/uav/src/main.cpp	(revision 121)
+++ trunk/demos/CircleFollower/uav/src/main.cpp	(revision 122)
@@ -45,7 +45,7 @@
     manager->SetupLogger(log_path);
 
-    Uav* drone=CreateUav(manager,name,uav_type);
+    Uav* drone=CreateUav(name,uav_type);
     TargetEthController *controller=new TargetEthController(manager,"Dualshock3",ds3port);
-    CircleFollower* demo=new CircleFollower(drone,controller);
+    CircleFollower* demo=new CircleFollower(controller);
 
     demo->Start();
Index: trunk/demos/Gps/uav/CMakeLists.txt
===================================================================
--- trunk/demos/Gps/uav/CMakeLists.txt	(revision 121)
+++ trunk/demos/Gps/uav/CMakeLists.txt	(revision 122)
@@ -6,5 +6,4 @@
 SET(FLAIR_USE_SENSOR_ACTUATOR TRUE)
 SET(FLAIR_USE_META TRUE)
-SET(FLAIR_USE_VRPN TRUE)
 SET(FLAIR_USE_GPS TRUE)
 
Index: trunk/demos/Gps/uav/src/DemoGps.cpp
===================================================================
--- trunk/demos/Gps/uav/src/DemoGps.cpp	(revision 121)
+++ trunk/demos/Gps/uav/src/DemoGps.cpp	(revision 122)
@@ -39,6 +39,6 @@
 using namespace flair::meta;
 
-DemoGps::DemoGps(Uav* uav,TargetController *controller): UavStateMachine(uav,controller), behaviourMode(BehaviourMode_t::Default) {
-
+DemoGps::DemoGps(TargetController *controller): UavStateMachine(controller), behaviourMode(BehaviourMode_t::Default) {
+		Uav* uav=GetUav();
     startCircle=new PushButton(GetButtonsLayout()->NewRow(),"start_circle");
     stopCircle=new PushButton(GetButtonsLayout()->LastRowLastCol(),"stop_circle");
Index: trunk/demos/Gps/uav/src/DemoGps.h
===================================================================
--- trunk/demos/Gps/uav/src/DemoGps.h	(revision 121)
+++ trunk/demos/Gps/uav/src/DemoGps.h	(revision 122)
@@ -33,5 +33,5 @@
 class DemoGps : public flair::meta::UavStateMachine {
     public:
-        DemoGps(flair::meta::Uav* uav,flair::sensor::TargetController *controller);
+        DemoGps(flair::sensor::TargetController *controller);
         ~DemoGps();
 
Index: trunk/demos/Gps/uav/src/main.cpp
===================================================================
--- trunk/demos/Gps/uav/src/main.cpp	(revision 121)
+++ trunk/demos/Gps/uav/src/main.cpp	(revision 122)
@@ -45,7 +45,7 @@
     manager->SetupLogger(log_path);
 
-    Uav* drone=CreateUav(manager,name,uav_type);
+    Uav* drone=CreateUav(name,uav_type);
     TargetEthController *controller=new TargetEthController(manager,"Dualshock3",ds3port);
-    DemoGps* demo=new DemoGps(drone,controller);
+    DemoGps* demo=new DemoGps(controller);
 
     demo->Start();
Index: trunk/demos/OpticalFlow/simulator/CMakeLists.txt
===================================================================
--- trunk/demos/OpticalFlow/simulator/CMakeLists.txt	(revision 122)
+++ trunk/demos/OpticalFlow/simulator/CMakeLists.txt	(revision 122)
@@ -0,0 +1,35 @@
+PROJECT(OpticalFlow_simulator)
+cmake_minimum_required(VERSION 2.8)
+
+SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
+SET(FLAIR_USE_SIMULATOR TRUE)
+SET(FLAIR_USE_SIMULATOR_GL TRUE)
+
+include($ENV{FLAIR_ROOT}/flair-dev/cmake-modules/GlobalCmakeFlair.cmake)
+include(${FLAIR_USE_FILE})
+
+SET(SRC_FILES
+	${CMAKE_SOURCE_DIR}/src/main.cpp
+)
+
+LINK_DIRECTORIES (
+	${FLAIR_LIBRARY_DIR}
+)
+
+INCLUDE_DIRECTORIES(
+	${FLAIR_INCLUDE_DIR}
+)
+
+#real time executable
+ADD_EXECUTABLE(${PROJECT_NAME}_rt
+	${SRC_FILES}
+)
+
+TARGET_LINK_LIBRARIES(${PROJECT_NAME}_rt ${FLAIR_LIBRARIES_RT})
+
+#non real time executable
+ADD_EXECUTABLE(${PROJECT_NAME}_nrt
+	${SRC_FILES}
+)
+
+TARGET_LINK_LIBRARIES(${PROJECT_NAME}_nrt ${FLAIR_LIBRARIES_NRT})
Index: trunk/demos/OpticalFlow/simulator/build_x86_64/bin/setup_x4.xml
===================================================================
--- trunk/demos/OpticalFlow/simulator/build_x86_64/bin/setup_x4.xml	(revision 122)
+++ trunk/demos/OpticalFlow/simulator/build_x86_64/bin/setup_x4.xml	(revision 122)
@@ -0,0 +1,64 @@
+<?xml version="1.0"?>
+<!DOCTYPE remote_ui_xml>
+<root name="interface">
+  <TabWidget name="Main_TabWidget">
+ <Tab name="x4_0">
+  <TabWidget name="tabs">
+   <Tab name="sampling">
+    <DoubleSpinBox value="0.001" name="Tech (s):"/>
+   </Tab>
+   <Tab name="optitrack">
+    <CheckBox value="1" name="enabled"/>
+   </Tab>
+   <Tab name="init">
+    <DoubleSpinBox value="-1.5" name="x:"/>
+    <DoubleSpinBox value="0" name="y:"/>
+    <DoubleSpinBox value="-3.5" name="z:"/>
+    <SpinBox value="0" name="yaw (deg):"/>
+   <Vector3DSpinBox name="position" value_x="0.00" value_y="0.00" value_z="-1.00"/></Tab>
+   <Tab name="model">
+    <DoubleSpinBox value="1.2" name="mass (kg):"/>
+    <DoubleSpinBox value="0.2" name="arm length (m):"/>
+    <DoubleSpinBox value="0.001" name="k_mot:"/>
+    <DoubleSpinBox value="0.001" name="c_mot:"/>
+    <DoubleSpinBox value="0.01" name="f_air_vert:"/>
+    <DoubleSpinBox value="0.4" name="f_air_lat:"/>
+    <DoubleSpinBox value="0.006" name="j_roll:"/>
+    <DoubleSpinBox value="0.006" name="j_pitch:"/>
+    <DoubleSpinBox value="0.1" name="j_yaw:"/>
+   </Tab>
+   <Tab name="us">
+    <GroupBox name="position">
+     <DoubleSpinBox value="0" name="x:"/>
+     <DoubleSpinBox value="0" name="y:"/>
+     <DoubleSpinBox value="0.04" name="z:"/>
+    </GroupBox>
+    <GroupBox name="direction">
+     <DoubleSpinBox value="0" name="x:"/>
+     <DoubleSpinBox value="0" name="y:"/>
+     <DoubleSpinBox value="1" name="z:"/>
+    </GroupBox>
+    <DoubleSpinBox value="6" name="range:"/>
+   <Vector3DSpinBox name="position" value_x="0.00" value_y="0.00" value_z="0.04"/><Vector3DSpinBox name="direction" value_x="0.00" value_y="0.00" value_z="1.00"/></Tab>
+   <Tab name="bottom camera">
+    <GroupBox name="position">
+     <DoubleSpinBox value="0" name="x:"/>
+     <DoubleSpinBox value="0" name="y:"/>
+     <DoubleSpinBox value="0" name="z:"/>
+    </GroupBox>
+    <GroupBox name="direction">
+     <DoubleSpinBox value="0" name="x:"/>
+     <DoubleSpinBox value="0" name="y:"/>
+     <DoubleSpinBox value="1" name="z:"/>
+    </GroupBox>
+    <GroupBox name="up">
+     <DoubleSpinBox value="1" name="x:"/>
+     <DoubleSpinBox value="0" name="y:"/>
+     <DoubleSpinBox value="0" name="z:"/>
+    </GroupBox>
+    <DoubleSpinBox value="70" name="fov:"/>
+   <Vector3DSpinBox name="position" value_x="0" value_y="0" value_z="0"/><Vector3DSpinBox name="direction" value_x="0.00" value_y="0.00" value_z="1.00"/><Vector3DSpinBox name="up" value_x="1.00" value_y="0.00" value_z="0.00"/></Tab>
+  </TabWidget>
+ </Tab>
+  </TabWidget>
+<TabWidget name="App_TabWidget"><Tab name="simulator"><PushButton name="save config on target" value="1"/></Tab></TabWidget><PushButton name="save config on target (simulator)" value="1"/></root>
Index: trunk/demos/OpticalFlow/simulator/build_x86_64/bin/setup_x8.xml
===================================================================
--- trunk/demos/OpticalFlow/simulator/build_x86_64/bin/setup_x8.xml	(revision 122)
+++ trunk/demos/OpticalFlow/simulator/build_x86_64/bin/setup_x8.xml	(revision 122)
@@ -0,0 +1,68 @@
+<?xml version="1.0"?>
+<!DOCTYPE remote_ui_xml>
+<root name="interface">
+  <TabWidget name="Main_TabWidget">
+ <Tab name="x8_0">
+  <TabWidget name="tabs">
+   <Tab name="sampling">
+    <DoubleSpinBox value="0.001" name="Tech (s):"/>
+   </Tab>
+   <Tab name="optitrack">
+    <CheckBox value="1" name="enabled"/>
+   </Tab>
+   <Tab name="init">
+    <DoubleSpinBox value="-1.5" name="x:"/>
+    <DoubleSpinBox value="0" name="y:"/>
+    <DoubleSpinBox value="-1.2" name="z:"/>
+    <SpinBox value="20" name="yaw (deg):"/>
+   <Vector3DSpinBox name="position" value_x="0.00" value_y="0.00" value_z="-1.00"/></Tab>
+   <Tab name="model">
+    <DoubleSpinBox value="1.6" name="mass (kg):"/>
+    <DoubleSpinBox value="0.2" name="arm length (m):"/>
+    <DoubleSpinBox value="0" name="position G (m):"/>
+    <DoubleSpinBox value="0.001" name="k_mot:"/>
+    <DoubleSpinBox value="0.001" name="c_mot:"/>
+    <DoubleSpinBox value="0.01" name="f_air_vert:"/>
+    <DoubleSpinBox value="0.4" name="f_air_lat:"/>
+    <DoubleSpinBox value="0.006" name="j_roll:"/>
+    <DoubleSpinBox value="0.006" name="j_pitch:"/>
+    <DoubleSpinBox value="0.1" name="j_yaw:"/>
+    <DoubleSpinBox value="0" name="j_r:"/>
+    <DoubleSpinBox value="0.72" name="sigma:"/>
+    <DoubleSpinBox value="1" name="S:"/>
+   </Tab>
+   <Tab name="us">
+    <GroupBox name="position">
+     <DoubleSpinBox value="0" name="x:"/>
+     <DoubleSpinBox value="0" name="y:"/>
+     <DoubleSpinBox value="0.04" name="z:"/>
+    </GroupBox>
+    <GroupBox name="direction">
+     <DoubleSpinBox value="0" name="x:"/>
+     <DoubleSpinBox value="0" name="y:"/>
+     <DoubleSpinBox value="1" name="z:"/>
+    </GroupBox>
+    <DoubleSpinBox value="6" name="range:"/>
+   <Vector3DSpinBox name="position" value_x="0.00" value_y="0.00" value_z="0.04"/><Vector3DSpinBox name="direction" value_x="0.00" value_y="0.00" value_z="1.00"/></Tab>
+   <Tab name="bottom camera">
+    <GroupBox name="position">
+     <DoubleSpinBox value="0" name="x:"/>
+     <DoubleSpinBox value="0" name="y:"/>
+     <DoubleSpinBox value="0" name="z:"/>
+    </GroupBox>
+    <GroupBox name="direction">
+     <DoubleSpinBox value="0" name="x:"/>
+     <DoubleSpinBox value="0" name="y:"/>
+     <DoubleSpinBox value="1" name="z:"/>
+    </GroupBox>
+    <GroupBox name="up">
+     <DoubleSpinBox value="1" name="x:"/>
+     <DoubleSpinBox value="0" name="y:"/>
+     <DoubleSpinBox value="0" name="z:"/>
+    </GroupBox>
+    <DoubleSpinBox value="70" name="fov:"/>
+   <Vector3DSpinBox name="position" value_x="0" value_y="0" value_z="0"/><Vector3DSpinBox name="direction" value_x="0.00" value_y="0.00" value_z="1.00"/><Vector3DSpinBox name="up" value_x="1.00" value_y="0.00" value_z="0.00"/></Tab>
+  </TabWidget>
+ </Tab>
+</TabWidget>
+<TabWidget name="App_TabWidget"><Tab name="simulator"><PushButton name="save config on target" value="1"/></Tab></TabWidget><PushButton name="save config on target (simulator)" value="1"/></root>
Index: trunk/demos/OpticalFlow/simulator/build_x86_64/bin/simulator_x4.sh
===================================================================
--- trunk/demos/OpticalFlow/simulator/build_x86_64/bin/simulator_x4.sh	(revision 122)
+++ trunk/demos/OpticalFlow/simulator/build_x86_64/bin/simulator_x4.sh	(revision 122)
@@ -0,0 +1,11 @@
+#! /bin/bash
+
+. $FLAIR_ROOT/flair-dev/scripts/ubuntu_cgroup_hack.sh
+
+if [ -f /proc/xenomai/version ];then
+	EXEC=./OpticalFlow_simulator_rt
+else
+	EXEC=./OpticalFlow_simulator_nrt
+fi
+
+$EXEC -n x4_0 -t x4 -a 127.0.0.1 -p 9000 -x setup_x4.xml -o 10 -m $FLAIR_ROOT/flair-bin/models -s $FLAIR_ROOT/flair-bin/models/indoor_flight_arena.xml
Index: trunk/demos/OpticalFlow/simulator/build_x86_64/bin/simulator_x8.sh
===================================================================
--- trunk/demos/OpticalFlow/simulator/build_x86_64/bin/simulator_x8.sh	(revision 122)
+++ trunk/demos/OpticalFlow/simulator/build_x86_64/bin/simulator_x8.sh	(revision 122)
@@ -0,0 +1,11 @@
+#! /bin/bash
+
+. $FLAIR_ROOT/flair-dev/scripts/ubuntu_cgroup_hack.sh
+
+if [ -f /proc/xenomai/version ];then
+	EXEC=./OpticalFlow_simulator_rt
+else
+	EXEC=./OpticalFlow_simulator_nrt
+fi
+
+$EXEC -n x8_0 -t x8 -a 127.0.0.1 -p 9000 -x setup_x8.xml -o 10 -m $FLAIR_ROOT/flair-bin/models -s $FLAIR_ROOT/flair-bin/models/indoor_flight_arena.xml
Index: trunk/demos/OpticalFlow/simulator/src/main.cpp
===================================================================
--- trunk/demos/OpticalFlow/simulator/src/main.cpp	(revision 122)
+++ trunk/demos/OpticalFlow/simulator/src/main.cpp	(revision 122)
@@ -0,0 +1,134 @@
+//  created:    2012/04/18
+//  filename:   main.cpp
+//
+//  author:     Guillaume Sanahuja
+//              Copyright Heudiasyc UMR UTC/CNRS 6599
+//
+//  version:    $Id: $
+//
+//  purpose:    main simulateur
+//
+//
+/*********************************************************************/
+
+#include <tclap/CmdLine.h>
+#include <Simulator.h>
+#include <X4.h>
+#include <X8.h>
+#include <SimuImu.h>
+#ifdef GL
+#include <SimuCameraGL.h>
+#include <Parser.h>
+#include <SimuUsGL.h>
+#endif
+
+
+using namespace TCLAP;
+using namespace std;
+using namespace flair::simulator;
+using namespace flair::sensor;
+
+int port;
+int opti_time;
+string xml_file;
+string media_path;
+string scene_file;
+string type;
+string name;
+string address;
+
+void parseOptions(int argc, char** argv)
+{
+	try
+	{
+        CmdLine cmd("Command description message", ' ', "0.1");
+
+        ValueArg<string> nameArg("n","name","uav name, also used for vrpn",true,"x4","string");
+        cmd.add( nameArg );
+
+        ValueArg<string> xmlArg("x","xml","xml file",true,"./reglages.xml","string");
+        cmd.add( xmlArg );
+
+        ValueArg<int> portArg("p","port","ground station port",true,9002,"int");
+        cmd.add( portArg );
+
+        ValueArg<string> addressArg("a","address","ground station address",true,"127.0.0.1","string");
+        cmd.add( addressArg );
+
+        ValueArg<string> typeArg("t","type","uav type, x4 or x8",true,"x4","string");
+        cmd.add( typeArg );
+
+
+        ValueArg<int> optiArg("o","opti","optitrack time ms",false,0,"int");
+        cmd.add( optiArg );
+
+#ifdef GL
+        ValueArg<string> mediaArg("m","media","path to media files",true,"./","string");
+        cmd.add( mediaArg );
+
+        ValueArg<string> sceneArg("s","scene","path to scene file",true,"./voliere.xml","string");
+        cmd.add( sceneArg );
+#endif
+
+        cmd.parse( argc, argv );
+
+        // Get the value parsed by each arg.
+        port=portArg.getValue();
+        xml_file = xmlArg.getValue();
+        opti_time = optiArg.getValue();
+        type = typeArg.getValue();
+        name=nameArg.getValue();
+        address=addressArg.getValue();
+#ifdef GL
+        media_path=mediaArg.getValue();
+        scene_file=sceneArg.getValue();
+#endif
+
+	} catch (ArgException &e)  // catch any exceptions
+	{ cerr << "error: " << e.error() << " for arg " << e.argId() << endl; }
+}
+
+
+int main(int argc, char* argv[])
+{
+    Simulator *simu;
+    Model *drone;
+    SimuImu* imu;
+#ifdef GL
+    SimuUsGL* us_gl;
+
+    SimuCameraGL *cam_bas;
+    Parser *gui;
+#endif
+    parseOptions(argc,argv);
+
+    simu= new Simulator("simulator",opti_time,90);
+    simu->SetupConnection(address,port);
+    simu->SetupUserInterface(xml_file);
+
+#ifdef GL
+    gui=new Parser(simu,960,480,640,480,media_path,scene_file);
+#endif
+
+    if(type=="x4")
+    {
+        drone=new X4(simu,name,0);
+    }
+    else
+    {
+        drone=new X8(simu,name,0);
+    }
+    imu=new SimuImu(drone,"imu",0);
+
+#ifdef GL
+    us_gl=new SimuUsGL(drone,"us",0);
+    cam_bas=new SimuCameraGL(drone,"bottom camera",320,240,640,0,0);
+#endif
+
+    simu->RunSimu();
+
+    delete simu;
+
+	return 0;
+}
+
Index: trunk/demos/OpticalFlow/uav/CMakeLists.txt
===================================================================
--- trunk/demos/OpticalFlow/uav/CMakeLists.txt	(revision 122)
+++ trunk/demos/OpticalFlow/uav/CMakeLists.txt	(revision 122)
@@ -0,0 +1,34 @@
+PROJECT(OpticalFlow)
+cmake_minimum_required(VERSION 2.8)
+
+SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
+SET(FLAIR_USE_FILTER TRUE)
+#SET(FLAIR_USE_VISION_FILTER TRUE)
+SET(FLAIR_USE_SENSOR_ACTUATOR TRUE)
+SET(FLAIR_USE_META TRUE)
+
+include($ENV{FLAIR_ROOT}/flair-dev/cmake-modules/GlobalCmakeFlair.cmake)
+include(${FLAIR_USE_FILE})
+
+SET(SRC_FILES
+	${CMAKE_SOURCE_DIR}/src/main.cpp
+	${CMAKE_SOURCE_DIR}/src/DemoOpticalFlow.cpp
+)
+
+INCLUDE_DIRECTORIES(
+	${FLAIR_INCLUDE_DIR}
+)
+
+#real time executable
+ADD_EXECUTABLE(${PROJECT_NAME}_rt
+	${SRC_FILES}
+)
+
+TARGET_LINK_LIBRARIES(${PROJECT_NAME}_rt ${FLAIR_LIBRARIES_RT})
+
+#non real time executable
+ADD_EXECUTABLE(${PROJECT_NAME}_nrt
+	${SRC_FILES}
+)
+
+TARGET_LINK_LIBRARIES(${PROJECT_NAME}_nrt ${FLAIR_LIBRARIES_NRT})
Index: trunk/demos/OpticalFlow/uav/build_arm/bin/OpticalFlow_ardrone2.sh
===================================================================
--- trunk/demos/OpticalFlow/uav/build_arm/bin/OpticalFlow_ardrone2.sh	(revision 122)
+++ trunk/demos/OpticalFlow/uav/build_arm/bin/OpticalFlow_ardrone2.sh	(revision 122)
@@ -0,0 +1,1 @@
+./demo_fo_nrt -a 192.168.147.193 -p 9000 -l /tmp -x OpticalFlow_ardrone2.xml -n Drone_0 -t ardrone2 -d ./dspcv_dsp.out
Index: trunk/demos/OpticalFlow/uav/build_arm/bin/OpticalFlow_ardrone2.xml
===================================================================
--- trunk/demos/OpticalFlow/uav/build_arm/bin/OpticalFlow_ardrone2.xml	(revision 122)
+++ trunk/demos/OpticalFlow/uav/build_arm/bin/OpticalFlow_ardrone2.xml	(revision 122)
@@ -0,0 +1,267 @@
+<?xml version="1.0"?>
+<root name="FrameworkManager">
+  <TabWidget name="Main_TabWidget">
+    <Tab name="x4-multiplex">
+      <TabWidget name="UavMultiplex">
+        <Tab name="Setup">
+          <GroupBox name="x4 multiplex">
+            <ComboBox name="front left blade pitch:" value="1"/>
+          </GroupBox>
+          <GroupBox name="motor attribution">
+            <ComboBox name="front left" value="0"/>
+            <ComboBox name="front rigth" value="1"/>
+            <ComboBox name="rear left" value="2"/>
+            <ComboBox name="rear rigth" value="3"/>
+          </GroupBox>
+          <GroupBox name="bldc">
+            <Label name="flight time"/>
+            <DoubleSpinBox name="min value:" value="0.4"/>
+            <DoubleSpinBox name="max value:" value="1"/>
+            <DoubleSpinBox name="test value:" value="0.2"/>
+            <PushButton name="test motor 0"/>
+            <PushButton name="test motor 1"/>
+            <PushButton name="test motor 2"/>
+            <PushButton name="test motor 3"/>
+          </GroupBox>
+        </Tab>
+        <Tab name="Values">
+          <DataPlot1D name="front left" period="100" enabled="0"/>
+          <DataPlot1D name="front right" period="100" enabled="0"/>
+          <DataPlot1D name="rear left" period="100" enabled="0"/>
+          <DataPlot1D name="rear right" period="100" enabled="0"/>
+        </Tab>
+      </TabWidget>
+    </Tab>
+    <Tab name="parrot-us">
+      <TabWidget name="parrot-us">
+        <Tab name="Reglages">
+          <GroupBox name="parrot-us"/>
+          <GroupBox name="Passe bas">
+            <DoubleSpinBox name="period, 0 for auto" value="0"/>
+            <DoubleSpinBox name="cutoff frequency" value="5"/>
+          </GroupBox>
+          <GroupBox name="Vz">
+            <DoubleSpinBox name="period, 0 for auto:" value="0"/>
+          </GroupBox>
+          <GroupBox name="Passe bas v">
+            <DoubleSpinBox name="period, 0 for auto" value="0"/>
+            <DoubleSpinBox name="cutoff frequency" value="10"/>
+          </GroupBox>
+        </Tab>
+        <Tab name="Mesures">
+          <DataPlot1D name="parrot-us" period="100" enabled="0"/>
+          <DataPlot1D name="vz" period="100" enabled="0"/>
+        </Tab>
+      </TabWidget>
+    </Tab>
+    <Tab name="parrot-imu">
+      <TabWidget name="parrot-imu">
+        <Tab name="Reglages">
+          <GroupBox name="parrot-imu"/>
+          <GroupBox name="post rotation">
+            <DoubleSpinBox name="value" value="0"/>
+            <ComboBox name="axis" value="0"/>
+          </GroupBox>
+          <DoubleSpinBox name="k_a[0]:" value="0.5"/>
+          <DoubleSpinBox name="k_a[1]:" value="0.5"/>
+          <DoubleSpinBox name="k_a[2]:" value="0"/>
+          <DoubleSpinBox name="k_b[0]:" value="0.01"/>
+          <DoubleSpinBox name="k_b[1]:" value="0.01"/>
+          <DoubleSpinBox name="k_b[2]:" value="0.01"/>
+        </Tab>
+        <Tab name="AHRS">
+          <DataPlot1D name="roll" period="100" enabled="0"/>
+          <DataPlot1D name="pitch" period="100" enabled="0"/>
+          <DataPlot1D name="yaw" period="100" enabled="0"/>
+          <DataPlot1D name="w_x" period="100" enabled="0"/>
+          <DataPlot1D name="w_y" period="100" enabled="0"/>
+          <DataPlot1D name="w_z" period="100" enabled="0"/>
+        </Tab>
+        <Tab name="IMU">
+          <DataPlot1D name="acc_x" period="100" enabled="0"/>
+          <DataPlot1D name="acc_y" period="100" enabled="0"/>
+          <DataPlot1D name="acc_z" period="100" enabled="0"/>
+          <DataPlot1D name="gyr_x" period="100" enabled="0"/>
+          <DataPlot1D name="gyr_y" period="100" enabled="0"/>
+          <DataPlot1D name="gyr_z" period="100" enabled="0"/>
+          <DataPlot1D name="mag_x" period="100" enabled="0"/>
+          <DataPlot1D name="mag_y" period="100" enabled="0"/>
+          <DataPlot1D name="mag_z" period="100" enabled="0"/>
+        </Tab>
+      </TabWidget>
+    </Tab>
+    <Tab name="battery">
+      <GroupBox name="battery">
+        <Label name="battery"/>
+        <DoubleSpinBox name="threshold" value="10.5"/>
+      </GroupBox>
+    </Tab>
+    <Tab name="camv">
+      <TabWidget name="camv">
+        <Tab name="Setup">
+          <GroupBox name="camv">
+            <DoubleSpinBox name="gain:" value="0.5"/>
+            <DoubleSpinBox name="exposure:" value="0.5"/>
+            <DoubleSpinBox name="bright:" value="0.5"/>
+            <DoubleSpinBox name="contrast:" value="0.5"/>
+            <DoubleSpinBox name="hue:" value="0.5"/>
+            <DoubleSpinBox name="sharpness:" value="0.5"/>
+            <DoubleSpinBox name="saturation:" value="0.5"/>
+            <CheckBox name="autogain:" value="1"/>
+            <CheckBox name="autoexposure:" value="1"/>
+            <CheckBox name="awb:" value="1"/>
+          <Label name="fps"/></GroupBox>
+          <GridLayout name="setup">
+            <GroupBox name="flux optique">
+              <GroupBox name="post rotation">
+                <DoubleSpinBox name="value" value="90"/>
+                <ComboBox name="axis" value="2"/>
+              </GroupBox>
+              <SpinBox name="max features:" value="64"/>
+            </GroupBox>
+            <GroupBox name="passe bas">
+              <DoubleSpinBox name="period, 0 for auto" value="0"/>
+              <DoubleSpinBox name="cutoff frequency" value="2"/>
+            </GroupBox>
+            <GroupBox name="sobel along x">
+              <SpinBox name="dx:" value="1"/>
+              <SpinBox name="dy:" value="0"/>
+            </GroupBox>
+            <GroupBox name="threshold">
+              <SpinBox name="threshold:" value="127"/>
+            </GroupBox>
+            <GroupBox name="houghlines">
+              <SpinBox name="full rho step:" value="4"/>
+              <DoubleSpinBox name="full theta step:" value="4"/>
+              <SpinBox name="tracking rho step:" value="4"/>
+              <DoubleSpinBox name="tracking theta step:" value="1"/>
+              <DoubleSpinBox name="tracking delta theta:" value="10"/>
+              <SpinBox name="nb points:" value="100"/>
+            </GroupBox>
+          </GridLayout>
+        </Tab>
+        <Tab name="Picture">
+          <Picture name="camv" period="500" enabled="0"/>
+          <Picture name="sobel along x" period="500" enabled="0"/>
+          <Picture name="threshold" period="500" enabled="0"/>
+          <GridLayout name="hough">
+            <DataPlot1D name="distance" period="100" enabled="1"/>
+            <DataPlot1D name="orientation" period="100" enabled="1"/>
+            <DataPlot1D name="line detected" period="100" enabled="1"/>
+          </GridLayout>
+        <DataPlot1D name="distance" period="100" enabled="1"/><DataPlot1D name="orientation" period="100" enabled="1"/><DataPlot1D name="line detected" period="100" enabled="1"/></Tab>
+      </TabWidget>
+    </Tab>
+    <Tab name="uav">
+      <GridLayout name="buttons">
+        <PushButton name="kill"/>
+        <PushButton name="start_log"/>
+        <PushButton name="stop_log"/>
+        <PushButton name="take_off"/>
+        <PushButton name="land"/>
+      </GridLayout>
+      <GroupBox name="takeoff/landing">
+        <DoubleSpinBox name="desired takeoff altitude" value="0.7"/>
+        <DoubleSpinBox name="desired landing altitude" value="0"/>
+      </GroupBox>
+      <GroupBox name="alt cons">
+        <DoubleSpinBox name="period, 0 for auto:" value="0"/>
+        <DoubleSpinBox name="velocity max (absolute):" value="1"/>
+        <DoubleSpinBox name="acceleration (absolute):" value="0.8"/>
+      </GroupBox>
+    </Tab>
+    <Tab name="control laws">
+      <TabWidget name="laws">
+        <Tab name="Setup">
+          <GroupBox name="u_roll">
+            <DoubleSpinBox name="sat ref:" value="20"/>
+            <DoubleSpinBox name="kp:" value="12"/>
+            <DoubleSpinBox name="sat dref:" value="1000"/>
+            <DoubleSpinBox name="kd:" value="0.2"/>
+            <DoubleSpinBox name="sat u:" value="0.4"/>
+          </GroupBox>
+          <GroupBox name="u_pitch">
+            <DoubleSpinBox name="sat ref:" value="20"/>
+            <DoubleSpinBox name="kp:" value="12"/>
+            <DoubleSpinBox name="sat dref:" value="1000"/>
+            <DoubleSpinBox name="kd:" value="0.2"/>
+            <DoubleSpinBox name="sat u:" value="0.4"/>
+          </GroupBox>
+          <GroupBox name="u_yaw">
+            <DoubleSpinBox name="period, 0 for auto" value="0"/>
+            <DoubleSpinBox name="kp:" value="0.6"/>
+            <DoubleSpinBox name="ki:" value="0.1"/>
+            <DoubleSpinBox name="sat i:" value="0.2"/>
+            <DoubleSpinBox name="kd:" value="0.2"/>
+            <DoubleSpinBox name="sat:" value="0.5"/>
+          </GroupBox>
+          <GroupBox name="u_z">
+            <DoubleSpinBox name="period, 0 for auto" value="0"/>
+            <DoubleSpinBox name="kp:" value="0.6"/>
+            <DoubleSpinBox name="ki:" value="0.2"/>
+            <DoubleSpinBox name="sat i:" value="0.4"/>
+            <DoubleSpinBox name="kd:" value="0.4"/>
+            <DoubleSpinBox name="offset g:" value="0.6"/>
+            <DoubleSpinBox name="sat:" value="1"/>
+            <DoubleSpinBox name="offset step:" value="0.0002"/>
+          </GroupBox>
+          <GroupBox name="u_x">
+            <DoubleSpinBox name="period, 0 for auto" value="0"/>
+            <DoubleSpinBox name="kp:" value="0.015"/>
+            <DoubleSpinBox name="ki:" value="0.02"/>
+            <DoubleSpinBox name="sat i:" value="0.15"/>
+            <DoubleSpinBox name="kd:" value="0"/>
+            <DoubleSpinBox name="sat:" value="0.3"/>
+          </GroupBox>
+          <GroupBox name="u_y">
+            <DoubleSpinBox name="period, 0 for auto" value="0"/>
+            <DoubleSpinBox name="kp:" value="0.015"/>
+            <DoubleSpinBox name="ki:" value="0.02"/>
+            <DoubleSpinBox name="sat i:" value="0.15"/>
+            <DoubleSpinBox name="kd:" value="0"/>
+            <DoubleSpinBox name="sat:" value="0.3"/>
+          </GroupBox>
+        </Tab>
+        <Tab name="Graphes">
+          <DataPlot1D name="u_roll" period="100" enabled="0"/>
+          <DataPlot1D name="u_pitch" period="100" enabled="0"/>
+          <DataPlot1D name="u_yaw" period="100" enabled="0"/>
+          <DataPlot1D name="u_z" period="100" enabled="1"/>
+          <DataPlot1D name="u_x" period="100" enabled="1"/>
+          <DataPlot1D name="u_y" period="100" enabled="0"/>
+        </Tab>
+      </TabWidget>
+    </Tab>
+    <Tab name="Dualshock3">
+      <TabWidget name="Dualshock3">
+        <Tab name="Reglages">
+          <GroupBox name="consignes joy">
+            <DoubleSpinBox name="debattement roll" value="-15"/>
+            <DoubleSpinBox name="debattement pitch" value="-15"/>
+            <DoubleSpinBox name="debattement wz" value="90"/>
+            <DoubleSpinBox name="debattement dz" value="-0.5"/>
+            <DoubleSpinBox name="trim" value="0.02"/>
+            <Label name="trim roll"/>
+            <PushButton name="reset roll trim"/>
+            <Label name="trim pitch"/>
+            <PushButton name="reset pitch trim"/>
+          </GroupBox>
+          <GroupBox name="consignes fo">
+            <DoubleSpinBox name="debattement x" value="0"/>
+            <DoubleSpinBox name="debattement y" value="0"/>
+            <DoubleSpinBox name="speed step" value="5"/>
+          </GroupBox>
+        </Tab>
+      </TabWidget>
+    </Tab>
+    <Tab name="flux optique">
+      <DataPlot1D name="x_velocity" period="100" enabled="1"/>
+      <DataPlot1D name="y_velocity" period="100" enabled="1"/>
+    </Tab>
+  </TabWidget>
+  <TabWidget name="App_TabWidget">
+    <Tab name="demo_line">
+      <PushButton name="save config on target" value="1"/>
+    </Tab>
+  <Tab name="Drone_0"><PushButton name="save config on target" value="1"/></Tab></TabWidget>
+</root>
Index: trunk/demos/OpticalFlow/uav/build_x86_64/bin/setup_x4.xml
===================================================================
--- trunk/demos/OpticalFlow/uav/build_x86_64/bin/setup_x4.xml	(revision 122)
+++ trunk/demos/OpticalFlow/uav/build_x86_64/bin/setup_x4.xml	(revision 122)
@@ -0,0 +1,287 @@
+<?xml version="1.0"?>
+<!DOCTYPE remote_ui_xml>
+<root name="interface">
+  <TabWidget name="Main_TabWidget">
+ <Tab name="Dualshock3">
+  <TabWidget name="Dualshock3">
+   <Tab name="Reglages">
+    <GroupBox name="dualshock3">
+     <SpinBox value="10" name="dead zone:"/>
+     <Label name="batterie"/>
+    </GroupBox>
+    <GroupBox name="consignes joy">
+     <DoubleSpinBox value="-20" name="debattement roll"/>
+     <DoubleSpinBox value="-20" name="debattement pitch"/>
+     <DoubleSpinBox value="90" name="debattement wz"/>
+     <DoubleSpinBox value="-0.7" name="debattement dz"/>
+     <DoubleSpinBox value="0" name="trim"/>
+     <Label name="trim roll"/>
+     <PushButton value="0" name="reset roll trim"/>
+     <Label name="trim pitch"/>
+     <PushButton value="0" name="reset pitch trim"/>
+    </GroupBox>
+   <GroupBox name="consignes fo"><DoubleSpinBox name="debattement x" value="-1"/><DoubleSpinBox name="debattement y" value="1"/></GroupBox></Tab>
+   <Tab name="Mesures">
+    <DataPlot1D name="roll">
+     <Setup period="100" enabled="1"/>
+    </DataPlot1D>
+    <DataPlot1D name="pitch">
+     <Setup period="100" enabled="1"/>
+    </DataPlot1D>
+    <DataPlot1D name="yaw">
+     <Setup period="100" enabled="1"/>
+    </DataPlot1D>
+    <DataPlot1D name="gaz">
+     <Setup period="100" enabled="1"/>
+    </DataPlot1D>
+   </Tab>
+  </TabWidget>
+ </Tab>
+ <Tab name="motors">
+  <TabWidget name="UavMultiplex">
+   <Tab name="Setup">
+    <GroupBox name="x4 multiplex">
+     <ComboBox value="0" name="front left blade pitch:"/>
+    </GroupBox>
+    <GroupBox name="motor attribution">
+     <ComboBox value="0" name="front left"/>
+     <ComboBox value="1" name="front rigth"/>
+     <ComboBox value="2" name="rear left"/>
+     <ComboBox value="3" name="rear rigth"/>
+    </GroupBox>
+    <GroupBox name="bldc">
+     <Label name="flight time"/>
+     <DoubleSpinBox value="0.4" name="min value:"/>
+     <DoubleSpinBox value="1" name="max value:"/>
+     <DoubleSpinBox value="0.1" name="test value:"/>
+     <PushButton value="0" name="test motor 0"/>
+     <PushButton value="0" name="test motor 1"/>
+     <PushButton value="0" name="test motor 2"/>
+     <PushButton value="0" name="test motor 3"/>
+    </GroupBox>
+    <GroupBox name="simubldc">
+     <DoubleSpinBox value="86" name="k driver:"/>
+    </GroupBox>
+   </Tab>
+   <Tab name="Values">
+    <DataPlot1D name="front left" period="100" enabled="0">
+     <Setup period="100" enabled="1"/>
+    </DataPlot1D>
+    <DataPlot1D name="front right" period="100" enabled="0">
+     <Setup period="100" enabled="1"/>
+    </DataPlot1D>
+    <DataPlot1D name="rear left" period="100" enabled="0">
+     <Setup period="100" enabled="1"/>
+    </DataPlot1D>
+    <DataPlot1D name="rear right" period="100" enabled="0">
+     <Setup period="100" enabled="1"/>
+    </DataPlot1D>
+   </Tab>
+   <Tab name="Speeds">
+    <DataPlot1D name="front left" period="100" enabled="0">
+     <Setup period="100" enabled="0"/>
+    </DataPlot1D>
+    <DataPlot1D name="front right" period="100" enabled="0">
+     <Setup period="100" enabled="0"/>
+    </DataPlot1D>
+    <DataPlot1D name="rear left" period="100" enabled="0">
+     <Setup period="100" enabled="0"/>
+    </DataPlot1D>
+    <DataPlot1D name="rear right" period="100" enabled="0">
+     <Setup period="100" enabled="0"/>
+    </DataPlot1D>
+   </Tab>
+  </TabWidget>
+ </Tab>
+ <Tab name="us">
+  <TabWidget name="us">
+   <Tab name="Reglages">
+    <GroupBox name="us">
+     <SpinBox value="50" name="data rate"/>
+    </GroupBox>
+    <GroupBox name="Passe bas">
+     <DoubleSpinBox value="0" name="period, 0 for auto"/>
+     <DoubleSpinBox value="5" name="cutoff frequency"/>
+    </GroupBox>
+    <GroupBox name="Vz">
+     <DoubleSpinBox value="0" name="period, 0 for auto:"/>
+    </GroupBox>
+    <GroupBox name="Passe bas v">
+     <DoubleSpinBox value="0" name="period, 0 for auto"/>
+     <DoubleSpinBox value="5" name="cutoff frequency"/>
+    </GroupBox>
+   </Tab>
+   <Tab name="Mesures">
+    <DataPlot1D name="us" period="100" enabled="1">
+     <Setup period="100" enabled="1"/>
+    </DataPlot1D>
+    <DataPlot1D name="vz" period="100" enabled="1">
+     <Setup period="100" enabled="1"/>
+    </DataPlot1D>
+   </Tab>
+  </TabWidget>
+ </Tab>
+ <Tab name="imu">
+  <TabWidget name="imu">
+   <Tab name="Reglages">
+    <GroupBox name="imu">
+     <SpinBox value="200" name="data rate"/>
+    </GroupBox>
+    <GroupBox name="post rotation">
+     <DoubleSpinBox value="0" name="value"/>
+     <ComboBox value="0" name="axis"/>
+    </GroupBox>
+   </Tab>
+   <Tab name="AHRS">
+    <DataPlot1D name="roll" period="100" enabled="1">
+     <Setup period="100" enabled="1"/>
+    </DataPlot1D>
+    <DataPlot1D name="pitch" period="100" enabled="1">
+     <Setup period="100" enabled="1"/>
+    </DataPlot1D>
+    <DataPlot1D name="yaw" period="100" enabled="1">
+     <Setup period="100" enabled="1"/>
+    </DataPlot1D>
+    <DataPlot1D name="w_x" period="100" enabled="0">
+     <Setup period="100" enabled="1"/>
+    </DataPlot1D>
+    <DataPlot1D name="w_y" period="100" enabled="0">
+     <Setup period="100" enabled="1"/>
+    </DataPlot1D>
+    <DataPlot1D name="w_z" period="100" enabled="0">
+     <Setup period="100" enabled="1"/>
+    </DataPlot1D>
+   </Tab>
+  </TabWidget>
+ </Tab>
+ <Tab name="battery">
+  <GroupBox name="battery">
+   <Label name="battery"/>
+   <DoubleSpinBox value="0" name="threshold"/>
+  </GroupBox>
+ </Tab>
+ <Tab name="simu_cam_v">
+  <TabWidget name="simu_cam_v">
+   <Tab name="Setup">
+    <GroupBox name="simu_cam_v">
+     <SpinBox value="50" name="data rate"/>
+    </GroupBox>
+    <GridLayout name="setup">
+     <GroupBox name="flux optique">
+      <SpinBox value="64" name="max features:"/>
+     <GroupBox name="post rotation"><DoubleSpinBox name="value" value="90"/><ComboBox name="axis" value="2"/></GroupBox></GroupBox>
+     <GroupBox name="passe bas">
+      <DoubleSpinBox value="0" name="period, 0 for auto"/>
+      <DoubleSpinBox value="1" name="cutoff frequency"/>
+     </GroupBox>
+    </GridLayout>
+   </Tab>
+   <Tab name="Picture">
+    <Picture name="simu_cam_v">
+     <Setup period="50" enabled="1"/>
+    </Picture>
+   </Tab>
+  </TabWidget>
+ </Tab>
+ <Tab name="uav">
+  <GridLayout name="buttons">
+   <PushButton value="0" name="kill"/>
+   <PushButton value="0" name="start_log"/>
+   <PushButton value="0" name="stop_log"/>
+   <PushButton value="1" name="take_off"/>
+   <PushButton value="0" name="land"/>
+  </GridLayout>
+  <GroupBox name="takeoff/landing">
+   <DoubleSpinBox value="1" name="desired takeoff altitude"/>
+   <DoubleSpinBox value="0" name="desired landing altitude"/>
+  </GroupBox>
+  <GroupBox name="alt cons">
+   <DoubleSpinBox value="0" name="period, 0 for auto:"/>
+   <DoubleSpinBox value="0.5" name="velocity max (absolute):"/>
+   <DoubleSpinBox value="0.2" name="acceleration (absolute):"/>
+  </GroupBox>
+ </Tab>
+ <Tab name="control laws">
+  <TabWidget name="laws">
+   <Tab name="Setup">
+    <GroupBox name="u_roll">
+     <DoubleSpinBox value="15" name="sat ref:"/>
+     <DoubleSpinBox value="5" name="kp:"/>
+     <DoubleSpinBox value="100" name="sat dref:"/>
+     <DoubleSpinBox value="0.1" name="kd:"/>
+     <DoubleSpinBox value="0.5" name="sat u:"/>
+    </GroupBox>
+    <GroupBox name="u_pitch">
+     <DoubleSpinBox value="15" name="sat ref:"/>
+     <DoubleSpinBox value="5" name="kp:"/>
+     <DoubleSpinBox value="100" name="sat dref:"/>
+     <DoubleSpinBox value="0.1" name="kd:"/>
+     <DoubleSpinBox value="0.5" name="sat u:"/>
+    </GroupBox>
+    <GroupBox name="u_yaw">
+     <DoubleSpinBox value="0" name="period, 0 for auto"/>
+     <DoubleSpinBox value="1" name="kp:"/>
+     <DoubleSpinBox value="0" name="ki:"/>
+     <DoubleSpinBox value="0" name="sat i:"/>
+     <DoubleSpinBox value="0.1" name="kd:"/>
+     <DoubleSpinBox value="0.2" name="sat:"/>
+    </GroupBox>
+    <GroupBox name="u_z">
+     <DoubleSpinBox value="0" name="period, 0 for auto"/>
+     <DoubleSpinBox value="0.3" name="kp:"/>
+     <DoubleSpinBox value="0.2" name="ki:"/>
+     <DoubleSpinBox value="0.5" name="sat i:"/>
+     <DoubleSpinBox value="0.1" name="kd:"/>
+     <DoubleSpinBox value="0.6" name="offset g:"/>
+     <DoubleSpinBox value="1" name="sat:"/>
+     <DoubleSpinBox value="0.0002" name="offset step:"/>
+    </GroupBox>
+    <GroupBox name="u_x">
+     <DoubleSpinBox value="0" name="period, 0 for auto"/>
+     <DoubleSpinBox value="0.030" name="kp:"/>
+     <DoubleSpinBox value="0.020" name="ki:"/>
+     <DoubleSpinBox value="0.20" name="sat i:"/>
+     <DoubleSpinBox value="0.1" name="kd:"/>
+     <DoubleSpinBox value="1" name="sat:"/>
+    </GroupBox>
+    <GroupBox name="u_y">
+     <DoubleSpinBox value="0" name="period, 0 for auto"/>
+     <DoubleSpinBox value="0.03" name="kp:"/>
+     <DoubleSpinBox value="0.020" name="ki:"/>
+     <DoubleSpinBox value="0.20" name="sat i:"/>
+     <DoubleSpinBox value="0.2" name="kd:"/>
+     <DoubleSpinBox value="1" name="sat:"/>
+    </GroupBox>
+   </Tab>
+   <Tab name="Graphes">
+    <DataPlot1D name="u_roll" period="100" enabled="0">
+     <Setup period="100" enabled="0"/>
+    </DataPlot1D>
+    <DataPlot1D name="u_pitch" period="100" enabled="0">
+     <Setup period="100" enabled="0"/>
+    </DataPlot1D>
+    <DataPlot1D name="u_yaw" period="100" enabled="0">
+     <Setup period="100" enabled="0"/>
+    </DataPlot1D>
+    <DataPlot1D name="u_z" period="100" enabled="0">
+     <Setup period="100" enabled="0"/>
+    </DataPlot1D>
+    <DataPlot1D name="u_x" period="100" enabled="1">
+     <Setup period="100" enabled="1"/>
+    </DataPlot1D>
+    <DataPlot1D name="u_y" period="100" enabled="1">
+     <Setup period="100" enabled="1"/>
+    </DataPlot1D>
+   </Tab>
+  </TabWidget>
+ </Tab>
+ <Tab name="flux optique">
+  <DataPlot1D name="x_velocity" period="100" enabled="1">
+   <Setup period="100" enabled="1"/>
+  </DataPlot1D>
+  <DataPlot1D name="y_velocity" period="100" enabled="1">
+   <Setup period="100" enabled="1"/>
+  </DataPlot1D>
+ </Tab>
+  </TabWidget>
+<TabWidget name="App_TabWidget"><Tab name="x4_0"><PushButton name="save config on target" value="1"/></Tab></TabWidget></root>
Index: trunk/demos/OpticalFlow/uav/build_x86_64/bin/setup_x8.xml
===================================================================
--- trunk/demos/OpticalFlow/uav/build_x86_64/bin/setup_x8.xml	(revision 122)
+++ trunk/demos/OpticalFlow/uav/build_x86_64/bin/setup_x8.xml	(revision 122)
@@ -0,0 +1,287 @@
+<?xml version="1.0"?>
+<!DOCTYPE remote_ui_xml>
+<root name="interface">
+  <TabWidget name="Main_TabWidget">
+ <Tab name="Dualshock3">
+  <TabWidget name="Dualshock3">
+   <Tab name="Reglages">
+    <GroupBox name="dualshock3">
+     <SpinBox value="10" name="dead zone:"/>
+     <Label name="batterie"/>
+    </GroupBox>
+    <GroupBox name="consignes joy">
+     <DoubleSpinBox value="-20" name="debattement roll"/>
+     <DoubleSpinBox value="-20" name="debattement pitch"/>
+     <DoubleSpinBox value="90" name="debattement wz"/>
+     <DoubleSpinBox value="-0.7" name="debattement dz"/>
+     <DoubleSpinBox value="0" name="trim"/>
+     <Label name="trim roll"/>
+     <PushButton value="0" name="reset roll trim"/>
+     <Label name="trim pitch"/>
+     <PushButton value="0" name="reset pitch trim"/>
+    </GroupBox>
+   <GroupBox name="consignes fo"><DoubleSpinBox name="debattement x" value="-1"/><DoubleSpinBox name="debattement y" value="1"/></GroupBox></Tab>
+   <Tab name="Mesures">
+    <DataPlot1D name="roll">
+     <Setup period="100" enabled="1"/>
+    </DataPlot1D>
+    <DataPlot1D name="pitch">
+     <Setup period="100" enabled="1"/>
+    </DataPlot1D>
+    <DataPlot1D name="yaw">
+     <Setup period="100" enabled="1"/>
+    </DataPlot1D>
+    <DataPlot1D name="gaz">
+     <Setup period="100" enabled="1"/>
+    </DataPlot1D>
+   </Tab>
+  </TabWidget>
+ </Tab>
+ <Tab name="motors">
+  <TabWidget name="UavMultiplex">
+   <Tab name="Setup">
+    <GroupBox name="x4 multiplex">
+     <ComboBox value="0" name="front left blade pitch:"/>
+    </GroupBox>
+    <GroupBox name="motor attribution">
+     <ComboBox value="0" name="front left"/>
+     <ComboBox value="1" name="front rigth"/>
+     <ComboBox value="2" name="rear left"/>
+     <ComboBox value="3" name="rear rigth"/>
+    <ComboBox name="top front left" value="0"/><ComboBox name="top front rigth" value="1"/><ComboBox name="top rear left" value="2"/><ComboBox name="top rear rigth" value="3"/><ComboBox name="bottom front left" value="4"/><ComboBox name="bottom front rigth" value="5"/><ComboBox name="bottom rear left" value="6"/><ComboBox name="bottom rear rigth" value="7"/></GroupBox>
+    <GroupBox name="bldc">
+     <Label name="flight time"/>
+     <DoubleSpinBox value="0.4" name="min value:"/>
+     <DoubleSpinBox value="1" name="max value:"/>
+     <DoubleSpinBox value="0.1" name="test value:"/>
+     <PushButton value="0" name="test motor 0"/>
+     <PushButton value="0" name="test motor 1"/>
+     <PushButton value="0" name="test motor 2"/>
+     <PushButton value="0" name="test motor 3"/>
+    <PushButton name="test motor 4"/><PushButton name="test motor 5"/><PushButton name="test motor 6"/><PushButton name="test motor 7"/></GroupBox>
+    <GroupBox name="simubldc">
+     <DoubleSpinBox value="86" name="k driver:"/>
+    </GroupBox>
+   <GroupBox name="x8 multiplex"><ComboBox name="top front left blade pitch:" value="0"/></GroupBox></Tab>
+   <Tab name="Values">
+    <DataPlot1D name="front left" period="100" enabled="0">
+     <Setup period="100" enabled="1"/>
+    </DataPlot1D>
+    <DataPlot1D name="front right" period="100" enabled="0">
+     <Setup period="100" enabled="1"/>
+    </DataPlot1D>
+    <DataPlot1D name="rear left" period="100" enabled="0">
+     <Setup period="100" enabled="1"/>
+    </DataPlot1D>
+    <DataPlot1D name="rear right" period="100" enabled="0">
+     <Setup period="100" enabled="1"/>
+    </DataPlot1D>
+   </Tab>
+   <Tab name="Speeds">
+    <DataPlot1D name="front left" period="100" enabled="0">
+     <Setup period="100" enabled="0"/>
+    </DataPlot1D>
+    <DataPlot1D name="front right" period="100" enabled="0">
+     <Setup period="100" enabled="0"/>
+    </DataPlot1D>
+    <DataPlot1D name="rear left" period="100" enabled="0">
+     <Setup period="100" enabled="0"/>
+    </DataPlot1D>
+    <DataPlot1D name="rear right" period="100" enabled="0">
+     <Setup period="100" enabled="0"/>
+    </DataPlot1D>
+   </Tab>
+  </TabWidget>
+ </Tab>
+ <Tab name="us">
+  <TabWidget name="us">
+   <Tab name="Reglages">
+    <GroupBox name="us">
+     <SpinBox value="50" name="data rate"/>
+    </GroupBox>
+    <GroupBox name="Passe bas">
+     <DoubleSpinBox value="0" name="period, 0 for auto"/>
+     <DoubleSpinBox value="5" name="cutoff frequency"/>
+    </GroupBox>
+    <GroupBox name="Vz">
+     <DoubleSpinBox value="0" name="period, 0 for auto:"/>
+    </GroupBox>
+    <GroupBox name="Passe bas v">
+     <DoubleSpinBox value="0" name="period, 0 for auto"/>
+     <DoubleSpinBox value="5" name="cutoff frequency"/>
+    </GroupBox>
+   </Tab>
+   <Tab name="Mesures">
+    <DataPlot1D name="us" period="100" enabled="1">
+     <Setup period="100" enabled="1"/>
+    </DataPlot1D>
+    <DataPlot1D name="vz" period="100" enabled="1">
+     <Setup period="100" enabled="1"/>
+    </DataPlot1D>
+   </Tab>
+  </TabWidget>
+ </Tab>
+ <Tab name="imu">
+  <TabWidget name="imu">
+   <Tab name="Reglages">
+    <GroupBox name="imu">
+     <SpinBox value="200" name="data rate"/>
+    </GroupBox>
+    <GroupBox name="post rotation">
+     <DoubleSpinBox value="0" name="value"/>
+     <ComboBox value="0" name="axis"/>
+    </GroupBox>
+   </Tab>
+   <Tab name="AHRS">
+    <DataPlot1D name="roll" period="100" enabled="1">
+     <Setup period="100" enabled="1"/>
+    </DataPlot1D>
+    <DataPlot1D name="pitch" period="100" enabled="1">
+     <Setup period="100" enabled="1"/>
+    </DataPlot1D>
+    <DataPlot1D name="yaw" period="100" enabled="1">
+     <Setup period="100" enabled="1"/>
+    </DataPlot1D>
+    <DataPlot1D name="w_x" period="100" enabled="0">
+     <Setup period="100" enabled="1"/>
+    </DataPlot1D>
+    <DataPlot1D name="w_y" period="100" enabled="0">
+     <Setup period="100" enabled="1"/>
+    </DataPlot1D>
+    <DataPlot1D name="w_z" period="100" enabled="0">
+     <Setup period="100" enabled="1"/>
+    </DataPlot1D>
+   </Tab>
+  </TabWidget>
+ </Tab>
+ <Tab name="battery">
+  <GroupBox name="battery">
+   <Label name="battery"/>
+   <DoubleSpinBox value="0" name="threshold"/>
+  </GroupBox>
+ </Tab>
+ <Tab name="simu_cam_v">
+  <TabWidget name="simu_cam_v">
+   <Tab name="Setup">
+    <GroupBox name="simu_cam_v">
+     <SpinBox value="50" name="data rate"/>
+    </GroupBox>
+    <GridLayout name="setup">
+     <GroupBox name="flux optique">
+      <SpinBox value="64" name="max features:"/>
+     <GroupBox name="post rotation"><DoubleSpinBox name="value" value="90"/><ComboBox name="axis" value="2"/></GroupBox></GroupBox>
+     <GroupBox name="passe bas">
+      <DoubleSpinBox value="0" name="period, 0 for auto"/>
+      <DoubleSpinBox value="1" name="cutoff frequency"/>
+     </GroupBox>
+    </GridLayout>
+   </Tab>
+   <Tab name="Picture">
+    <Picture name="simu_cam_v">
+     <Setup period="50" enabled="1"/>
+    </Picture>
+   </Tab>
+  </TabWidget>
+ </Tab>
+ <Tab name="uav">
+  <GridLayout name="buttons">
+   <PushButton value="0" name="kill"/>
+   <PushButton value="0" name="start_log"/>
+   <PushButton value="0" name="stop_log"/>
+   <PushButton value="1" name="take_off"/>
+   <PushButton value="0" name="land"/>
+  </GridLayout>
+  <GroupBox name="takeoff/landing">
+   <DoubleSpinBox value="1" name="desired takeoff altitude"/>
+   <DoubleSpinBox value="0" name="desired landing altitude"/>
+  </GroupBox>
+  <GroupBox name="alt cons">
+   <DoubleSpinBox value="0" name="period, 0 for auto:"/>
+   <DoubleSpinBox value="0.5" name="velocity max (absolute):"/>
+   <DoubleSpinBox value="0.2" name="acceleration (absolute):"/>
+  </GroupBox>
+ </Tab>
+ <Tab name="control laws">
+  <TabWidget name="laws">
+   <Tab name="Setup">
+    <GroupBox name="u_roll">
+     <DoubleSpinBox value="15" name="sat ref:"/>
+     <DoubleSpinBox value="5" name="kp:"/>
+     <DoubleSpinBox value="100" name="sat dref:"/>
+     <DoubleSpinBox value="0.1" name="kd:"/>
+     <DoubleSpinBox value="0.5" name="sat u:"/>
+    </GroupBox>
+    <GroupBox name="u_pitch">
+     <DoubleSpinBox value="15" name="sat ref:"/>
+     <DoubleSpinBox value="5" name="kp:"/>
+     <DoubleSpinBox value="100" name="sat dref:"/>
+     <DoubleSpinBox value="0.1" name="kd:"/>
+     <DoubleSpinBox value="0.5" name="sat u:"/>
+    </GroupBox>
+    <GroupBox name="u_yaw">
+     <DoubleSpinBox value="0" name="period, 0 for auto"/>
+     <DoubleSpinBox value="1" name="kp:"/>
+     <DoubleSpinBox value="0" name="ki:"/>
+     <DoubleSpinBox value="0" name="sat i:"/>
+     <DoubleSpinBox value="0.1" name="kd:"/>
+     <DoubleSpinBox value="0.2" name="sat:"/>
+    </GroupBox>
+    <GroupBox name="u_z">
+     <DoubleSpinBox value="0" name="period, 0 for auto"/>
+     <DoubleSpinBox value="0.3" name="kp:"/>
+     <DoubleSpinBox value="0.2" name="ki:"/>
+     <DoubleSpinBox value="0.5" name="sat i:"/>
+     <DoubleSpinBox value="0.1" name="kd:"/>
+     <DoubleSpinBox value="0.6" name="offset g:"/>
+     <DoubleSpinBox value="1" name="sat:"/>
+     <DoubleSpinBox value="0.0002" name="offset step:"/>
+    </GroupBox>
+    <GroupBox name="u_x">
+     <DoubleSpinBox value="0" name="period, 0 for auto"/>
+     <DoubleSpinBox value="0.03" name="kp:"/>
+     <DoubleSpinBox value="0.020" name="ki:"/>
+     <DoubleSpinBox value="0.2" name="sat i:"/>
+     <DoubleSpinBox value="0.1" name="kd:"/>
+     <DoubleSpinBox value="1" name="sat:"/>
+    </GroupBox>
+    <GroupBox name="u_y">
+     <DoubleSpinBox value="0" name="period, 0 for auto"/>
+     <DoubleSpinBox value="0.03" name="kp:"/>
+     <DoubleSpinBox value="0.020" name="ki:"/>
+     <DoubleSpinBox value="0.2" name="sat i:"/>
+     <DoubleSpinBox value="0.1" name="kd:"/>
+     <DoubleSpinBox value="1" name="sat:"/>
+    </GroupBox>
+   </Tab>
+   <Tab name="Graphes">
+    <DataPlot1D name="u_roll" period="100" enabled="0">
+     <Setup period="100" enabled="0"/>
+    </DataPlot1D>
+    <DataPlot1D name="u_pitch" period="100" enabled="0">
+     <Setup period="100" enabled="0"/>
+    </DataPlot1D>
+    <DataPlot1D name="u_yaw" period="100" enabled="0">
+     <Setup period="100" enabled="0"/>
+    </DataPlot1D>
+    <DataPlot1D name="u_z" period="100" enabled="0">
+     <Setup period="100" enabled="0"/>
+    </DataPlot1D>
+    <DataPlot1D name="u_x" period="100" enabled="1">
+     <Setup period="100" enabled="1"/>
+    </DataPlot1D>
+    <DataPlot1D name="u_y" period="100" enabled="1">
+     <Setup period="100" enabled="1"/>
+    </DataPlot1D>
+   </Tab>
+  </TabWidget>
+ </Tab>
+ <Tab name="flux optique">
+  <DataPlot1D name="x_velocity" period="100" enabled="1">
+   <Setup period="100" enabled="1"/>
+  </DataPlot1D>
+  <DataPlot1D name="y_velocity" period="100" enabled="1">
+   <Setup period="100" enabled="1"/>
+  </DataPlot1D>
+ </Tab>
+  </TabWidget>
+<TabWidget name="App_TabWidget"><Tab name="x4_0"><PushButton name="save config on target" value="1"/></Tab><Tab name="x8_0"><PushButton name="save config on target" value="1"/></Tab></TabWidget></root>
Index: trunk/demos/OpticalFlow/uav/build_x86_64/bin/x4.sh
===================================================================
--- trunk/demos/OpticalFlow/uav/build_x86_64/bin/x4.sh	(revision 122)
+++ trunk/demos/OpticalFlow/uav/build_x86_64/bin/x4.sh	(revision 122)
@@ -0,0 +1,11 @@
+#! /bin/bash
+
+. $FLAIR_ROOT/flair-dev/scripts/ubuntu_cgroup_hack.sh
+
+if [ -f /proc/xenomai/version ];then
+	EXEC=./OpticalFlow_rt
+else
+	EXEC=./OpticalFlow_nrt
+fi
+
+$EXEC -n x4_0 -a 127.0.0.1 -p 9000 -l /tmp -x setup_x4.xml -t x4_simu -v dsp_stub
Index: trunk/demos/OpticalFlow/uav/build_x86_64/bin/x8.sh
===================================================================
--- trunk/demos/OpticalFlow/uav/build_x86_64/bin/x8.sh	(revision 122)
+++ trunk/demos/OpticalFlow/uav/build_x86_64/bin/x8.sh	(revision 122)
@@ -0,0 +1,11 @@
+#! /bin/bash
+
+. $FLAIR_ROOT/flair-dev/scripts/ubuntu_cgroup_hack.sh
+
+if [ -f /proc/xenomai/version ];then
+	EXEC=./OpticalFlow_rt
+else
+	EXEC=./OpticalFlow_nrt
+fi
+
+$EXEC -n x8_0 -a 127.0.0.1 -p 9000 -l /tmp -x setup_x8.xml -t x8_simu -v dsp_stub
Index: trunk/demos/OpticalFlow/uav/src/DemoOpticalFlow.cpp
===================================================================
--- trunk/demos/OpticalFlow/uav/src/DemoOpticalFlow.cpp	(revision 122)
+++ trunk/demos/OpticalFlow/uav/src/DemoOpticalFlow.cpp	(revision 122)
@@ -0,0 +1,160 @@
+//  created:    2011/05/01
+//  filename:   DemoOpticalFlow.cpp
+//
+//  author:     Guillaume Sanahuja
+//              Copyright Heudiasyc UMR UTC/CNRS 7253
+//
+//  version:    $Id: $
+//
+//  purpose:    demo optical flow
+//
+//
+/*********************************************************************/
+
+#include "DemoOpticalFlow.h"
+#include <Uav.h>
+#include <Camera.h>
+#include <CvtColor.h>
+#include <OpticalFlow.h>
+#include <OpticalFlowSpeed.h>
+#include <LowPassFilter.h>
+#include <cvmatrix.h>
+#include <GridLayout.h>
+#include <DataPlot1D.h>
+#include <Tab.h>
+#include <TabWidget.h>
+#include <GroupBox.h>
+#include <DoubleSpinBox.h>
+#include <FrameworkManager.h>
+#include <MetaDualShock3.h>
+#include <Vector2D.h>
+#include <AhrsData.h>
+#include <Ahrs.h>
+#include <Pid.h>
+
+#include <stdio.h>
+
+using namespace std;
+using namespace flair::core;
+using namespace flair::gui;
+using namespace flair::filter;
+using namespace flair::meta;
+using namespace flair::sensor;
+
+DemoOpticalFlow::DemoOpticalFlow(TargetController *controller): UavStateMachine(controller) {
+  Uav* uav=GetUav();
+	if (uav->GetVerticalCamera() == NULL) {
+        exit(1);
+    }
+uav->GetVerticalCamera()->SetLogFormat(Camera::LogFormat::JPG);
+getFrameworkManager()->AddDeviceToLog(uav->GetVerticalCamera());
+    greyCameraImage=new CvtColor(uav->GetVerticalCamera(),"gray",CvtColor::Conversion_t::GRAY);
+
+    uav->GetVerticalCamera()->UseDefaultPlot(greyCameraImage->Output()); // Le defaultPlot de la caméra peut afficher n'importe quoi?
+
+    //optical flow stack
+    opticalFlow=new OpticalFlow(greyCameraImage,uav->GetVerticalCamera()->GetLayout()->NewRow(),"flux optique");
+    opticalFlowSpeed=new OpticalFlowSpeed(opticalFlow,"vitesse du flux optique");
+
+    cvmatrix_descriptor* desc=new cvmatrix_descriptor(2,1);
+    for(int i=0;i<2;i++) {
+        desc->SetElementName(i,0,opticalFlowSpeed->Output()->Name(i,0));
+    }
+    cvmatrix* prev_value=new cvmatrix((const Thread*)this,desc,floatType,uav->ObjectName()); // diamond inheritance
+    for(int i=0;i<2;i++) {
+        prev_value->SetValue(i,0,0);
+    }
+
+    opticalFlowSpeedFiltered=new LowPassFilter(opticalFlowSpeed,uav->GetVerticalCamera()->GetLayout()->NewRow(),"passe bas",prev_value);
+// delete prev_value?
+
+    getFrameworkManager()->AddDeviceToLog(opticalFlowSpeed);
+
+    Tab* opticalFlowTab=new Tab(getFrameworkManager()->GetTabWidget(),"flux optique");
+    DataPlot1D* xVelocityPlot=new DataPlot1D(opticalFlowTab->NewRow(),"x_velocity",-5,5);
+    DataPlot1D* yVelocityPlot=new DataPlot1D(opticalFlowTab->LastRowLastCol(),"y_velocity",-5,5);
+
+    xVelocityPlot->AddCurve(opticalFlowSpeed->Output()->Element(0,0));
+    xVelocityPlot->AddCurve(opticalFlowSpeedFiltered->Matrix()->Element(0,0),DataPlot::Blue);
+    yVelocityPlot->AddCurve(opticalFlowSpeed->Output()->Element(1,0));
+    yVelocityPlot->AddCurve(opticalFlowSpeedFiltered->Matrix()->Element(1,0),DataPlot::Blue);
+
+    u_x=new Pid(setupLawTab->At(1,0),"u_x");
+    u_x->UseDefaultPlot(graphLawTab->NewRow());
+    u_y=new Pid(setupLawTab->At(1,1),"u_y");
+    u_y->UseDefaultPlot(graphLawTab->LastRowLastCol());
+
+    opticalFlowGroupBox=new GroupBox(GetJoystick()->GetTab()->NewRow(),"consignes fo");
+    maxXSpeed=new DoubleSpinBox(opticalFlowGroupBox->NewRow(),"debattement x"," m/s",-5,5,0.1,1);
+    maxYSpeed=new DoubleSpinBox(opticalFlowGroupBox->LastRowLastCol(),"debattement y"," m/s",-5,5,0.1,1);
+
+    opticalFlowReference=new cvmatrix((const Thread*)this,2,1,floatType);
+    xVelocityPlot->AddCurve(opticalFlowReference->Element(0,0),DataPlot::Green,"consigne");
+    yVelocityPlot->AddCurve(opticalFlowReference->Element(1,0),DataPlot::Green,"consigne");
+
+    customReferenceOrientation= new AhrsData(this,"reference");
+    uav->GetAhrs()->AddPlot(customReferenceOrientation,DataPlot::Yellow);
+    AddDataToControlLawLog(customReferenceOrientation);
+}
+
+void DemoOpticalFlow::SignalEvent(Event_t event) {
+    switch(event) {
+    case Event_t::EnteringControlLoop:
+        opticalFlowReference->SetValue(0,0,GetJoystick()->GetAxisValue(1)*maxXSpeed->Value());//joy axis 0 maps to x displacement
+        opticalFlowReference->SetValue(1,0,GetJoystick()->GetAxisValue(0)*maxYSpeed->Value());//joy axis 1 maps to y displacement
+        break;
+    }
+}
+
+void DemoOpticalFlow::ExtraCheckJoystick(void) {
+    static bool wasOpticalFlowModeButtonPressed=false;
+    // controller button R1 enters optical flow mode
+    if(GetJoystick()->IsButtonPressed(9)) { // R1
+        if (!wasOpticalFlowModeButtonPressed) {
+            wasOpticalFlowModeButtonPressed=true;
+            if (SetOrientationMode(OrientationMode_t::Custom)) {
+                Thread::Info("(Re)entering optical flow mode\n");
+                u_x->Reset();
+                u_y->Reset();
+            } else {
+                Thread::Warn("Could not enter optical flow mode\n");
+            }
+        }
+    } else {
+        wasOpticalFlowModeButtonPressed=false;
+    }
+}
+
+const AhrsData *DemoOpticalFlow::GetReferenceOrientation(void) {
+    Euler refAngles=GetDefaultReferenceOrientation()->GetQuaternion().ToEuler();//to keep default yaw reference
+
+    // /!\ in this demo, the target value is a speed (in pixel/s). As a consequence the error is the difference between the current speed and the target speed
+    Vector2D error, errorVariation; // in Uav coordinate system
+
+    //opticalFlow= matrice de déplacements en pixels entre 2 images consécutives
+    //opticalFlowSpeed=vitesse de déplacement en pixel par seconde (moyenne sur tous les points et division par le delta T)
+    error.x=opticalFlowSpeedFiltered->Output(0,0)-opticalFlowReference->Value(0,0);
+    error.y=opticalFlowSpeedFiltered->Output(1,0)-opticalFlowReference->Value(1,0);
+
+    //la dérivée est à la fréquence de la loi de commande ("rapide") alors que le flux optique est à la fréquence de la caméra
+    // fréquemment la dérivée car le signal n'a pas bougé -> dérivée super crade
+    //gsanahuj: brancher un eulerderivative derriere le opticalFlowSpeedFiltered pour avoir la derivee
+    //opticalFlowSpeed doit etre renomme car finalement ce n'est pas une vitesse mais un deplacement
+    errorVariation.x=0;
+    errorVariation.y=0;
+
+    u_x->SetValues(error.x, errorVariation.x);
+    u_x->Update(GetTime());
+    refAngles.pitch=u_x->Output();
+
+    u_y->SetValues(error.y, errorVariation.y);
+    u_y->Update(GetTime());
+    refAngles.roll=-u_y->Output();
+
+    customReferenceOrientation->SetQuaternionAndAngularRates(refAngles.ToQuaternion(),Vector3D(0,0,0));
+
+    return customReferenceOrientation;
+}
+
+DemoOpticalFlow::~DemoOpticalFlow() {
+}
Index: trunk/demos/OpticalFlow/uav/src/DemoOpticalFlow.h
===================================================================
--- trunk/demos/OpticalFlow/uav/src/DemoOpticalFlow.h	(revision 122)
+++ trunk/demos/OpticalFlow/uav/src/DemoOpticalFlow.h	(revision 122)
@@ -0,0 +1,63 @@
+//  created:    2011/05/01
+//  filename:   DemoOpticalFlow.h
+//
+//  author:     Guillaume Sanahuja
+//              Copyright Heudiasyc UMR UTC/CNRS 7253
+//
+//  version:    $Id: $
+//
+//  purpose:    demo optical flow
+//
+//
+/*********************************************************************/
+//------------
+
+#ifndef DEMOOPTICALFLOW_H
+#define DEMOOPTICALFLOW_H
+
+#include <UavStateMachine.h>
+
+namespace flair {
+    namespace core {
+        class cvmatrix;
+    }
+    namespace gui {
+        class GroupBox;
+        class DoubleSpinBox;
+    }
+    namespace filter {
+        class OpticalFlow;
+        class OpticalFlowSpeed;
+        class LowPassFilter;
+        class CvtColor;
+    }
+    namespace sensor {
+        class TargetController;
+    }
+}
+
+class DemoOpticalFlow : public flair::meta::UavStateMachine {
+
+    public:
+        DemoOpticalFlow(flair::sensor::TargetController *controller);
+        ~DemoOpticalFlow();
+
+    protected:
+        void SignalEvent(Event_t event);
+        void ExtraCheckJoystick(void);
+        const flair::core::AhrsData *GetReferenceOrientation(void);
+
+        flair::gui::GroupBox* opticalFlowGroupBox;
+        flair::gui::DoubleSpinBox *maxXSpeed,*maxYSpeed;
+        flair::core::cvmatrix *opticalFlowReference;
+        flair::filter::Pid *u_x, *u_y;
+        flair::filter::LowPassFilter* opticalFlowSpeedFiltered;
+        flair::filter::CvtColor* greyCameraImage;
+        flair::core::AhrsData *customReferenceOrientation;
+
+    private:
+        flair::filter::OpticalFlow *opticalFlow;
+        flair::filter::OpticalFlowSpeed *opticalFlowSpeed;
+};
+
+#endif // DEMOOPTICALFLOW_H
Index: trunk/demos/OpticalFlow/uav/src/main.cpp
===================================================================
--- trunk/demos/OpticalFlow/uav/src/main.cpp	(revision 122)
+++ trunk/demos/OpticalFlow/uav/src/main.cpp	(revision 122)
@@ -0,0 +1,107 @@
+//  created:    2011/05/01
+//  filename:   main.cpp
+//
+//  author:     Guillaume Sanahuja
+//              Copyright Heudiasyc UMR UTC/CNRS 7253
+//
+//  version:    $Id: $
+//
+//  purpose:    exemple de code x4
+//
+//
+/*********************************************************************/
+
+#include "DemoOpticalFlow.h"
+#include <UavFactory.h>
+#include <FrameworkManager.h>
+#include <stdio.h>
+#include <tclap/CmdLine.h>
+#include <TargetEthController.h>
+#include <init.h>
+
+using namespace TCLAP;
+using namespace std;
+using namespace flair::core;
+using namespace flair::meta;
+using namespace flair::sensor;
+
+string uav_type;
+string dsp_file;
+string log_path;
+int port;
+int ds3port;
+string xml_file;
+string name;
+string address;
+
+void parseOptions(int argc, char** argv);
+
+
+int main(int argc, char* argv[]) {
+    parseOptions(argc,argv);
+
+    FrameworkManager *manager;
+    manager= new FrameworkManager(name);
+    manager->SetupConnection(address,port);
+    manager->SetupUserInterface(xml_file);
+    manager->SetupLogger(log_path);
+    SetupDSP(dsp_file);
+
+    Uav* drone=CreateUav(name,uav_type);
+    TargetEthController *controller=new TargetEthController(manager,"Dualshock3",ds3port);
+    DemoOpticalFlow* demo=new DemoOpticalFlow(controller);
+
+    demo->Start();
+    demo->Join();
+
+    delete manager;
+
+    CloseDSP();
+}
+
+void parseOptions(int argc, char** argv)
+{
+	try
+	{
+
+        CmdLine cmd("Command description message", ' ', "0.1");
+
+        ValueArg<string> nameArg("n","name","uav name",true,"x4","string");
+        cmd.add( nameArg );
+
+        ValueArg<string> typeArg("t","type","uav type: ardrone2, hds_x4, hds_x8, hds_xufo, hds_simu or hds_simux (with x the number of the simulated uav)",true,"hds_x4","string");
+        cmd.add( typeArg );
+
+        ValueArg<string> dspArg("v","dsp","executable dsp",true,"./dspcv_dsp.out","string");
+        cmd.add( dspArg );
+
+        ValueArg<string> xmlArg("x","xml","fichier xml",true,"./reglages.xml","string");
+        cmd.add( xmlArg );
+
+        ValueArg<string> logsArg("l","logs","repertoire des logs",true,"/media/ram","string");
+        cmd.add( logsArg );
+
+        ValueArg<int> portArg("p","port","port pour station sol",true,9000,"int");
+        cmd.add( portArg );
+
+        ValueArg<string> addressArg("a","address","addresse station sol",true,"127.0.0.1","string");
+        cmd.add( addressArg );
+
+        ValueArg<int> ds3portArg("d","ds3_port","port pour ds3",false,20000,"int");
+        cmd.add( ds3portArg );
+
+        cmd.parse( argc, argv );
+
+        // Get the value parsed by each arg.
+        uav_type=typeArg.getValue();
+        dsp_file = dspArg.getValue();
+        log_path = logsArg.getValue();
+        port=portArg.getValue();
+        ds3port=ds3portArg.getValue();
+        xml_file = xmlArg.getValue();
+        name=nameArg.getValue();
+        address=addressArg.getValue();
+
+	} catch (ArgException &e)  // catch any exceptions
+	{ cerr << "error: " << e.error() << " for arg " << e.argId() << endl; }
+}
Index: trunk/demos/SimpleFleet/uav/src/SimpleFleet.cpp
===================================================================
--- trunk/demos/SimpleFleet/uav/src/SimpleFleet.cpp	(revision 121)
+++ trunk/demos/SimpleFleet/uav/src/SimpleFleet.cpp	(revision 122)
@@ -50,16 +50,21 @@
 
 
-SimpleFleet::SimpleFleet(flair::meta::Uav* uav,string broadcast,TargetController *controller): UavStateMachine(uav,controller), behaviourMode(BehaviourMode_t::Default), vrpnLost(false) {
-    uav->SetupVRPNAutoIP(uav->ObjectName());
-
-    circle=new TrajectoryGenerator2DCircle(uav->GetVrpnClient()->GetLayout()->NewRow(),"circle");
-    uav->GetVrpnObject()->xPlot()->AddCurve(circle->Matrix()->Element(0,0),0,0,255);
-    uav->GetVrpnObject()->yPlot()->AddCurve(circle->Matrix()->Element(0,1),0,0,255);
-    uav->GetVrpnObject()->VxPlot()->AddCurve(circle->Matrix()->Element(1,0),0,0,255);
-    uav->GetVrpnObject()->VyPlot()->AddCurve(circle->Matrix()->Element(1,1),0,0,255);
-
-    xCircleCenter=new DoubleSpinBox(uav->GetVrpnClient()->GetLayout()->NewRow(),"x circle center"," m",-5,5,0.1,1,0);
-    yCircleCenter=new DoubleSpinBox(uav->GetVrpnClient()->GetLayout()->NewRow(),"y circle center"," m",-5,5,0.1,1,0);
-    yDisplacement=new DoubleSpinBox(uav->GetVrpnClient()->GetLayout()->NewRow(),"y displacement"," m",0,2,0.1,1,0);
+SimpleFleet::SimpleFleet(string broadcast,TargetController *controller): UavStateMachine(controller), behaviourMode(BehaviourMode_t::Default), vrpnLost(false) {
+    Uav* uav=GetUav();
+		
+		VrpnClient* vrpnclient=new VrpnClient("vrpn", uav->GetDefaultVrpnAddress(),10000, 80);
+		uavVrpn = new MetaVrpnObject(uav->ObjectName());
+		getFrameworkManager()->AddDeviceToLog(uavVrpn);
+		uav->GetAhrs()->YawPlot()->AddCurve(uavVrpn->State()->Element(2),DataPlot::Green);
+
+    circle=new TrajectoryGenerator2DCircle(vrpnclient->GetLayout()->NewRow(),"circle");
+    uavVrpn->xPlot()->AddCurve(circle->Matrix()->Element(0,0),0,0,255);
+    uavVrpn->yPlot()->AddCurve(circle->Matrix()->Element(0,1),0,0,255);
+    uavVrpn->VxPlot()->AddCurve(circle->Matrix()->Element(1,0),0,0,255);
+    uavVrpn->VyPlot()->AddCurve(circle->Matrix()->Element(1,1),0,0,255);
+
+    xCircleCenter=new DoubleSpinBox(vrpnclient->GetLayout()->NewRow(),"x circle center"," m",-5,5,0.1,1,0);
+    yCircleCenter=new DoubleSpinBox(vrpnclient->GetLayout()->NewRow(),"y circle center"," m",-5,5,0.1,1,0);
+    yDisplacement=new DoubleSpinBox(vrpnclient->GetLayout()->NewRow(),"y displacement"," m",0,2,0.1,1,0);
 
     //parent->AddDeviceToLog(Uz());
@@ -101,5 +106,5 @@
     //get yaw from vrpn
     Euler vrpnEuler;
-    GetUav()->GetVrpnObject()->GetEuler(vrpnEuler);
+    uavVrpn->GetEuler(vrpnEuler);
 
     //get roll, pitch and w from imu
@@ -120,6 +125,6 @@
     Vector3D uav_pos,uav_vel;
 
-    GetUav()->GetVrpnObject()->GetPosition(uav_pos);
-    GetUav()->GetVrpnObject()->GetSpeed(uav_vel);
+    uavVrpn->GetPosition(uav_pos);
+    uavVrpn->GetSpeed(uav_vel);
     //z and dz must be in uav's frame
     z=-uav_pos.z;
@@ -154,7 +159,7 @@
     Euler vrpn_euler; // in VRPN coordinate system
 
-    GetUav()->GetVrpnObject()->GetPosition(uav_pos);
-    GetUav()->GetVrpnObject()->GetSpeed(uav_vel);
-    GetUav()->GetVrpnObject()->GetEuler(vrpn_euler);
+    uavVrpn->GetPosition(uav_pos);
+    uavVrpn->GetSpeed(uav_vel);
+    uavVrpn->GetEuler(vrpn_euler);
 
     uav_pos.To2Dxy(uav_2Dpos);
@@ -294,5 +299,5 @@
 void SimpleFleet::ExtraSecurityCheck(void) {
     if (!vrpnLost && behaviourMode!=BehaviourMode_t::Default) {
-        if (!GetUav()->GetVrpnObject()->IsTracked(500)) {
+        if (!uavVrpn->IsTracked(500)) {
             Thread::Err("Optitrack, uav lost\n");
             vrpnLost=true;
@@ -322,5 +327,5 @@
     circle->SetCenter(target_2Dpos);
 
-    GetUav()->GetVrpnObject()->GetPosition(uav_pos);
+    uavVrpn->GetPosition(uav_pos);
     uav_pos.To2Dxy(uav_2Dpos);
     circle->StartTraj(uav_2Dpos,1);
@@ -347,8 +352,8 @@
     }
 
-    GetUav()->GetVrpnObject()->GetEuler(vrpn_euler);
+    uavVrpn->GetEuler(vrpn_euler);
     yaw_hold=vrpn_euler.yaw;
 
-    GetUav()->GetVrpnObject()->GetPosition(vrpn_pos);
+    uavVrpn->GetPosition(vrpn_pos);
     vrpn_pos.To2Dxy(pos_hold);
 
Index: trunk/demos/SimpleFleet/uav/src/SimpleFleet.h
===================================================================
--- trunk/demos/SimpleFleet/uav/src/SimpleFleet.h	(revision 121)
+++ trunk/demos/SimpleFleet/uav/src/SimpleFleet.h	(revision 122)
@@ -26,4 +26,7 @@
         class TrajectoryGenerator2DCircle;
     }
+		namespace meta {
+        class MetaVrpnObject;
+    }
     namespace gui {
         class DoubleSpinBox;
@@ -34,5 +37,5 @@
 class SimpleFleet : public flair::meta::UavStateMachine {
     public:
-        SimpleFleet(flair::meta::Uav* uav,std::string broadcast,flair::sensor::TargetController *controller);
+        SimpleFleet(std::string broadcast,flair::sensor::TargetController *controller);
         ~SimpleFleet();
 
@@ -75,4 +78,5 @@
         flair::gui::DoubleSpinBox *xCircleCenter,*yCircleCenter,*yDisplacement;
         flair::core::AhrsData *customReferenceOrientation,*customOrientation;
+				flair::meta::MetaVrpnObject *uavVrpn;
 };
 
Index: trunk/demos/SimpleFleet/uav/src/main.cpp
===================================================================
--- trunk/demos/SimpleFleet/uav/src/main.cpp	(revision 121)
+++ trunk/demos/SimpleFleet/uav/src/main.cpp	(revision 122)
@@ -46,7 +46,7 @@
     manager->SetupUserInterface(xml_file);
 
-    Uav* drone=CreateUav(manager,name,uav_type);
+    Uav* drone=CreateUav(name,uav_type);
     TargetEthController *controller=new TargetEthController(manager,"Dualshock3",ds3port);
-    SimpleFleet* demo=new SimpleFleet(drone,broadcast,controller);
+    SimpleFleet* demo=new SimpleFleet(broadcast,controller);
 
     demo->Start();
Index: trunk/demos/Skeletons/CustomReferenceAngles/CMakeLists.txt
===================================================================
--- trunk/demos/Skeletons/CustomReferenceAngles/CMakeLists.txt	(revision 121)
+++ trunk/demos/Skeletons/CustomReferenceAngles/CMakeLists.txt	(revision 122)
@@ -6,5 +6,4 @@
 SET(FLAIR_USE_SENSOR_ACTUATOR TRUE)
 SET(FLAIR_USE_META TRUE)
-SET(FLAIR_USE_VRPN TRUE)
 
 include($ENV{FLAIR_ROOT}/flair-dev/cmake-modules/GlobalCmakeFlair.cmake)
Index: trunk/demos/Skeletons/CustomReferenceAngles/src/MyApp.cpp
===================================================================
--- trunk/demos/Skeletons/CustomReferenceAngles/src/MyApp.cpp	(revision 121)
+++ trunk/demos/Skeletons/CustomReferenceAngles/src/MyApp.cpp	(revision 122)
@@ -29,10 +29,10 @@
 using namespace flair::sensor;
 
-MyApp::MyApp(Uav* uav,TargetController *controller): UavStateMachine(uav,controller), behaviourMode(BehaviourMode_t::Default) {
+MyApp::MyApp(TargetController *controller): UavStateMachine(controller), behaviourMode(BehaviourMode_t::Default) {
     start_CustomAngles=new PushButton(GetButtonsLayout()->NewRow(),"start CustomReferenceAngles");
     stop_CustomAngles=new PushButton(GetButtonsLayout()->NewRow(),"stop CustomReferenceAngles");
 
     customReferenceOrientation= new AhrsData(this,"reference");
-    uav->GetAhrs()->AddPlot(customReferenceOrientation,DataPlot::Yellow);
+    GetUav()->GetAhrs()->AddPlot(customReferenceOrientation,DataPlot::Yellow);
     AddDataToControlLawLog(customReferenceOrientation);
 }
Index: trunk/demos/Skeletons/CustomReferenceAngles/src/MyApp.h
===================================================================
--- trunk/demos/Skeletons/CustomReferenceAngles/src/MyApp.h	(revision 121)
+++ trunk/demos/Skeletons/CustomReferenceAngles/src/MyApp.h	(revision 122)
@@ -31,5 +31,5 @@
 class MyApp : public flair::meta::UavStateMachine {
     public:
-        MyApp(flair::meta::Uav* uav,flair::sensor::TargetController *controller);
+        MyApp(flair::sensor::TargetController *controller);
         ~MyApp();
 
Index: trunk/demos/Skeletons/CustomReferenceAngles/src/main.cpp
===================================================================
--- trunk/demos/Skeletons/CustomReferenceAngles/src/main.cpp	(revision 121)
+++ trunk/demos/Skeletons/CustomReferenceAngles/src/main.cpp	(revision 122)
@@ -44,7 +44,7 @@
     manager->SetupLogger(log_path);
 
-    Uav* drone=CreateUav(manager,name,uav_type);
+    Uav* drone=CreateUav(name,uav_type);
     TargetEthController *controller=new TargetEthController(manager,"Dualshock3",ds3port);
-    MyApp* app=new MyApp(drone,controller);
+    MyApp* app=new MyApp(controller);
 
     app->Start();
Index: trunk/demos/Skeletons/CustomTorques/CMakeLists.txt
===================================================================
--- trunk/demos/Skeletons/CustomTorques/CMakeLists.txt	(revision 121)
+++ trunk/demos/Skeletons/CustomTorques/CMakeLists.txt	(revision 122)
@@ -6,5 +6,4 @@
 SET(FLAIR_USE_SENSOR_ACTUATOR TRUE)
 SET(FLAIR_USE_META TRUE)
-SET(FLAIR_USE_VRPN TRUE)
 
 include($ENV{FLAIR_ROOT}/flair-dev/cmake-modules/GlobalCmakeFlair.cmake)
Index: trunk/demos/Skeletons/CustomTorques/src/MyApp.cpp
===================================================================
--- trunk/demos/Skeletons/CustomTorques/src/MyApp.cpp	(revision 121)
+++ trunk/demos/Skeletons/CustomTorques/src/MyApp.cpp	(revision 122)
@@ -26,5 +26,5 @@
 using namespace flair::sensor;
 
-MyApp::MyApp(Uav* uav,TargetController *controller): UavStateMachine(uav,controller), behaviourMode(BehaviourMode_t::Default) {
+MyApp::MyApp(TargetController *controller): UavStateMachine(controller), behaviourMode(BehaviourMode_t::Default) {
     start_CustomTorques=new PushButton(GetButtonsLayout()->NewRow(),"start CustomTorques");
     stop_CustomTorques=new PushButton(GetButtonsLayout()->NewRow(),"stop CustomTorques");
Index: trunk/demos/Skeletons/CustomTorques/src/MyApp.h
===================================================================
--- trunk/demos/Skeletons/CustomTorques/src/MyApp.h	(revision 121)
+++ trunk/demos/Skeletons/CustomTorques/src/MyApp.h	(revision 122)
@@ -28,5 +28,5 @@
 class MyApp : public flair::meta::UavStateMachine {
     public:
-        MyApp(flair::meta::Uav* uav,flair::sensor::TargetController *controller);
+        MyApp(flair::sensor::TargetController *controller);
         ~MyApp();
 
Index: trunk/demos/Skeletons/CustomTorques/src/main.cpp
===================================================================
--- trunk/demos/Skeletons/CustomTorques/src/main.cpp	(revision 121)
+++ trunk/demos/Skeletons/CustomTorques/src/main.cpp	(revision 122)
@@ -45,7 +45,7 @@
     manager->SetupLogger(log_path);
 
-    Uav* drone=CreateUav(manager,name,uav_type);
+    Uav* drone=CreateUav(name,uav_type);
     TargetEthController *controller=new TargetEthController(manager,"Dualshock3",ds3port);
-    MyApp* app=new MyApp(drone,controller);
+    MyApp* app=new MyApp(controller);
 
     app->Start();
