Scénario pilotage Roborock S50 par zone

Bonjour,

Je reviens sur le pilotage par zone de l’aspirateur robot Roborock S50.
Cela fonctionne parfaitement chez moi en suivant le tuto de Patrick que l’on trouve ici ou encore pour une version plus récente ici.
J’en profite aussi pour le remercier pour le partage de ce tuto.

Mais j’ai une question:

Il est expliqué dans le tuto de Patrick qu’on peut regrouper les zones pour un couloir ou une zone de vie.
Bonne idée on va mettre cela en oeuvre:

$coordonnees['R2D2_PIECEDEVIE'][] = $coordonnees['R2D2_SALON'][0];
$coordonnees['R2D2_PIECEDEVIE'][] = $coordonnees['R2D2_SEJOUR'][0];

J’ai fait une commande dans mon virtuel pour lancer le nettoyage de la pièce de vie mais je voyais pas ou ne comprenais pas comment les zones allaient s’enchainer dans le script. Je suis donc passé à l’exercice pratique.

Grâce à mon virtuelle la commande R2D2_PIECEDEVIE actionne le scénario (et donc le script) et le robot démarre, il se lance dans le nettoyage de la première zone de la zone de vie à savoir ici le salon.
Une fois le salon parcourue de long en large le robot retour à sa base.
Mais par la suite j’ai pas le nettoyage de la deuxième zone de la zone de vie: le séjour.

Une idée pour que les zones s’enchainent?

Je pourrai faire un scénario qui enchaine automatiquement les zones mais du coup je vois pas l’intérêt (ou ne sait pas le mettre en œuvre) d’une zone de « regroupement de zone » déclarée dans le script.
Je précise que la partie script c’est pas vraiment mon fort et que pour ma part cela a été un bon exercice de compréhension.

Alors vous faites comment?

1 « J'aime »

Salut, oui c’est possible en concaténant les coordonnées :

ex :
1 zone: [18828,24908,21128,25958,1]
2 zones : [18828,24908,21128,25958,1],[19859,26014,22909,27014,1]

A mettre dans le paramètre de la commande.

Je suis pas un spécialiste du dev, mais tu peux l’exploiter de cette manière :

Ex :

$coordonnees['R2D2_SEJOUR'][] = "19859,26014,22909,27014,1";
$coordonnees['R2D2_SALON'][] = "18828,24908,21128,25958,1";
$coordonnees['R2D2_PIECEDEVIE'][] = $coordonnees['R2D2_SALON'][0];
$coordonnees['R2D2_PIECEDEVIE'][] = $coordonnees['R2D2_SEJOUR'][0];

if (count($coordonnees['R2D2_PIECEDEVIE']) > 1) {
	$newpos = "[" . implode('],[', $coordonnees['R2D2_PIECEDEVIE']) . "]";
};

$newpos te donnera => [18828,24908,21128,25958,1],[19859,26014,22909,27014,1]

Moi, c’est comme ça que je fait :wink:

Merci @akashha pour cette solution.

Je vais essayer d’implanter et tester ce bout de code dans le script.
Comme je disais je suis pas un pro du code donc je vais tâtonner car avec la gestion de la rotation il faut surement adapter.

Hésite pas au besoin.

Petite astuce pour extraire facilement les coordonnées du robot, j’utilise un émulateur « Android » (bluestack sur mac), il doit y avoir l’équivalent sur windows. Je lance l’application « FloleVac », c’est une application Android qui permet de copier coller les coordonnées en fonction des zones sélectionnées.

Pour les extraires :

  • Aller dans « Carte » / « Zone Nettoyé » / « Ajouter » et lorsque tu clic sur "Nettoyage, tu reste appuyé, ça copie les coordonnées sélectionnées dans le presse papier. Un coller dans un fichier texte et c’est sauvegardé.

Tu peux donner jusqu’a 5 zones en même temps. :wink:

Merci bien.

J’ai déjà toutes mes zones et ça fonctionne très bien.

$coordonnees['R2D2_NULL'][] = "";
$coordonnees['R2D2_ENTREE'][] = "22010,26832,25310,28282,1";
$coordonnees['R2D2_CUISINE'][] = "25181,25138,28591,26738,1";
$coordonnees['R2D2_SALON'][] = "24609,26759,29909,31199,1";
$coordonnees['R2D2_SEJOUR'][] = "24199,31282,27549,33882,1";
$coordonnees['R2D2_CHAMBRE'][] = "20368,30121,24068,33721,1";
$coordonnees['R2D2_BUREAU'][] = "17296,30031,20246,33731,1";
$coordonnees['R2D2_COULOIR'][] = "19443,28254,24093,30054,1";
$coordonnees['R2D2_SALLEDEAU'][] = "24009,23856,25059,27156,1";

