Aller au contenu


Photo
* * * * * 1 note(s)

SLAMTEC RPLIDAR A2: développement en C d'un driver 4K ultra rapide

SLAMTEC RPLIDAR A2 4K Embarqué Integer FPU FIxed point

57 réponses à ce sujet

#41 Serveurperso

Serveurperso

    Membre passionné

  • Membres
  • PipPipPip
  • 394 messages
  • Gender:Male
  • Location:Paris
  • Interests:Systèmes/Réseaux/Dev/Hardware/RF/Optique/Lasers...

Posté 18 avril 2018 - 07:46

C'est cette partie du code la plus intéressante, et c'est déjà optimisé à mort en fait, tellement qu'on comprend rien de premier abord en fait "c'est neuneu"


Cloud de serveurs à faible latence pour la téléopération sécurisée de robots mobiles, drones et autres systèmes embarqués temps réel

Serveur de développement : https://www.serveurp...om/?page=robots
Accès officiel aux robots : https://www.vigibot.com
News : https://www.vigirobotics.com

Radiobot = Grande base mobile mecanum - 8 caméras, liaisons radio UHF (non Wi-Fi), PIC32 bare-metal + serveur NodeJS déporté
Xubot = Petite base mobile mecanum - 3 caméras, IHM web embarquée sur le robot, liaison Wi-Fi + portail captif, PIC32 bare-metal + serveur NodeJS et vidéo H.264 faible latence (Odroid XU4Q)
Robil = Comme Xubot mais avec une Raspberry PI et sa caméra
Zoombot = Caméra motorisée Axis 214 PTZ (Pan Tilt Zoom)
Raspibot = Une Raspberry PI + une PI caméra + quelques servomoteurs + un client Node.js Open-Source = un robot web fluide et économique.


#42 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 7 375 messages
  • Gender:Male
  • Location:Cholet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 18 avril 2018 - 08:06

On arrive maintenant à 

 syncBit[0] = (( (currentAngle_raw_q16 + angleInc_q16) % (360<<16)) < angleInc_q16 )?1:0;

syncBit est une variale intermédiaire qui sera effacée au fur et à mesure qu'on avance mais que contient cette valeur ?  

 

Revenons à nos indices k :
 

  currentAngle_raw_q16  ( k ) + angleInc_q16  =  wi_q16 +  k * angleInc_q16   + angleInc_q16  = wi_q16 + ( k+1) * angleInc_q16   =  currentAngle_raw_q16  ( k +1 )  

 

 

d'où 

 

 (currentAngle_raw_q16 + angleInc_q16) % (360<<16))   = (currentAngle_raw_q16 + angleInc_q16) % (360°_q16)) 

 c'est  le complément sur 360°  du "  prochain  currentAngle_raw_q16  " . 

 

d'où : 

syncBit[0] = (( (currentAngle_raw_q16 + angleInc_q16) % (360<<16)) < angleInc_q16 )?1:0;

équivaut à 

 

if( currentAngle_raw_q16 ( K+ 1 ) % 360°_q16  < angeInc_q16)

   sincBit(K) = 1; 
sinon 
  sincBit(K) =  0; 

 

 

or comme currentAngle_raw_q16 ( K+ 1 ) =  wi_q16 + ( k+1) * angleInc_q16    (    avec K >= 0   AngleInc_q16 >=  0 et  wi_q16 >= 0 ) 

On a nécessairement  
currentAngle_raw_q16 ( K+ 1 ) >=   angeInc_q16 

 

Par contre si currentAngle_raw_q16 ( K+ 1 ) déborde des 360° de valeur <angleInc_q16 on aura alors   

 

currentAngle_raw_q16 ( K+ 1 )  % 360°_q16  qui sera inférieur à angleInc_q16 ! 

 

 

donc noter syncBit(k) = 1 en général et passe à 0 juste avant que  currentAngle_raw_q16 ( K) ne déborde des 360° ! Ce qui permet de détecter le passage de l'angle par 0.


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !

 

Les réalisations de Mike118  

 

 

 


#43 Serveurperso

