mirror of
https://github.com/modelec/Documentations.git
synced 2026-01-18 16:37:30 +01:00
Merge remote-tracking branch 'origin/main'
This commit is contained in:
@@ -3,15 +3,17 @@
|
||||
SYSTEM "https://resources.jetbrains.com/writerside/1.0/product-profile.dtd">
|
||||
|
||||
<instance-profile id="gu"
|
||||
name="Guide d'utilisation"
|
||||
name="Documentation Robot Modelec 2024"
|
||||
start-page="Présentation.md">
|
||||
|
||||
<toc-element topic="Présentation.md"/>
|
||||
<toc-element topic="Serge.md">
|
||||
<toc-element topic="Code.md"/>
|
||||
<toc-element topic="Strategie.md"/>
|
||||
<toc-element topic="Odométrie.md"/>
|
||||
<toc-element topic="Lidar.md"/>
|
||||
<toc-element topic="Actionneurs.md"/>
|
||||
<toc-element topic="Montage_Serge.md"/>
|
||||
</toc-element>
|
||||
<toc-element topic="Pami.md">
|
||||
<toc-element topic="Montage.md"/>
|
||||
|
||||
@@ -1,20 +1,24 @@
|
||||
# Code
|
||||
|
||||
## Installation des dépendances
|
||||
Installation des différents programmes du robot
|
||||
{collapsible="true" default-state="collapsed"}
|
||||
<tabs>
|
||||
<tab title="Dépendances">
|
||||
Installtion des dépendances pour les différents programmes de Serge
|
||||
lxqt est necessaire car il install des lib manquantes pour l'ihm
|
||||
|
||||
```BASH
|
||||
sudo apt install build-essential cmake gcc libopencv-dev qt6-base-dev qt6-base-dev-tools lxqt-core qt6-wayland libcamera-dev
|
||||
mkdir Serge && cd Serge
|
||||
chmod 700 /run/user/1000
|
||||
```
|
||||
|
||||
````Bash
|
||||
crontab -e
|
||||
@reboot chmod 700 /run/user/1000
|
||||
````
|
||||
```
|
||||
{collapsible="true"}
|
||||
</tab>
|
||||
<tab title="Client TCP">
|
||||
Installation du client TCP, il sert à recevoir et à envoyer les paquets TCP pour l'interconnexion entre les différents programmes de Serge
|
||||
|
||||
## Installation du client TCP
|
||||
```BASH
|
||||
git clone https://github.com/modelec/TCPSocketClient.git
|
||||
cd TCPSocketClient/
|
||||
@@ -24,8 +28,11 @@ sudo make install
|
||||
cd ../..
|
||||
echo 'export LD_LIBRARY_PATH=:/usr/local/lib64:/usr/local/lib' >> ~/.bashrc
|
||||
```
|
||||
{collapsible="true"}
|
||||
</tab>
|
||||
<tab title="Serveur TCP">
|
||||
Installation du serveur TCP, il sert à gérer les paquets TCP pour l'interconnexion des différents programmes de Serge.
|
||||
|
||||
## Installation du serveur TCP
|
||||
```BASH
|
||||
git clone https://github.com/modelec/TCPSocketServer.git
|
||||
cd TCPSocketServer/
|
||||
@@ -34,8 +41,11 @@ cmake ..
|
||||
make
|
||||
cd ../..
|
||||
```
|
||||
{collapsible="true"}
|
||||
</tab>
|
||||
<tab title="Détéction de l'adversaire">
|
||||
Installation du programme de détéction de l'adversaire, il utilise le Lidar pour détécter la présence d'adversaire afin de ne pas leur rentrer dedans.
|
||||
|
||||
## Installtion de la détection de l'adversaire
|
||||
```BASH
|
||||
git clone https://github.com/Slamtec/rplidar_sdk.git
|
||||
cd rplidar_sdk/
|
||||
@@ -48,8 +58,11 @@ cmake ..
|
||||
make
|
||||
cd ../..
|
||||
```
|
||||
{collapsible="true"}
|
||||
</tab>
|
||||
<tab title="Contrôle des servo-moteurs">
|
||||
Installation du programme de contrôle des servo-moteurs, il sert à contrôler les servo moteurs utile pour les différents actionneurs.
|
||||
|
||||
## Installation du programme de contrôle des servo-moteurs
|
||||
````Bash
|
||||
git clone https://github.com/barulicm/PiPCA9685.git
|
||||
cd PiPCA9685
|
||||
@@ -66,8 +79,11 @@ cmake ..
|
||||
make
|
||||
cd ../..
|
||||
````
|
||||
{collapsible="true"}
|
||||
</tab>
|
||||
<tab title="IHM">
|
||||
Installation de l'IHM, l'IHM sert à controler les différents systèmes ainsi qu'à lancer Serge.
|
||||
|
||||
## Installtion de l'IHM
|
||||
````Bash
|
||||
git clone https://github.com/modelec/ihm.git
|
||||
cd ihm
|
||||
@@ -76,8 +92,15 @@ cmake ..
|
||||
make
|
||||
cd ../..
|
||||
````
|
||||
{collapsible="true"}
|
||||
</tab>
|
||||
</tabs>
|
||||
|
||||
<tabs>
|
||||
|
||||
<tab title="Connecteur raspi -> ardiuno">
|
||||
Installation du connecteur raspi -> arduino, il sert à transmettre les ordres de la raspi à l'arduino.
|
||||
|
||||
## Installation du connecteur raspi -> arduino
|
||||
````Bash
|
||||
git clone https://github.com/modelec/connectors.git -b tcp
|
||||
cd connectors/
|
||||
@@ -86,8 +109,11 @@ cmake ..
|
||||
make
|
||||
cd ../..
|
||||
````
|
||||
{collapsible="true"}
|
||||
</tab>
|
||||
<tab title="Détéction des pots et des panneaux solaires">
|
||||
Installation du programme de détéction des pots et des panneaux solaires, il sert à détécter les pots et à transmettre leurs coordonner, même chose pour les panneaux solaires avec l'orientation en plus.
|
||||
|
||||
## Installtion du programme de détection des pots et des panneaux solaires
|
||||
````Bash
|
||||
git clone https://github.com/kbarni/LCCV.git
|
||||
cd LCCV
|
||||
@@ -104,8 +130,11 @@ cmake ..
|
||||
make
|
||||
cd ../..
|
||||
````
|
||||
{collapsible="true"}
|
||||
</tab>
|
||||
<tab title="Tirette">
|
||||
Installation du programme de la tirette, il sert à détécter si la tirette est retier ou est en place.
|
||||
|
||||
## Installation du programme de la tirette
|
||||
````Bash
|
||||
git clone https://github.com/WiringPi/WiringPi.git
|
||||
cd WiringPi
|
||||
@@ -118,8 +147,14 @@ cd tirette
|
||||
g++ main.cpp MyClient.cpp MyClient.h -o tirette -l wiringPi -l TCPSocket
|
||||
cd ../
|
||||
````
|
||||
{collapsible="true"}
|
||||
</tab>
|
||||
<tab title="Initialisation">
|
||||
Installation du programme d'initialisation, il sert à l'initialisation des différents programme de Serge, ainsi qu'à verifier si les différents programmes fonctionnent toujours.
|
||||
|
||||
## Installation du programme d'initialisation
|
||||
````Bash
|
||||
git clone https://github.com/modelec/Initialisation.git
|
||||
````
|
||||
````
|
||||
{collapsible="true"}
|
||||
</tab>
|
||||
</tabs>
|
||||
33
Writerside/topics/Montage_Serge.md
Normal file
33
Writerside/topics/Montage_Serge.md
Normal file
@@ -0,0 +1,33 @@
|
||||
# Montage
|
||||
|
||||
## Matériel nécessaire
|
||||
{collapsible="true" default-state="collapsed"}
|
||||
|
||||
- Découpeuse laser (chassis)
|
||||
- Imprimante 3D
|
||||
- Fer à souder
|
||||
|
||||
## Chassis
|
||||
{collapsible="true" default-state="collapsed"}
|
||||
|
||||
Découpez le chassis à l'aide des fichiers [ici]()
|
||||
|
||||
## Moteur
|
||||
{collapsible="true" default-state="collapsed"}
|
||||
|
||||
|
||||
## Pinces
|
||||
{collapsible="true" default-state="collapsed"}
|
||||
|
||||
|
||||
## Actionneur panneau solaire
|
||||
{collapsible="true" default-state="collapsed"}
|
||||
|
||||
## Caméra
|
||||
{collapsible="true" default-state="collapsed"}
|
||||
|
||||
## Lidar
|
||||
{collapsible="true" default-state="collapsed"}
|
||||
|
||||
## Alimentation
|
||||
{collapsible="true" default-state="collapsed"}
|
||||
@@ -7,12 +7,21 @@ Serge est un robot qui a pour objectif de déplacer des plantes et d'orienter de
|
||||
{collapsible="true" default-state="expanded"}
|
||||
- [Raspberry Pi 5](https://www.kubii.com/fr/cartes-nano-ordinateurs/4106-1831-raspberry-pi-5-3272496315938.html#/ram-4_gb)
|
||||
- [Raspberry Pi Camera](https://www.kubii.com/fr/cameras-capteurs/3878-1690-module-camera-v3-raspberry-pi-3272496313699.html#/angle_de_camera-grand_angle_120)
|
||||
- [Arduino Mega](https://store.arduino.cc/products/arduino-mega-2560-rev3)
|
||||
- [Batterie 3s 3000 mAh](https://www.amazon.fr/dp/B07LFRFY1S?psc=1&ref=ppx_yo2ov_dt_b_product_details)
|
||||
- [Alimentation 12V à 5V](https://www.amazon.fr/dp/B071ZRXKJY?psc=1&ref=ppx_yo2ov_dt_b_product_details)
|
||||
- [Boutton d'arret d'urgence](https://www.amazon.fr/dp/B07RGQQTW8?psc=1&ref=ppx_yo2ov_dt_b_product_details)
|
||||
- [Servomoteur](https://www.amazon.fr/dp/B07H88DB8R?psc=1&ref=ppx_yo2ov_dt_b_product_details)
|
||||
- [Roulements blindés](https://www.amazon.fr/dp/B09DC4S99S?psc=1&ref=ppx_yo2ov_dt_b_product_details)
|
||||
- [Interface IIC](https://www.amazon.fr/dp/B07RG9ZTMD?psc=1&ref=ppx_yo2ov_dt_b_product_details)
|
||||
- [Moteur](https://www.amazon.fr/gp/product/B088PW9B8G/ref=ppx_yo_dt_b_asin_title_o03_s00?ie=UTF8&psc=1)
|
||||
- [Encodeur](https://www.amazon.fr/gp/product/B08YNYPHTZ/ref=ppx_yo_dt_b_asin_title_o04_s00?ie=UTF8&psc=1)
|
||||
- [PCB Puissance](https://github.com/modelec/pcb_puissance)
|
||||
|
||||
## Fonctionnement
|
||||
{collapsible="true" default-state="expanded"}
|
||||
### Détéction d'une plante
|
||||
La détéction des plantes est géré par OpenCV, le code est disponible [ici](https://github.com/modelec/detection_pot).
|
||||
La détéction des plantes est gérée par OpenCV, le code est disponible [ici](https://github.com/modelec/detection_pot).
|
||||
|
||||
### Détéction de l'adversaire
|
||||
La détéction de l'adversaire des géré par le Lidar, le code est disponible [ici](https://github.com/modelec/detection_adversaire)
|
||||
|
||||
La détéction de l'adversaire est gérée par le Lidar, le code est disponible [ici](https://github.com/modelec/detection_adversaire)
|
||||
|
||||
213
Writerside/topics/Strategie.md
Normal file
213
Writerside/topics/Strategie.md
Normal file
@@ -0,0 +1,213 @@
|
||||
# Strategie
|
||||
|
||||
## Description rapide
|
||||
|
||||
La strategie de notre robot est stocké dans le programe TCPSocketServer aka le server tcp qui recoit les requetes des differents client.
|
||||
La strategie est divisé en plusieurs étape clé :
|
||||
```C++
|
||||
enum StratPattern {
|
||||
TURN_SOLAR_PANNEL_1,
|
||||
TURN_SOLAR_PANNEL_2,
|
||||
TURN_SOLAR_PANNEL_3,
|
||||
TAKE_FLOWER_BOTTOM,
|
||||
TAKE_FLOWER_TOP,
|
||||
DROP_FLOWER,
|
||||
GO_END,
|
||||
};
|
||||
```
|
||||
Ces étapes clé corresponde au differentes actions que le robot doit réaliser pour la coupe de france de robotique 2024.
|
||||
|
||||
|
||||
Le programe contient un tableau avec ces differentes actions et un index qui pointe sur l'action en cours.
|
||||
```C++
|
||||
std::vector<StratPattern> stratPatterns = {
|
||||
TURN_SOLAR_PANNEL_1,
|
||||
TURN_SOLAR_PANNEL_2,
|
||||
TURN_SOLAR_PANNEL_3,
|
||||
TAKE_FLOWER_BOTTOM,
|
||||
TAKE_FLOWER_BOTTOM,
|
||||
TAKE_FLOWER_BOTTOM,
|
||||
DROP_FLOWER,
|
||||
TAKE_FLOWER_TOP,
|
||||
TAKE_FLOWER_TOP,
|
||||
TAKE_FLOWER_TOP,
|
||||
DROP_FLOWER,
|
||||
GO_END
|
||||
};
|
||||
|
||||
// This is the index of the current pattern
|
||||
int whereAmI = 0;
|
||||
```
|
||||
|
||||
Chaque actions correspond à une fonction qui est appelé par le server tcp.
|
||||
```C++
|
||||
/*
|
||||
* Start Strategy function
|
||||
*/
|
||||
void goAndTurnSolarPannel(StratPattern sp);
|
||||
|
||||
void findAndGoFlower(StratPattern sp);
|
||||
|
||||
void goEnd();
|
||||
|
||||
void dropFlowers();
|
||||
/*
|
||||
* End Strategy function
|
||||
*/
|
||||
```
|
||||
|
||||
## Panneaux Solaires
|
||||
|
||||
Dans notre stratégie nous commencer par tourner trois panneaux solaires
|
||||
|
||||
Le but ici est de ce placer contre le bord de la tableau, le plus proche possible pour pouvoir toucher le panneau solaire avec l'actionneur tout en gardant de la marge pour que le robot puissent encore tourner
|
||||
|
||||
Les panneau solaire possèdes des tag Aruco qui permettent de savoir leur possition et leur rotation mais dans notre cas nous avons décidé de ne pas les utiliser pour des raisons de simplicité et de rapidité et du fait que nous connaisons leur position exact.
|
||||
|
||||
Le code pour tourner un panneau solaire est le suivant :
|
||||
|
||||
```C++
|
||||
this->go(x, y);
|
||||
awaitRobotIdle();
|
||||
|
||||
this->rotate(PI / 2);
|
||||
awaitRobotIdle();
|
||||
|
||||
this->checkPanneau(servo_moteur);
|
||||
usleep(100'000);
|
||||
|
||||
this->go(x+130, y);
|
||||
awaitRobotIdle();
|
||||
|
||||
this->uncheckPanneau(servo_moteur);
|
||||
```
|
||||
|
||||
Le but est de ce placer a coter du panneau solaire pour le tourner et ensuite avancé un peu pour replier l'actionneur.
|
||||
|
||||
## Fleur
|
||||
|
||||
En fonction de notre équipe nous allons utilisé deux zones fixes ou nous allons chercher des plantes.
|
||||
|
||||
Celle-ci sont, pour l'équipe bleu :
|
||||
- 1000 1300
|
||||
- 1000 700
|
||||
|
||||
Et pour l'équipe jaune :
|
||||
- 2000 1300
|
||||
- 2000 700
|
||||
|
||||
Nous allons detecter les tag aruco present au alentours de la zone voulue.
|
||||
|
||||
le programe va réalisé 5 scan de la zone et checher le tag qui reviens le plus pour eviter les faux positif.
|
||||
|
||||
Le code pour chercher une fleur est le suivant :
|
||||
|
||||
```C++
|
||||
this->arucoTags.clear();
|
||||
this->broadcastMessage("strat;aruco;get aruco;1\n");
|
||||
for (int i = 0; i < 5; i++) {
|
||||
if (stopEmergency) std::terminate();
|
||||
|
||||
usleep(200'000);
|
||||
this->broadcastMessage("strat;aruco;get aruco;1\n");
|
||||
}
|
||||
usleep(100'000);
|
||||
|
||||
std::optional<ArucoTag> tag = getBiggestArucoTag(300, 700, -200, 200);
|
||||
|
||||
if (tag.has_value()) {
|
||||
if (pinceState[1] == NONE) {
|
||||
goToAruco(tag.value(), 1);
|
||||
} else if (pinceState[2] == NONE) {
|
||||
goToAruco(tag.value(), 2);
|
||||
} else if (pinceState[0] == NONE) {
|
||||
goToAruco(tag.value(), 0);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Ensuite la fonction goTaAruco va aller a la position de la plante pour la recuperer.
|
||||
|
||||
```C++
|
||||
void TCPServer::goToAruco(const ArucoTag &arucoTag, const int pince) {
|
||||
double robotPosX = this->robotPose.pos.x;
|
||||
double robotPosY = this->robotPose.pos.y;
|
||||
double theta = this->robotPose.theta;
|
||||
double decalage;
|
||||
double rotate;
|
||||
if (pince < 0 || pince > 2) {
|
||||
return;
|
||||
}
|
||||
|
||||
switch (pince) {
|
||||
case 0:
|
||||
decalage = 60;
|
||||
rotate = -0.07;
|
||||
break;
|
||||
case 1:
|
||||
decalage = 0;
|
||||
rotate = 0;
|
||||
break;
|
||||
case 2:
|
||||
decalage = -60;
|
||||
rotate = 0.07;
|
||||
break;
|
||||
default:
|
||||
decalage = 0;
|
||||
rotate = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
this->baisserBras();
|
||||
this->openPince(pince);
|
||||
|
||||
double xPrime = arucoTag.pos()[0];
|
||||
double yPrime = arucoTag.pos()[1];
|
||||
double roll = arucoTag.rot()[1];
|
||||
|
||||
auto centerPlantX = (20 * std::cos(roll)) + xPrime/* - 50*/;
|
||||
auto centerPlantY = (-20 * std::sin(roll)) + yPrime + decalage;
|
||||
|
||||
double thetaPrime = std::atan2(centerPlantY, centerPlantX);
|
||||
|
||||
this->rotate(this->robotPose.theta + rotate - thetaPrime);
|
||||
awaitRobotIdle();
|
||||
|
||||
double robotPosForPotX = (centerPlantX * std::cos(theta) + centerPlantY * std::sin(theta)) + robotPosX;
|
||||
double robotPosForPotY = (-centerPlantX * std::sin(theta) + centerPlantY * std::cos(theta)) + robotPosY;
|
||||
|
||||
int previousSpeed = this->speed;
|
||||
|
||||
this->transit(robotPosForPotX, robotPosForPotY, 130);
|
||||
awaitRobotIdle();
|
||||
|
||||
this->closePince(pince);
|
||||
usleep(500'000);
|
||||
this->setSpeed(previousSpeed);
|
||||
pinceState[pince] = TCPUtils::startWith(arucoTag.name(), "Purple_flower") ? PURPLE_FLOWER : WHITE_FLOWER;
|
||||
}
|
||||
```
|
||||
|
||||
Ici le code va prendre en compte dans quelle pince nous voulons mettre la plante et va ajuster la position de la plante en fonction de la position du robot.
|
||||
|
||||
A savoir que le le programe pour trouver les tag arcuo nous renvoie la position du TAG pas de la plantes, celui-ci est placer tout autour de la plantes a 20mm du bord.
|
||||
|
||||
Dans un premier temps, ces 20mm sont rajouter et ensuite un changement de repere est effectuer pour que le robot puisse ce deplacer en fonction de la position de la plante.
|
||||
|
||||
## Fin de partie
|
||||
|
||||
Lorsque que nous commencont la partie nous evons choisir le spawn du robot, il existe 6 zone distinct sur le robot sur laquelle on peut faire partir notre robot, 3 par équipe.
|
||||
|
||||
La zone d'arrivé du robot doit être l'une des deux zones restante.
|
||||
|
||||
C'est pourquoi nous connaisont cette valeur et nous pouvons donc nous deplacer directement a la fin de la partie.
|
||||
|
||||
## Robot adverse trop proche
|
||||
|
||||
Nous avons pour obligation de ne pas toucher le robot adverse, pour cela nous avons mis en place un systeme de detection de la distance entre les deux robots grace a un lidar.
|
||||
|
||||
Pour cela, lorsque le lidar va detecter un adversaire il vas envoyé un message `stop proximity` avec l'angle et la distance au robot adverse.
|
||||
|
||||
Grace a cela nous pouvons dans un premier temps stopper notre robot et si le robot adversaire ne bouge pas, nous decaler dans le sens opposé.
|
||||
|
||||
Ensuite nous pouvons reprendre notre stratégie.
|
||||
Reference in New Issue
Block a user