Embedded Motion Control 2018 Group 1: Difference between revisions
Line 93: | Line 93: | ||
# Try detecting the exit. | # Try detecting the exit. | ||
# IF exit is found: Drive towards exit and skip to step 7. | # IF exit is found: Drive towards exit and skip to step 7. | ||
ELSE: Turn 180 degrees and perform step 2 and 3 once again. | |||
# Try detecting the exit. | # Try detecting the exit. | ||
# IF exit is found: Drive towards exit and skip to step 7. | # IF exit is found: Drive towards exit and skip to step 7. |
Revision as of 10:21, 28 May 2018
Group Members
TU/e Number | Name | |
---|---|---|
1279602 | Ahmed Hizar (A.H.) Ahmed Ajmal | a.h.ahmed.ajmal@student.tue.nl |
0914013 | Jari (J.J.) van Steen | j.j.v.steen@student.tue.nl |
0924842 | Nazar (N.) Rozkvas | n.rozkvas@student.tue.nl |
1279491 | Arpit (A.) Aggarwal | a.aggarwal@student.tue.nl |
1031018 | Willem (W.) Verhoeven | w.b.verhoeven@student.tue.nl |
Escape room
This part describes all of our progress in the first challenge of the course, which is the Escape Room challenge.
Initial design
Before the software could be created that makes an escape possible, an initial design report was created to assist in the design of the software. This initial design report can be found here: Initial design report group 1. The most important points from this report will be given on the wiki page.
Requirements & Specifications
The first step in the design process is the creation of requirements for the software, which gives a way to express PICO's required behaviour in the Escape room challenge. To translate this into software, the requirements have to be specified, which is done via specifications. These specifications are used in the software design. Both the requirements and corresponding specifications are given here:
Requirements | Specifications |
---|---|
PICO has to avoid all walls at any time. | PICO should always stay always stay away from walls at least 15 centimeters. |
PICO should aim for an equal distance to the right and left when moving through a corridor between 0.5 and 1.5 meters. | |
PICO should complete its task well independent of the initial conditions. | PICO has to scan its surroundings with a frequency of at least 5 Hz while moving to prevent bumping into a wall. |
PICO should operate fully autonomously. | The final software should not make use of teleoperation. |
PICO cannot translate or rotate faster than prescribed. | The maximum translational velocity of PICO is 0.5 m/s and the maximum rotational velocity of PICO is 1.2 rad/s. |
PICO has to deal with small imperfections in the real world it operates in. | An uncertainty margin of 0.05 meter should be present when building a world model to deal with imperfections in the real world. |
The software should be easy to set up. | The software should be set up according to the information on the wiki page. |
PICO has to cross the finish line as fast as possible within the maximum time of 5 minutes. | |
PICO needs to stop when it crosses the finish line. | PICO needs to stop after it has entered the corridor and there is more than 1 meter distance to the left and to the right |
PICO has to identify the exit of the escape room. | An algorithm is created which ensures that PICO identifies an exit between 0.5 and 1.5 meters wide when facing the exit under an angle of 60 degrees or less. |
PICO has to keep looking for the exit if it cannot find the exit. | PICO will drive towards the point furthest away from at that moment if the exit is not detected. |
Escape strategy
To escape the room as fast as possible for this challenge, a plan has been created on geometric level that makes PICO escape as fast as possible. This plan will be described here by first explaining the plan at the highest level and explaining some of the steps in more detail afterwards.
Overlaying plan
The highest level of this plan will first be described by a simple step-by-step algorithm.
- Initialize the sensors and actuators.
- Scan surroundings from the given position and orientation.
- Try detecting the exit.
- IF exit is found: Drive towards exit and skip to step 7.
ELSE: Turn 180 degrees and perform step 2 and 3 once again.
- Try detecting the exit.
- IF exit is found: Drive towards exit and skip to step 7.
ELSE: Move into the direction of the furthest point for a quarter of this distance.
- Return to step 2.
- Identify the 2 corridor walls and orient the robot to face the exit, then drive forward while remaining in the center.
Program structure
The program has been built according to the Initial Design (Initial design report group 1) having the following 3 structural blocks: Detection, Planning and Control. Each of these correspond to a separate class, connected via an additional class 'main'. The functionality of each class is described in more detail below.
State flags
Execution of the program is sequential, such that the methods are called one-by-one depending on the state of the robot. The states are controlled by boolean flags, which include:
- turn - a flag set to "true" by the planning block when no exit is detected and we wish to turn around to examine the other half of the room. It is unchecked when the control block completes the turn;
- drive_frw - a flag set to "true" by the planning block when exit is detected a PICO has to move in that direction or when no exit is detected and the robot should move in the direction of the furthest point detected;
- turned_once - a flag set to true by the planning block after the first turn in the case exit is not detected form the original orientation. This flag ensures that no continuous turning occurs. The value is set to "false" when drive_frw is set to "true";
- in_corridor - a flag set in the main function when the execution cycle for moving towards the exit it completed. This assumes that PICO is at the exit and a different algorithm for setpoints generation is executed in the planning block;
- escaped - a flag set by the detection block, when no reasonable data is detected after passing through the corridor. As this flag is turned to true, the program should stop executing.
Program classses
The whole program consisted of 4 C++ classes:
main.cpp
- This is the main function where the program starts.
- It initializes objects that are required for the hardware components interaction and program execution (e.g. emc::Rate, emc::IO).
- It initializes the objects storing the sensor data, setpoint for the control loop and the furthest detected point. The later one has the same type as setpoints, however initialized separately since the furthest point is updated every iteration of the main while loop.
- Inside the while loop, the three classes are executed and are constantly updated (Detection, Planning, Control).
detection.cpp
- This is the class that reads data from the sensors, filters it and does detection of primitive shapes and their interpretation. Output is wall line equation, corner points of the exit and one point for the furthest detected distance, with corresponding boolean flags
- Detection file includes methods to detect the walls, find exit and furthest point via line-fitting algorithm.
- The line fitting algorithm provides the equation of a line.
- Method to find exit compares the fitted lines with individual measurements, looking for large neighboring differences in the laser data.
- Method to find walls assumes that the data from the front and the sides of the robot should represent lines. This is verified by searching for laser data with distance closer than a specified value. It then fits the line over those points and spits them to the planning block.
- Method for the furthest point searches for the laser scan with the largest distance data.
planning.cpp
- This is the class that interprets the data and sets the setpoints for movement. The output is relative angle to the setpoint and distance to it.
- It fully exploits the flag commands mentioned earlier and bases its decision on them.
- There are two algorithms between which, the distinction is done depending on the phase that the PICO is in.
- Room logic method checks all the data provided by the detection class and interprets it in destination points.
- A series of corridor following commands access the corridor data when the flag in_corridor is checked. It sets a setpoint based on the two parallel lines describing the walls, keeping the robot in the middle of the corridor
driveControl.cpp
- This is the class that converts the setpoints to the commands to the actuators and tracks their execution.
- It heavily relies on the odometry data.
- Based on the flags turn or drive_frw it executes the functions for speed regulation till the odometry data states that PICO is at the desired position.
Simulation
With the program described above, PICO was able to escape the room in the simulation.
Escape room challenge
Unfortunately, the program for the Escape room challenge was not written perfectly and PICO have failed the challenge, not being able to find the exit. As it was found later, the reason for that is the difference execution of the drive controls in the simulator and on the robot. The simulator was built in such a way, that PICO does not stop moving is a given direction till a command is changed. However, the real robot executed the drive commands only for a certain period of time and then it stops.
As a result, during the first operation stage facing the wall, it did not complete the full turn to scan the surroundings and proceeded to the next stage, moving to the furthest point. The furthest point was not selected properly and PICO have hit the wall.
Another conclusion that our group has made is that there should be a direct repulsion algorithm implemented such that in case PICO is located too close to the wall, the first command would be to move from the wall to the safe (predefined) distance and maintain it during the whole challenge. Only if this condition is achieved, the regular program can be run.