Interfaces de classes parentes abstraites

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.

Les interfaces de classes parentes abstraites sont les fonctions qu’une classe dérivée peut ajouter en héritant de sa classe parente. Vous pouvez réécrire ces fonctions selon les besoins réels. Cette section présente les classes parentes abstraites suivantes.

Communication

Le code source appartenant à la catégorie communication est stocké dans le fichier Communication Component/src/interface/communication.py du répertoire d’installation de Mech-Vision et Mech-Viz.

Classe Communication

La classe Communication est une classe de base utilisée pour la communication. Elle fournit une série de fonctions d’interface qui doivent être réécrites côté serveur ou client.

Fonction de classe Description

is_connected()

Déterminer si la connexion en cours a réussi.

set_recv_size()

Définir la longueur des données reçues à chaque fois ; la valeur par défaut est de 1024 octets.

send()

Fonction d’interface utilisée pour envoyer des données.

recv()

Fonction d’interface utilisée pour recevoir des données.

close()

Fonction d’interface utilisée pour fermer la communication socket.

before_recv()

Fonction d’interface dans laquelle vous pouvez ajouter une logique selon les besoins réels avant de recevoir les données. La surcharge est possible.

after_recv()

Fonction d’interface dans laquelle vous pouvez ajouter une logique selon les besoins réels après la réception des données. La surcharge est possible.

after_handle()

Fonction d’interface dans laquelle vous pouvez ajouter une logique selon les besoins réels après le traitement des données. La surcharge est possible.

Classe TcpServer

La classe TcpServer encapsule un serveur socket TCP/IP.

Fonction de classe Description

bind_and_listen()

Lier le port.

local_socket()

Fournir les informations du socket local.

remote_socket()

Fournir les informations du socket distant.

accept()

Accepter la connexion avec le client.

send()

Envoyer les données.

recv()

Recevoir les données.

close()

Fermer le socket.

close_client()

Se déconnecter du client.

Classe TcpClinet

La classe TcpClient encapsule un client socket TCP/IP.

Propriété de classe Description

is_bind_port

Indique s’il faut lier le port. S’il existe une restriction de port côté client, la valeur doit être définie sur True.

Fonction de classe Description

send()

Envoyer les données.

recv()

Recevoir les données.

close()

Fermer le socket.

set_timeout()

Définir la valeur de temporisation en secondes.

reconnect_server()

Se reconnecter au serveur.

after_connect_server()

Fonction d’interface utilisée pour spécifier quoi faire après la première connexion réussie au serveur.

after_reconnect_server()

Fonction d’interface utilisée pour spécifier quoi faire après la reconnexion au serveur.

after_timeout()

Fonction d’interface utilisée pour spécifier quoi faire après l’expiration du délai.

Adaptateur

Le code source appartenant à la catégorie Adapter est stocké dans le fichier Communication Component/src/interface/adapter.py du répertoire d’installation de Mech-Vision et Mech-Viz.

Classe de base Adapter

Adapter encapsule des fonctions liées à Mech-Viz, Mech-Vision et Robserver, notamment démarrer Mech-Viz, arrêter Mech-Viz, définir les paramètres de Step de Mech-Vision ou Mech-Viz, et lancer la reconnaissance Mech-Vision. Lorsqu’un programme Adapter est utilisé pour appeler Mech-Viz ou Mech-Vision, il faut utiliser une classe dérivée de la classe de base Adapter.

Les propriétés de la classe Adapter sont présentées dans le tableau ci-dessous.

Propriété de classe Description

viz_project_dir

Répertoire du projet Mech-Viz actuel

vision_project_name

Nom du projet Mech-Vision actuel

is_simulate

Indique s’il faut exécuter Mech-Viz en mode simulation

is_keep_viz_state

Indique s’il faut conserver l’état au moment de l’arrêt précédent de Mech-Viz

is_save_executor_data

