15. CNDE
15.1. Configurar Feedback de Estado CNDE do Robô
Protótipo |
|
|---|---|
Descrição |
Define a configuração padrão do CNDE (chamar antes da conexão RPC) |
Parâmetros Obrigatórios |
|
Parâmetros Padrão |
Nenhum |
Valor de Retorno |
|
15.2. Adicionar Estado do Robô à Configuração de Estado CNDE
Protótipo |
|
|---|---|
Descrição |
Adiciona lista de estados CNDE com base na configuração existente (suporta manutenção dinâmica e isolamento IP) |
Parâmetros Obrigatórios |
|
Parâmetros Padrão |
Nenhum |
Valor de Retorno |
|
15.3. Remover Estado do Robô da Configuração de Estado CNDE
Protótipo |
|
|---|---|
Descrição |
Remove lista de estados CNDE com base na configuração existente (suporta manutenção dinâmica e isolamento IP) |
Parâmetros Obrigatórios |
|
Parâmetros Padrão |
Nenhum |
Valor de Retorno |
|
15.4. Definir Período de Feedback de Estado CNDE
Protótipo |
|
|---|---|
Descrição |
Define o período de feedback de estado CNDE (suporta configuração global ou isolada por IP) |
Parâmetros Obrigatórios |
|
Parâmetros Padrão |
Nenhum |
Valor de Retorno |
|
15.5. Obter o Conjunto Completo de Estados do Feedback de Estado CNDE Atual
Protótipo |
|
|---|---|
Descrição |
Obtém todos os conjuntos de estados atuais |
Parâmetros Obrigatórios |
Nenhum |
Parâmetros Padrão |
Nenhum |
Valor de Retorno |
|
15.6. Exemplo de Código de Uso do Feedback de Estado CNDE
1from fairino import Robot
2from fairino.Robot import RobotState, SetRobotRealtimeStateConfig, DEFAULT_CNDE_STATES, AddRobotRealtimeState, DeleteRobotRealtimeState, SetRobotRealtimeStatePeriod
3import time
4
5# ==================== Parâmetros de Configuração Global ====================
6ROBOT_IP = '192.168.58.2' # Endereço IP do robô
7# ========== Test1: Teste de Configuração CNDE e Aquisição de Dados =============
8# Etapas do teste:
9# 1. Definir configuração CNDE (JointCurPos, ToolCurPos, período 20ms)
10# 2. Estabelecer conexão RPC
11# 3. Imprimir dados de posições das juntas e pose TCP do robô
12# 4. Obter timestamp e verificar período
13# 5. Modificar configuração (RobotMode, RbtEnableState, período 10ms)
14# 6. Verificar se a nova configuração entrou em vigor
15
16def test1_cnde_config_and_data():
17 """Test1: Teste de configuração CNDE e aquisição de dados - verificar configurações e tempo real dos dados"""
18 print_separator("Test1: Teste de configuração CNDE e aquisição de dados")
19
20 # ===== Passo 1: Definir configuração CNDE (JointCurPos, ToolCurPos, 20ms) =====
21 print("\n[Passo 1] Definindo configuração CNDE...")
22 print(" Campos de configuração: JointCurPos, ToolCurPos")
23 print(" Período de feedback: 20ms")
24
25 custom_states = [
26 RobotState.JointCurPos, # Posição atual da junta
27 RobotState.ToolCurPos, # Posição atual da ferramenta (TCP)
28 ]
29
30 rtn = SetRobotRealtimeStateConfig(custom_states, 20)
31 if rtn != 0:
32 print(f"✗ Falha ao definir configuração, código de erro: {rtn}")
33 return None
34 print("✓ Configuração CNDE definida com sucesso")
35
36 # ===== Passo 2: Estabelecer conexão RPC =====
37 print(f"\n[Passo 2] Estabelecendo conexão RPC ({ROBOT_IP})...")
38 robot = Robot.RPC(ROBOT_IP)
39 time.sleep(0.5) # Aguardar conexão e recepção de dados
40
41 # Verificar configuração
42 config = robot.CNDEGetConfig()
43 if config:
44 states, period = config
45 print(f"✓ Conexão bem-sucedida, configuração atual: {len(states)} campos, período {period}ms")
46 else:
47 print("✗ Não foi possível obter a configuração CNDE")
48 return robot
49
50 # ===== Passo 3: Imprimir posições das juntas e pose TCP do robô =====
51 print("\n[Passo 3] Imprimindo posições das juntas e pose TCP do robô...")
52 print(" (Dica: Arraste o robô para observar as mudanças nos dados)")
53 print(" Pressione Ctrl+C para interromper a impressão dos dados")
54 print(" (Use o Wireshark para capturar pacotes e verificar o período real dos dados)\n")
55
56 sample_count = 0
57 try:
58 while sample_count < 100: # Coletar 100 amostras
59 pkg = robot.robot_state_pkg
60
61 # Imprimir a cada 10 quadros
62 if sample_count % 10 == 0:
63 print(f"--- Amostra #{sample_count} ---")
64 print(f" Posições das juntas (deg): [{', '.join([f'{x:.3f}' for x in pkg.jt_cur_pos])}]")
65 print(f" Pose TCP (mm/deg): [{', '.join([f'{x:.3f}' for x in pkg.tl_cur_pos])}]")
66 print(f" Contagem de quadros atual: {pkg.frame_cnt}")
67 print()
68
69 sample_count += 1
70 time.sleep(0.02) # 20ms
71
72 except KeyboardInterrupt:
73 print("\n Impressão de dados interrompida pelo usuário")
74
75 # Fechar conexão
76 robot.CloseRPC()
77 time.sleep(1)
78
79 # ===== Passo 4: Modificar configuração e verificar =====
80 print("\n[Passo 4] Modificando configuração CNDE...")
81 print(" Novos campos de configuração: RobotMode, RbtEnableState")
82 print(" Novo período de feedback: 10ms")
83
84 new_states = [
85 RobotState.RobotMode,
86 RobotState.RbtEnableState,
87 ]
88
89 # Definir nova configuração
90 rtn = SetRobotRealtimeStateConfig(new_states, 10)
91 if rtn != 0:
92 print(f"✗ Falha ao definir nova configuração, código de erro: {rtn}")
93 return robot
94 print("✓ Nova configuração definida com sucesso")
95
96 # Reconectar
97 robot = Robot.RPC(ROBOT_IP)
98 time.sleep(0.5)
99
100 # Verificar nova configuração
101 config = robot.CNDEGetConfig()
102 if config:
103 states, period = config
104 print(f"✓ Configuração atual: {[s.name for s in states]}")
105 print(f"✓ Período atual: {period}ms")
106
107 if period == 10:
108 print("✓ Verificação de modificação de configuração aprovada (período alterado para 10ms)")
109 else:
110 print(f"⚠ Período não生效 (esperado 10ms, atual {period}ms)")
111
112 # Imprimir novos dados
113 pkg = robot.robot_state_pkg
114 print(f"\n[Novos Dados de Configuração]")
115 print(f" robot_mode: {pkg.robot_mode}")
116 print(f" rbtEnableState: {pkg.rbtEnableState}")
117 else:
118 print("✗ Não foi possível obter a nova configuração")
119
120 print("\n✓ Test1 concluído")
121 return robot
122
123
124if __name__ == "__main__":
125 test1_cnde_config_and_data()
126
127
128# ======== Test2: Teste de Adição/Remoção de Campos de Estado ====================
129# Função: Testar AddRobotRealtimeState() e DeleteRobotRealtimeState()
130# Etapas do teste:
131# 1. Usar AddRobotRealtimeState() para adicionar SpeedScaleManual e SpeedScaleAuto
132# 2. Conectar ao robô, imprimir velocidade global nos modos manual/automático
133# 3. Modificar a velocidade global no WebApp e observar as mudanças nos dados do SDK
134# 4. Usar DeleteRobotRealtimeState() para remover os campos adicionados
135# 5. Reconectar e verificar se os valores de velocidade são 0 (campos não são mais atualizados)
136
137
138def test2_add_delete_state():
139 """Test2: Teste de adição/remoção de campos de estado - verificar adição e remoção dinâmica de estados CNDE"""
140 print_separator("Test2: Teste de adição/remoção de campos de estado")
141
142 # ===== Passo 1: Adicionar campos SpeedScaleManual e SpeedScaleAuto =====
143 print("\n[Passo 1] Usando AddRobotRealtimeState() para adicionar campos de escala de velocidade...")
144 print(" Campos adicionados: SpeedScaleManual, SpeedScaleAuto")
145
146 rtn = AddRobotRealtimeState([
147 RobotState.SpeedScaleManual,
148 RobotState.SpeedScaleAuto,
149 ])
150
151 if rtn != 0:
152 print(f"✗ Falha na adição de campos, código de erro: {rtn}")
153 return None
154 print("✓ Campos adicionados com sucesso")
155
156 # ===== Passo 2: Estabelecer conexão RPC e imprimir velocidade =====
157 print(f"\n[Passo 2] Estabelecendo conexão RPC ({ROBOT_IP})...")
158 robot = Robot.RPC(ROBOT_IP)
159 time.sleep(0.5) # Aguardar conexão e recepção de dados
160
161 # Verificar configuração
162 config = robot.CNDEGetConfig()
163 if config:
164 states, period = config
165 print(f"✓ Conexão bem-sucedida, configuração atual: {len(states)} campos")
166 # Verificar se os campos adicionados estão incluídos
167 has_manual = RobotState.SpeedScaleManual in states
168 has_auto = RobotState.SpeedScaleAuto in states
169 if has_manual and has_auto:
170 print("✓ Verificação de configuração aprovada: SpeedScaleManual e SpeedScaleAuto foram adicionados")
171 else:
172 print(f"⚠ Aviso de verificação de configuração: Manual={has_manual}, Auto={has_auto}")
173 else:
174 print("✗ Não foi possível obter a configuração CNDE")
175
176 # Imprimir dados de velocidade
177 print("\n[Dados de Velocidade Atuais] (Modifique a velocidade global no WebApp para observar as mudanças)")
178 print(" Dica: Habilite o robô arrastando-o e alterne entre modos manual/automático para observar os valores de velocidade")
179 print(" Pressione Ctrl+C para interromper a impressão dos dados\n")
180
181 sample_count = 0
182 try:
183 while sample_count < 100: # Coletar 100 amostras (cerca de 10 segundos em intervalos de 100ms)
184 pkg = robot.robot_state_pkg
185 print(f" [{sample_count:3d}] SpeedScaleManual: {pkg.speedScaleManual:.2f}, "
186 f"SpeedScaleAuto: {pkg.speedScaleAuto:.2f}, "
187 f"Mode: {pkg.robot_mode}")
188 sample_count += 1
189 time.sleep(0.1) # Intervalo de 100ms
190 except KeyboardInterrupt:
191 print("\n Impressão de dados interrompida pelo usuário")
192
193 print(f"\n✓ Coleta de dados concluída, total de {sample_count} amostras")
194
195 # ===== Passo 3: Desconectar =====
196 print("\n[Passo 3] Desconectando conexão atual...")
197 robot.CloseRPC()
198 time.sleep(1.0) # Aguardar o fechamento completo do CNDE
199
200 # ===== Passo 4: Remover campos adicionados =====
201 print("\n[Passo 4] Usando DeleteRobotRealtimeState() para remover campos de escala de velocidade...")
202 rtn = DeleteRobotRealtimeState([
203 RobotState.SpeedScaleManual,
204 RobotState.SpeedScaleAuto,
205 ])
206
207 if rtn != 0:
208 print(f"✗ Falha na remoção de campos, código de erro: {rtn}")
209 return robot
210 print("✓ Campos removidos com sucesso")
211
212 # ===== Passo 5: Reconectar e verificar se os valores dos campos são 0 =====
213 print(f"\n[Passo 5] Reconectando e verificando os valores dos campos após remoção...")
214
215 robot = Robot.RPC(ROBOT_IP)
216 time.sleep(0.5)
217
218 # Ler valores de velocidade
219 pkg = robot.robot_state_pkg
220 manual_speed = pkg.speedScaleManual
221 auto_speed = pkg.speedScaleAuto
222
223 print(f"\n SpeedScaleManual após remoção: {manual_speed:.2f}")
224 print(f" SpeedScaleAuto após remoção: {auto_speed:.2f}")
225
226 # Verificar se são 0
227 if manual_speed == 0 and auto_speed == 0:
228 print("\n✓ Test2 verificação aprovada: valores de velocidade são 0 após a remoção dos campos")
229 else:
230 print(f"\n⚠ Test2 aviso: valores de velocidade não são zero após a remoção dos campos")
231
232 print("\n✓ Test2 concluído")
233 return robot
234
235if __name__ == "__main__":
236 test2_add_delete_state()