//Coordonnees des goThere
$coordonnees['R2D2_Poubelle'][] = "28300,25950";

//Zones de regroupement plusieurs autres zones :
$coordonnees['R2D2_APPARTEMENT'][] = $coordonnees['R2D2_ENTREE'][0];
$coordonnees['R2D2_APPARTEMENT'][] = $coordonnees['R2D2_CUISINE'][0];
$coordonnees['R2D2_APPARTEMENT'][] = $coordonnees['R2D2_CHAMBRE'][0];
$coordonnees['R2D2_APPARTEMENT'][] = $coordonnees['R2D2_BUREAU'][0];
$coordonnees['R2D2_APPARTEMENT'][] = $coordonnees['R2D2_COULOIR'][0];
$coordonnees['R2D2_PIECEDEVIE'][] = $coordonnees['R2D2_SALON'][0];
$coordonnees['R2D2_PIECEDEVIE'][] = $coordonnees['R2D2_SEJOUR'][0];
$coordonnees['R2D2_PIECEQUOTIDIEN'][] = $coordonnees['R2D2_CUISINE'][0];
$coordonnees['R2D2_PIECEQUOTITIEN'][] = $coordonnees['R2D2_SALLEDEAU'][0];

Mon soucis est surtout l’enchainement des zones en utilisant les multi-zones définies dans le script.
En lisant de nombreux postes j’avais bien compris qu’il faut concaténer les coordonnées. Mais le script que j’utilise suivant le tuto de @patrick je comprends pas comment il fait cette « concaténation » en recalculant les coordonnées suivant l’angle de rotation possible de la carte.

Personnelement, je n’ai pas intégré le recalcul des coordonnées car ma carte n’a jamais fait de rotation et ça fait plusieurs mois que je l’utilise… mais ça doit être adaptable.

Copie/Colle tout ton script, on y verra déjà plus claire.

Voila mon script complet:


 //Script de contournement des problèmes de rotations de cartes
//définition des zones (cleanZone) et des positions sur la carte (goThere):
$coordonnees = array();
$coordonnees['R2D2_NULL'][] = "";
$coordonnees['R2D2_ENTREE'][] = "22010,26832,25310,28282,1";
$coordonnees['R2D2_CUISINE'][] = "25181,25138,28591,26738,1";
$coordonnees['R2D2_SALON'][] = "24609,26759,29909,31199,1";
$coordonnees['R2D2_SEJOUR'][] = "24199,31282,27549,33882,1";
$coordonnees['R2D2_CHAMBRE'][] = "20368,30121,24068,33721,1";
$coordonnees['R2D2_BUREAU'][] = "17296,30031,20246,33731,1";
$coordonnees['R2D2_COULOIR'][] = "19443,28254,24093,30054,1";
$coordonnees['R2D2_SALLEDEAU'][] = "24009,23856,25059,27156,1";

//Coordonnees des goThere
$coordonnees['R2D2_Poubelle'][] = "28300,25950";

//Zones de regroupement plusieurs autres zones :
$coordonnees['R2D2_APPARTEMENT'][] = $coordonnees['R2D2_ENTREE'][0];
$coordonnees['R2D2_APPARTEMENT'][] = $coordonnees['R2D2_CUISINE'][0];
$coordonnees['R2D2_APPARTEMENT'][] = $coordonnees['R2D2_CHAMBRE'][0];
$coordonnees['R2D2_APPARTEMENT'][] = $coordonnees['R2D2_BUREAU'][0];
$coordonnees['R2D2_APPARTEMENT'][] = $coordonnees['R2D2_COULOIR'][0];
$coordonnees['R2D2_PIECEDEVIE'][] = $coordonnees['R2D2_SALON'][0];
$coordonnees['R2D2_PIECEDEVIE'][] = $coordonnees['R2D2_SEJOUR'][0];
$coordonnees['R2D2_PIECEQUOTIDIEN'][] = $coordonnees['R2D2_CUISINE'][0];
$coordonnees['R2D2_PIECEQUOTITIEN'][] = $coordonnees['R2D2_SALLEDEAU'][0];

