Updated Read-me

This commit is contained in:
Tanja Sukal 2024-08-27 08:36:47 +00:00
parent 6f21bb3d03
commit b4158c2377

View File

@ -1,4 +1,4 @@
# EV3_Python Color sorting cubes
# EV3_Python Object sorter
The following document describes a program written in Python for the Lego Mindstorm EV3.
The purpose of the program is to let a robot sort cubes based on their color.
@ -13,16 +13,17 @@ But the program should work with all robots that have one driven wheel per side.
The camera used for this program is the **Pixy2** for Lego Mindstorms. To work with the camera, you have to teach it the object you want to sort. For this, you need PixyMon on your PC. How to get PixyMon, teach an object and everything else you need to know is listed on the [PixyCam Website](https://docs.pixycam.com/wiki/doku.php?id=wiki:v2:pixy_lego_quick_start).
* **Camera**: Connected to input port **1** `pixy2 = Pixy2(port=1, i2c_address=0x54)`
* **Camera**: Connected to input port **1**
* Taught **Signature 1**: orange cube, leave in sorting area `sig_let = 1`
* Taught **Signature 2**: green cube, sort out `sig_sort = 2`
* Taught **Signature 1**: orange cube, leave in sorting area
* Taught **Signature 2**: green cube, sort out
The camera should be mounted on top of the robot and directed downwards for good results in detection.
#### Motors
The robot drives forward when the wheels turn counter-clockwise. `polarity = 'inversed'` If you use a robot with a clockwise direction of rotation, you need to change the settings in the program. `polarity = 'normal'`
The robot drives forward when the wheels turn counter-clockwise. If you use a robot with a clockwise direction of rotation, you need to change the parameters given in the arguments to `'normal'`. (See Additional Parameters in [Initialization](#initialization))
* **Left** Motor: Connected to output-port **A**
* **Right** Motor: Connected to output-port **D**
@ -31,8 +32,7 @@ The robot drives forward when the wheels turn counter-clockwise. `polarity = 'in
To track the distance between the robot and the cube, a LEGO Ultrasonic Sensor is used. To identify the outer line of the sorting area, one LEGO Color Sensor is used. For keeping track of the rotation on the back side of the robot, a LEGO gyro sensor is mounted.
* **Ultrasonic Sensor**: Connected to input-port **2**
* **Color Sensor**: Connected to input-port **3**
* **Gyro sensor**: Connected to input-port **4**
* **Gyro Sensor**: Connected to input-port **4**
#### Objects to sort
The sorted objects are simple cubes made of paper. You can find the tutorial for folding the cube on [YouTube](https://youtu.be/VjooTcZRwTE?si=HaiStBDw1cQu3K7o). To ensure the ultrasonic sensor recognizes the cube, it is 5.5 cm high and long. The two colors should be distinct from each other.
@ -41,42 +41,68 @@ The sorted objects are simple cubes made of paper. You can find the tutorial for
## Program
The purpose of the program is to sort different objects. In detail, this means that the robot should push all green cubes out of the sorting area and leave all orange cubes inside.
Due to the fact that the robot gets a lot of inputs and does not need to check everything at the same time, the program is divided into five states / classes. The robot will switch between the states when certain events happen. You can identify the current state by looking at the LEDs on the EV3-brick.
The main part of the program is the class "Object_Sorter". Due to the fact that the robot gets a lot of inputs and does not need to check everything at the same time, the class contains five different state methods. The robot will switch automatically between the states when certain events happen. You can identify the current state by looking at the LEDs on the EV3-brick.
* **Search**: Both LEDs are black
* **Get**: Only the left LED is green
* **Sort**: Both LEDs are green
* **Avoid**: Both LEDs are orange
* **Edge**: Both LEDs are red
The different classes are explained in detail below.
The different methods of the class are explained in detail below.
### Class: Search
The target of the class is to search for new cubes to sort. The robot spins around until one of five events causes a change.
### Initialization
During the initialization phase of the object sorter all the arguments given are assigned.
**Robot drives over black line**: If the robot drives across the line, it switches to the class "[Edge](#class-edge)".
In- and Outputs:
* `ultrasonic_input`: Input Port of the Ultrasonic Sensor (Default:`INPUT_2`)
* `color_input`: Input Port of the Color Sensor (Default:`INPUT_3`)
* `gyro_input`: Input Port of the Gyro Sensor(Default:`INPUT_4`)
* `camera_port`: Input Port of the Pixy2 camera (Default: `1`)
* `leftmotor_output`: Output Port of the left motor (Default:`OUTPUT_A`)
* `"rightmotor_output`: Output Port of the right motor (Default:`OUTPUT_D`)
**Robot has a cube in his arms**: When the Ultrasonic Sensor detects an object in front of him, this means there is already a cube in his arms, and he switches to class "[Sort](#class-sort)".
Additional Parameters:
* `leftmotor_polarity`: Polarity (direction of rotation) of the left motor (Default:`'inversed'`)
* `rightmotor_polarity`: Polarity (direction of rotation) of the right motor (Default:`'inversed'`)
* `signature_dice_remains`: Number of signature of the cube that should remain inside the outline (Default:`1`)
* `signature_dice_sorted`: Number of signature of the cube that should be sorted out or the area (Default:`2`)
* `speed_drive`: Speed of motor during normal driving (Default:`30`)
* `speed_search`: Speed of motor during search mode (Default:`10`)
* `distance_us`: Detection range, where the "caught" cube should be in, relevant for the ultrasonic sensor (Default:`12`)
* `max_reflection_outline`: Maximall reflection of outline (Default:`10`)
**Camera detects orange cube**: If the camera finds an orange cube, it changes to the class "[Avoid](#class-avoid)".
### Method: Search
The target of the method is to search for new cubes to sort. The robot spins around until one of five events causes a change.
**Camera detects green cube**: If the camera finds a green cube, it changes to the class "[Get](#class-get)".
**Robot drives over black line**: If the robot drives across the line, it switches to the state "[Edge](#method-edge)".
**Robot spun without finding something**: When the robot has turned for 2 full rounds (720°) and has not detected one of the four things above, it will drive a bit forward. If it reaches the line, it changes to the class "[Edge](#class-edge)". Otherwise, it starts the class "[Search](#class-search)" again at the new spot.
**Robot has a cube in his arms**: When the Ultrasonic Sensor detects an object in front of it, this means there is already a cube in its arms, and it switches to state "[Sort](#method-sort)".
### Class: Get
The purpose of the class is to drive towards the green cube and "catch" it in its arms.
To make that happen, the class checks the current position of the cube and corrects the driving direction if necessary. Due to the fact that there are several reasons why the camera does not consistently recognize the cube, the robot has a routine to find the cube again (driving backwards, turning left). If the routine does not work, the program changes back to class "[Search](#class-search)".
Otherwise, the ultrasonic sensor detects the cube in the arms, and the program changes to class "[Sort](#class-sort)", or the robot moves over the line, and it switches to class "[Edge](#class-edge)".
**Camera detects orange cube**: If the camera finds an orange cube, it changes to the state "[Avoid](#method-avoid)".
### Class: Sort
The task of the class is to drive the cube to the outline of the sorting area and avoid the orange cubes on the way.
If the camera detects an orange cube, the program switches to the class "[Avoid](#class-avoid)", whereas if it doesn't, the robot continues straight ahead until the outline is reached and the program changes to the class "[Edge](#class-edge)".
**Camera detects green cube**: If the camera finds a green cube, it changes to the state "[Get](#method-get)".
**Robot spun without finding something**: When the robot has turned for 2 full rounds (720°) and has not detected one of the four things above, it will drive a bit forward. If it reaches the outline, it changes to the state "[Edge](#method-edge)". Otherwise, it starts the state "[Search](#method-search)" again at the new spot.
### Method: Get
The purpose of the method is to drive towards the green cube and "catch" it in its arms.
To make that happen, the method checks the current position of the cube and corrects the driving direction if necessary. Due to the fact that there are several reasons why the camera does not consistently recognize the cube, the robot has a routine to find the cube again (driving backwards, turning left). If the routine does not work, the program changes back to state "[Search](#method-search)".
Otherwise, the ultrasonic sensor detects the cube in the arms, and the program changes to state "[Sort](#method-sort)", or the robot moves over the line, and it switches to state "[Edge](#method-edge)".
### Method: Sort
The task of the method is to drive the cube to the outline of the sorting area and avoid the orange cubes on the way.
If the camera detects an orange cube, the program switches to the state "[Avoid](#method-avoid)", whereas if it doesn't, the robot continues straight ahead until the outline is reached and the program changes to the state "[Edge](#method-edge)".
### Method: Avoid
The detected orange cube should be avoided by the robot. Therefore, the camera looks for the orange cube again and gets its position. If it is out of reach of the robot, the drive path will not change, but if the cube is on the way, the robot corrects its driving direction. After that, the program switches back to the state before. ("[Search](#method-search)" or "[Sort](#method-sort)")
### Method: Edge
The robot has reached the outline. It drives backward and turns 100° to the right. The program switches back to the state "[Search](#method-search)" afterward.
### Method: Run
This method only is used to start the operations of the object sorter and continue in an endless while-loop.
### Class: Avoid
The detected orange cube should be avoided by the robot. Therefore, the camera looks for the orange cube again and gets its position. If it is out of reach of the robot, the drive path will not change, but if the cube is on the way, the robot corrects its driving direction. After that, the program switches back to the class before. ("[Search](#class-search)" or "[Sort](#class-sort)")
### Class: Edge
The robot has reached the outline. It drives backward and turns 100° to the right. The program switches back to the class "[Search](#class-search)" afterward.
## Problems and Improvements
### Robot does not detect outer line
@ -84,14 +110,7 @@ During programming, I was challenged by the problem that the outer line is somet
Another reason can be that the arms project shadows or the line doesn't differ enough from the floor. Make sure that the given values and the physical structure of the robot make sense for your circumstances.
You can change all the input values such as the minimal line reflection and the driving rates in the program.
```
# Defined inputs for the given experiment / enviroment
fast = 30 # driving speed
slow = 10 # searching speed
line = 10 # min. reflection of outline
```
You can change all the input values such as the minimal line reflection and the driving rates with a dictionary of the arguments given to the class. (See [Initialization](#initialization))
### Camera does not detect cubes
If the camera does not detect the cubes, there are multiple reasons. Sometimes, due to lightning changes, the camera does not identify the different colors correct. You can go back to PixyMon and see if the cubes are even detected. If not, you have to teach the object / cube to the camera again, preferably in the environment where the sorting happens. Also, there is a [section](https://docs.pixycam.com/wiki/doku.php?id=wiki:v2:some_tips_on_generating_color_signatures_2) on the PixyCam Website about improving the detection accuracy you should read.