Serveurperso

    Membre passionné

  • Membres
  • PipPipPip
  • 394 messages
  • Gender:Male
  • Location:Paris
  • Interests:Systèmes/Réseaux/Dev/Hardware/RF/Optique/Lasers...

Posté 18 avril 2018 - 08:15

C'est justement cette partie qu'il nous manque pour synchroniser le 0 au début du tableau.

 

Ton analyse du dessus va me servir de base pour la version optimisée du code

Va falloir entrer dans la table de sinus directement en 16 bits

Bosser en Q16 permet d'avoir 16 bits de mantisse et 16 bits d'exposant.


Cloud de serveurs à faible latence pour la téléopération sécurisée de robots mobiles, drones et autres systèmes embarqués temps réel

Serveur de développement : https://www.serveurp...om/?page=robots
Accès officiel aux robots : https://www.vigibot.com
News : https://www.vigirobotics.com

Radiobot = Grande base mobile mecanum - 8 caméras, liaisons radio UHF (non Wi-Fi), PIC32 bare-metal + serveur NodeJS déporté
Xubot = Petite base mobile mecanum - 3 caméras, IHM web embarquée sur le robot, liaison Wi-Fi + portail captif, PIC32 bare-metal + serveur NodeJS et vidéo H.264 faible latence (Odroid XU4Q)
Robil = Comme Xubot mais avec une Raspberry PI et sa caméra
Zoombot = Caméra motorisée Axis 214 PTZ (Pan Tilt Zoom)
Raspibot = Une Raspberry PI + une PI caméra + quelques servomoteurs + un client Node.js Open-Source = un robot web fluide et économique.


#44 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 7 375 messages
  • Gender:Male
  • Location:Cholet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 18 avril 2018 - 08:50

En fait c'est pas pour toi je peste contre leurs code moisi qui ne respecte pas du tout la doc et qui utilise des types non stricts (uint8_t int8_t etc...)

 

eh bien en fait si le code respecte la doc mis à part cet histoire de signe qui est traité nulle part ... du moins pour le moment ...

ils n'indiquent pas comment ils stoquent leur dtheta q3 ... Si ça se trouve il gère le signe en dehors de la fonction ... =) le code n'a pas encore révélé tous ses secrets =) 


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !

 

Les réalisations de Mike118  

 

 

 


#45 Serveurperso

Serveurperso

    Membre passionné

  • Membres
  • PipPipPip
  • 394 messages
  • Gender:Male
  • Location:Paris
  • Interests:Systèmes/Réseaux/Dev/Hardware/RF/Optique/Lasers...

Posté 19 avril 2018 - 08:53

Être obligé de faire une rétroingénierie par manque d'information c'est quand même anormal surtout que c'est juste parce qu'il ont eu la flemme de faire un débit UART configurable

Cloud de serveurs à faible latence pour la téléopération sécurisée de robots mobiles, drones et autres systèmes embarqués temps réel

Serveur de développement : https://www.serveurp...om/?page=robots
Accès officiel aux robots : https://www.vigibot.com
News : https://www.vigirobotics.com

Radiobot = Grande base mobile mecanum - 8 caméras, liaisons radio UHF (non Wi-Fi), PIC32 bare-metal + serveur NodeJS déporté
Xubot = Petite base mobile mecanum - 3 caméras, IHM web embarquée sur le robot, liaison Wi-Fi + portail captif, PIC32 bare-metal + serveur NodeJS et vidéo H.264 faible latence (Odroid XU4Q)
Robil = Comme Xubot mais avec une Raspberry PI et sa caméra
Zoombot = Caméra motorisée Axis 214 PTZ (Pan Tilt Zoom)
Raspibot = Une Raspberry PI + une PI caméra + quelques servomoteurs + un client Node.js Open-Source = un robot web fluide et économique.


#46 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 7 375 messages
  • Gender:Male
  • Location:Cholet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 20 avril 2018 - 04:46

Bon j'ai beau chercher partout dans le code je ne trouve pas d'endroit où il gère un éventuel signe ... 

Là c'est si je ne me trompe pas la fonction d'acquisition de la trame en mode 4K : 