Indique s’il faut enregistrer les données de l’exécuteur Mech-Viz

is_force_simulate

Indique s’il faut forcer Mech-Viz à s’exécuter en mode simulation

is_force_real_run

Indique s’il faut forcer Mech-Viz à s’exécuter et à piloter le robot réel

code_signal

Le signal d’affichage des informations d’Adapter dans l’onglet Console du panneau de logs de Mech-Vision (y compris les codes d’erreur)

msg_signal

Le signal d’affichage des informations d’Adapter dans l’onglet Console du panneau de logs de Mech-Vision (sans les codes d’erreur)

i_code_signal

Le signal d’affichage des informations Mech-Interface dans l’onglet Console du panneau de logs de Mech-Vision (y compris les codes d’erreur)

i_msg_signal

Le signal d’affichage des informations Mech-Interface dans l’onglet Console du panneau de logs de Mech-Vision (sans les codes d’erreur)

viz_finished_signal

Le signal indiquant que Mech-Viz s’est arrêté normalement ou avec une erreur

connect_robot_signal

Signal de connexion/déconnexion avec le robot

start_adapter_signal

Signal de démarrage d’Adapter

service_name_changed

Le signal affichant l’état de Mech-Viz et Mech-Vision dans l’onglet Console du panneau de logs de Mech-Vision

setting_infos

Les informations de configuration

service_name

Nom du service enregistré

Les fonctions de la classe Adapter sont présentées dans le tableau ci-dessous.

Fonction de classe Description

on_exec_status_changed()

Recevoir les informations d’état de Mech-Viz et Mech-Vision.

register_self_service()

Enregistrer le service Adapter.

vision_project_dirs()

Interroger le répertoire du projet Mech-Vision.

vision_project_names()

Interroger tous les noms de projets Mech-Vision.

get_vision_projects_id_by_grpc()

Interroger les noms de tous les projets Mech-Vision chargés.

is_viz_registered()

Vérifier si Mech-Viz est enregistré.

is_viz_in_running()

Vérifier si Mech-Viz est en cours d’exécution.

is_vision_started()

Vérifier si le projet Mech-Vision est enregistré.

find_services()

Rechercher des services.

before_start_viz()

Cette fonction est appelée avant de démarrer Mech-Viz.

after_start_viz()

Cette fonction est appelée après le démarrage de Mech-Viz.

viz_not_registerd()

Cette fonction est appelée si Mech-Viz n’est pas enregistré après avoir été démarré.

viz_is_running()

Cette fonction est appelée si Mech-Viz est déjà en cours d’exécution lors du démarrage de Mech-Viz.

viz_run_error()

Cette fonction est appelée si une erreur se produit lors de l’exécution de Mech-Viz après le démarrage de Mech-Viz.

viz_run_finished()

Cette fonction est appelée après la fin de l’exécution de Mech-Viz.

viz_plan_failed()

Cette fonction est appelée après l’échec de la planification d’une trajectoire par Mech-Viz.

viz_no_targets()

Cette fonction est appelée lorsque la trajectoire planifiée par Mech-Viz n’a aucun point de passage de mouvement.

viz_unreachable_targets()

Cette fonction est appelée lorsque la trajectoire planifiée par Mech-Viz contient un point de passage inatteignable.

viz_collision_checked()

Cette fonction est appelée lorsqu’une collision est détectée dans la trajectoire planifiée par Mech-Viz.

parse_viz_reply()

Analyser la réponse de Mech-Viz.

wait_viz_result()

Attendre la réponse de Mech-Viz.

start_viz()

Démarrer Mech-Viz.

stop_viz()

Arrêter Mech-Viz.

pause_viz()

Mettre Mech-Viz en pause.

find_vision_pose()

Déclencher la capture d’images du projet Mech-Vision.

async_call_vision_run()

Déclencher de façon asynchrone la capture d’images du projet Mech-Vision.

async_get_vision_callback()

