From 571f6da0ae7ebb17bb0e9a8e24b9ba9771947de6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20MARQUET?= Date: Thu, 11 Apr 2024 15:18:55 +0200 Subject: [PATCH 1/3] Add materiel to the list and change the code design --- Writerside/topics/Code.md | 61 ++++++++++++++++++++++++++++---------- Writerside/topics/Serge.md | 15 ++++++++-- 2 files changed, 58 insertions(+), 18 deletions(-) diff --git a/Writerside/topics/Code.md b/Writerside/topics/Code.md index 3a27437..a6b3aab 100644 --- a/Writerside/topics/Code.md +++ b/Writerside/topics/Code.md @@ -1,20 +1,24 @@ # Code -## Installation des dépendances +Installation des différents programmes du robot +{collapsible="true" default-state="collapsed"} + + +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"} + + +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/ @@ -23,8 +27,11 @@ cmake .. sudo make cd ../.. ``` +{collapsible="true"} + + +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/ @@ -33,8 +40,11 @@ cmake .. make cd ../.. ``` +{collapsible="true"} + + +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/ @@ -47,8 +57,11 @@ cmake .. make cd ../.. ``` +{collapsible="true"} + + +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 @@ -65,8 +78,11 @@ cmake .. make cd ../.. ```` +{collapsible="true"} + + +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 @@ -75,8 +91,11 @@ cmake .. make cd ../.. ```` +{collapsible="true"} + + +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/ @@ -85,8 +104,11 @@ cmake .. make cd ../.. ```` +{collapsible="true"} + + +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 @@ -103,8 +125,11 @@ cmake .. make cd ../.. ```` +{collapsible="true"} + + +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 @@ -117,8 +142,14 @@ cd tirette g++ main.cpp MyClient.cpp MyClient.h -o tirette -l wiringPi -l TCPSocket cd ../ ```` +{collapsible="true"} + + +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 -```` \ No newline at end of file +```` +{collapsible="true"} + + \ No newline at end of file diff --git a/Writerside/topics/Serge.md b/Writerside/topics/Serge.md index 23091c1..9bb6eca 100644 --- a/Writerside/topics/Serge.md +++ b/Writerside/topics/Serge.md @@ -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) From fcf22859efd34cbc11f0a66bfa16dfd528cc2b86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20MARQUET?= Date: Mon, 15 Apr 2024 13:19:10 +0200 Subject: [PATCH 2/3] Add base for montage of serge --- Writerside/gu.tree | 3 ++- Writerside/topics/Code.md | 4 ++++ Writerside/topics/Montage_Serge.md | 33 ++++++++++++++++++++++++++++++ 3 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 Writerside/topics/Montage_Serge.md diff --git a/Writerside/gu.tree b/Writerside/gu.tree index d58d447..d494cd6 100644 --- a/Writerside/gu.tree +++ b/Writerside/gu.tree @@ -3,7 +3,7 @@ SYSTEM "https://resources.jetbrains.com/writerside/1.0/product-profile.dtd"> @@ -12,6 +12,7 @@ + diff --git a/Writerside/topics/Code.md b/Writerside/topics/Code.md index 7cb2233..a5229fe 100644 --- a/Writerside/topics/Code.md +++ b/Writerside/topics/Code.md @@ -94,6 +94,10 @@ cd ../.. ```` {collapsible="true"} + + + + Installation du connecteur raspi -> arduino, il sert à transmettre les ordres de la raspi à l'arduino. diff --git a/Writerside/topics/Montage_Serge.md b/Writerside/topics/Montage_Serge.md new file mode 100644 index 0000000..067519d --- /dev/null +++ b/Writerside/topics/Montage_Serge.md @@ -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"} \ No newline at end of file From 13fed3c7332d4439cfebea0ff292aae8464a1c67 Mon Sep 17 00:00:00 2001 From: ackimixs Date: Thu, 25 Apr 2024 11:26:29 +0200 Subject: [PATCH 3/3] strat v0.1 --- Writerside/gu.tree | 1 + Writerside/topics/Strategie.md | 213 +++++++++++++++++++++++++++++++++ 2 files changed, 214 insertions(+) create mode 100644 Writerside/topics/Strategie.md diff --git a/Writerside/gu.tree b/Writerside/gu.tree index d494cd6..739b7fc 100644 --- a/Writerside/gu.tree +++ b/Writerside/gu.tree @@ -9,6 +9,7 @@ + diff --git a/Writerside/topics/Strategie.md b/Writerside/topics/Strategie.md new file mode 100644 index 0000000..1287fab --- /dev/null +++ b/Writerside/topics/Strategie.md @@ -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 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 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. \ No newline at end of file