u_result RPlidarDriverImplCommon::_waitCapsuledNode(rplidar_response_capsule_measurement_nodes_t & node, _u32 timeout)
{
    int  recvPos = 0;
    _u32 startTs = getms();
    _u8  recvBuffer[sizeof(rplidar_response_capsule_measurement_nodes_t)];
    _u8 *nodeBuffer = (_u8*)&node;
    _u32 waitTime;


   while ((waitTime=getms() - startTs) <= timeout) {
        size_t remainSize = sizeof(rplidar_response_capsule_measurement_nodes_t) - recvPos;
        size_t recvSize;

        bool ans = _chanDev->waitfordata(remainSize, timeout-waitTime, &recvSize);
        if(!ans)
        {
            return RESULT_OPERATION_TIMEOUT;
        }
        if (recvSize > remainSize) recvSize = remainSize;
        
        recvSize = _chanDev->recvdata(recvBuffer, recvSize);
        
        for (size_t pos = 0; pos < recvSize; ++pos) {
            _u8 currentByte = recvBuffer[pos];

            switch (recvPos) {
            case 0: // expect the sync bit 1
                {
                    _u8 tmp = (currentByte>>4);
                    if ( tmp == RPLIDAR_RESP_MEASUREMENT_EXP_SYNC_1 ) {
                        // pass
                    } else {
                        _is_previous_capsuledataRdy = false;
                        continue;
                    }

                }
                break;
            case 1: // expect the sync bit 2
                {
                    _u8 tmp = (currentByte>>4);
                    if (tmp == RPLIDAR_RESP_MEASUREMENT_EXP_SYNC_2) {
                        // pass
                    } else {
                        recvPos = 0;
                        _is_previous_capsuledataRdy = false;
                        continue;
                    }
                }
                break;
            }
            nodeBuffer[recvPos++] = currentByte;
            if (recvPos == sizeof(rplidar_response_capsule_measurement_nodes_t)) {
                // calc the checksum ...
                _u8 checksum = 0;
                _u8 recvChecksum = ((node.s_checksum_1 & 0xF) | (node.s_checksum_2<<4));
                for (size_t cpos = offsetof(rplidar_response_capsule_measurement_nodes_t, start_angle_sync_q6);
                    cpos < sizeof(rplidar_response_capsule_measurement_nodes_t); ++cpos)
                {
                    checksum ^= nodeBuffer[cpos];
                }
                if (recvChecksum == checksum)
                {
                    // only consider vaild if the checksum matches...
                    if (node.start_angle_sync_q6 & RPLIDAR_RESP_MEASUREMENT_EXP_SYNCBIT) 
                    {
                        // this is the first capsule frame in logic, discard the previous cached data...
                        _is_previous_capsuledataRdy = false;
                        return RESULT_OK;
                    }
                    return RESULT_OK;
                }
                _is_previous_capsuledataRdy = false;
                return RESULT_INVALID_DATA;
            }
        }
    }
    _is_previous_capsuledataRdy = false;
    return RESULT_OPERATION_TIMEOUT;
}

Et visiblement il font bien que prendre les byte 1 à 1 et ne font pas de traitement dessus ... 

Du coup je ne vois vraiment pas où est ce qu'ils traitent le fameux signe mystère ... 

Donc j'ai bien l'impression que ce signe mystère n'existe pas ... d'où le fait que ça marche bien quand pascal le prend en non signé. 


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !

 

Les réalisations de Mike118  

 

 

 


#47 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 7 375 messages
  • Gender:Male
  • Location:Cholet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 20 avril 2018 - 05:16

En fait je viens de comprendre que je me prend la tête pour rien avec cette gestion de signe ! 

Path et Pascal ont tous les deux raisons à leur façon ! =) 

Le nombre est bien signé"  mais en C en ça se gère tout seul par les débordements.... 

si on est sur 8 bits,   -1 => 0b11111111  = 255 ...       

1 + -10  = 1 + 255 = 256  ...  

 

là la même chose est faite en 32 bits ! =) 

Sauf que en java script, la représentation des variables n'est pas pareil du coup path doit faire sa manip en plus pour gérer le sign, que slamtech ne fait pas sur son code car c'est déjà géré par le type =) 

 

Bref je me suis pris la tête pour rien x) 


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !

 

