Embedded Motion Control 2017 Group 9: Difference between revisions
(13 intermediate revisions by 3 users not shown) | |||
Line 169: | Line 169: | ||
:::First, the robot will detect the existence of the door and returns ‘possible_door_flag’, which indicates the existence and the direction of the door with respect to the robot. When ‘possible_door_flag’ is '1', the running program will skip ‘junction detection’ sub-block and directly execute ‘Door Movement Block’ since the information of junction is not as important as information of door existence. Otherwise, ‘Detection & Decision Block’ will proceed to the next sub-block for junction checking. <br><br> | :::First, the robot will detect the existence of the door and returns ‘possible_door_flag’, which indicates the existence and the direction of the door with respect to the robot. When ‘possible_door_flag’ is '1', the running program will skip ‘junction detection’ sub-block and directly execute ‘Door Movement Block’ since the information of junction is not as important as information of door existence. Otherwise, ‘Detection & Decision Block’ will proceed to the next sub-block for junction checking. <br><br> | ||
::: | :::Secondly, the robot will detect the existence of junctions. The junction will be described by ‘junction_flag’ and ‘junction direction flag’. The ‘junction_flag’ indicates the existence of the junction around the robot, and it is set by ‘Junction Detection’ sub-block. The ‘junction direction flag’ indicates the type of junction: left, forward and right. If ‘junction_flag’ is '1' indicating the existence of a junction, the ‘Decision’ sub-block will then decide the direction to which robot should move. If not, the ‘Decision’ sub-block will give the default movement mode, ‘Normal Move Forward’. <br><br> | ||
:::The ‘Open Space Detection’ is inside the ‘Junction Detection’ sub-block which will be introduced later.<br><br> | :::The ‘Open Space Detection’ is inside the ‘Junction Detection’ sub-block which will be introduced later.<br><br> | ||
:::Notice that when the robot is executing actions, the position and orientation of the robot with respect to the maze is changing, therefore, the data collected by laser scanner is not reliable for making another decision. In order to avoid this type of error, we want to block the ‘Detection and Decision Block’ until the last issued command is implemented completely and ‘junction_flag’, ‘possible_door_flag’ are reset. As a result, it is necessary to stipulate that ‘Detection & Decision Block’ can only be executed when both ‘junction_flag’ and ‘possible_door_flag’ are '0'. For example, after a junction or door is detected, another decision will not be made until movement is finished and the other blocks help reset the flags.<br><br> | :::Notice that when the robot is executing actions, the position and orientation of the robot with respect to the maze is changing, therefore, the data collected by laser scanner is not reliable for making another decision. In order to avoid this type of error, we want to block the ‘Detection and Decision Block’ until the last issued command is implemented completely and ‘junction_flag’, ‘possible_door_flag’ are reset. As a result, it is necessary to stipulate that ‘Detection & Decision Block’ can only be executed when both ‘junction_flag’ and ‘possible_door_flag’ are '0'. For example, after a junction or door is detected, another decision will not be made until movement is finished and the other blocks help reset the flags.<br><br> | ||
Line 278: | Line 278: | ||
:::The code introducing the information of front left/right laser beam into environment detection is positioned at the end of the "junction_detection.cpp", after the detection of junction is completed. The value of junction_flag and int array junction_direction which indicate the direction of the available corridors at the junction has been assigned. Then, checks on the result of LRF at -45° and 45° follows. If there is no obstacle found in one of these two directions, junction_flag will be reset and the information of left junction detection will be cleaned. i.e. the value of junction_direction[2] will be assigned zero. Variable openspace_flag will be set to indicate the discovery of open space, no matter it is left or right one. <br><br> | :::The code introducing the information of front left/right laser beam into environment detection is positioned at the end of the "junction_detection.cpp", after the detection of junction is completed. The value of junction_flag and int array junction_direction which indicate the direction of the available corridors at the junction has been assigned. Then, checks on the result of LRF at -45° and 45° follows. If there is no obstacle found in one of these two directions, junction_flag will be reset and the information of left junction detection will be cleaned. i.e. the value of junction_direction[2] will be assigned zero. Variable openspace_flag will be set to indicate the discovery of open space, no matter it is left or right one. <br><br> | ||
And then, it comes the decision block. Now, the value of junction_flag is zero, Decision block will not execute "Corridor Decision Block" because the condition for this block doesn't hold as showed in figure ''''"Flow Chart of Decision Block"'''. But the condition for the first case in "Open Space Decision Block" hold in this case and decision in this case is specified as 2(indicator of turning left movement) in this round and another variable "openspace_decision_flag" is set at the end of the this sub-block. When "turning left" movement is completed, same detection procedure is repetitively performed. Because the discovery of right open space, the indicator of the discovery of junctions keep being cleaned and indicator for left junction stays at 0 at the end of "Junction_detection Block", openspace_flag is set at the mean time as stated above. the second time when "Decision Block" is executed, the condition of the first case in "Open Space Decision Block" doesn't hold anymore beacause the value of "openspace_decision_flag" has been set to 1 and no block help to reset it up to now. It is until "Openspce_case3" that "Decision Block" executes sub-block3 and reset the value of "openspace_decision_flag". That is how open-space algorithms works.<br><br> | And then, it comes to the decision block. Now, the value of junction_flag is zero, Decision block will not execute "Corridor Decision Block" because the condition for this block doesn't hold as showed in figure ''''"Flow Chart of Decision Block"'''. But the condition for the first case in "Open Space Decision Block" hold in this case and decision in this case is specified as 2(indicator of turning left movement) in this round and another variable "openspace_decision_flag" is set at the end of the this sub-block. When "turning left" movement is completed, same detection procedure is repetitively performed. Because the discovery of right open space, the indicator of the discovery of junctions keep being cleaned and indicator for left junction stays at 0 at the end of "Junction_detection Block", openspace_flag is set at the mean time as stated above. the second time when "Decision Block" is executed, the condition of the first case in "Open Space Decision Block" doesn't hold anymore beacause the value of "openspace_decision_flag" has been set to 1 and no block help to reset it up to now. It is until "Openspce_case3" that "Decision Block" executes sub-block3 and reset the value of "openspace_decision_flag". That is how open-space algorithms works.<br><br> | ||
The performance of the algorithm is show in video "'''Open space performance in simulator'''"<br> | The performance of the algorithm is show in video "'''Open space performance in simulator'''"<br> | ||
Line 290: | Line 290: | ||
{| class="wikitable" style="text-align: left; width: 1000px;" | {| class="wikitable" style="text-align: left; width: 1000px;" | ||
|- | |- | ||
| | |The Decision Block consists of two sub-blocks. One of the sub-blocks is “Corridor Decision Block” and the other block is “Open Space Decision Block”. These two blocks account for decision in corridor and open-space respectively. The switch between two decision sub-block is based on the value of “openspace_flag”, which indicate the existence of the open space. | ||
:As demonstrated in “Flow-Chart of Decision block”, when “Decision Block” is executed, program will be navigated to different sub-blocks. Navigating variables are given by “junction_detection” block. According to the internal logic of the “junction_detection” block, “junction_flag” and “openspace_flag” cannot be true at the same time, which ensures that “Decision” block cannot execute “Corridor Decision Block” and “Open Space Decision Block” in same round. | :As demonstrated in “Flow-Chart of Decision block”, when “Decision Block” is executed, program will be navigated to different sub-blocks. Navigating variables are given by “junction_detection” block. According to the internal logic of the “junction_detection” block, “junction_flag” and “openspace_flag” cannot be true at the same time, which ensures that “Decision” block cannot execute “Corridor Decision Block” and “Open Space Decision Block” in same round. | ||
:The detailed decision logic will be interpreted below: | :The detailed decision logic will be interpreted below: | ||
Line 324: | Line 324: | ||
|- | |- | ||
|After the door check function has been completed, the door movement function is then called. The possible door flag obtained from the door check function is then utilized to determine the position of the door: | |After the door check function has been completed, the door movement function is then called. The possible door flag obtained from the door check function is then utilized to determine the position of the door: | ||
If the possible door flag is 1 the robot has to turn to the right, if the flag is 2 the robot has to move straight and if the flag is 3, the robot has to turn left. After making the turn and adjust its position with respect to the potential door, the “io.sendOpendoorRequest” command which represented as a bell rings is executed and the robot has to wait 5 seconds for the door to open. After 5 seconds has expired, the robot then scan whether the door has opened or not. | |||
If the door is opened, then all the flag in the function are cleared and then the program will jump out from this door movement function into turn straight in the junction movement function. If the door is not opened (which means false door is detected) then the robot needs to make a turn. The turn that the robot has to made is based on where the door was before. If the door was detected in front then 180 degrees rotation is executed, if door was in the left then 90 degrees rotation to the right is executed and if detect the door was in the right then 90 degrees rotation to the left is executed. After the rotation is done, then all of the flag related to the door check and movement are cleared and the program back to the main function. | If the door is opened, then all the flag in the function are cleared and then the program will jump out from this door movement function into turn straight in the junction movement function. If the door is not opened (which means false door is detected) then the robot needs to make a turn. The turn that the robot has to made is based on where the door was before. If the door was detected in front then 180 degrees rotation is executed, if door was in the left then 90 degrees rotation to the right is executed and if detect the door was in the right then 90 degrees rotation to the left is executed. After the rotation is done, then all of the flag related to the door check and movement are cleared and the program back to the main function. | ||
There are few additional flags being used in this door movement function. Calibration flag is used indicate that the robot has adjusted its position with respect to the potential door. The rotate finished flag is used to make sure the robot has finished the rotation. The signal sent flag indicates whether the open door request has been sent or not. The waiting finished flag is used to indicates that the waiting time for door to be opened has been expired. <br> | There are few additional flags being used in this door movement function. Calibration flag is used indicate that the robot has adjusted its position with respect to the potential door. The rotate finished flag is used to make sure the robot has finished the rotation. The signal sent flag indicates whether the open door request has been sent or not. The waiting finished flag is used to indicates that the waiting time for door to be opened has been expired. <br> | ||
[https://gitlab.com/emc2017/group9/snippets/1665190/ code snippet: door_movement.cpp]<br> | |||
[[file:door_mov.gif]] | [[file:door_mov.gif]] | ||
| | |[[File:Door_movement.png |500px|thumb|Door_movement.png]] | ||
[[File:Door_movement.png |500px|thumb|Door_movement.png]] | |||
|- | |- | ||
|} | |} | ||
Line 350: | Line 348: | ||
Both cases turnRight and turnLeft rotates 90 degrees to the corresponding direction and measures the rotation with the odometer to determine when to stop. To make sure that the odometer is accurate enough, the rotating speed is set at 0.2 rad/s. <br> | Both cases turnRight and turnLeft rotates 90 degrees to the corresponding direction and measures the rotation with the odometer to determine when to stop. To make sure that the odometer is accurate enough, the rotating speed is set at 0.2 rad/s. <br> | ||
''''' | '''''moveForward''''':<br> | ||
After finishing the turnStraight, the code will go into the movForward state. PICO moves straight for 5m or stops when counters time[5s] has passed. This movement is exactly the same as the turnStraight movement except for the distance and countertime. <br> | After finishing the turnStraight, the code will go into the movForward state. PICO moves straight for 5m or stops when counters time[5s] has passed. This movement is exactly the same as the turnStraight movement except for the distance and countertime. <br> | ||
Line 392: | Line 390: | ||
|-style="text-align: center;" | |-style="text-align: center;" | ||
| | | | ||
'''Maze | '''Maze challenge record''' | ||
|- | |- | ||
Line 400: | Line 398: | ||
|[[File:Dead end1.png |380px]] [[File:Dead end2.png |360px|]]<br> | |[[File:Dead end1.png |380px]] [[File:Dead end2.png |360px|]]<br> | ||
|-style="text-align: center;" | |-style="text-align: center;" | ||
|'''First | |'''First dead end & Second dead end''' | ||
|- | |- | ||
|Causal analysis on the failure of the Maze Challenge was proved by simulator as well. We make the configures same as what we applied in Experiment and executed the code on simulator, same phenomenon was observed as video "'''Dead | |Causal analysis on the failure of the Maze Challenge was proved by simulator as well. We make the configures same as what we applied in Experiment and executed the code on simulator, same phenomenon was observed as video "'''Dead end loop in simulator'''" shows. | ||
|- | |- | ||
|[[File:Dead end loop.png|center|400px|link=https://www.youtube.com/watch?v=0uGBiHtvhQ4&feature=youtu.be]]<br> | |[[File:Dead end loop.png|center|400px|link=https://www.youtube.com/watch?v=0uGBiHtvhQ4&feature=youtu.be]]<br> | ||
|-style="text-align: center;" | |-style="text-align: center;" | ||
|'''Dead | |'''Dead end loop in simulator''' | ||
|- | |- | ||
| After the | | After the maze challenge, we lowered the value of detection radius for front obstacle detection and ran the code in simulator. Because it is arbitrary decision, the time PICO costed for maze solving is not a constant. But we found the maze could always be solved within 5 mins. Video "'''Maze solving performance in simulator'''" shows that "Maze is solved successfully within 5 mins" | ||
|-style="text-align: center;" | |-style="text-align: center;" | ||
|[[File:Maze Solvingg92017.png|center|400px|link=https://www.youtube.com/watch?v=gu2cwZ9TVVE&feature=youtu.be]]<br> | |[[File:Maze Solvingg92017.png|center|400px|link=https://www.youtube.com/watch?v=gu2cwZ9TVVE&feature=youtu.be]]<br> | ||
|-style="text-align: center;" | |-style="text-align: center;" | ||
|'''Maze | |'''Maze solving performance in simulator''' | ||
|} | |} | ||
Line 425: | Line 423: | ||
<br> | <br> | ||
*'''''Oversensitiveness of | *'''''Oversensitiveness of quantitative algorithm''''': <br> | ||
Mathematical principle of the the algorithm is quantitative. For example, the condition for the discovery of front door detection is that the distance of three directions of PICO (right,left and front) are smaller than specified values. And it was the improperly selected threshold of the front side make PICO go into loop in the maze challenge. By reducing the detection range of a door, this problem was solved. i.e., the portability of quantitative algorithm is oversensitive to the dimensions of the environment, which may lead to mis-detecting and mis-operating. Besides, the rotation of PICO at the junction is controlled in open loop way, and the angle of rotation in junction turning part is integer multiple of 90° based on the precondition that all f the angle of junction is 90°. what if the angle of junction is not 90°? this algorithm cannot deal with a more general problem because of its quantitative based principle. Quantitativeness of the algorithm lower the portability of the it and make PICO oversensitive.<br> | Mathematical principle of the the algorithm is quantitative. For example, the condition for the discovery of front door detection is that the distance of three directions of PICO (right,left and front) are smaller than specified values. And it was the improperly selected threshold of the front side make PICO go into loop in the maze challenge. By reducing the detection range of a door, this problem was solved. i.e., the portability of quantitative algorithm is oversensitive to the dimensions of the environment, which may lead to mis-detecting and mis-operating. Besides, the rotation of PICO at the junction is controlled in open loop way, and the angle of rotation in junction turning part is integer multiple of 90° based on the precondition that all f the angle of junction is 90°. what if the angle of junction is not 90°? this algorithm cannot deal with a more general problem because of its quantitative based principle. Quantitativeness of the algorithm lower the portability of the it and make PICO oversensitive.<br> | ||
Line 432: | Line 430: | ||
<br> | <br> | ||
*'''''Solving | *'''''Solving strategy''''': <br> | ||
Our former design of strategy was using a combination of mapping and depth first search. The problem was that junction detection did not work well, it sets flags where it should not. Thus, this strategy was rejected and we used random decisions. To solve the issue of junction detection,the split and merge algorithm can be used to detect the corners and walls. Another solving strategy that proved to be functioning well is the pledge algorithm that group 10 used. | Our former design of strategy was using a combination of mapping and depth first search. The problem was that junction detection did not work well, it sets flags where it should not. Thus, this strategy was rejected and we used random decisions. To solve the issue of junction detection,the split and merge algorithm can be used to detect the corners and walls. Another solving strategy that proved to be functioning well is the pledge algorithm that group 10 used. | ||
*''''' Too | *''''' Too much "innovation" and too less reference''''': <br> | ||
During the project, we | During the project, we tried to design our own methods to solve the maze instead of using the methods which have been provided in previous WIKI. For example, we designed a new way to solve open space, instead of using 'virtual wall'. Design new method considerably increases the complexity but the result seems not good. In order to avoid this problem, it will be wise to just use the method provided in WIKI. If we still have time, then we can try to create our own method. | ||
*'''''Shining | *'''''Shining points''''': <br> | ||
**'''Flag | **'''Flag based structure''': | ||
:The logic of | :The logic of whole system is built on the base of flags. The flags mainly have three functions: | ||
::*''' | ::*''' Indicate the features around the Robot''':<br> | ||
::''junction_flag'': indicate the discovery of junctions around the PICO | ::''junction_flag'': indicate the discovery of junctions around the PICO | ||
::''Possible_door_flag'': indicate the discovery of possible door | ::''Possible_door_flag'': indicate the discovery of possible door | ||
Line 448: | Line 446: | ||
::Flags shown above performance as an indicator of feature discovery. | ::Flags shown above performance as an indicator of feature discovery. | ||
::*''''' | ::*'''''Indicate the completion of Movement''''' | ||
::''junction_flag'': when junction movement is completed, junction_flag will be reset. | ::''junction_flag'': when junction movement is completed, junction_flag will be reset. | ||
::''possible_door_flag'': when door movement is completed, ‘’possible_door_flag’’ will be reset | ::''possible_door_flag'': when door movement is completed, ‘’possible_door_flag’’ will be reset | ||
Line 471: | Line 469: | ||
::With these flags indicating the state of the PICO, the logicalness of the system is guaranteed. <br> | ::With these flags indicating the state of the PICO, the logicalness of the system is guaranteed. <br> | ||
::The key | ::The key issue of this structure is the position where the flags should be set or reset, it is also where we spent much time.<br> | ||
:*'''''Innovation of | :*'''''Innovation of detection method''''':<br> | ||
:The method to solve open space problem, junction detection and door detection are purely by innovation,. | :The method to solve open space problem, junction detection and door detection are purely by innovation,. | ||
|- | |- | ||
Line 505: | Line 503: | ||
===Movement=== | ===Movement=== | ||
[https://gitlab.com/emc2017/group9/snippets/1664956/ code snippet: move_forward.cpp]<br> | [https://gitlab.com/emc2017/group9/snippets/1664956/ code snippet: move_forward.cpp]<br> | ||
[https://gitlab.com/emc2017/group9/snippets/1664964/ code snippet: junction_movement.cpp] | [https://gitlab.com/emc2017/group9/snippets/1664964/ code snippet: junction_movement.cpp] | ||
= Files = | = Files = | ||
[[File:Assignment-for-week1.pdf]] | [[File:Assignment-for-week1.pdf]] |
Latest revision as of 19:01, 21 June 2017
Group Members
Name: | Student id: |
Mian Wei | 1035075 |
Zhihao Wu | 1041226 |
Petrus Teguh Handoko | 1033085 |
Bo Deng | 1034694 |
Bo Cong | 0976759 |
Jian Wen Kok | 0808353 |
Nico Huebel | Tutor |
Initial Design
The initial design for the maze challenge is elaborated below. It includes the requirements, functions, components, schematic of program structure, specifications and interfaces to define the working of PICO. The file for the initial design is included here: |
Requirements
PICO should:
➢ Drive autonomously through maze
➢ Take a turn without touching walls
➢ Detect turns or branching corridors
➢ Avoid collisions with obstacles (including walls)
➢ Drive straight and rotate smoothly
➢ Not stand still for more than 30 seconds
➢ Avoid getting trapped in the maze
➢ Recognize the door
Functions
Below is the scheme of PICO's functions. The basic skills enable the advanced skills, and all these skills are integrated into the main function to finish the maze challenge.
Components
Drive control
‐Holonomic base (omni‐wheels)
‐Pan‐tilt unit for head
Detection
‐170◦ wide‐angle camer (Unavailable in this project)
‐Asus Xtion Depth sensor (Unavailable in this project)
‐Laser Range Finder (LRF)
‐Wheel encoders (odometry)
World model
Computer
‐Intel I7
‐Ubuntu 14.04
Specifications
- Maximum translational speed of 0.5 m/s | |
Interfaces
The odometer and LRF provide data for mapping the environment.
The algorithm sets nodes on the junction as a setpoint for the navigation and calculates the route.
The results of the calculation are interpreted as movement orders, which control the actuators.
The odometer and LRFare used to constantly track the environment changes.
The recorded changes are compared with the reference and the recognition program can then distinguish obstructions, dead ends, doors and junctions.
Corridor Challenge
Design
For corridor challenge, PICO is designed to behave as follows: These control sequences are illustrated in the flow chart on the right side. Modified potential fieldLaser beams A1 and A2 are used to check the relative distance between the left and right sides of PICO. Based on this measurement, the robot will be adjusted to the middle of the corridor by movement of both translation and rotation velocities. Junction detectionLaser beam B1 and B2 are used to identify whether a junction exists or not. When a junction is detected, the potential field is switched off. PICO continues the forward movement until either A1 or A2 detects the junction. This sequential control guarantees that PICO makes the turn at the correct position. Then PICO turns 90 degrees and moves forward to finish the challenge. ResultPICO was unable to complete the corridor challenge: - In the first trial, PICO moved straight forward without a potential field function. When PICO detects the junction, it stopped and rotated 90 degrees in the opposite direction. This inevitably resulted in crashing into the walls. |
Evaluation
In the first trial, we used our old program that has proven to be successful as seen in the video. Unfortunately we did not push the correct version to PICO. In the second trial, we used our latest program. The potential field function is added since there is a chance that PICO would run into the walls without it. The new program works in the simulation but it has not been tested in the real settings. We had problems of controlling the odometer to turn PICO correctly. During the challenge, this program was run anyway, since the backup program was failed in the first trial. Without being tested in experimental runs, our program unluckily failed us again. Later on, a mistake was found in the junction detection section. After all, we think the potential field function should be properly added to PICO, to prevent colliding into walls; instead of a static turn that is implemented currently, a smooth turn movement is suggested to cut the time expense.
|
Maze Challenge
Design
Architecture
|
Main Flow
|
Detection
Junction Detection
In the figure 'Laser bundle for junction detection', it shows that three laser bundles in the front, left and right directions are selected for the dectections. To make the performance of detection block more reliable and robust, the detection radius and detection angle are carefully calculated. The detection angle is set to be 48° and the maximum detection range is thereby ±114°.
As a result, the boundaries of three laser bundles are:
To make sure that PICO will not collide with the wall, especially when it is turning at junctions, the width 'd' should be larger than PICO's width. We use the base of isosceles triangle constructed by laser beams of -144° and -66°(for right side, we take 114° and 66°) to evaluate the width of the comming side corridor. The calculation is shown as following. This equation ensures that PICO can only find junction that is wide enough for PICO to move into. The detection radius is therefore set to be 0.85. Two flags are used to describe the existence and feature of junctions: the junction flag and the direction flag. Junction flag:
Direction flag:
If junction flag becomes 1, the decision block will be triggered and decide a direction to move PICO. |
Door Detection
Door Open Detection
We use the similar way to detect if the door is opened after waiting for 5 seconds. The forward direction laser bundle is used. If the boundaries and more than 75% laser beams inside the laser bundle detect longer distance than detection radius, PICO will consider door has opened.(Similar as front junction detection) |
Open Space Detection
"Open Space Detection" block is an extension of "Junction Detection" block. By including another two laser beams ranges around -45°and 45°respectively (red ranges in the figure),the feature of open-space can be distinguished from that of normal junctions. the differences will be introduced below in three different cases in detail: Openspace flag:
openspace_Detection_case1
openspace_Detection_case2
openspace_Detection_case3
And then, it comes to the decision block. Now, the value of junction_flag is zero, Decision block will not execute "Corridor Decision Block" because the condition for this block doesn't hold as showed in figure '"Flow Chart of Decision Block". But the condition for the first case in "Open Space Decision Block" hold in this case and decision in this case is specified as 2(indicator of turning left movement) in this round and another variable "openspace_decision_flag" is set at the end of the this sub-block. When "turning left" movement is completed, same detection procedure is repetitively performed. Because the discovery of right open space, the indicator of the discovery of junctions keep being cleaned and indicator for left junction stays at 0 at the end of "Junction_detection Block", openspace_flag is set at the mean time as stated above. the second time when "Decision Block" is executed, the condition of the first case in "Open Space Decision Block" doesn't hold anymore beacause the value of "openspace_decision_flag" has been set to 1 and no block help to reset it up to now. It is until "Openspce_case3" that "Decision Block" executes sub-block3 and reset the value of "openspace_decision_flag". That is how open-space algorithms works. The performance of the algorithm is show in video "Open space performance in simulator" Open space performance in simulator
|
Decision Block
The Decision Block consists of two sub-blocks. One of the sub-blocks is “Corridor Decision Block” and the other block is “Open Space Decision Block”. These two blocks account for decision in corridor and open-space respectively. The switch between two decision sub-block is based on the value of “openspace_flag”, which indicate the existence of the open space.
|
There are three cases that robot may encounter in open space: | |
Case1:
|
|
Case2:
|
|
Case3:
|
Movement
Door Movement
After the door check function has been completed, the door movement function is then called. The possible door flag obtained from the door check function is then utilized to determine the position of the door:
If the possible door flag is 1 the robot has to turn to the right, if the flag is 2 the robot has to move straight and if the flag is 3, the robot has to turn left. After making the turn and adjust its position with respect to the potential door, the “io.sendOpendoorRequest” command which represented as a bell rings is executed and the robot has to wait 5 seconds for the door to open. After 5 seconds has expired, the robot then scan whether the door has opened or not. If the door is opened, then all the flag in the function are cleared and then the program will jump out from this door movement function into turn straight in the junction movement function. If the door is not opened (which means false door is detected) then the robot needs to make a turn. The turn that the robot has to made is based on where the door was before. If the door was detected in front then 180 degrees rotation is executed, if door was in the left then 90 degrees rotation to the right is executed and if detect the door was in the right then 90 degrees rotation to the left is executed. After the rotation is done, then all of the flag related to the door check and movement are cleared and the program back to the main function. There are few additional flags being used in this door movement function. Calibration flag is used indicate that the robot has adjusted its position with respect to the potential door. The rotate finished flag is used to make sure the robot has finished the rotation. The signal sent flag indicates whether the open door request has been sent or not. The waiting finished flag is used to indicates that the waiting time for door to be opened has been expired. |
Junction Movement
The Junction Movement function consist of five cases: turnStraight, TurnRight, TurnLeft, protection and movForward. turnStraight: turnRight and turnLeft: moveForward: protection: The code snippet is included below: |
Move Forward
Similarly to the junction_movement.cpp, move_forward.cpp uses three front laser bundles to adjust the speed. The forward speed is either 0.5m/s when the detection allows or -0.2 m/s otherwise. What differs from the junction_movement.cpp is that the forward movement will not stop when it adjusts with the side movement to avoid obstruction. With 6 laser bundles, 3 at both sides, it adjusts the sidewards speed. When it detects a obstruction, it will move sidewards to avoid the obstruction. |
Protection
The picture on the left is the front detection for adjusting the forward velocity and on the right picture is the side detection to adjust the sideways velocity. All laser beams takes the average of 15 points. The forward speed is either 0.5m/s when there is no obstruction in the front or -0.2 m/s otherwise. The sidewards speed is 0.2m/s when an obstruction is detected or 0 m/s otherwise. Below is the protection in action to avoid collision.
|
Result
Evaluation for Maze
By adding states we increase the complexity of the system and this can result very easily into undesired behavior as it is observed. PICO can only perform 20 tasks each second and since we are moving at a speed of 0.5 m/s and this combined with the many states the program has, can result into more undesired behavior.
Mathematical principle of the the algorithm is quantitative. For example, the condition for the discovery of front door detection is that the distance of three directions of PICO (right,left and front) are smaller than specified values. And it was the improperly selected threshold of the front side make PICO go into loop in the maze challenge. By reducing the detection range of a door, this problem was solved. i.e., the portability of quantitative algorithm is oversensitive to the dimensions of the environment, which may lead to mis-detecting and mis-operating. Besides, the rotation of PICO at the junction is controlled in open loop way, and the angle of rotation in junction turning part is integer multiple of 90° based on the precondition that all f the angle of junction is 90°. what if the angle of junction is not 90°? this algorithm cannot deal with a more general problem because of its quantitative based principle. Quantitativeness of the algorithm lower the portability of the it and make PICO oversensitive.
To solve the problem of oversensitiveness, we add protection block to prevent collision and improve robustness. Longer activation distance improve the performance of Protection with larger buffer distance, while it led to another problem-protection deadlock in narrow corridor.The protection field was wider than the corridor. Because when an obstruction at the side was detected, protection causes the forward velocity to be zero and activates the sidewards velocity. This resulted in a deadlock. By reducing the protection field, this problem could be solved. The balance between good protection performance and avoidance of protection deadlock is needed.
Our former design of strategy was using a combination of mapping and depth first search. The problem was that junction detection did not work well, it sets flags where it should not. Thus, this strategy was rejected and we used random decisions. To solve the issue of junction detection,the split and merge algorithm can be used to detect the corners and walls. Another solving strategy that proved to be functioning well is the pledge algorithm that group 10 used.
During the project, we tried to design our own methods to solve the maze instead of using the methods which have been provided in previous WIKI. For example, we designed a new way to solve open space, instead of using 'virtual wall'. Design new method considerably increases the complexity but the result seems not good. In order to avoid this problem, it will be wise to just use the method provided in WIKI. If we still have time, then we can try to create our own method.
|
Evaluation group9 EMC 2017
We were able to make two programs that were able to solve both challenges in simulation. The corridor challenge was failed because of a mistake in pushing the program and inefficient use of the tests in the real setting due to lack of know how it update in git. From the maze challenge we learned that robustness is critical. The protection and detection works but is too restricting causing PICO to fail the challenge. Below we listed some more conclusions and experience we acquired for this course. |
Code snippets
corridor challenge
potential field
junction detection
maze challenge
Door Movement
code snippet: door_movement.cpp
Movement
code snippet: move_forward.cpp
code snippet: junction_movement.cpp