Recevoir de façon asynchrone le résultat de Mech-Vision.

deal_vision_result()

Traiter le résultat de Mech-Vision.

set_step_property()

Définir les paramètres de Step dans Mech-Vision.

read_step_property()

Lire les paramètres de Step dans Mech-Vision.

select_parameter_group()

Sélectionner la recette de paramètres dans le projet Mech-Vision.

set_task_property()

Définir les paramètres de Step dans Mech-Viz.

read_task_property()

Lire les paramètres de Step dans Mech-Viz.

get_digital_in()

Obtenir les DI.

set_digital_out()

Définir les DO.

before_start_adapter()

Cette fonction est appelée avant de démarrer Adapter.

start()

Démarrer Adapter.

close()

Arrêter Adapter.

handle_command()

Traiter les commandes reçues des dispositifs externes.

Classe TcpServerAdapter

Comme indiqué ci-dessous, la classe TcpServerAdapter hérite d’Adapter et elle encapsule les fonctions de TcpServer.

class TcpServerAdapter(Adapter):
    def __init__(self, host_address, server=TcpServer):
        super(TcpServerAdapter, self).__init__()
        self.init_server(host_address, server)

    def init_server(self, host_address, server=TcpServer):
        self._server = server(host_address)

    def set_recv_size(self, size):
        self._server.set_recv_size(size)

    def send(self, msg, is_logging=True):
        return self._server.send(msg, is_logging)

    def recv(self):
        return self._server.recv()

    def start(self):
        self.before_start_adapter()
        while not self.is_stop_adapter:
            try:
                self._server.before_recv()
                cmds = self._server.recv()
                logging.info("Received raw data from client:{}".format(cmds))
                if not cmds:
                    logging.warning("Adapter client is disconnected!")
                    self.code_signal.emit(logging.WARNING, CENTER_CLIENT_DISCONNECTED)
                    self._server.close_client()
                    self.accept()
                    continue
                self._server.after_recv()
            except socket.error:
                logging.warning("Adapter client is closed!")
                self.code_signal.emit(logging.WARNING, CENTER_CLIENT_DISCONNECTED)
                self._server.close_client()
                self.accept()
            except Exception as e:
                logging.exception("Exception occurred when receiving data from client: {}.".format(e))
            else:
                try:
                    self.handle_command(cmds)
                    self._server.after_handle()
                except Exception as e:
                    self.msg_signal.emit(logging.ERROR, _translate("messages", "Handle command exception: {}".format(e)))
                    logging.exception("Adapter exception in handle_command(): {}".format(e))

    def close(self):
        super().close()
        self._server.close()

    def before_start_adapter(self):
        super().before_start_adapter()
        self.accept()

    def accept(self):
        if self.is_stop_adapter:
            return
        self.code_signal.emit(logging.INFO, CENTER_WAIT_FOR_CLIENT)
        self._server.accept()
        if self._server.is_connected():
            self.code_signal.emit(logging.INFO, CENTER_CLIENT_CONNECTED)
            self.msg_signal.emit(logging.INFO, _translate("messages", "Client address is") + " {}".format(self._server.remote_socket()[1]))

Classe TcpClientAdapter

Comme indiqué ci-dessous, la classe TcpClientAdapter hérite d’Adapter et encapsule les fonctions de TcpClient.

