lien : click here

L’API officielle fournit par Evolution Robotics utilise directement l’application fournie avec le robot. Pour pouvoir commander l’ER1, l’API dialogue avec cette application par une connexion telnet, qui permet alors d’accéder à toutes les fonctionnalités de l’application avec quelques restrictions toutefois. En premier lieu, les commandes que l’on peut envoyer aux moteurs ne permettent pas de tourner et d’avancer en même temps. De plus, les commandes qui permettent de tourner et d’avancer doivent être envoyées en degrés et en cm. Bien que cela puisse être d’abord un avantage de simplicité, cette limitation devient vite gênante quand on veut exécuter au robot des mouvements précis et optimisés, comme le contour d’un obstacle.

Même si Evolution Robotics ne fournit pas le code de son API, il existe une solution de contournement, qui permet pour le coup de se passer complètement de l’application d’Evolution Robotics. Attention toutefois, on pert également la partie détection d’objets de l’api d’Evolution Robotics. Cette API alternative a été codée par reverse engineering, en écoutant le port usb qui est relié aux RCM, le petit boitier situé sous le robot.

Image

Le RCM dans son boitier

 

Image

Détail de la carte carte

L’auteur de cette API est Yau Lam Yiu. Elle est disponible en téléchargement sur sa page http://www.cs.ust.hk/~yiu/robot/. Le code est développé pour Microsoft Visual C++ 6 et est facilement portable sur les versions ultérieures du framework.

Il existe également une version Linux que je n’ai pas encore testé, disponible sur http://robotics.naist.jp/~osamu-m/software/er1-linux/.

Voila ci-dessous le code nécessaire pour initialiser et faire avancer le robot.
On commence d’abord par l’initialisation du port et du moteur.

RCMotion RCDev;
   dwErr=RCMDev.RCMInit("COM4");
   RCMDev.WheelInit();

 

Aprés cette initialisation, on peut directement utiliser les fonctions disponibles pour avancer et tourner :
Voici la commande moteur pour avancer

RCMDev.WheelSetVelocity(0x0001F77E);
RCMDev.WheelUpdate();

 

(attention, le robot ne va pas s’arréter à moins d’envoyer la commande RCMDev.WheelSetVelocity(0x0);)

Et voici la commande moteur tourner sur place

RCMDev.WheelSetTurn(0x0001F77E);
RCMDev.WheelUpdate();

 

Enfin voici les deux lignes nécessaires pour arrêter les moteurs.

RCMDev.WheelSetVelocity(0x0);
   RCMDev.WheelSetPower(0x0);

 

Personnellement, la fonctionnalité principale qui m’interessait dans cette api était le fait de pouvoir tourner en avançant. Voici donc la fonction que j’ai ajouté, qui permet de donner une commande différente pour chacun des moteurs.

void RCMotion::WheelSetMove(DWORD dwLeft, DWORD dwRight )
{
WheelSetPower(0x4CC0);
SendCmd_DW(1,SetVelocity,dwLeft);
SendCmd_DW(0,SetVelocity,dwRight);
}

 

À vous ensuite de calculer les valeurs dwLeft et dwRight afin de donner le rayon de courbure que vous souhaitez. Pour cela, il faut utiliser un modèle d’odométrie pour roues différentielles.