This project is part of my bachelor's thesis. The goal is to get a gopigo car to detect lanes provided by the raspberry pi camera v2. Return an information about the direction of the lane and keep the lane with a p-controller. Additionally, I implemented an obstacle detection with a haar cascade for cars.
The workthrough of the lane detection and lane keeping is the following:
- A possibly distorted input image is provided by the raspberry pi camera. With the file camcalib.py the input image is getting undistorted.
- After that the region of intested is being set. A lot of different lane detection projects use a trapezoid for the ROI, but this wasn't possible for this project since in turns the inner lane disappears and I need a the information that I get. ROI also helps with the computing power needed -> smaller images, faster computation
- The image process contains of canny edge detection and a threshold image. The combination of both is the combo_image and is used to warp the image. To visualize the lanes a hough transformation is used (right image)
- The warping of the image into a birdeye-view provids an optimal image perspective to extract the lane information especially in curved lanes.
- To calculate the aimed trajectory the birdeye-image is being halfed. This halfed image is being scanned for the lanes. As a return a few middlepoints are generated and averaged. The trajectory is drawn into the birdeye-image from the middle of vehicle (bottom of the image) to the half of the image. As a x-value the averaged middlepoints is used. After that I rewarped the image to display the image in normal perspective as well!
-
The detect_lanes_img function returnes the direction of the trajectory and the center of the car for a variance analysis.
-
The last part is the implementation of a p-controller that is correcting the error between the trajectory and the middle of the car
The workthrough of the obstacle detection is the following:
- First you need a haar cascade for cars -> cars.xml
- After that take a reference image of an obstacle you want to detect
- Meassure the distance to the object and the width of the object and correct the variables KNOWN_DISTANCE and KNOWN_WIDTH
- Adjust the wanted distance before stopping
- After that drive onto the object and hope that all goes to play and nothing get's smashed :)