# LANDING_SPACE

Thuật toán hạ cánh và điều hướng drone dựa trên ArUco marker

## Tải xuống git này và cài đặt các tài nguyên cần thiết

```bash
git clone https://git.vnai.xyz/haminhtien99/landing_space
cd landing_space
pip install -r requirements.txt
```

## Cài đặt các giá trị ban đầu cho marker

Di chuyển tới file [`default_config.py`](default_config.py), thay đổi các giá trị sau. Lưu ý kích thước `MARKER_SIZE` và `SQUARE_SIZE` đặt cùng đơn vị (tùy ý centimet, milimet), khi đó kết quả đầu ra về khoảng cách sẽ nhận được giá trị tương ứng

```python
MARKER_SIZE=5 # kích thước các mã QR-code
set_resolution='original' # điều chỉnh độ phân giải cho camera, đặt original nếu ko thay đổi
SQUARE_SIZE = 2.1  # kích thước ô của bàn cờ
```



## Hiệu chuẩn camera:

Để thực hiện hiệu chuẩn, cần phải chụp ảnh bàn cờ `chessboard.jpg` được in trên giấy với nhiều góc độ, vị trí khác nhau

`python camera_calibration/capture_images.py`

- Nhấn phím "s" để chụp ảnh, nhấn "q" để kết thúc.
- Ảnh sẽ được lưu vào thư mục con của thư mục `camera_calibration/images`, tương ứng với giá trị `set_resolution` được đặt ban đầu.

`python camera_calibration/capture_images_without_showing.py`, tương tự bên trên

- Ảnh sẽ được tự động lưu vào thư mục `camera_calibration/images` sau mỗi 5 giây.
- Nhấn tổ hợp phím `Ctrl` + `C` để thoát chương trình

`python camera_calibration/calibration.py`

- Thông số hiệu chuẩn của camera sẽ được lưu vào thư mục `camera_calibration/calib_data`.

## Dữ liệu hiệu chuẩn
Dữ liệu hiệu chuẩn camera lưu tại tệp .npz. Dữ liệu này bao gồm:

- camMatrix: Ma trận camera, chứa các tham số nội tại của camera.
- distCoef: Các hệ số biến dạng của camera.
- rVector: Vector xoay của từng ảnh dùng để hiệu chuẩn.
- tVector: Vector tịnh tiến của từng ảnh hiệu chuẩn.

## Tạo mã Aruco:

- Tạo tùy ý 20 mã marker. Chạy `python generate_markers/generate.py`.
- Có thể thay đổi loại marker tùy ý, trong bài toán này sử dụng loại 7x7 (`aruco.DICT_7X7_50`)


## Ước lượng vị trí marker so với camera:
- Chạy `distance_estimation/distance_single.py` 
- Cài đặt `visualization = True`để in kết quả đầu ra kèm kết quả hình ảnh, nhấn `q` đẻ thoát;
- Hoặc chạy `visualization = False` để in kết quả đầu ra, nhấn `Ctrl + C`.

## Ước lượng vị trí camera:
### Chuẩn bị
- Chuẩn bị marker như trong hình mô tả `map_markers.jpg`.
- Xác định chuẩn xác vị trí tương đối của các ID1, ID2, ID3, ID4 so với ID0 ở trung tâm (lấy hệ tọa độ mặt phẳng là trục x, y của marker ID0). Nên đặt các marker vùng rìa không đối xứng nhau nhằm tối ưu tính toán tọa độ trong trường hợp bị che khuất. Gắn các marker sao cho các trục x, y, z cùng hướng với nhau.
<p align="center">
  <img src="map_markers.jpg" alt="Tọa độ biểu diễn markers" width="600"/>
</p>

### Tính toán
`python distance_estimation/camera_position.py`
- Ược lượng vị trí camera trong bản đồ tạo bởi các marker được xác định trước
- Phương pháp này tính toán vị trí camera từ vector tVec, không sử dụng ma trận nghịch đảo của ma trận xoay (vốn yêu cầu mặt phẳng camera luôn song song với mặt phẳng của marker).
- Các script này sẽ hiển thị vị trí tương đối của camera so với `marker_0` đặt ở trung tâm vùng hạ cánh. `x, y, z, roll, pitch, yaw` sẽ được hiển thị trên màn hình.
- Nhấn phím `q` để kết thúc, thoát video