Les réalisations de Mike118  

 

 

 


#48 Serveurperso

Serveurperso

    Membre passionné

  • Membres
  • PipPipPip
  • 394 messages
  • Gender:Male
  • Location:Paris
  • Interests:Systèmes/Réseaux/Dev/Hardware/RF/Optique/Lasers...

Posté 20 avril 2018 - 05:22

C'est exactement l'astuce que j'utilise pour faire un index unsigned pour la table de sinus avec le minimum d'opérations :

 

int16_t sin16(int16_t angle) {
 return sinTable16[uint16_t(angle)] - UN16;
}
 


Cloud de serveurs à faible latence pour la téléopération sécurisée de robots mobiles, drones et autres systèmes embarqués temps réel

Serveur de développement : https://www.serveurp...om/?page=robots
Accès officiel aux robots : https://www.vigibot.com
News : https://www.vigirobotics.com

Radiobot = Grande base mobile mecanum - 8 caméras, liaisons radio UHF (non Wi-Fi), PIC32 bare-metal + serveur NodeJS déporté
Xubot = Petite base mobile mecanum - 3 caméras, IHM web embarquée sur le robot, liaison Wi-Fi + portail captif, PIC32 bare-metal + serveur NodeJS et vidéo H.264 faible latence (Odroid XU4Q)
Robil = Comme Xubot mais avec une Raspberry PI et sa caméra
Zoombot = Caméra motorisée Axis 214 PTZ (Pan Tilt Zoom)
Raspibot = Une Raspberry PI + une PI caméra + quelques servomoteurs + un client Node.js Open-Source = un robot web fluide et économique.


#49 Serveurperso

Serveurperso

    Membre passionné

  • Membres
  • PipPipPip
  • 394 messages
  • Gender:Male
  • Location:Paris
  • Interests:Systèmes/Réseaux/Dev/Hardware/RF/Optique/Lasers...

Posté 20 avril 2018 - 05:35

Maintenant il ne me manque QUE la détection du passage de l'angle par zéro. Et pas obfusquée-crado comme ils ont fait mais comprendre pourquoi le code

 

oldAngle = angle;

