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  MotorInterface * control=NULL;
24  Planner *planner=NULL;
25  Logger * logger=NULL;
26  bool running =0;
27  std::thread * LIDAR_thread=NULL;
28  float simulationStep=2*std::max(ROBOT_HALFLENGTH, ROBOT_HALFWIDTH);
29  std::chrono::high_resolution_clock::time_point previousTimeScan;
30  GoalChanger * goal_changer=NULL;
31  std::vector<vertexDescriptor>m_plan, current_vertices;
32  Task controlGoal;
33  CoordinateContainer data2fp;
34  TransitionSystem transitionSystem=TransitionSystem(1);
35  WorldBuilder *worldBuilder=new WorldBuilder();
36  vertexDescriptor currentVertex=MOVING_VERTEX;
37  edgeDescriptor movingEdge=edgeDescriptor(), currentEdge=movingEdge;
38 
39  public:
40 
41 
42 Configurator(){
43  init();
44 }
45 
46 Configurator(Task _task){
47  init(_task);
48 }
49 
50 virtual ~Configurator(){
51  delete worldBuilder;
52  worldBuilder=NULL;
53 }
54 
58 void insertCoordinate(float x, float y){
59  data2fp.insert(Pointf(x, y));
60 }
61 
67 virtual void init(Task _task=Task());
68 
75 virtual bool Spawner();
76 
77 int getIteration(){
78  return iteration;
79 }
80 
81 void addIteration(int i=1){
82  iteration+=i;
83 }
84 
85 void assignDisturbanceToTask(const Disturbance & d, Task & t);
86 
87 
88 void dummy_vertex(vertexDescriptor src);
89 
97 simResult simulate(Task t, b2World & w);
98 
99 virtual float remainingSimulationTime(const Task * const t=NULL);
100 
106 
107 
108 void printPlan(std::vector <vertexDescriptor>* p=NULL);
109 
110 
111 
120 std::pair<edgeDescriptor, bool> addVertex(const vertexDescriptor & src, vertexDescriptor &v1, Edge edge=Edge(), bool topDown=0);
121 
126 virtual void explore_plan(b2World&)=0;
127 
128 //std::vector <vertexDescriptor> back_planner(TransitionSystem&, vertexDescriptor, vertexDescriptor root=0);
129 
130 // //starts thread
131 // void start();
132 
133 // //stops thread
134 // void stop();
135 
136 void registerInterface(MotorInterface *);
137 
144 void newScanEvent();
145 
149 void clearData(){data2fp.clear();}
150 
151 
155 virtual void change_task();
156 
162 void update_graph(TransitionSystem& g, const TrackingResult & tr);
163 
164 //round angle to a divisor of PI/2
172 float approximate_angle(float angle, Direction d, simResult::resultType outcome);
173 
177 virtual void adjust_goal_expectation();
178 
182 std::pair <bool, Direction> getOppositeDirection(Direction d);
183 
184 
191 void adjust_simulated_task(const vertexDescriptor&v, Task& t);
192 
193 
194 void register_controller(Controller * controller){
195  task_controller=controller;
196 }
197 
198 Controller* get_controller(){
199  return task_controller;
200 }
204 void register_tracker(Tracker * _tracker){
205  if (!_tracker){return;}
206  tracker=_tracker;
207  tracker->init(controlGoal);
208 }
209 
210 Tracker * get_tracker()const {
211  return tracker;
212 }
213 
214 MotorInterface * get_motor_interface(){
215  return control;
216 }
217 
218 
219 
220 void register_planner(Planner * _p){
221  planner=_p;
222 }
223 
224 void setSimulationStep(float f){
225  simulationStep=f;
226 }
227 
228 void register_logger(Logger * l){
229  logger=l;
230 }
231 
232 void register_goalChanger(GoalChanger * gc){
233  goal_changer=gc;
234 }
235 
240 static void MulT(const b2Transform& B, Task & task);
241 
242 
247 static void InvMul(const b2Transform& B, Task & task);
248 
253 static void InvMul_(const b2Transform& B, Task & task);
254 
259 static void Mul(const b2Transform& B, Task &task);
260 
269 virtual Robot makeRobot(b2World& world, const Task & task);
270 
271 //Disturbance * getGoalDisturbance(){return &controlGoal.disturbance;}
272 
273 bool areInterfacesSetUp();
274 
281 void assignBodyFeatures(Task & t, const BodyFeatures & bf);
282 
290 void assignDimensions(Task & t, float halfLength, float halfWidth);
291 
292 void register_worldBuilder(WorldBuilder * wb){
293  if (worldBuilder){
294  delete worldBuilder;
295  }
296  worldBuilder=wb;
297 }
298 
299 b2Transform get_start(const Task *const t){
300  if (!t){
301  throw std::invalid_argument("null pointer to task");
302  }
303  return t->start;
304 }
305 
306 Direction get_direction(const Task *const t){
307  if (!t){
308  throw std::invalid_argument("null pointer to task");
309  }
310  return t->direction;
311 }
312 };
313 
319  protected:
320  void explore_plan(b2World&)override;
321 
322  float remainingSimulationTime(const Task *const t)override;
323 
324  public:
325 
327 
328  ReactiveConfigurator(Task _task){
329  init(_task);
330 }
331 
332 
333 };
334 
335  #endif
Definition: configurator.h:17
void register_tracker(Tracker *_tracker)
registers and initialises the tracker to the goal
Definition: configurator.h:204
void adjust_simulated_task(const vertexDescriptor &v, Task &t)
If Task.
Definition: configurator.cpp:296
float approximate_angle(float angle, Direction d, simResult::resultType outcome)
Approximating angle to divisors of pi/2.
Definition: configurator.cpp:160
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:102
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:285
virtual Robot makeRobot(b2World &world, const Task &task)
Makes the robot object in the world with the given start position and task.
Definition: configurator.cpp:73
virtual bool Spawner()
Calls functions to explore the state space and extract a plan.
Definition: configurator.cpp:47
std::pair< bool, Direction > getOppositeDirection(Direction d)
Definition: configurator.cpp:312
void estimate_current_vertex()
Definition: configurator.cpp:179
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:289
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.
void newScanEvent()
Spawns tasks, creates plans, tracks task and controls real-world task switching option to run in thre...
Definition: configurator.cpp:139
virtual void adjust_goal_expectation()
Uses tracking information to adjust the position of the goal relative to the robot.
Definition: configurator.cpp:256
static void Mul(const b2Transform &B, Task &task)
Matrix multiplication.
Definition: configurator.cpp:14
void insertCoordinate(float x, float y)
Inserts one xy coordinate in the coordinate container.
Definition: configurator.h:58
void clearData()
Clears coordinates.
Definition: configurator.h:149
virtual void init(Task _task=Task())
Initialises configurator.
Definition: configurator.cpp:19
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:235
simResult simulate(Task t, b2World &w)
Simulates this task, includes creating the robot object.
Definition: configurator.cpp:80
virtual void change_task()
changes tasks executing on the robot
Definition: configurator.cpp:214
Callback interface class for implementing custom strategies to switch between tasks to be executed.
Definition: task_controller.h:11
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:318
void explore_plan(b2World &) override
Explores and plan.
Definition: configurator.cpp:323
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:47
Tracking interface: Bridge between the real world and the simulation. Is used for tracking execution ...
Definition: tracker.h:19
Definition: worldbuilder.h:5
std::set< Pointf > CoordinateContainer
container for LIDAR coordinates
Definition: sensor.h:61
Definition: disturbance.h:47
Definition: disturbance.h:113
Edges connecting states in the transition system.
Definition: graphTools.h:40
Definition: control_interface.h:117
Wrapper around cv::Point2f for customisation purposes.
Definition: sensor.h:12
Definition: tracker.h:5
Definition: disturbance.h:269