class TcpClientAdapter(Adapter):

    def __init__(self, host_address):
        super().__init__()
        self.init_client(host_address)

    def init_client(self, host_address, client=TcpClient):
        self._client = client(host_address)

    def set_bind_port(self, is_bind=True):
        self._client.is_bind_port = is_bind

    def set_recv_size(self, size):
        self._client.set_recv_size(size)

    def send(self, msg, is_logging=True):
        self._client.send(msg, is_logging)

    def recv(self):
        return self._client.recv()

    def start(self):
        self.reconnect_server(False)
        while not self.is_stop_adapter:
            try:
                self._client.before_recv()
                cmds = self._client.recv()
                if not cmds:
                    self.reconnect_server()
                    continue
                logging.info("Received command from server:{}".format(cmds))
                self._client.after_recv()
            except socket.timeout:
                logging.warning("Socket timeout")
                self._client.after_timeout()
            except socket.error:
                sleep(5)
                self.reconnect_server()
            except Exception as e:
                logging.exception("Exception occurred when receiving from server: {}".format(e))
            else:
                try:
                    self.handle_command(cmds)
                except Exception as e:
                    self.msg_signal.emit(logging.ERROR, _translate("messages", "Handle command exception: {}".format(e)))
                    logging.exception("Adapter exception in handle_command(): {}".format(e))

    def close(self):
        super().close()
        self._client.close()

    def reconnect_server(self, is_reconnect=True):
        self._client.reconnect_server()
        if self.is_stop_adapter:
            return
        if self._client.is_connected():
            self.code_signal.emit(logging.INFO, CENTER_CONNECT_TO_SERVER)
        else:
            self.code_signal.emit(logging.WARNING, CENTER_SERVER_DISCONNECTED)

Classe TcpMultiplexingServerAdapter

Comme indiqué ci-dessous, la classe TcpMultiplexingServerAdapter hérite d’Adapter et sert principalement à connecter plusieurs clients.

class TcpMultiThreadingServerAdapter(Adapter):
    def __init__(self, address):
        super().__init__()
        self._servers = {}
        self.add_server(address)
        self.sockets = {}
        self.clients_ip = {}
        self.thread_pool = ThreadPoolExecutor(max_workers=4, thread_name_prefix="tcp_multi_server_thread")
        self.thread_id_socket_dict = {}
        self.set_recv_size()

    def set_recv_size(self, size=1024):
        self.recv_size = size

    def _find_client_ip(self, sock):
        for k, v in self.sockets.items():
            if v = sock:
                return k

    def _find_server(self, sock):
        for k, v in self._servers.items():
            if v = sock:
                return k

    def add_server(self, host_address):
        server = TcpServer(host_address)
        server.bind_and_listen()
        self._servers[server] = server.local_socket()

    def set_clients_ip(self, clients_ip):
        """
            Must be called before start().
            `clients_ip` is a dict(key is client ip, value is client description).
        """
        self.clients_ip = clients_ip

    def add_connection(self, ip_port, sock):
        self.sockets[ip_port] = sock
        logging.info("Add {}, connections: {}".format(ip_port, self.sockets))
        self.msg_signal.emit(logging.INFO, _translate("messages", "The client {} gets online.").format(ip_port))

    def del_connection(self, ip):
        logging.info("Del {}, connections: {}".format(ip, self.sockets))
        if self.client_connection(ip):
            self.client_connection(ip).close()
            self.sockets.pop(ip)
        self.msg_signal.emit(logging.WARNING, _translate("messages", "The client {} gets offline.").format(ip))

    def client_connection(self, client_ip):
        return self.sockets.get(client_ip)

    def check_read_events(self, rs):
        for s in rs:
            if s in self._servers.values():  # recv connection
                server = self._find_server(s)
                if self.is_stop_adapter:
                    return
                server.accept()
                client_socket, client_addr = server.remote_socket()
                ip_port = "{}:{}".format(str(client_addr[0]), str(client_addr[1]))
                self.add_connection(ip_port, client_socket)
            elif s in self.sockets.values():  # recv data
                client_ip = self._find_client_ip(s)
                if not client_ip:
                    continue
                msg = self.recv_by_s(s)
                if not msg:
                    self.del_connection(client_ip)
                    return
                try:
                    future = self.thread_pool.submit(self.handle_command_thread, s, msg)
                except Exception as e:
                    logging.exception("Adapter exception in handle_command(): {}".format(e))

    def handle_command_thread(self, s, msg):
        thread_id = threading.get_ident()
        self.thread_id_socket_dict[thread_id] = s
        self.handle_command(msg)
        # del self.thread_id_socket_dict[thread_id]

    def send(self, msg, is_logging=True):
        thread_id = threading.get_ident()
        sock = self.thread_id_socket_dict.get(thread_id)
        len_total = len(msg)
        while msg:
            if sock:
                len_sent = sock.send(msg)
            else:
                for v in self.sockets.values():
                    try:
                        len_sent = v.send(msg)
                    except Exception as e:
                        logging.warning(e)
            if not len_sent:
                logging.warning("Connection lost, close the client connection.")
                return len_sent
            if is_logging:
                logging.info("Server send: {}, len_sent: {}".format(msg, len_sent))
            msg = msg[len_sent:]
        return len_total

    def recv(self):
        thread_id = threading.get_ident()
        sock = self.thread_id_socket_dict.get(thread_id)
        return self.recv_by_s(sock)

    def recv_by_s(self, sock):
        msg = b""
        try:
            msg = sock.recv(self.recv_size)
        except socket.error:
            logging.error("The client is closed!")
        if msg:
            logging.info("Received message: {}".format(msg))
        return msg

    def check_task(self):
        """
            Interface.
        """

    def close(self):
        super().close()
        for server in self._servers.keys():
            server.close()
        for client_ip in self.sockets.keys():
            try:
                self.client_connection(client_ip).close()
                logging.info("Close socket :{}".format(client_ip))
            except Exception as e:
                logging.warning("Close socket error:{}, exception:{}".format(client_ip, e))
        self.sockets = {}

    def start(self):
        self.before_start_adapter()
        while not self.is_stop_adapter:
            avalible_sockets = list(self.sockets.values()) + list(self._servers.values())
            rs, _, _ = select(avalible_sockets, [], [], 0.1)
            self.check_read_events(rs)
            try:
                self.check_task()
            except Exception as e:
                self.msg_signal.emit(logging.ERROR,
                                     _translate("messages", "Handle command exception: {}".format(e)))
                logging.exception("Exception when check task:{}".format(e))
                sleep(5)

