Interface RobotService

Vous consultez actuellement la documentation pour la dernière version (2.1.2). Pour accéder à une autre version, cliquez sur le bouton "Changer de version" situé dans le coin supérieur droit de la page.

■ Si vous n’êtes pas sûr de la version du produit que vous utilisez, veuillez contacter le support technique Mech-Mind pour obtenir de l’aide.

Cette section présente les interfaces Adapter liées à RobotService, comme indiqué ci-dessous.

Simuler le service RobotServer

« Simuler le service RobotServer » est généralement utilisé dans des scénarios où le système de vision pilote le robot en maître, mais où le robot ne peut pas être contrôlé directement via RobotServer (jouant le rôle d’appareil maître de la communication maître-contrôle). Dans ce cas, l’interface RobotService peut être utilisée pour simuler un RobotServer et ainsi piloter le robot en maître. Après l’enregistrement de RobotService dans Mech-Viz, Mech-Viz interagira avec RobotService comme avec un robot réel.

« Simuler le service RobotServer » peut être utilisé pour :

  • Obtenir les JPs du robot pour les calculs dans Mech-Vision (dans le scénario caméra embarquée);

  • Obtenir la pose du robot réel et l’envoyer au service RobotService.

Exemple

L’objet RobotService dans une classe dérivée d’Adapter est appelé comme suit.

def _register_service(self):
       """
       register_service
       :return:
       """
       if self.robot_service:
           return

       self.robot_service = RobotService(self)
       other_info = {'robot_type': self.robot_service.service_name}
       self.server, _ = register_service(self.hub_caller, self.robot_service, other_info)

       self.robot_service.setJ([0.0, 0.0, 0.0, 0.0, 0.0, 0.0])

La classe RobotService est présentée ci-dessous.

class RobotService(JsonService):
    service_type = "robot"
    service_name = "robot"
    jps = [0, 0, 0, 0, 0, 0]
    pose = [0, 0, 0, 1, 0, 0, 0]

    def getJ(self, *_):
        return {"joint_positions": self.jps}

    def setJ(self, jps):
        logging.info("setJ:{}".format(jps))
        self.jps = jps

    def getL(self, *_):
        return {"tcp_pose": self.pose}

    def getFL(self, *_):
        return {"flange_pose": self.pose}

    def setL(self, pose):
        logging.info("setL:{}".format(pose))
        self.pose = pose

    def moveXs(self, params, _):
        pass

    def stop(self, *_):
        pass

    def setTcp(self, *_):
        pass

    def setDigitalOut(self, params, _):
        pass

    def getDigitalIn(self, *_):
        pass

    def switchPauseContinue(self, *_):
        pass

getJ

La fonction getJ() est utilisée pour obtenir les JPs actuelles pour Mech-Viz et Mech-Vision, comme indiqué ci-dessous. En général, les JPs actuelles sont d’abord définies via la fonction setJ(), puis getJ() est appelée.

Exemple

def getJ(self, *_):
     pose = {"joint_positions": self._jps}
     return pose
  1. Dans le scénario caméra embarquée : écrire les JPs envoyées par le robot dans setJ().

    def setJ(self, jps):
      assert len(jps) = 6
      for i in range(6):
          jps[i] = deg2rad(float(jps[i]))
      self._jps = jps
      logging.info("SetJ:{}".format(self._jps))

    Dans cet exemple, “jps” correspond aux JPs envoyées par le robot, et sa valeur sera affectée à self._jps, qui sera utilisée par la fonction getJ(). Comme la fonction getJ() exige des données en radians, veuillez noter qu’une conversion d’unités est nécessaire ici.

  2. Dans le scénario caméra fixe : Il n’est pas nécessaire de définir les JPs actuelles en fonction de la pose du robot réel. Cependant, il faut définir une position Home qui n’entraîne pas de collision comme pose initiale pour simuler le robot réel ; sinon, la valeur sera attribuée aléatoirement et une erreur peut survenir.

    def getJ(self, *_):
         return {"joint_positions": [1.246689,-0.525868,-0.789761,-1.330814, 0.922581, 4.364021]}