angle = [calcul d'angle]

 

if(oldAngle > angle)

 indexDuTableau = 0;

 

ne fonctionne pas...


Cloud de serveurs à faible latence pour la téléopération sécurisée de robots mobiles, drones et autres systèmes embarqués temps réel

Serveur de développement : https://www.serveurp...om/?page=robots
Accès officiel aux robots : https://www.vigibot.com
News : https://www.vigirobotics.com

Radiobot = Grande base mobile mecanum - 8 caméras, liaisons radio UHF (non Wi-Fi), PIC32 bare-metal + serveur NodeJS déporté
Xubot = Petite base mobile mecanum - 3 caméras, IHM web embarquée sur le robot, liaison Wi-Fi + portail captif, PIC32 bare-metal + serveur NodeJS et vidéo H.264 faible latence (Odroid XU4Q)
Robil = Comme Xubot mais avec une Raspberry PI et sa caméra
Zoombot = Caméra motorisée Axis 214 PTZ (Pan Tilt Zoom)
Raspibot = Une Raspberry PI + une PI caméra + quelques servomoteurs + un client Node.js Open-Source = un robot web fluide et économique.


#50 Serveurperso

Serveurperso

    Membre passionné

  • Membres
  • PipPipPip
  • 394 messages
  • Gender:Male
  • Location:Paris
  • Interests:Systèmes/Réseaux/Dev/Hardware/RF/Optique/Lasers...

Posté 21 avril 2018 - 08:02

J'avance : si jamais je retire la compensation d'angle (deltaAnglesQ3) alors les données démarrent bien à zéro dans le tableau, sans les sursauts à + 180 degrés. ça ressemble à un integer warp contre productif...

 

Sur le PIC32 j'ai une multiplication / division euclidienne en 1 cycle d'horloge, c'est donc plus performant (et surtout plus lisible) que ce qu'ils ont fait dans le driver d'origine:D

         oldAngle = angle;
         angle = (
                   oldStartAngleQ6 +
                   diffAngleQ6 * i / RPLIDARNBSAMPLES// -
                   //(deltaAnglesQ3[i] << 3)
                 ) * 65536 / (360 << 6);


          if(oldAngle > angle) {
           lidarsx[j] = MESURENULLE;
           lidarsy[j] = MESURENULLE;
           lidarsCartex[j] = MESURENULLE;
           lidarsCartey[j] = MESURENULLE;
           j = 0;
          }


Cloud de serveurs à faible latence pour la téléopération sécurisée de robots mobiles, drones et autres systèmes embarqués temps réel

Serveur de développement : https://www.serveurp...om/?page=robots
Accès officiel aux robots : https://www.vigibot.com
News : https://www.vigirobotics.com

Radiobot = Grande base mobile mecanum - 8 caméras, liaisons radio UHF (non Wi-Fi), PIC32 bare-metal + serveur NodeJS déporté
Xubot = Petite base mobile mecanum - 3 caméras, IHM web embarquée sur le robot, liaison Wi-Fi + portail captif, PIC32 bare-metal + serveur NodeJS et vidéo H.264 faible latence (Odroid XU4Q)
Robil = Comme Xubot mais avec une Raspberry PI et sa caméra
Zoombot = Caméra motorisée Axis 214 PTZ (Pan Tilt Zoom)
Raspibot = Une Raspberry PI + une PI caméra + quelques servomoteurs + un client Node.js Open-Source = un robot web fluide et économique.


#51 Serveurperso

Serveurperso

    Membre passionné

  • Membres
  • PipPipPip
  • 394 messages
  • Gender:Male
  • Location:Paris
  • Interests:Systèmes/Réseaux/Dev/Hardware/RF/Optique/Lasers...

Posté 21 avril 2018 - 11:31

Ca commence a prendre forme et c'est quand même plus claire que le code d'origine.

Reste un dernier bug neuneu : j'ai ma remise à zéro avant que le dernier bloc ne soit enregistré

DODO suite demain!

    // Ici code de lecture header (state machine)

    diffAngleQ6 = startAngleQ6 - oldStartAngleQ6;
    if(oldStartAngleQ6 > startAngleQ6)
     diffAngleQ6 += 360 << 6;

    diffAngleTotalQ6 = 0;
    for(uint8_t i = 0; i < NBMESURESCABINES; i++) {

     angleBrutQ6 = oldStartAngleQ6 + diffAngleTotalQ6 / NBMESURESCABINES;
     diffAngleTotalQ6 += diffAngleQ6;

     angle = angleBrutQ6;
     angle -= deltaAnglesQ3[i] << 3;
     angle *= 65536;
     angle /= (360 << 6);

     if((angleBrutQ6 + diffAngleQ6) % (360 << 6) < diffAngleQ6) {
      // Ecrire un MESURENULLE et retour au début du stockage
     }

     // Ici code de stockage des données
    }

   // Ici code de lecture des cabines (state machine)


Cloud de serveurs à faible latence pour la téléopération sécurisée de robots mobiles, drones et autres systèmes embarqués temps réel

Serveur de développement : https://www.serveurp...om/?page=robots
Accès officiel aux robots : https://www.vigibot.com
News : https://www.vigirobotics.com

Radiobot = Grande base mobile mecanum - 8 caméras, liaisons radio UHF (non Wi-Fi), PIC32 bare-metal + serveur NodeJS déporté
Xubot = Petite base mobile mecanum - 3 caméras, IHM web embarquée sur le robot, liaison Wi-Fi + portail captif, PIC32 bare-metal + serveur NodeJS et vidéo H.264 faible latence (Odroid XU4Q)
Robil = Comme Xubot mais avec une Raspberry PI et sa caméra
Zoombot = Caméra motorisée Axis 214 PTZ (Pan Tilt Zoom)
Raspibot = Une Raspberry PI + une PI caméra + quelques servomoteurs + un client Node.js Open-Source = un robot web fluide et économique.


#52 Serveurperso

Serveurperso

    Membre passionné

  • Membres
  • PipPipPip
  • 394 messages
  • Gender:Male
  • Location:Paris
  • Interests:Systèmes/Réseaux/Dev/Hardware/RF/Optique/Lasers...

Posté 22 avril 2018 - 06:24

DEBOUT à 7h !!!

Truc pondu à froid au réveil : Ne prendre que le front descendant de l'impulsion pour éviter que ce soit vrais durant toute la durée des 32 derniers enregistrements des 16 cabines.

static bool oldPulse;
static bool pulse = 0;
oldPulse = pulse;
pulse = (angleBrutQ6 + diffAngleQ6) % (360 << 6) < diffAngleQ6;

if(!pulse && oldPulse) {
  // Ecrire un MESURENULLE et retour au début du stockage
}

Et la tout fonctionne à 100% en 4K :D Je vais quand même réfléchir aux moindre optimisation sans dégrader la lisibilité / ou amélioration uniquement de la lisibilité / amélioration de l'élégance du code...


Cloud de serveurs à faible latence pour la téléopération sécurisée de robots mobiles, drones et autres systèmes embarqués temps réel

Serveur de développement : https://www.serveurp...om/?page=robots
Accès officiel aux robots : https://www.vigibot.com
News : https://www.vigirobotics.com

Radiobot = Grande base mobile mecanum - 8 caméras, liaisons radio UHF (non Wi-Fi), PIC32 bare-metal + serveur NodeJS déporté
Xubot = Petite base mobile mecanum - 3 caméras, IHM web embarquée sur le robot, liaison Wi-Fi + portail captif, PIC32 bare-metal + serveur NodeJS et vidéo H.264 faible latence (Odroid XU4Q)
Robil = Comme Xubot mais avec une Raspberry PI et sa caméra
Zoombot = Caméra motorisée Axis 214 PTZ (Pan Tilt Zoom)
Raspibot = Une Raspberry PI + une PI caméra + quelques servomoteurs + un client Node.js Open-Source = un robot web fluide et économique.


#53 Serveurperso

Serveurperso

    Membre passionné

  • Membres
  • PipPipPip
  • 394 messages
  • Gender:Male
  • Location:Paris
  • Interests:Systèmes/Réseaux/Dev/Hardware/RF/Optique/Lasers...

Posté 22 avril 2018 - 09:41

Voila je lui ai tordu le coup, c'est terminé.

 

Il suffisait juste de détecter le passage par zéro sur l'angle non compensé !!!

 

Il faut quand même avouer que :

if(oldAngleBrutQ6 > angleBrutQ6)

 

C'est quand même beaucoup beaucoup plus facile à comprendre que :

syncBit[0] = (( (currentAngle_raw_q16 + angleInc_q16) % (360<<16)) < angleInc_q16 )?1:0;"

 

Qu'ils nous on pondu dans le code d'origine, et sans parler du reste !!! Le développeur de robotpeak devait être drogué...

 

Voila l'algo terminé, et sans aucun charabia :

    #define NBMESURESCABINES 32
    #define UNTOURQ6 (360 << 6)

    // Ici le code machine d'état pour l'en-tête...

    diffAngleQ6 = startAngleQ6 - oldStartAngleQ6;                                      // Calcul l'angle entre deux mesures de référence
    if(oldStartAngleQ6 > startAngleQ6)
     diffAngleQ6 += UNTOURQ6;

    diffAngleTotalQ6 = 0;
    for(uint8_t i = 0; i < NBMESURESCABINES; i++) {

     angleBrutQ6 = (oldStartAngleQ6 + diffAngleTotalQ6 / NBMESURESCABINES) % UNTOURQ6; // Calcul de l'angle non compensé et sans débordement
     diffAngleTotalQ6 += diffAngleQ6;

     if(oldAngleBrutQ6 > angleBrutQ6) {                                                // Détection du passage par zéro de l'angle non compensé
      // Remise à zéro de la position d'enregistrement dans les tableaux
     }
     oldAngleBrutQ6 = angleBrutQ6;

     if(distances[i]) {                                                                // Si la lecture est valide
      angle = angleBrutQ6 - (deltaAnglesQ3[i] << 3);                                   // Compensation de l'angle
      angle = angle * 65536 / UNTOURQ6;                                                // Remise à l'échelle de l'angle

      // Ici enregistrement cartésien etc...

     }
    }
    oldStartAngleQ6 = startAngleQ6;

    // Ici le code machine d'état pour l'en-tête...

Cloud de serveurs à faible latence pour la téléopération sécurisée de robots mobiles, drones et autres systèmes embarqués temps réel

Serveur de développement : https://www.serveurp...om/?page=robots
Accès officiel aux robots : https://www.vigibot.com
News : https://www.vigirobotics.com

Radiobot = Grande base mobile mecanum - 8 caméras, liaisons radio UHF (non Wi-Fi), PIC32 bare-metal + serveur NodeJS déporté
Xubot = Petite base mobile mecanum - 3 caméras, IHM web embarquée sur le robot, liaison Wi-Fi + portail captif, PIC32 bare-metal + serveur NodeJS et vidéo H.264 faible latence (Odroid XU4Q)
Robil = Comme Xubot mais avec une Raspberry PI et sa caméra
Zoombot = Caméra motorisée Axis 214 PTZ (Pan Tilt Zoom)
Raspibot = Une Raspberry PI + une PI caméra + quelques servomoteurs + un client Node.js Open-Source = un robot web fluide et économique.


#54 Serveurperso

Serveurperso

    Membre passionné

  • Membres
  • PipPipPip
  • 394 messages
  • Gender:Male
  • Location:Paris
  • Interests:Systèmes/Réseaux/Dev/Hardware/RF/Optique/Lasers...

Posté 29 mai 2018 - 07:57

Hop good new ils ont pondu une MAJ du firmware RPLIDAR A2 pour supporter le 8K sur le même hardware:D

Je vais tenter cette semaine.

http://www.slamtec.com/cn/Support#rplidar-a2

https://wiki.slamtec...pageId=16154735

 


Cloud de serveurs à faible latence pour la téléopération sécurisée de robots mobiles, drones et autres systèmes embarqués temps réel

Serveur de développement : https://www.serveurp...om/?page=robots
Accès officiel aux robots : https://www.vigibot.com
News : https://www.vigirobotics.com

Radiobot = Grande base mobile mecanum - 8 caméras, liaisons radio UHF (non Wi-Fi), PIC32 bare-metal + serveur NodeJS déporté
Xubot = Petite base mobile mecanum - 3 caméras, IHM web embarquée sur le robot, liaison Wi-Fi + portail captif, PIC32 bare-metal + serveur NodeJS et vidéo H.264 faible latence (Odroid XU4Q)
Robil = Comme Xubot mais avec une Raspberry PI et sa caméra
Zoombot = Caméra motorisée Axis 214 PTZ (Pan Tilt Zoom)
Raspibot = Une Raspberry PI + une PI caméra + quelques servomoteurs + un client Node.js Open-Source = un robot web fluide et économique.


#55 Serveurperso

Serveurperso

    Membre passionné

  • Membres
  • PipPipPip
  • 394 messages
  • Gender:Male
  • Location:Paris
  • Interests:Systèmes/Réseaux/Dev/Hardware/RF/Optique/Lasers...

Posté 17 juin 2018 - 07:44

C'est bon je l'ai flashé sur mes 2 robots qui fonctionnent toujours en 4K de la même façon qu'avant, sauf que le protocole bas niveau 8K est maintenant dispo. Il reste à coder le driver 8K au besoin (mais sur le PIC32 8000 mesures par secondes faut pas pousser).

 

Maintenant le bit de "start" fonctionne quand le moteur se relance des qu'on bloque la rotation or qu'avant il était complètement ératique et rarement mis à 1...

 

1.png

2.png

 


Cloud de serveurs à faible latence pour la téléopération sécurisée de robots mobiles, drones et autres systèmes embarqués temps réel

Serveur de développement : https://www.serveurp...om/?page=robots
Accès officiel aux robots : https://www.vigibot.com
News : https://www.vigirobotics.com

Radiobot = Grande base mobile mecanum - 8 caméras, liaisons radio UHF (non Wi-Fi), PIC32 bare-metal + serveur NodeJS déporté
Xubot = Petite base mobile mecanum - 3 caméras, IHM web embarquée sur le robot, liaison Wi-Fi + portail captif, PIC32 bare-metal + serveur NodeJS et vidéo H.264 faible latence (Odroid XU4Q)
Robil = Comme Xubot mais avec une Raspberry PI et sa caméra
Zoombot = Caméra motorisée Axis 214 PTZ (Pan Tilt Zoom)
Raspibot = Une Raspberry PI + une PI caméra + quelques servomoteurs + un client Node.js Open-Source = un robot web fluide et économique.


#56 Path

Path

    Made By Humans

  • Modérateur
  • PipPipPipPipPip
  • 2 277 messages
  • Gender:Male
  • Location:Paris

Posté 08 août 2018 - 05:36

Vous en avez compris quoi du S ?

 

Dans la doc (v1.1), au chapitre : Express Scan(EXPRESS_SCAN) Request and Response

Response descriptor flag S:
After entering express scan mode, the first sent data response packet always has
the S flag set to 1. In the following measuring process, if the angle value cannot be
calculated via the above formula due to rotating speed instability or something
wrong, RPLIDAR will reset the flag S. Then the host system is supposed to restart
the data analysis based on the current response data packet set as flag S.

 

Plus bas, au chapitre : Calculate RPLIDAR Scanning Speed

The host system can keep recording the interval time between two adjacent

measurement sample data response with the start flag bit S set to 1 (S=1), called
∆T. The interval time represents how long the RPLIDAR has spent to perform a 360o
scan. So the actual scan speed can be calculated using the following equation:
RPM = 1/∆∗60
The calculated value can be used as a feedback to control the motor speed.

 

Perso, j'y comprend rien. Le S à 1, il signale une reprise après erreur ou bien une révolution (360°) ?


Podcast Made By Humans

Je cherche des volontaires de tous niveaux pour nos petites conversations entre hobbyistes.

Accès aux salles secrètes

 


#57 Serveurperso

Serveurperso

    Membre passionné

  • Membres
  • PipPipPip
  • 394 messages
  • Gender:Male
  • Location:Paris
  • Interests:Systèmes/Réseaux/Dev/Hardware/RF/Optique/Lasers...

Posté 09 août 2018 - 02:25

C'est du camoulox leur truc j'en ai pas tenu compte de cette saloperie de S car dans mon case 3 le robot est sensé, le TXDEBUG branché en permanence sur la synthèse vocale dire le mot "start" ce qui arrive extrêmement rarement voir jamais - parfois au démarrage mais vraiment genre une fois par mois.....

   case 3:
    sum ^= current;
    startAngleQ6 |= (current & 0x7F) << 8;
    start = current >> 7;                                                              // Fin de réception de l'en-tête
    if(start)
     TXDEBUG.println("start");

Cloud de serveurs à faible latence pour la téléopération sécurisée de robots mobiles, drones et autres systèmes embarqués temps réel

Serveur de développement : https://www.serveurp...om/?page=robots
Accès officiel aux robots : https://www.vigibot.com
News : https://www.vigirobotics.com

Radiobot = Grande base mobile mecanum - 8 caméras, liaisons radio UHF (non Wi-Fi), PIC32 bare-metal + serveur NodeJS déporté
Xubot = Petite base mobile mecanum - 3 caméras, IHM web embarquée sur le robot, liaison Wi-Fi + portail captif, PIC32 bare-metal + serveur NodeJS et vidéo H.264 faible latence (Odroid XU4Q)
Robil = Comme Xubot mais avec une Raspberry PI et sa caméra
Zoombot = Caméra motorisée Axis 214 PTZ (Pan Tilt Zoom)
Raspibot = Une Raspberry PI + une PI caméra + quelques servomoteurs + un client Node.js Open-Source = un robot web fluide et économique.


#58 Path

Path

    Made By Humans

  • Modérateur
  • PipPipPipPipPip
  • 2 277 messages
  • Gender:Male
  • Location:Paris

Posté 09 août 2018 - 09:58

Ok merci :) Idem, sur la version JS, et ça fonctionne très bien aussi.


Podcast Made By Humans

Je cherche des volontaires de tous niveaux pour nos petites conversations entre hobbyistes.

Accès aux salles secrètes

 




Répondre à ce sujet



  


0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users