Classe IOAdapter

Comme indiqué ci-dessous, la classe IOAdapter hérite d’Adapter et utilise une boucle while pour obtenir les DI.

class IOAdapter(Adapter):
    robot_name = None
    check_rate = 0.5

    def __init__(self, host_address):
        super().__init__()
        self.last_gi = 0

    def get_digital_in(self, timeout=None):
        return super().get_digital_in(self.robot_name, timeout)

    def set_digital_out(self, port, value, timeout=None):
        super().set_digital_out(self.robot_name, port, value, timeout)

    def _check_gi(self):
        gi_js = self.get_digital_in()
        gi = int(json.loads(gi_js.decode())["value"])
        if self.last_gi != gi:
            self.last_gi = gi
            logging.info("Check GI signal status: {}".format(gi))
        self.handle_gi(gi)

    def start(self):
        self.before_start_adapter()
        while not self.is_stop_adapter:
            try:
                self._check_gi()
            except Exception as e:
                logging.exception(e)
                self.check_gi_failed()
            sleep(self.check_rate)

    def handle_gi(self, gi):
        """
            Interface.
        """

    def check_gi_failed(self):
        """
            Interface.
        """

Classe AdapterWidget

Comme indiqué ci-dessous, la classe AdapterWidget est une classe parente, et toutes les fonctions liées à la personnalisation de l’interface utilisateur doivent être implémentées dans ses classes dérivées.

class AdapterWidget(QWidget):

    def set_adapter(self, adapter):
        self.adapter = adapter
        self.after_set_adapter()

    def after_set_adapter(self):
        """
            Interface.
        """

    def close(self):
        super().close()
        """
            Interface.
        """

Service

Le code source appartenant à la catégorie service est stocké dans le fichier Communication Component/src/interface/services.py du répertoire d’installation de Mech-Vision et Mech-Viz.

