Bratmobile
configurator.h
1 #ifndef CONFIGURATOR_H
2 #define CONFIGURATOR_H
3 #include <dirent.h>
4 #include <thread>
5 #include <filesystem>
6 #include <ncurses.h>
7 #include <fstream>
8 #include <algorithm>
9 #include <random>
10 #include <sys/stat.h>
11 #include "debug.h"
12 #include "planner.h"
13 #include "control_interface.h"
14 #include "task_controller.h"
15 #include "tracker.h"
16 
18 protected:
19  int iteration=0, simulatedTasks=0;
20  Task currentTask;
21  Controller * task_controller=NULL;
22  Tracker * tracker=NULL;
23  LIDAR_In * ci=NULL;
24  Motor_Out * control=NULL;
25  Planner *planner=NULL;
26  Logger * logger=NULL;
27  bool running =0;
28  std::thread * LIDAR_thread=NULL;
29  float simulationStep=2*std::max(ROBOT_HALFLENGTH, ROBOT_HALFWIDTH);
30  std::chrono::high_resolution_clock::time_point previousTimeScan;
31  GoalChanger * goal_changer=NULL;
32  std::vector<vertexDescriptor>m_plan, current_vertices;
33  Task controlGoal;
34  CoordinateContainer data2fp;
35  TransitionSystem transitionSystem=TransitionSystem(1);
36  WorldBuilder *worldBuilder=new WorldBuilder();
37  vertexDescriptor currentVertex=MOVING_VERTEX;
38  edgeDescriptor movingEdge=edgeDescriptor(), currentEdge=movingEdge;
39 
40  public:
41 
42 
43 Configurator(){
44  init();
45 }
46 
47 Configurator(Task _task){
48  init(_task);
49 }
50 
51 virtual ~Configurator(){
52  stop();
53  delete worldBuilder;
54  worldBuilder=NULL;
55 }
56 
62 virtual void init(Task _task=Task());
63 
70 virtual bool Spawner();
71 
72 int getIteration(){
73  return iteration;
74 }
75 
76 void addIteration(int i=1){
77  iteration+=i;
78 }
79 
80 void assignDisturbanceToTask(const Disturbance & d, Task & t);
81 
82 
83 void dummy_vertex(vertexDescriptor src);
84 
92 simResult simulate(Task t, b2World & w);
93 
94 virtual float remainingSimulationTime(const Task * const t=NULL);
95 
101 
102 
103 void printPlan(std::vector <vertexDescriptor>* p=NULL);
104 
105 
106 
115 std::pair<edgeDescriptor, bool> addVertex(const vertexDescriptor & src, vertexDescriptor &v1, Edge edge=Edge(), bool topDown=0);
116 
121 virtual void explore_plan(b2World&)=0;
122 
123 //std::vector <vertexDescriptor> back_planner(TransitionSystem&, vertexDescriptor, vertexDescriptor root=0);
124 
125 //starts thread
126 void start();
127 
128 //stops thread
129 void stop();
130 
131 void registerInterface(LIDAR_In *, Motor_Out *);
132 
139 static void run(Configurator *);
140 
144 virtual void change_task();
145 
151 void update_graph(TransitionSystem& g, const TrackingResult & tr);
152 
153 //round angle to a divisor of PI/2
161 float approximate_angle(float angle, Direction d, simResult::resultType outcome);
162 
166 virtual void adjust_goal_expectation();
167 
171 std::pair <bool, Direction> getOppositeDirection(Direction d);
172 
173 
180 void adjust_simulated_task(const vertexDescriptor&v, Task& t);
181 
182 
183 void register_controller(Controller * controller){
184  task_controller=controller;
185 }
186 
187 Controller* get_controller(){
188  return task_controller;
189 }
193 void register_tracker(Tracker * _tracker){
194  if (!_tracker){return;}
195  tracker=_tracker;
196  tracker->init(controlGoal);
197 }
198 
199 Tracker * get_tracker()const {
200  return tracker;
201 }
202 
203 Motor_Out * get_motor_interface(){
204  return control;
205 }
206 
207 LIDAR_In * get_lidar_interface(){
208  return ci;
209 }
210 
211 
212 void register_planner(Planner * _p){
213  planner=_p;
214 }
215 
216 void setSimulationStep(float f){
217  simulationStep=f;
218 }
219 
220 void register_logger(Logger * l){
221  logger=l;
222 }
223 
224 void register_goalChanger(GoalChanger * gc){
225  goal_changer=gc;
226 }
227 
232 static void MulT(const b2Transform& B, Task & task);
233 
234 
239 static void InvMul(const b2Transform& B, Task & task);
240 
245 static void InvMul_(const b2Transform& B, Task & task);
246 
251 static void Mul(const b2Transform& B, Task &task);
252 
261 virtual Robot makeRobot(b2World& world, const b2Transform & start);
262 
263 //Disturbance * getGoalDisturbance(){return &controlGoal.disturbance;}
264 
265 bool areInterfacesSetUp(Configurator * c=NULL);
266 
273 void assignBodyFeatures(Task & t, const BodyFeatures & bf);
274 
282 void assignDimensions(Task & t, float halfLength, float halfWidth);
283 
284 void register_worldBuilder(WorldBuilder * wb){
285  if (worldBuilder){
286  delete worldBuilder;
287  }
288  worldBuilder=wb;
289 }
290 
291 b2Transform get_start(const Task *const t){
292  if (!t){
293  throw std::invalid_argument("null pointer to task");
294  }
295  return t->start;
296 }
297 
298 Direction get_direction(const Task *const t){
299  if (!t){
300  throw std::invalid_argument("null pointer to task");
301  }
302  return t->direction;
303 }
304 };
305 
311  protected:
312  void explore_plan(b2World&)override;
313 
314  float remainingSimulationTime(const Task *const t)override;
315 
316  public:
317 
319 
320  ReactiveConfigurator(Task _task){
321  init(_task);
322 }
323 
324 
325 };
326 
327  #endif
Definition: disturbance.h:47
Definition: configurator.h:17
void register_tracker(Tracker *_tracker)
registers and initialises the tracker to the goal
Definition: configurator.h:193
virtual Robot makeRobot(b2World &world, const b2Transform &start)
Makes the robot object in the world with the given start position and task.
Definition: configurator.cpp:80
void adjust_simulated_task(const vertexDescriptor &v, Task &t)
If Task.
Definition: configurator.cpp:350
static void run(Configurator *)
Spawns tasks, creates plans, tracks task and controls real-world task switching option to run in thre...
Definition: configurator.cpp:177
float approximate_angle(float angle, Direction d, simResult::resultType outcome)
Approximating angle to divisors of pi/2.
Definition: configurator.cpp:212
std::pair< edgeDescriptor, bool > addVertex(const vertexDescriptor &src, vertexDescriptor &v1, Edge edge=Edge(), bool topDown=0)
Add state to the cognitive map and set next state Task direction and options.
Definition: configurator.cpp:112
void assignBodyFeatures(Task &t, const BodyFeatures &bf)
Assigns body features to the disturbance of a task (NOTE: affordance and validity of the disturbance ...
Definition: configurator.cpp:339
virtual bool Spawner()
Calls functions to explore the state space and extract a plan.
Definition: configurator.cpp:54
std::pair< bool, Direction > getOppositeDirection(Direction d)
Definition: configurator.cpp:366
void estimate_current_vertex()
Definition: configurator.cpp:231
void assignDimensions(Task &t, float halfLength, float halfWidth)
Assigns dimensions to the disturbance of a task (NOTE: pose, affordance and validity of the disturban...
Definition: configurator.cpp:343
static void InvMul_(const b2Transform &B, Task &task)
Matrix multiply by transpose.
static void MulT(const b2Transform &B, Task &task)
Matrix multiply by transpose.
Definition: configurator.cpp:4
virtual void explore_plan(b2World &)=0
Explores and plan.
virtual void adjust_goal_expectation()
Uses tracking information to adjust the position of the goal relative to the robot.
Definition: configurator.cpp:302
static void Mul(const b2Transform &B, Task &task)
Matrix multiplication.
Definition: configurator.cpp:14
virtual void init(Task _task=Task())
Initialises configurator.
Definition: configurator.cpp:22
static void InvMul(const b2Transform &B, Task &task)
Matrix multiply by transpose.
Definition: configurator.cpp:9
void update_graph(TransitionSystem &g, const TrackingResult &tr)
Definition: configurator.cpp:287
simResult simulate(Task t, b2World &w)
Simulates this task, includes creating the robot object.
Definition: configurator.cpp:87
virtual void change_task()
changes tasks executing on the robot
Definition: configurator.cpp:266
Callback interface class for implementing custom strategies to switch between tasks to be executed.
Definition: task_controller.h:11
Definition: control_interface.h:31
Class used to load data from the configurator.
Definition: debug.h:18
Definition: control_interface.h:42
Searches the transition system and extracts a plan.
Definition: planner.h:130
Implements a Braitenberg vehicle: only simulates one Task at a time.
Definition: configurator.h:310
void explore_plan(b2World &) override
Explores and plan.
Definition: configurator.cpp:377
Robot class for Box2D simulation.
Definition: robot.h:18
A closed hybrid control loop. It has an initial disturbance representing the continuous state and a d...
Definition: task.h:45
Tracking interface: Bridge between the real world and the simulation. Is used for tracking execution ...
Definition: tracker.h:17
Definition: worldbuilder.h:5
std::set< Pointf > CoordinateContainer
container for LIDAR coordinates
Definition: sensor.h:61
Definition: disturbance.h:114
Edges connecting states in the transition system.
Definition: graphTools.h:40
Definition: control_interface.h:119
Definition: tracker.h:3
Definition: disturbance.h:270