Interfaces de classes parentes abstraites
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