Classe NotifyService

Le code de la classe NotifyService est présenté ci-dessous.

class NotifyService(JsonService):
    service_type = "notify"
    service_name = "adapter"

    def handle_message(self, msg):
        """
            Interface.
        """

    def notify(self, request, _):
        msg = request["notify_message"]
        logging.info("notify message:{}".format(msg))
        return self.handle_message(msg)

Le nom de service par défaut est adapter. Si plusieurs services de notification sont nécessaires dans le projet, vous pouvez redéfinir service_name pour distinguer les différents services. Les descriptions des fonctions de classe sont présentées dans le tableau ci-dessous.

Fonction de classe Description

handle_message()

Fonction d’interface ; la classe dérivée peut la surcharger.

notify()

Analyser le message ; la classe dérivée n’a généralement pas besoin de la surcharger.

Classe VisionResultSelectedAtService

Le code de la classe VisionResultSelectedAtService est présenté ci-dessous.

class VisionResultSelectedAtService(JsonService):
    service_type = "vision_watcher"
    service_name = "vision_watcher_adapter"

    def __init__(self):
        self.poses = None

    def poses_found(self, result):
        """
            Interface.
        """

    def posesFound(self, request, _):
        logging.info("{} result:{}".format(jk.mech_vision, request))
        self.poses_found(request)

    def poses_planned(self, result):
        """
            Interface.
        """

    def posesPlanned(self, request, _):
        logging.info("Plan result:{}".format(request))
        self.poses_planned(request)

    def multiPickCombination(self, request, _):
        logging.info("multiPickCombination:{}".format(request))

Le type de service par défaut est vision_watcher, qui ne peut pas être modifié. Le nom de service par défaut est vision_watcher_adapter. Si plusieurs services vision_watcher sont nécessaires dans le projet, vous pouvez modifier service_name dans la classe dérivée pour distinguer les différents services. Les descriptions des fonctions de classe sont présentées dans le tableau ci-dessous.

Fonction de classe Description

poses_found()

Fonction d’interface pouvant être surchargée dans la classe dérivée ; le paramètre est le résultat de reconnaissance de Mech-Vision.

posesFound()

Analyser le résultat de reconnaissance envoyé par Mech-Vision ; la fonction de la classe dérivée n’a généralement pas besoin d’être surchargée.

poses_planned()

Fonction d’interface ; le paramètre est le point de vision du trajet planifié par Mech-Viz.

posesPlanned()

Analyser le message de planification envoyé par Mech-Viz.

Classe RobotService

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

Le type de service par défaut est robot, qui ne peut pas être modifié. Le nom de service par défaut est robot, et il doit être remplacé par le nom du robot réel dans la classe dérivée. Vous devrez définir une pose en JPs ou en TCP dans la classe dérivée, qui sera utilisée pour définir une position fixe pendant l’exécution de Mech-Viz. Assurez-vous que cette pose n’entraîne pas de collision avec les objets de la scène. Les descriptions des fonctions de classe sont présentées dans le tableau ci-dessous.

Fonction de classe Description

getJ()

Retourner les JPs à Mech-Viz/Mech-Vision.

setJ()

Définir les JPs via des services externes en radians.

getL()

Retourner le TCP à Mech-Viz/Mech-Vision.

getFL()

Retourner la pose de la bride à Mech-Viz/Mech-Vision.

setL()

Définir la pose de la bride en quaternions pour les services externes ; l’unité est le mètre.

moveXs()

Cette fonction est appelée après que Mech-Viz a terminé la planification de la trajectoire. Le paramètre contient les propriétés des points de passage. Veuillez noter que s’il existe des Steps susceptibles d’interrompre la pré-planification, tels que Check DI, Branch by Msg dans le projet Mech-Viz, Mech-Viz appellera cette fonction plusieurs fois.

stop()

Arrêter le robot (cette fonction est rarement appelée).

