nova-sim / scripts /test_nova_jogger_v2.py
Georg
Enhance multi-axis homing and Nova API v2 integration
59625d9
#!/usr/bin/env python3
"""Test Nova Jogger v2 with real robot movements."""
import os
import sys
import time
from pathlib import Path
# Add parent directory to path
sys.path.insert(0, str(Path(__file__).parent.parent))
# Load .env.local
def load_env_file(filepath):
"""Simple .env file loader."""
if not filepath.exists():
return
with open(filepath, 'r') as f:
for line in f:
line = line.strip()
if line and not line.startswith('#') and '=' in line:
key, value = line.split('=', 1)
os.environ[key.strip()] = value.strip()
def main():
# Load .env.local
env_path = Path(__file__).parent.parent / ".env.local"
if not env_path.exists():
print(f"Error: {env_path} not found")
return 1
print(f"Loading environment from {env_path}")
load_env_file(env_path)
# Import NovaJogger
try:
from robots.ur5.nova_jogger import NovaJogger
print("✓ NovaJogger imported successfully")
except ImportError as e:
print(f"✗ Failed to import NovaJogger: {e}")
return 1
# Get config
instance_url = os.getenv("NOVA_INSTANCE_URL")
access_token = os.getenv("NOVA_ACCESS_TOKEN")
cell_id = os.getenv("NOVA_CELL_ID", "cell")
controller_id = os.getenv("NOVA_CONTROLLER_ID")
motion_group_id = os.getenv("NOVA_MOTION_GROUP_ID")
if not all([instance_url, access_token, controller_id, motion_group_id]):
print("✗ Missing required environment variables")
return 1
print("\n" + "=" * 70)
print("Nova Jogger v2 Integration Test")
print("=" * 70)
print(f"Instance: {instance_url}")
print(f"Controller: {controller_id}")
print(f"Motion Group: {motion_group_id}")
print()
# Create jogger instance
jogger = NovaJogger(
instance_url=instance_url,
access_token=access_token,
cell_id=cell_id,
controller_id=controller_id,
motion_group_id=motion_group_id
)
try:
# Connect
print("[1] Connecting to Nova API v2...")
if not jogger.connect():
print("✗ Failed to connect")
return 1
print("✓ Connected\n")
# Test 1: Joint jogging
print("[2] Testing joint jogging (joint 0, 0.05 rad/s)...")
if not jogger.start_joint_jog(joint=0, direction="+", velocity_rads_per_sec=0.05):
print("✗ Failed to start joint jog")
return 1
print("✓ Joint jog started")
print(" Jogging for 1 second...")
time.sleep(1.0)
if not jogger.stop():
print("✗ Failed to stop")
return 1
print("✓ Stopped\n")
time.sleep(0.5)
# Test 2: Cartesian translation
print("[3] Testing cartesian translation (X axis, 5 mm/s)...")
if not jogger.start_cartesian_translation(axis="x", direction="+", velocity_mm_per_sec=5.0):
print("✗ Failed to start cartesian translation")
return 1
print("✓ Cartesian translation started")
print(" Jogging for 1 second...")
time.sleep(1.0)
if not jogger.stop():
print("✗ Failed to stop")
return 1
print("✓ Stopped\n")
time.sleep(0.5)
# Test 3: Mode switching - joint to cartesian without reconnecting
print("[4] Testing dynamic mode switching...")
print(" Phase 1: Joint mode (joint 1, 0.05 rad/s)")
if not jogger.start_joint_jog(joint=1, direction="+", velocity_rads_per_sec=0.05):
print("✗ Failed to start joint jog")
return 1
time.sleep(0.5)
print(" Phase 2: Switching to cartesian (Y axis, 5 mm/s)")
if not jogger.start_cartesian_translation(axis="y", direction="+", velocity_mm_per_sec=5.0):
print("✗ Failed to switch to cartesian")
return 1
time.sleep(0.5)
print(" Phase 3: Switching back to joint (joint 2)")
if not jogger.start_joint_jog(joint=2, direction="+", velocity_rads_per_sec=0.05):
print("✗ Failed to switch back to joint")
return 1
time.sleep(0.5)
if not jogger.stop():
print("✗ Failed to stop")
return 1
print("✓ Mode switching successful\n")
time.sleep(0.5)
# Test 4: Cartesian rotation
print("[5] Testing cartesian rotation (Z axis, 0.1 rad/s)...")
if not jogger.start_cartesian_rotation(axis="z", direction="+", velocity_rads_per_sec=0.1):
print("✗ Failed to start cartesian rotation")
return 1
print("✓ Cartesian rotation started")
print(" Jogging for 0.5 seconds...")
time.sleep(0.5)
if not jogger.stop():
print("✗ Failed to stop")
return 1
print("✓ Stopped\n")
# Disconnect
print("[6] Disconnecting...")
jogger.disconnect()
print("✓ Disconnected")
print("\n" + "=" * 70)
print("✓ ALL TESTS PASSED")
print("=" * 70)
print("\nNova Jogger v2 API integration is working correctly!")
return 0
except Exception as e:
print(f"\n✗ Test failed: {type(e).__name__}: {e}")
import traceback
traceback.print_exc()
try:
jogger.disconnect()
except:
pass
return 1
if __name__ == "__main__":
sys.exit(main())