15. CNDE

15.1. Configurar Feedback de Estado CNDE do Robô

Protótipo

SetRobotRealtimeStateConfig(states: List[RobotState], period: int = 500) -> int:

Descrição

Define a configuração padrão do CNDE (chamar antes da conexão RPC)

Parâmetros Obrigatórios

  • states: Lista de enums RobotState

  • period: Período de dados (ms), intervalo 8-1000, padrão 8ms

Parâmetros Padrão

Nenhum

Valor de Retorno

  • Código de erro Sucesso-0 Falha-errcode

15.2. Adicionar Estado do Robô à Configuração de Estado CNDE

Protótipo

AddRobotRealtimeState(states: List[RobotState], ip: str = None) -> int:

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

  • states: Lista de enums RobotState, estados a adicionar

  • ip: Opcional, especifica o IP do robô (para configuração isolada multi-robô; se não fornecido, modifica a configuração global)

Parâmetros Padrão

Nenhum

Valor de Retorno

  • Código de erro Sucesso-0 Falha-errcode

15.3. Remover Estado do Robô da Configuração de Estado CNDE

Protótipo

DeleteRobotRealtimeState(states: List[RobotState], ip: str = None) -> int:

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

  • states: Lista de enums RobotState, estados a remover

  • ip: Opcional, especifica o IP do robô (para configuração isolada multi-robô; se não fornecido, modifica a configuração global)

Parâmetros Padrão

Nenhum

Valor de Retorno

  • Código de erro Sucesso-0 Falha-errcode

15.4. Definir Período de Feedback de Estado CNDE

Protótipo

SetRobotRealtimeStatePeriod(period: int, ip: str = None) -> int:

Descrição

Define o período de feedback de estado CNDE (suporta configuração global ou isolada por IP)

Parâmetros Obrigatórios

  • period: Período de dados (ms), intervalo 8-1000

  • ip: Opcional, especifica o IP do robô (se não fornecido, modifica a configuração global)

Parâmetros Padrão

Nenhum

Valor de Retorno

  • Código de erro Sucesso-0 Falha-errcode

15.5. Obter o Conjunto Completo de Estados do Feedback de Estado CNDE Atual

Protótipo

CNDEGetConfig(self) -> tuple:

Descrição

Obtém todos os conjuntos de estados atuais

Parâmetros Obrigatórios

Nenhum

Parâmetros Padrão

Nenhum

Valor de Retorno

  • Código de erro Sucesso-0 Falha-errcode Estrutura de resultado de configuração contendo lista de estados

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()