setTcp()

Définir le TCP (cette fonction est rarement appelée).

setDigitalOut()

Définir les DO (cette fonction est rarement appelée).

getDigitalIn()

Obtenir les DI (cette fonction est rarement appelée).

switchPauseContinue()

Mettre le robot en pause/reprendre (cette fonction est rarement appelée).

Classe OuterMoveService

Le code de la classe OuterMoveService est présenté ci-dessous.

class OuterMoveService(JsonService):
    service_type = "outer_move"
    service_name = "outer_move"
    move_target_type = TCP_POSE
    velocity = 0.25
    acceleration = 0.25
    blend_radius = 0.05
    motion_type = MOVEJ
    is_tcp_pose = False
    pick_or_place = 0

    def __init__(self):
        self.targets = []

    def gather_targets(self, di, jps, flange_pose):
        """
            Interface.

            Please add targets to `self.targets` here if needed.
        """

    def add_target(self, move_target_type, target):
        self.targets.append({"move_target_type": move_target_type, "target": target})

    def getMoveTargets(self, params, *_):
        """
        @return: targets(move_target_type  0:jps, 1:tcp_pose, 2:obj_pose)
                 velocity(default 0.25)
                 acceleration(default 0.25)
                 blend_radius(default 0.05)
                 motion_type(default moveJ  'J':moveJ, 'L':moveL)
                 is_tcp_pose(default False)
        """
        di = params["di"]
        jps = params["joint_positions"]
        flange_pose = params["pose"]
        logging.info("getMoveTargets: di={}, jps={}, flange_pose={}".format(di, jps, flange_pose))

        self.gather_targets(di, jps, flange_pose)
        targets = self.targets[:]
        self.targets.clear()
        logging.info("Targets: {}".format(targets))
        return {"targets": targets, "velocity": self.velocity, "acceleration": self.acceleration, "blend_radius": self.blend_radius,
                "motion_type": self.motion_type, "is_tcp_pose": self.is_tcp_pose, "pick_or_place": self.pick_or_place}

Le type et le nom de service par défaut sont tous deux outer_move. Si plusieurs services outer_move sont nécessaires dans le projet, vous pouvez modifier service_name dans la classe dérivée pour distinguer les différents services. Les descriptions des fonctions de classe sont présentées dans le tableau ci-dessous.

Fonction de classe Description

move_target_type()

Type de cible ; 0 : jps, 1 : tcp_pose, 2 : obj_pose.

velocity()

Vitesse de la cible (point de passage) ; la valeur par défaut est 0.25.

acceleration()

Accélération de la cible ; la valeur par défaut est 0.25.

blend_radius()

Le rayon de raccordement de la cible ; la valeur par défaut est 0.05 m.

motion_type()

Le type de mouvement de la cible : ‘J’ : moveJ, ‘L’ : moveL.

is_tcp_pose()

Indique si la pose de la cible est en TCP.

gather_targets()

Fonction d’interface, qui collecte toutes les cibles. Le paramètre contient les JPs actuels, la pose de la bride et la valeur DI du robot. La classe dérivée peut être surchargée selon les besoins réels.

add_target()

Ajouter une cible ; cette fonction peut être appelée dans la classe dérivée pour ajouter une cible.

getMoveTargets()

Cette fonction est appelée lorsque Mech-Viz procède sur l’External Move Step. Le paramètre contient les JPs actuels, la pose de la bride et la valeur DI du robot.

Enregistrer le service

Les services correspondant aux quatre classes ci-dessus ne sont disponibles qu’après enregistrement. La fonction utilisée pour l’enregistrement des services est présentée ci-dessous.

def register_service(hub_caller, service, other_info=None):
    server, port = start_server(service)
    if service.service_type = "robot":
        other_info["from_adapter"] = True
        other_info["simulate"] = False
    hub_caller.register_service(service.service_type, service.service_name, port, other_info)
    return server, port

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.