// Récupération des paramètres stockés dans le virtuel :
 // rotation relative de la carte == 0 lors de la création initiale des zones
$cmd = cmd::byString("#[Systeme][R2D2 Virtuel][rotation_map]#");
$rotation = $cmd->execCmd();
// centre X de la carte :
$cmd = cmd::byString("#[Systeme][R2D2 Virtuel][centre_x]#");
$centre_x = $cmd->execCmd();
// centre Y de la carte :
$cmd = cmd::byString("#[Systeme][R2D2 Virtuel][centre_y]#");
$centre_y = $cmd->execCmd();
$centre = array($centre_x,$centre_y); // centre X, Y de la carte (25000,25000)

function rotate($x,$y, $angle,$centre) {
  if($angle == 0)
    {
    // ajustement facultatif du centre par défaut en cas de léger déplacement de la base :
    // $x = $x - 80;
    // $y = $y + 80;
    return array($x,$y);
  	}
  	$angle *= M_PI / 180;
 	$xM = $x - $centre[0];
    $yM = $y - $centre[1];
    $x = $xM * cos($angle) + $yM * sin($angle) + $centre[0];
    $y = - $xM * sin($angle) + $yM * cos($angle) + $centre[1];
  	return array(round($x), round($y));
    
}
            
                 
function generer($coordonnees,$quoi,$rotation,$centre)
     {
     if( count($coordonnees[$quoi])<1 ) return "AUCUN";
     $zonedef=array();
     foreach($coordonnees[$quoi] as $lazone)
     	{ // pour chaque zone
        $zone=explode(',', $lazone);
        $coord=array();
        list( $xa , $ya ) = rotate($zone[0],$zone[1],$rotation,$centre);  // Renvoi position debut array(x,y)
        if( $zone[2] > 0 )
            { // Clean zone
            list( $xb , $yb ) = rotate($zone[2],$zone[3],$rotation,$centre); // renvoi position fin array(x,y)
            if( $xa < $xb )
            	{
                $coord[0] = $xa;
                $coord[1] = 0;
                $coord[2] = $xb;
                }
            else{
                $coord[0] = $xb;
                $coord[1] = 0;
                $coord[2] = $xa;
                }
            if( $ya < $yb )
                {
                $coord[1] = $ya;
                $coord[3] = $yb;
                }
            else{ 
                $coord[1] = $yb;
                $coord[3] = $ya;
                }
            $coord[4]=$zone[4];
            $zonedef[]='['.implode(',',$coord).']';
            }
        else{  // Gothere
            $zonedef[] = $xa . "," . $ya;
            }
        }                      
     return implode(',',$zonedef);
   }
           
$cmd = cmd::bystring("#[Systeme][R2D2 Virtuel][Ordre]#");
$job = $cmd->execCmd(); // contient le nom de la zone ou position demandée (tel que défini dans notre tableau)
                                   
// on génère les coordonnées corrigées :
$newpos = generer($coordonnees,$job,$rotation,$centre);
                                   
// et on sauve ces coordonnées dans notre virtuel (pour qu'ils soient exploitables hors de notre bloc de code)
$cmd = cmd::byString("#[Systeme][R2D2 Virtuel][coordonnees]#");
$cmd->event($newpos);
                                   
// FIN DU SCRIPT 


Et ba c’est nickel ça, j’ai testé la génération des coordonnées fonctionne parfaitement.
La seule chose qui peut poser problème, c’est ton doigt carré qui à écris « R2D2_PIECEQUOTITIEN » et « R2D2_PIECEQUOTIDIEN ». lol

Remplace par :

$coordonnees['R2D2_PIECEQUOTIDIEN'][] = $coordonnees['R2D2_CUISINE'][0];
$coordonnees['R2D2_PIECEQUOTIDIEN'][] = $coordonnees['R2D2_SALLEDEAU'][0];

:wink:

Oh bordel ! J’avais pas vu ça.
J’ai passé deux jours à lire tous les posts et tuto que j’ai pu trouvé pour comprendre à cause de mon doigt farceur.
Merci pour ton œil de lynx !

Donc en fait je me pose trop de questions car le script fait la concaténation et applique la rotation.
Ce qui prouve bien qu’il faut que je creuse le php.

Encore merci @akashha .

Oui, le script marche bien.
Profite :wink:

Ce sujet a été automatiquement fermé après 24 heures suivant le dernier commentaire. Aucune réponse n’est permise dorénavant.