Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 70 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
name: CI

on:
push:
branches: [master]
pull_request:
branches: [master]

jobs:
lint:
name: Format check (black)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- uses: actions/setup-python@v5
with:
python-version: "3.11"
cache: "pip"

- name: Install black
run: pip install black

- name: Check formatting
run: black --check cameras/ engine/ download_models.py

syntax:
name: Syntax check
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- uses: actions/setup-python@v5
with:
python-version: "3.11"

- name: Check syntax (py_compile)
run: |
python -m py_compile download_models.py
python -m py_compile engine/config.py
python -m py_compile engine/mathlib.py
python -m py_compile engine/dot_obj_parser.py
python -m py_compile engine/opengl_3d_object.py
python -m py_compile cameras/parameters.py
python -m py_compile cameras/fonctions_images.py || true
python -m py_compile cameras/write_read_csv.py

test:
name: Tests (pytest)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- uses: actions/setup-python@v5
with:
python-version: "3.11"
cache: "pip"

- name: Install system dependencies
run: |
sudo apt-get update
sudo apt-get install -y --no-upgrade libgl1 libglib2.0-0

- name: Install dependencies
run: |
pip install -r requirements.txt
pip install -r requirements-dev.txt

- name: Run tests
run: pytest -v
18 changes: 18 additions & 0 deletions .github/workflows/release-please.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
name: Release Please

on:
push:
branches: [master]

permissions:
contents: write
pull-requests: write

jobs:
release-please:
runs-on: ubuntu-latest
steps:
- uses: googleapis/release-please-action@v4
with:
token: ${{ secrets.GITHUB_TOKEN }}
release-type: python
8 changes: 6 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
/engine/models/
/.venv
/.idea
test.*
__pycache__/
/program.prof
/program.prof
tmpclaude*