getFL

La fonction getFL() est utilisée pour fournir la pose de la bride du robot lors de la capture d’images. Comme, dans le scénario caméra embarquée, la relation positionnelle calibrée est entre la bride et la caméra, mais les données finalement utilisées sont exprimées dans le repère de base du robot, la pose de la bride au moment de la capture d’image est nécessaire.

def getFL(self, *_):
    return {"flange_pose": self.pose}

Veuillez noter les points suivants lorsque des points de vision sont fournis dans le scénario caméra embarquée :

  1. Si le robot renvoie une pose de capture d’image en JPs, vous pouvez appeler directement setJ() dans RobotService (l’unité est le radian) et la fonction renverra [].

  2. Si le robot renvoie une pose de capture d’image en pose de bride, procédez comme suit:

    • Assurez-vous que “is_eye_in_hand” est défini sur true dans le fichier de paramètres extrinsèques “extri_param.json” du projet Mech-Vision ;

    • Appelez setFL() de RobotService (la pose est représentée par des quaternions et l’unité est le mètre).

moveXs

Le service RobotService créé via Adapter utilise la fonction moveXs() pour recevoir les points de passage du trajet planifié par Mech-Viz, comme indiqué ci-dessous.

Définition de fonction

def moveXs(self, params, _):
     with self.lock:
         for move in params["moves"]:
             self.targets.append(move)
     return {"finished": True}

“params” transmet tous les paramètres du projet Mech-Viz. Toutes les poses cibles, y compris celles issues de Vision Move, Relative Move, etc., peuvent être obtenues via params[“moves”]. Les poses renvoyées sont par défaut en JPs et seront placées dans “self.targets” pour des appels ultérieurs.

Exemple

En général, cette fonction est utilisée conjointement avec la fonction “notify()”. Lorsque Adapter reçoit un message de notification, il transmet “self.targets” à la fonction pour conversion et empaquetage, puis l’envoie au robot, comme ci-dessous.

def notify(self, request, _):
    msg = request["notify_message"]
    logging.info("{} notify message:{}".format(self.service_name, msg))
    if msg = "started":
        with self.lock:
            self.move_targets.clear()
    elif msg = "finished":
        with self.lock:
            targets = self.move_targets[:]
            self.move_targets.clear()
        self.send_moves(targets)

Lorsque le message de notification “started” est reçu, les cibles de la liste seront vidées, afin d’éviter des cibles dupliquées causées par une déconnexion imprévue et un redémarrage de Mech-Viz. Lorsque le message de notification “finished” est reçu, la liste de cibles sera transmise à la fonction “pack_move”, qui agrégera les données puis les enverra.

def pack_move(self, move_param):
     move_list = []
     for i, move in enumerate(move_param):
         target = move["target"]
         move_list.append(target)
     logging.info("move list num:{}".format(len(move_list)))
     logging.info("move list:{}".format(*move_list))
     motion_cmd = pack('>24f', *move_list)
     self.send(motion_cmd)

Selon les besoins réels sur site, vous pouvez choisir d’envoyer toutes les cibles planifiées par Mech-Viz ou sélectionner plusieurs cibles à envoyer depuis la liste par index. La fonction pack_move() agrège généralement les données selon le format spécifique requis par différentes marques de robots, et le format de données requis est généralement spécifié dans la solution de communication.

Cette page est-elle utile ?

Veuillez nous indiquer comment améliorer :

Nous accordons de l’importance à votre vie privée

Nous utilisons des cookies pour vous offrir la meilleure expérience possible sur notre site web. En continuant à utiliser le site, vous reconnaissez accepter l’utilisation des cookies. Si vous refusez, un cookie unique sera utilisé pour garantir que vous ne soyez pas suivi ou reconnu lors de votre visite sur ce site.