# Modèles 3D (téléchargés via download_models.py)
/engine/models/*.obj
/engine/models/*.mtl
3 changes: 3 additions & 0 deletions .release-please-manifest.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
".": "0.1.0"
}
65 changes: 65 additions & 0 deletions FEEDBACK.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
# Feedback — Krafton

## Vue d'ensemble

C'est un **moteur 3D avec système de positionnement par vision**, combinant :
- Un moteur de rendu OpenGL (pygame + PyOpenGL)
- Un pipeline de vision par ordinateur (OpenCV, blob detection LED)
- Des fichiers FreeCAD pour un contrôleur physique ("manette")

Le projet est clairement un **prototype académique** (les commits mentionnent "l'oral").

---

## Points positifs

- **Quaternions** pour les rotations — approche mathématiquement solide, évite le gimbal lock
- **Bonne séparation** graphics vs vision (modules distincts)
- **Type hints** récemment ajoutés — bonne direction
- Hiérarchie de classes propre pour les objets 3D (`OBJECT_BASE`, `FACES`, `AXES`, etc.)
- Orthonormalisation de Gram-Schmidt pour maintenir la base caméra

---

## Problèmes critiques

| Problème | Fichier | Impact |
|----------|---------|--------|
| `engine/models/` ignoré par `.gitignore` mais requis au démarrage | `main.py:14` | Crash au lancement |
| Vision et moteur 3D complètement découplés — aucune intégration | Tout le projet | Fonctionnalité incomplète |
| Chemin relatif hardcodé `'engine/models/Theiere.obj'` | `main.py:14` | Fragile |

---

## Problèmes de code

- **16 méthodes de déplacement quasi-identiques** (`forward3D`, `backward3D`, etc.) — `opengl_3d_object.py:169-293`. Une seule fonction paramétrée suffirait.
- **Cache désactivé** avec `force_parse=True` en dur — `dot_obj_parser.py:15`
- **Couleurs aléatoires** à chaque compilation — `opengl_3d_object.py:78,92`
- `produit_scalaire()` dans `fonctions_images.py:37-48` réimplémente ce que NumPy fait nativement
- Aucune gestion d'erreurs (I/O, caméra, OpenGL)
- `if __name__ == "__main__":` absent dans `main.py`

---

## OpenGL Legacy

Le projet utilise des **display lists** (OpenGL 1.x). Pour de meilleures performances, les VBOs (Vertex Buffer Objects) seraient la prochaine étape — mais pour un prototype, c'est acceptable.

---

## Documentation & Qualité

- README d'une seule ligne
- Aucun test (et `test.*` explicitement ignoré dans `.gitignore`)
- Messages de commits peu descriptifs (`"a"`, `"Drop the mic..."`)
- Configuration éparpillée entre `parameters.py` et `main.py`

---

## Priorités si tu veux aller plus loin

1. **Intégrer vision + moteur** — c'est le cœur du projet
2. **Factoriser les méthodes de déplacement** — gain immédiat de lisibilité
3. **Ajouter les modèles au repo** (ou un script de téléchargement)
4. **Documenter le setup** dans le README
100 changes: 99 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,100 @@
# Krafton
Moteur 3d et positionnement par vision

Moteur 3D avec système de positionnement par vision. Le projet combine un moteur de rendu OpenGL (rotations par quaternions), un pipeline de vision par ordinateur pour la détection de marqueurs LED, et des modèles FreeCAD pour un contrôleur physique.

## Prérequis

- Python 3.10+
- Fichiers de modèles `.obj` à placer dans `engine/models/`

## Installation

Créer et activer un environnement virtuel :

```bash
python -m venv .venv
```

Windows :
```bash
.venv\Scripts\activate
```

Linux / macOS :
```bash
source .venv/bin/activate
```

Installer les dépendances :

```bash
pip install -r requirements.txt
```

## Modèles 3D

Les modèles `.obj` ne sont pas inclus dans le dépôt. Pour les télécharger :

```bash
python download_models.py
```

## Lancement

```bash
python -m engine.main
```

## Développement

Le code est formaté avec [black](https://black.readthedocs.io/). Lancer le formateur avant chaque commit :

```bash
black cameras/ engine/ download_models.py
```

## CI/CD

### Pipelines GitHub Actions

| Workflow | Déclencheur | Rôle |
|----------|-------------|------|
| `ci.yml` | push / PR → `master` | Formatage black, syntaxe Python, tests unitaires (pytest) |
| `release-please.yml` | push → `master` | Crée automatiquement les PRs de release, bumpe la version dans `pyproject.toml` et génère le changelog |

Les tests couvrent la logique pure (math, parsing OBJ, caméra). Les méthodes OpenGL (`compile`, `draw`) et la boucle pygame nécessitent un contexte graphique et ne sont pas testées.

### Release Please

[Release Please](https://github.com/googleapis/release-please) détecte les commits sur `master` et crée une PR de release qui :
- incrémente la version sémantique dans `pyproject.toml`
- génère / met à jour `CHANGELOG.md`
- crée le tag Git et la GitHub Release au merge

La version courante est définie dans `pyproject.toml` (`version = "..."`) et suivie dans `.release-please-manifest.json`.

### Conventional Commits

Release Please s'appuie sur la convention [Conventional Commits](https://www.conventionalcommits.org/) pour déterminer le type de bump et le contenu du changelog.

| Préfixe | Effet sur la version | Exemple |
|---------|----------------------|---------|
| `fix:` | patch (`0.1.0` → `0.1.1`) | `fix: corriger le calcul de l'homographie` |
| `feat:` | mineur (`0.1.0` → `0.2.0`) | `feat: ajouter le support des fichiers .gltf` |
| `feat!:` ou `BREAKING CHANGE:` | majeur (`0.1.0` → `1.0.0`) | `feat!: refactoriser l'API caméra` |
| `chore:`, `docs:`, `refactor:`… | aucun bump | `chore: mettre à jour les dépendances` |

Les commits sans préfixe (comme les commits actuels) sont ignorés par Release Please et n'apparaissent pas dans le changelog.

## Contrôles

| Touche | Action |
|--------|--------|
| `↑ ↓ ← →` | Avancer / reculer / strafe |
| `Espace / C` | Monter / descendre |
| `Z S Q D` | Pitch / Yaw |
| `A E` | Roll |
| `Entrée` | Réinitialiser la position |
| `1` | Sélectionner la caméra |
| `2` | Sélectionner l'objet 1 |
| `Échap` | Quitter |
33 changes: 33 additions & 0 deletions SESSION.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Messages de la session

1. Donne moi un feedback sur ce repository ?
2. Ecrit moi l'ensemble de ce feedback dans un fichier a la racine FEEDBACK.md
3. engine/models/ ignoré par .gitignore mais requis au démarrage main.py:14 Crash au lancement occupe toi ca, ajoute les fichiers tmpclaude au gitignore
4. peux tu m'ajouter un debut de doc dans le README; juste une courte description du projet, comment installer avec pip et lancer
5. peux tu ajouter dans la doc la facon de creer un env virtuel python
6. est ce que les versions disponibles dans le requirements peuvent etre upgrade facilement en restant sur des versions stables
7. oui, est ce que c'est la meilleur facon de gerer les dependances en python en 2026 ?
8. (Erreur terminal) FileNotFoundError: engine/models/Theiere.obj introuvable au lancement
9. peux tu rendre ce point meilleur : Chemin relatif hardcodé 'engine/models/Theiere.obj' main.py:14 Fragile
10. Peux tu refactorer ces trois points : 16 méthodes de déplacement quasi-identiques / produit_scalaire() réimplémente NumPy / if __name__ == "__main__": absent dans main.py
11. que peux t on faire sur le point : Configuration éparpillée entre parameters.py et main.py ?
12. je veux l'option A oui merci
13. j'aimerai ajouter un script de telechargement de model
14. ajoute l'instruction au readme
15. je n'y connais rien, ou trouver generalement des models libre de droit pour fonctionner avec ce projet, ajoute des exemples au script download
16. (Erreur terminal) HTTP Error 406: Not Acceptable lors du téléchargement de teapot.obj
17. peux tu rendres le parser plus tolérant (gérer les faces sans slashes)
18. ajoute les models comme teapot au gitignore
19. peux tu reformater tout le code du projet ?
20. peux tu ajouter la methodologie au readme, usage de black avant de commit push
21. Peux tu me lister les commentaires et todo ?
22. peux tu resumer cela dans un fichier a la racine TODOs.md
23. Peux tu ajouter une doc dans chaque fichier python consise et chaque method/fonction importante
24. ajoute un niveau de log info et debug dans les parties principales afin de suivre le travail de la solution
25. peux tu m'ajouter les pipelines standards github, release please, ci classic
26. peux tu ajouter tout cela dans une section du readme et la Note importante sur les conventional commits
27. Peux tu m'ajouter des tests unitaires
28. est il possible de tester le main ou des parties du main non couverte par les autres tests ?
29. j'ai un pb sur le pipeline de test sur github (erreur apt-get 404 libglib2.0-0t64)
30. Peux tu me lister dans un fichier a la racine, notre echange dans cette session avec seulement mes messages
31. Peux tu remonter plus loin dans nos echanges, jusqu'au debut de notre chat et l'ajouter au fichier
30 changes: 30 additions & 0 deletions TODOs.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# TODOs

## Tâches ouvertes

- `engine/main.py:70` — Migrer le système de fenêtre de pygame vers GLUT
- `cameras/images.py:17` — Écrire la fonction de traitement d'image pour les captures 1 et 2

## Code commenté à décider (garder ou supprimer)

### Éclairage OpenGL (`engine/main.py` + `engine/opengl_3d_object.py`)
Tout le système d'éclairage fixe (`GL_LIGHT0`, `glMaterialfv`, `glNormal3fv`) est commenté.
Lignes concernées : `main.py:79-86`, `main.py:99-100`, `opengl_3d_object.py:7-10`, `:101-105`, `:116`, `:121-125`, `:136`

### Face culling (`engine/main.py:93-95`)
`glFrontFace`, `glCullFace`, `glEnable(GL_CULL_FACE)` désactivés.

### Prints de debug (`engine/main.py:136-138`)
Logs des vecteurs front/up/right et du FPS.

### Cache OBJ désactivé (`engine/dot_obj_parser.py:102`)
`self.writeToCache()` commenté — le système de cache n'est pas encore plus rapide que le parsing direct.

### Classe `VEC3` abandonnée (`engine/mathlib.py:77-88`)
Remplacée par les quaternions. Peut être supprimée.

### Méthode `__invert__` (`engine/mathlib.py:57-58`)
Prototype commenté sur `QUATERNION`.

### Conversion BGR→GRAY (`cameras/configuration_camera.py:14`)
`cv2.cvtColor` commenté dans la boucle de calibration.
23 changes: 17 additions & 6 deletions cameras/configuration_camera.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
"""Calibration intrinsèque d'une caméra par détection de chessboard.

Capture des photos avec la touche configurée dans parameters.py,
détecte les coins du damier et calcule la matrice K via compute_intrinsics().
Le résultat est sauvegardé avec write().
"""

import cv2
import numpy as np
from parameters import *
Expand All @@ -11,17 +18,21 @@

while capture.isOpened():
ret, frame = capture.read()
#frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
frame = cv2.flip(frame, 1)
if cv2.waitKey(1) == ord(take_photo) and nb_photo != nb_photo_max:
nb_photo += 1
ret, corners = cv2.findChessboardCorners(frame, checkboard_info[0],
cv2.CALIB_CB_ADAPTIVE_THRESH + cv2.CALIB_CB_FAST_CHECK + cv2.CALIB_CB_NORMALIZE_IMAGE)
ret, corners = cv2.findChessboardCorners(
frame,
checkboard_info[0],
cv2.CALIB_CB_ADAPTIVE_THRESH
+ cv2.CALIB_CB_FAST_CHECK
+ cv2.CALIB_CB_NORMALIZE_IMAGE,
)
lst_points.append(corners)
for i in corners:
cv2.circle(frame, (int(i[0][0]), int(i[0][1])), 5, (0, 255, 0), 2)
cv2.imshow('a', frame)

cv2.imshow("a", frame)

if cv2.waitKey(1) == ord(quitter):
break
Expand All @@ -32,4 +43,4 @@

K = compute_intrinsics(object_points_list, lst_points)

write(K)
write(K)
Loading